发射模块主要程序: 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++; } }
|