- 发射_DHT11程序
- //宏定义
- #define uchar unsigned char
- #define uint unsigned int
- //头函数
- #include <reg51.h>
- #include <intrins.h>
- //无线模块
- #include "api.h"
- #include "nRF24L01P.h"
- #include "DHT11.h"
- //LED 管脚定义
- sbit TXLED_R=P1^3;
- sbit RXLED_Y=P1^5;
- //主机询问命令
- uchar CMD[]={0xaa,0xbb,0xcc,0xdd};
- //主函数
- void main()
- {
- TXLED_R=0; //初始化LED
- RXLED_Y=0;
- init_io(); //无线初始化IO
- RX_Mode(); //设置为接收模式
- TXLED_R=1;
- RXLED_Y=1;
- //循环执行
- while(1)
- {
- sta = SPI_Read(STATUS); //读状态寄存器
- if(RX_DR) //判断是否接受到数据
- {
- SPI_Read_Buf(RD_RX_PLOAD, RX_BUF, TX_PLOAD_WIDTH); //从RX FIFO读出数据
- flag = 1;
- RXLED_Y=0; //打开接收指示灯
- }
- SPI_RW_Reg(WRITE_REG + STATUS, sta); //清除RX_DS中断标志
- if(flag) //接受完成
- {
- flag = 0; //清标志
- //命令为主机询问
- if(RX_BUF[0]==CMD[0]&&RX_BUF[1]==CMD[1]&&RX_BUF[2]==CMD[2]&&RX_BUF[3]==CMD[3])
- {
- //打开接收成功指示
- //无线答应信号湿度 温度
- RH(); //DHT11读取
- TX_BUF[0]=0xaa;
- //T温度
- TX_BUF[1]=U8T_data_H;
- //RH湿度
- TX_BUF[2]=U8RH_data_H;
- TX_BUF[3]=0xdd;
- delay_ms(100);
- RXLED_Y=1; //关闭接受射指示灯
- TXLED_R=0; //打开发射指示灯
- TX_Mode(TX_BUF); // 把nRF24L01设置为发送模式并发送数据
- Check_ACK(1); // 等待发送完毕,清除TX FIFO
- delay_ms(100);
- //发送成功指示
- TXLED_R=1; //关闭发射指示灯
- RX_Mode(); // 设置为接收模式
- }
- }
- }
- }
复制代码- 接收_温湿度控制程序
- //宏定义
- #define uchar unsigned char
- #define uint unsigned int
- //头函数
- #include <reg51.h>
- #include <intrins.h>
- //屏幕函数调用
- #include "Lcd.h"
- //无线模块
- #include "api.h"
- #include "nRF24L01P.h"
- //继电器定义
- sbit jiangwen=P3^5;
- sbit shengwen=P3^4;
- sbit choushi=P3^3;
- sbit jiashi=P3^2;
- //LED 管脚定义
- sbit TXLED_R=P1^3;
- sbit RXLED_Y=P1^5;
- //蜂鸣器
- sbit Feng=P1^2;
- //蜂鸣器闪烁标志位
- bit shan=0;
- #include "KEY.h"
- //主机询问命令
- uchar CMD[]={0xaa,0xbb,0xcc,0xdd};
- uchar Mode=0;
- uchar temp=0;
- uchar KK=0;
- //报警温湿度
- uchar TNumber=30,RHNumber=50,TX=20,HX=40;
- //主函数
- void main()
- {
- TH0=0x4b;
- TL0=0xff;//赋初值
- TMOD=0x01;//设置工作方式
- EA=1;//打开中断总开关
- ET0=1;//打开允许开关
- TR0=1;
- //LCD初始化显示
- Init_LCD();
- delay_ms(250);
- TXLED_R=0; //初始化
- RXLED_Y=0;
- init_io(); //无线初始化IO
- RX_Mode(); //设置为接收模式
- TXLED_R=1;
- RXLED_Y=1;
- /////////////////////////////////////////////
- TXLED_R=0; //发送指示灯
- ////////////////////////////////////////////////////////////////////////////////
- //循环显示
- while(1)
- {
- TXLED_R=0; //发送指示灯
- TX_ACK(); //发送询问信号
- sta = SPI_Read(STATUS); //读状态寄存器
- TXLED_R=1; //发送指示灯
- if(RX_DR) //判断是否接受到数据
- {
- SPI_Read_Buf(RD_RX_PLOAD, RX_BUF, TX_PLOAD_WIDTH); // 从RX FIFO读出数据
- flag = 1;
- }
- delay_ms(100);
- SPI_RW_Reg(WRITE_REG + STATUS, sta); // 清除RX_DS中断标志
- if(flag==1) // 接受完成
- {
- Mode=0;
- flag=0;
- }
- else //设备丢失
- {
- Mode=1;
- }
- //显示
- //数据显示
- if(Mode==0)
- {
- RXLED_Y=0;
- if(temp!=1)//重新初始化
- {
- display1();
- temp=1;
- }
- display2(RX_BUF[1],RX_BUF[2]);//显示读数
- if(RX_BUF[1]>TNumber) //温度超标降温
- {
- jiangwen=0;
- }
- else
- {
- jiangwen=1;
- }
- if(RX_BUF[1]<TX) //温度过低升温
- {
- shengwen=0;
- }
- else
- {
- shengwen=1;
- }
- if(RX_BUF[2]>RHNumber) //湿度超标抽湿
- {
- choushi=0;
- }
- else
- {
- choushi=1;
- }
- if(RX_BUF[2]<HX) //湿度过低加湿
- {
- jiashi=0;
- }
- else
- {
- jiashi=1;
- }
- if(((RX_BUF[1]>TNumber||RX_BUF[2]>RHNumber||RX_BUF[1]<TX||RX_BUF[2]<HX))&&(shan==1)) //超阀值蜂鸣器报警
- {
- Feng=0;
- }
- else
- {
- Feng=1;
- }
- RXLED_Y=1;
- }
- //读取键值
- KK=KEY_();
- if(KK==3)//调整模式
- {
- Mode=2;
- KK=0;
- }
- //数据显示不在线
- if(Mode==1)
- {
- if(temp!=2)
- NoLine();//设备丢失
- temp=2;
- }
- //键盘
- else if(Mode==2)
- {
- temp=3;
- display3();
- display4(TNumber,RHNumber,TX,HX);
- write_com(0x0f);//打开光标
- write_com(0x80+5);
- //调温上限
- while(KK!=3)
- {
- //读取键值
- KK=KEY_();
- if(KK==1)//++
- {
- TNumber++;
- if(TNumber==51)
- TNumber=50;
- display4(TNumber,RHNumber,TX,HX);
- write_com(0x0f);//打开光标
- write_com(0x80+5);
- }
- if(KK==2)//--
- {
- TNumber--;
- if(TNumber==TX)
- TNumber++;
- display4(TNumber,RHNumber,TX,HX);
- write_com(0x0f);//打开光标
- write_com(0x80+5);
- }
- }
- KK=0;
- write_com(0x0f);//打开光标
- write_com(0x80+0x40+5);
- //调温x下限
- while(KK!=3)
- {
- //读取键值
- KK=KEY_();
- if(KK==1)//++
- {
- TX++;
- if(TX==TNumber)
- TX--;
- display4(TNumber,RHNumber,TX,HX);
- write_com(0x0f);//打开光标
- write_com(0x80+0x40+5);
- }
- if(KK==2)//--
- {
- TX--;
- if(TX==0xff)
- TX=0;
- display4(TNumber,RHNumber,TX,HX);
- write_com(0x0f);//打开光标
- write_com(0x80+0x40+5);
- }
- }
- KK=0;
- write_com(0x0f);//打开光标
- write_com(0x80+14);
- //调湿 上
- while(KK!=3)
- {
- //读取键值
- KK=KEY_();
- if(KK==1)//++
- {
- RHNumber++;
- if(RHNumber==91)
- RHNumber=90;
- display4(TNumber,RHNumber,TX,HX);
- write_com(0x0f);//打开光标
- write_com(0x80+14);
- }
- if(KK==2)//--
- {
- RHNumber--;
- if(RHNumber==HX)
- RHNumber++;
- display4(TNumber,RHNumber,TX,HX);
- write_com(0x0f);//打开光标
- write_com(0x80+14);
- }
- }
- KK=0;
- write_com(0x0f);//打开光标
- write_com(0x80+0x40+14);
- //调湿 下
- while(KK!=3)
- {
- //读取键值
- KK=KEY_();
- if(KK==1)//++
- {
- HX++;
- if(HX==RHNumber)
- HX--;
- display4(TNumber,RHNumber,TX,HX);
- write_com(0x0f);//打开光标
- write_com(0x80+0x40+14);
- }
- if(KK==2)//--
- {
- HX--;
- if(HX==19)
- HX=20;
- display4(TNumber,RHNumber,TX,HX);
- write_com(0x0f);//打开光标
- write_com(0x80+0x40+14);
- }
- }
- KK=0;
- }
- delay_ms(200);
- delay_ms(200);
- delay_ms(200);
- }
- }
- void time0() interrupt 1//定时器函数
- {
- uchar m;
- TH0=0x4b;
- TL0=0xff;//重新赋初值
- m++;
- if(m==4)
- {
- shan=~shan;
- m=0;
- }
- }
复制代码
基于51单片机的无线温湿度控制系统.rar
(542.46 KB, 下载次数: 245)
|