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