标题: 室内甲醛浓度检测及无线显示系统设计 代码 [打印本页]
作者: 方507 时间: 2017-4-7 18:08
标题: 室内甲醛浓度检测及无线显示系统设计 代码
发射模块主要程序:
void main()
{
uchar TxBuf[20]={0}; //清空发送缓存区
uchar RxBuf[20]={0}; //清空接收缓存区
SCON = 0x50; //设置8-bit控制串口寄存器
TMOD = 0x20; //设置定时器Timer1频率
TH1 = TL1 = 0xfd; //设置定时器高八位和低八位
TR1 = 1; //启动定时器Timer1
ES = 1;
EA = 1; //开中断
// send_write("STC12C5A60S2\r\nUart Test !\r\n");
init_NRF24L01() ; //初始化nrf24L01
nRF24L01_TxPacket(TxBuf); //缓存区数据放入nrf24L01
delay(80000);
while(1)
{
TxBuf[0] = 12; //主机对从机发送的起始信息
TxBuf[1] = ch2o/256; //甲醛高位
TxBuf[2] = ch2o%256; //甲醛低位
TxBuf[3] = (ch2o/256)+(ch2o%256); //甲醛浓度计算规则
if(once==1)
{
nRF24L01_TxPacket(TxBuf); // 传送缓存数据
TxBuf[0] = 0; //清缓存
TxBuf[0] = 0;
once=0; //标志位
delay(20000);
}
SetRX_Mode();
nRF24L01_RxPacket(RxBuf);
if(RxBuf[0]==12)
{
once=1;
}
Delay(10000);
RxBuf[0] = 0x00; //清接收缓存寄存器
RxBuf[1] = 0x00;
}
}
void send_init_4() interrupt 4
{
if (RI)
{
RI = 0; //标志位
UART_dat[sign]=SBUF;
switch(sign)
{
case 0:
if(UART_dat[sign]==0xFF) //发送起始位
{
sign=1;
}else
{
sign=0;
}
break;
case 1:
if(UART_dat[sign]==0x17) //判断气体名称是否为CH2O
{
sign=2;
}else
{
sign=0;
}
break;
case 2:
if(UART_dat[sign]==0x04) //判断单位是否为ppm
{
sign=3;
}else
{
sign=0;
}
break;
case 3:
if(UART_dat[sign]==0x00) //数据高位
{
sign=4;
}else
{
sign=0;
}
break;
case 4:
sign=5; //数据低位
break;
case 5:
sign=6;
break;
case 6:
if(UART_dat[sign]==0x13) //判断满量程高位
{
sign=7;
}else
{
sign=0;
}
break;
case 7:
if(UART_dat[sign]==0x88) //判断满量程低位
{
sign=8;
}else
{
sign=0;
}
break;
case 8: /进行信息的校验,判断要不要接收
if((UART_dat[sign]+UART_dat[1]+UART_dat[2]+UART_dat[3]+UART_dat[4]+UART_dat[5]+UART_dat[6]+UART_dat[7])%256==0)
{
ch2o=UART_dat[4]*256+UART_dat[5];
ch2o=ch2o*13.392857; //单位由ppm转mg/m^2
sign=0;
once=1;
send(0x30+ch2o/1000%10); //发送小数点后第一位
send(0x30+ch2o/100%10); //发送小数点后第二位
send(0x30+ch2o/10%10); //发送小数点后第三位
send(0x30+ch2o%10); //发送小数点后第四位
send_write("\r\n");
}else
{
sign=0;
}
break;
}
}
接收模块主要程序:
uint ch2o_H,ch2o;
uchar ms,sec;
bit beep1,send;
void delay(uint T) //延时函数
{
while(T--);
}
void LCD1602_write(uchar order,dat) //1602 一个字节 处理
{
LCD1602_e=0;
LCD1602_rs=order;
LCD1602_dat=dat;
LCD1602_rw=0;
LCD1602_e=1;
delay(20);
LCD1602_e=0;
}
void LCD1602_writebyte(uchar *prointer) //1602 字符串 处理
{
while(*prointer!='\0')
{
LCD1602_write(1,*prointer);
prointer++;
}
}
void LCD1602_cls() //1602 初始化
{
LCD1602_write(0,0x01); //清屏
delay(15000);
LCD1602_write(0,0x38); // 设置5*7点阵
delay(1500);
LCD1602_write(0,0x0c); //开显示屏,不显示光标
LCD1602_write(0,0x06); //写入字符且光标右移
LCD1602_write(0,0xd0);
delay(15000);
}
void show() //显示数据
{
LCD1602_write(0,0x80); //显示第一行
LCD1602_writebyte("CH2O:");
LCD1602_write(1,0x30+ch2o/10000%10); //显示小数点前一位
LCD1602_writebyte("."); //显示小数点
LCD1602_write(1,0x30+ch2o/1000%10); //显示小数点后第一位
LCD1602_write(1,0x30+ch2o/100%10); //显示小数点后第二位
LCD1602_write(1,0x30+ch2o/10%10); //显示小数点后第三位
LCD1602_write(1,0x30+ch2o%10); //显示小数点后第四位
LCD1602_writebyte("mg/m3"); //显示单位
LCD1602_write(0,0xc0); //显示第二行
LCD1602_writebyte("CH2O_H:");
LCD1602_write(1,0x30+ch2o_H/100%10); //显示小数点前一位
LCD1602_writebyte(".");
LCD1602_write(1,0x30+ch2o_H/10%10); //显示小数点后第一位
LCD1602_write(1,0x30+ch2o_H%10); //显示小数点后第二后
LCD1602_writebyte("mg/m3"); //显示单位
}
void proc()
{
if(ch2o/100>=ch2o_H) //超过设定值
{
led_1=1; //1灯亮,2灯灭
led_2=0;
beep1=1;
}else
{
led_1=0; //1灯灭,2灯亮
led_2=1;
beep1=0;
}
}
void key()
{
if(!key_1)
{
ms=sec=0;
delay(8888); //按键去抖
if(!key_1)
{
if(ch2o_H<700)ch2o_H++; //按键加
ms=sec=0;
while(!key_1)
{
show();
proc();
}
IapEraseSector(0x0000);
IapProgramByte(0x0000,ch2o_H/256);
IapProgramByte(0x0001,ch2o_H%256);
}
}
if(!key_2)
{
ms=sec=0;
delay(8888);
if(!key_2)
{
if(ch2o_H>0) ch2o_H--; //按键减
ms=sec=0;
while(!key_2)
{
show();
proc();
}
IapEraseSector(0x0000);
IapProgramByte(0x0000,ch2o_H/256);
IapProgramByte(0x0001,ch2o_H%256);
}
}
}
void main()
{
float Ad_dat=0;
uchar h,l; //定义高位与低位变量
uchar TxBuf[20]={0};
uchar RxBuf[20]={0};
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
ET0=1;
TR0=1;
EA=1;
init_NRF24L01() ;
delay(40000);
nRF24L01_TxPacket(TxBuf);
delay(60000);
LCD1602_cls();
h=IapReadByte(0x0000);
l=IapReadByte(0x0001);
ch2o_H=h*256+l; //高位*256+低位
if(ch2o_H>700) ch2o_H=5000;
while(1)
{
TxBuf[0] = 12;
TxBuf[1] = 0;
if(send==1)
{
nRF24L01_TxPacket(TxBuf); //接收缓冲区的数据
TxBuf[0] = 0x00;
TxBuf[1] = 0x00;
send=0;
delay(20000);
}
SetRX_Mode();
nRF24L01_RxPacket(RxBuf);
if(RxBuf[0]==12)
{
ch2o=RxBuf[1]*256+RxBuf[1];
}
delay(20000);
RxBuf[0] = 0x00;
RxBuf[1] = 0x00;
RxBuf[2] = 0x00;
RxBuf[3] = 0x00;
show(); //调用显示程序
key(); //调用按键程序
proc(); //调用与标准值对比程序
}
}
void UART_1() interrupt 1
{
TH0=0x4c; //定时器初始化
TL0=0x00;
ms++;
if(ms%2==0) //长按按键计数处理
{
if(sec>1) //定时超过1s
{
if(!key_1)
{
if(ch2o_H<700)ch2o_H++;
}
if(!key_2)
{
if(ch2o_H>0) ch2o_H--;
}
}
}
if(ms%10==0) //定时500ms,中断10次
{
send=1;
if(beep1==1)
{
beep=!beep;
}else
{
beep=1;
}
}
if(ms>19) //定时超过1s,中断超过20次
{
ms=0;
sec++;
}
}
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |