創作者:新用戶 | 更新日期: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單片機控制。畢業答辯結束了現在公開代碼吧。這里有一個問題,在上傳數據時,每第二次數據才能被上傳,不知道問題出在哪里,望大神指導