|
无线温湿度监测(NRF24L01+89c52+12864串行显示+DS18B20+DHT11)
部分代码如下:
想要一对多通信,经过简单修改即可
- /****************************************************************************************/
- /*NRF24L01要更改收发端,只需要通过是否宏定义RX即可,#define RX为接收端,不定义则为发送端*/
- /***************************************************************************************/
- /**************************************************************************************/
- /*通过DS18B20测试当前环境温度, 通过DHT11测试湿度,并通过12864串行显示当前温度值********/
- /*目前显示范围: 温度-55~ +125摄氏度,湿度20%-95% 湿度测量误差:+-5%*******************/
- /*************************************************************************************/
- #include "reg52.H"
- #include "intrins.h"
- #include "math.H" //要用到取绝对值函数abs()
- #include "DELAY.H"
- #include "DS18B20.H"
- #include "12864.h"
- #include "DHT11.H"
- #include "nRF24L01.H"
- #define uchar unsigned char
- #define uint unsigned int
- //#define RX //接收端则要定义此,由于采用条件编译,所以会在不同情况时,有函数没被用到,报warning可不用在意
- extern uchar U8RH_data_H,U8RH_data_L; //需要应用到DHT11中的湿度全局变量
- int tempValue; //温度数据用了全局变量
-
- uchar Rx_Buf[RX_PLOAD_WIDTH];
- uchar Tx_Buf[TX_PLOAD_WIDTH];
- /*MAIN*/
- void main()
- {
- unsigned char TMPS[] = {0,0,0,0x2e,0,0};
- unsigned char RHS[] = {0,0,0x2e,0,0x25};
- uchar i,RH_H,RH_L,tmp_H,tmp_L,TMP; uint tmp;int TMP_Value,tmpvalue;
- float t;
- LCD_INIT(); //LCD12864定义
- while(1)
- {
- #ifndef RX //条件编译
- DS_sendChangeCmd(); //启动DS18B20温度转换
- DS_sendReadCmd(); //发送DS18B20读取数据命令
- tmp_L = DS18B20_RByte(); /*读取的两个字节分别写入tmp_L和tmp_H
- */
- tmp_H = DS18B20_RByte();
- RH(); //DHT11初始化
- RH_H= U8RH_data_H; //全局定义的湿度高八位给RH_H暂存
- RH_L= U8RH_data_L; //全局定义的湿度低八位给RH_L暂存
- SPI_RW(FLUSH_TX); //清寄存器
- Tx_Buf[0] = tmp_L; //温度低八位
- Tx_Buf[1] = tmp_H; //温度高八位
- Tx_Buf[2] = RH_L; //湿度低八位
- Tx_Buf[3] = RH_H; //湿度高八位
- NRF24L01_Init_TX(1); //初始化,用通道1发送
- nRF24L01_TxPacket(Tx_Buf); //发送TX寄存器数据
- Tx_Buf[0] = 0;
- Tx_Buf[1] = 0;
- Tx_Buf[2] = 0;
- Tx_Buf[3] = 0;
-
- #endif
-
- #ifdef RX //条件编译
-
- NRF24L01_Init_RX(1); //接收时先初始化NRF24L01,注意为Init_RX(1),通道1接收
- nRF24L01_RxPacket(Rx_Buf); //读取RX寄存器内数据
-
- /*温湿度处理*/
-
- lcd_setaddr(1,0); //“温度”汉字在LCD12864显示位置
- lcd_putstr("温度:");
-
- /*温湿度高低八位分别暂存*/
- tmp_L = Rx_Buf[0];
- tmp_H = Rx_Buf[1];
- RH_L = Rx_Buf[2];
- RH_H = Rx_Buf[3];
-
- /*温度数据处理*/
-
- TMP_Value = tmp_H;
- TMP_Value <<= 8;
- TMP_Value |= tmp_L;
- t = TMP_Value * 0.0625;
- TMP_Value = t * 100 + (TMP_Value > 0 ? 0.5 : -0.5);
- tempValue = TMP_Value;
- tmp = abs(tempValue);
- TMPS[0] = 0x30+tmp / 10000;
- TMPS[1] = 0x30+tmp % 10000 / 1000;
- TMPS[2] = 0x30+tmp % 1000 / 100;
- TMPS[4] = 0x30+tmp % 100 / 10;
- TMPS[5] = 0x30+tmp % 10;
- /*****************/
- lcd_setaddr(1,3); //LCD12864温度数据写入位置
- for(i = 0;i<6;i++)
- {
- lcd_wdata(TMPS[i]); //连续写入温度数据到LCD12864
- }
- lcd_setaddr(1,6); //写入“℃”在LCD12864的显示位置
- lcd_putstr("℃");
-
- /*以下为湿度*/
-
- lcd_setaddr(2,0);
- lcd_putstr("湿度:");
-
- /*湿度数据处理*/
-
- RHS[0] = 0x30+RH_H/10;
- RHS[1] = 0x30+RH_H%10;
- RHS[3] = 0x30+RH_L/10;
- /* *************** */
- lcd_setaddr(2,3); //LCD12864湿度数据显示位置
- for(i = 0;i<5;i++)
- {
- lcd_wdata(RHS[i]); //连续写入湿度数据到LCD12864
- }
- #endif
- }
- }
复制代码
|
评分
-
查看全部评分
|