標(biāo)題: 室內(nèi)甲醛濃度檢測及無線顯示系統(tǒng)設(shè)計 代碼 [打印本頁]
作者: 方507 時間: 2017-4-7 18:08
標(biāo)題: 室內(nèi)甲醛濃度檢測及無線顯示系統(tǒng)設(shè)計 代碼
發(fā)射模塊主要程序:
void main()
{
uchar TxBuf[20]={0}; //清空發(fā)送緩存區(qū)
uchar RxBuf[20]={0}; //清空接收緩存區(qū)
SCON = 0x50; //設(shè)置8-bit控制串口寄存器
TMOD = 0x20; //設(shè)置定時器Timer1頻率
TH1 = TL1 = 0xfd; //設(shè)置定時器高八位和低八位
TR1 = 1; //啟動定時器Timer1
ES = 1;
EA = 1; //開中斷
// send_write("STC12C5A60S2\r\nUart Test !\r\n");
init_NRF24L01() ; //初始化nrf24L01
nRF24L01_TxPacket(TxBuf); //緩存區(qū)數(shù)據(jù)放入nrf24L01
delay(80000);
while(1)
{
TxBuf[0] = 12; //主機對從機發(fā)送的起始信息
TxBuf[1] = ch2o/256; //甲醛高位
TxBuf[2] = ch2o%256; //甲醛低位
TxBuf[3] = (ch2o/256)+(ch2o%256); //甲醛濃度計算規(guī)則
if(once==1)
{
nRF24L01_TxPacket(TxBuf); // 傳送緩存數(shù)據(jù)
TxBuf[0] = 0; //清緩存
TxBuf[0] = 0;
once=0; //標(biāo)志位
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; //標(biāo)志位
UART_dat[sign]=SBUF;
switch(sign)
{
case 0:
if(UART_dat[sign]==0xFF) //發(fā)送起始位
{
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) //數(shù)據(jù)高位
{
sign=4;
}else
{
sign=0;
}
break;
case 4:
sign=5; //數(shù)據(jù)低位
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: /進(jìn)行信息的校驗,判斷要不要接收
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轉(zhuǎn)mg/m^2
sign=0;
once=1;
send(0x30+ch2o/1000%10); //發(fā)送小數(shù)點后第一位
send(0x30+ch2o/100%10); //發(fā)送小數(shù)點后第二位
send(0x30+ch2o/10%10); //發(fā)送小數(shù)點后第三位
send(0x30+ch2o%10); //發(fā)送小數(shù)點后第四位
send_write("\r\n");
}else
{
sign=0;
}
break;
}
}
接收模塊主要程序:
uint ch2o_H,ch2o;
uchar ms,sec;
bit beep1,send;
void delay(uint T) //延時函數(shù)
{
while(T--);
}
void LCD1602_write(uchar order,dat) //1602 一個字節(jié) 處理
{
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); // 設(shè)置5*7點陣
delay(1500);
LCD1602_write(0,0x0c); //開顯示屏,不顯示光標(biāo)
LCD1602_write(0,0x06); //寫入字符且光標(biāo)右移
LCD1602_write(0,0xd0);
delay(15000);
}
void show() //顯示數(shù)據(jù)
{
LCD1602_write(0,0x80); //顯示第一行
LCD1602_writebyte("CH2O:");
LCD1602_write(1,0x30+ch2o/10000%10); //顯示小數(shù)點前一位
LCD1602_writebyte("."); //顯示小數(shù)點
LCD1602_write(1,0x30+ch2o/1000%10); //顯示小數(shù)點后第一位
LCD1602_write(1,0x30+ch2o/100%10); //顯示小數(shù)點后第二位
LCD1602_write(1,0x30+ch2o/10%10); //顯示小數(shù)點后第三位
LCD1602_write(1,0x30+ch2o%10); //顯示小數(shù)點后第四位
LCD1602_writebyte("mg/m3"); //顯示單位
LCD1602_write(0,0xc0); //顯示第二行
LCD1602_writebyte("CH2O_H:");
LCD1602_write(1,0x30+ch2o_H/100%10); //顯示小數(shù)點前一位
LCD1602_writebyte(".");
LCD1602_write(1,0x30+ch2o_H/10%10); //顯示小數(shù)點后第一位
LCD1602_write(1,0x30+ch2o_H%10); //顯示小數(shù)點后第二后
LCD1602_writebyte("mg/m3"); //顯示單位
}
void proc()
{
if(ch2o/100>=ch2o_H) //超過設(shè)定值
{
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); //接收緩沖區(qū)的數(shù)據(jù)
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(); //調(diào)用顯示程序
key(); //調(diào)用按鍵程序
proc(); //調(diào)用與標(biāo)準(zhǔn)值對比程序
}
}
void UART_1() interrupt 1
{
TH0=0x4c; //定時器初始化
TL0=0x00;
ms++;
if(ms%2==0) //長按按鍵計數(shù)處理
{
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.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |