安可信01

安可信01的详细介绍

创作者:新用户 | 更新日期:2016-06-20 | 在线时长:6时
用于实时监测室内甲醛浓度(毕业设计相关)。

#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
/*-----------1602显示相关声明--------------------*/

uchar d[]={"Welcome To Use Please wait..."};//开机界面
uchar e[]={"CL of CH2O is:"};//工作界面1
uchar f[10];
sbit LCD_RS = P1^3;//  相关引脚定义     
sbit LCD_RW = P1^4;
sbit LCD_EN = P1^5;
sbit mang=P2^7;

void LCD_Init();
bit lcd_busy();
void lcd_wcmd(uchar cmd);
void lcd_wdat(uchar dat);
void LCD_Clear();
void LCD_Write_kaiji();
void LCD_Write_work1();
void LCD_Write_work2();
/*-------------------------------------------------*/
uint ch2o;
sbit feng=P1^2;//蜂鸣器
void fm();
/*--------------------------------------
            WLAN-URAT
----------------------------------------*/
uchar wlan_mode[]="AT+CWMODE=1\r\n";
uchar wlan_lj[]="AT+CWJAP=\"zzu_wifi\",\"z12345678a\"\r\n";
uchar fwqlj[]="AT+CIPSTART=\"TCP\",\"121.42.180.30\",8181\r\n";

uchar wlan_cipm[]="AT+CIPMODE=1\r\n";
uchar wlan_cips[]="AT+CIPSEND\r\n";

//uchar now_dat[]="{\"M\":\"update\",\"ID\":\"309\",\"V\":{\"304\":\"00.15\"}}\r\n";
//uchar now_dat1[]="{\"M\":\"update\",\"ID\":\"309\",\"V\":{\"304\":\"0.12\"}}\r\n";
uchar now_dat2[]="{\"M\":\"update\",\"ID\":\"309\",\"V\":{\"304\":\"value1\"}}\r\n";
uchar wlan_land[]="{\"M\":\"checkin\",\"ID\":\"309\",\"K\":\"a167d99a9\"}\r\n";
void wlan_cipsend();

void wlan_link();
void yun_dat();
void yun_land();
/*--------------------------------------------------
             串口通信声明
---------------------------------------------------*/
uchar out_num;
uchar in_num;
uchar a[5]={0xa5,0x5a,0x02,0x80,0xaa};
uchar b[4];
uchar recdat[9]={0};//接收缓存
bit recFlag=0;//为1代表串口接收到了数据

void init_uart();
void dat_check();
void datfig();
void datclear();
void datsent(uchar catdat);
void sendc(uchar *pd);
void UART_INT(void);
void delay(uint z);

/*-----------------------------------------
      串口通信初始化
-----------------------------------------*/
void init_uart()
{
	 EA=0;
	 PCON=0x00;//smod=0波特率正常
	 SCON=0x50;//串口工作方式1,允许接收
	 TMOD=0x20;//定时器1,工作方式2,8位自动装载
	 TH1=0xfd;
	 TL1=0xfd;//设定波特率为9600
	 ET1=0;//不允许定时器1中断       
	 TR1 = 1; //启动定时器1 
	 RI=0;
	 TI=0;
	 IE=0x90;//单片机中断开,串口中断开
}

/*------------------------------------------
           数据发送
------------------------------------------*/

void datsent(uchar catdat)
{
	SBUF=catdat;
	while(TI==0);
	TI=0;
}
void sendc(uchar *pd)
{
 while((*pd)!='\0')
 {
  datsent(*pd);
  pd++;
 }
}
/*------------------------------------------------
判断数据是否合理
------------------------------------------------*/
void dat_check()
{
	static uchar count;//静态局部变量用于数据的计数
	uchar i;
	if(recdat[0]==0xa5)//
	 {
			count=1; 
	 }
  if(count==1&&recdat[1]==0x5a) 
	{  
		count=2; 
		
	}
	if(count==2&&recdat[2]==0x06) 
	{  
		count=3; 
		
	}
	if(count==3&&recdat[3]==0x80) 
	{  
		count=4;
		i=0;
		
	}
 while(count>=4&&count<9)
 {     
		b[i]=recdat[count];//存入甲醛浓度信息
		count ++;
	  i++;
 }

 if(count==9&&recdat[8]==0xaa)
	 {      
			recFlag=1;//数据接收标志位置1,通知主程序已接收到有效数据
			count=0;   //计数变量清零为下次接收做准备         
	 }	 
}
/*----------------------------------------------------
数据处理
-----------------------------------------------------*/
void datfig()
{
	ch2o=b[2]*256+b[3];
	//if(ch2o>60)
	//{
		//feng=0;
	//}
	//else feng=1;
	f[0]=0x30+ch2o/10000;
	f[1]=0x30+(ch2o/1000)%10;
	f[2]=0x30+(ch2o/100)%10;
	f[4]=0x30+(ch2o/10)%10;
	f[5]=0x30+ch2o%10;
	now_dat2[37]=0x30+ch2o/10000;
	now_dat2[38]=0x30+(ch2o/1000)%10;
	now_dat2[39]=0x30+(ch2o/100)%10;
	now_dat2[40]='.';
	now_dat2[41]=0x30+(ch2o/10)%10;
	now_dat2[42]=0x30+ch2o%10;
}
/*----------------------------------------------------
数据缓存清零
-----------------------------------------------------*/
void datclear()
{
	recdat[0]=0;
	recdat[1]=0;
	recdat[2]=0;
	recdat[3]=0;
	recdat[4]=0;
	recdat[5]=0;
	recdat[6]=0;
	recdat[7]=0;
	recdat[8]=0;
}
/*----------------------------------------------------
显示相关程序段
-----------------------------------------------------*/

/*------------------------------------------------
              判忙函数
------------------------------------------------*/
 bit lcd_busy()
 {                          
    bit result;
    LCD_RS = 0;
    LCD_RW = 1;
    LCD_EN = 1;//RS=L,RW=H,E=H,1602状态可读
    delayNOP();
    result =mang;
    LCD_EN = 0;
    return result; 
 }
/*------------------------------------------------
              写命令函数
------------------------------------------------*/
 void lcd_wcmd(uchar cmd)
{                          
    while(lcd_busy()==1);
    LCD_RS = 0;
    LCD_RW = 0;//RS=L,RW=L,写指令
    LCD_EN = 0;
    _nop_();
    _nop_(); 
    P2=cmd;
    delayNOP();
    LCD_EN = 1;//E=H,产生高脉冲
    delayNOP();
    LCD_EN = 0; 
    delay(10);
}
/*------------------------------------------------
              写数据函数
------------------------------------------------*/
 void lcd_wdat(uchar dat)
{                          
    while(lcd_busy()==1);
    LCD_RS = 1;
    LCD_RW = 0;
    LCD_EN = 0;
    P2=dat;
    delayNOP();
    LCD_EN = 1;
    delayNOP();
    LCD_EN = 0; 
    delay(10);
}
/*------------------------------------------------
                清屏函数
------------------------------------------------*/
 void LCD_Clear(void) 
 { 
 lcd_wcmd(0x01); 
 delay(5);
 }
 /*-------------------------------------------------
 --------------------------------------------------*/
 void lcd_pos(uchar pos)
{                          
  lcd_wcmd(pos|0x80);//80H+地址码
}
/*------------------------------------------------
              1602初始化
------------------------------------------------*/
 void lcd_init()
{    
    delay(15);   
    lcd_wcmd(0x38); 
    delay(5);
    lcd_wcmd(0x38);         
    delay(5);
    lcd_wcmd(0x38);         
    delay(5);
		while(lcd_busy()==1);//忙则等待
		lcd_wcmd(0x38);
		while(lcd_busy()==1);
		lcd_wcmd(0x08);
		while(lcd_busy()==1);
		lcd_wcmd(0x01);      
		while(lcd_busy()==1);
		while(lcd_busy()==1);
    lcd_wcmd(0x0c);      
		while(lcd_busy()==1);
		lcd_wcmd(0x06);
    delay(5);
		while(lcd_busy()==1);
    lcd_wcmd(0x01);      
    delay(5);
}
/*------------------------------------------------
            显示函数
------------------------------------------------*/
 void LCD_Write_kaiji( ) 
 {   
		uchar num;
	  lcd_pos(0x00);
		for(num=0;num<14;num++)
		{
			lcd_wdat(d[num]);
			delay(20);
		}
		lcd_pos(0x40);
		for(num=15;num<29;num++)
		{
			lcd_wdat(d[num]);
			delay(20);
		}
}
/*------------------------------------------------
              工作显示
------------------------------------------------*/
 void LCD_Write_work1( ) 
 {   
		uchar num;
	  
	  lcd_pos(0x00);
		for(num=0;num<14;num++)
		{
				lcd_wdat(e[num]);
				delay(2);
		}
		f[3]='.';
		f[7]='p';
		f[8]='p';
		f[9]='m';
		lcd_pos(0x43);
		num=3;
		lcd_wdat(f[num]);
		lcd_pos(0x46);
		for(num=7;num<10;num++)
		{
			lcd_wdat(f[num]);
			delay(2);
		}
 }
 /*------------------------------------------------
              工作显示
------------------------------------------------*/
 void LCD_Write_work2( ) 
 {   
		uchar num;
	  lcd_pos(0x40);
		for(num=0;num<3;num++)
		{
			lcd_wdat(f[num]);
			delay(2);
		}
		
		lcd_pos(0x44); 
		for(num=4;num<6;num++)
		{
			lcd_wdat(f[num]);
			delay(2);
		}
 }
 /*-----------------------------------
              蜂鸣器函数
 -----------------------------------*/
void fm()
{
	if(ch2o>60)
		{
			feng=0;
		}
		else feng=1;
		yun_dat();
}
/*-----------------------------------------
          1ms延时函数
------------------------------------------*/
void delay(uint z)
{
	uint x,y;
	for(x=z;x>0;x--)
		for(y=114;y>+0;y--);
}
/*------------------------------------------
             主函数
------------------------------------------*/
void main( )
{
	init_uart();
	LCD_Clear();
	lcd_init();
	LCD_Write_kaiji();
	//init_uart();
  wlan_link();
	wlan_cipsend();
  yun_land();	
	delay(6000);
	LCD_Clear();
	LCD_Write_work1();
	while(1)
	{
		recFlag=0;
	while(recFlag==0)
	{
		in_num=0;
		sendc(a);
		delay(2000);
		dat_check();
		//delay(2000);
	}
		datfig();
	  delay(2000);
		yun_dat();
		LCD_Write_work2();
		//if(ch2o>60)
		//{
			//feng=0;
		//}
		//else feng=1;
		//yun_dat();
		fm();
		datclear();
	}
}
/******************************************* 
            中断服务程序
 ******************************************/
void UART_INT(void) interrupt 4
{ 
	if(RI)
	{
	RI=0;
	recdat[in_num]=SBUF;
	in_num++;
	if(in_num>9)
	{
		in_num=0;
	}
  }
}
/*--------------------------

----------------------------*/
void wlan_cipsend()
{
sendc(wlan_cipm);
delay(500);
sendc(wlan_cips);
delay(500);
}
/*-------------------------
-------------------------*/
void wlan_link()
{
sendc(wlan_mode);
delay(500);
sendc(wlan_lj);
delay(15000);
sendc(fwqlj);
delay(1000);
}
/*------------------------
-------------------------*/
void yun_dat()
{
//sendc(now_dat);
//delay(2000);
//sendc(now_dat1);
//delay(2000);
//sendc(now_dat1);
//delay(2000);
//sendc(now_dat);
//delay(2000);
sendc(now_dat2);
delay(2000);
sendc(now_dat2);
}
void yun_land()
{
sendc(wlan_land);
delay(2000);
}

简单的云端数据上传,基于ESP8266-01,使用C51单片机控制。毕业答辩结束了现在公开代码吧。这里有一个问题,在上传数据时,每第二次数据才能被上传,不知道问题出在哪里,望大神指导