發(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++; } }
|