创作者:新用户 | 更新日期: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单片机控制。毕业答辩结束了现在公开代码吧。这里有一个问题,在上传数据时,每第二次数据才能被上传,不知道问题出在哪里,望大神指导