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