找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7543|回复: 11
收起左侧

基于51单片机的无线温湿度控制系统

  [复制链接]
ID:502576 发表于 2019-4-1 17:40 | 显示全部楼层 |阅读模式
02.png 01.png
  1. 发射_DHT11程序
  2. //宏定义
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. //头函数
  6. #include <reg51.h>
  7. #include <intrins.h>
  8. //无线模块
  9. #include "api.h"
  10. #include "nRF24L01P.h"
  11. #include "DHT11.h"


  12. //LED 管脚定义
  13. sbit TXLED_R=P1^3;
  14. sbit RXLED_Y=P1^5;


  15. //主机询问命令
  16. uchar CMD[]={0xaa,0xbb,0xcc,0xdd};

  17. //主函数
  18. void main()
  19. {
  20.         TXLED_R=0;                                          //初始化LED
  21.         RXLED_Y=0;
  22.         init_io();                              //无线初始化IO
  23.         RX_Mode();                              //设置为接收模式
  24.         TXLED_R=1;
  25.         RXLED_Y=1;
  26.         //循环执行
  27.         while(1)
  28.         {
  29.                 sta = SPI_Read(STATUS);          //读状态寄存器
  30.             if(RX_DR)                                     //判断是否接受到数据
  31.                 {
  32.                         SPI_Read_Buf(RD_RX_PLOAD, RX_BUF, TX_PLOAD_WIDTH);  //从RX FIFO读出数据
  33.                         flag = 1;
  34.                         RXLED_Y=0;                          //打开接收指示灯
  35.                 }
  36.                 SPI_RW_Reg(WRITE_REG + STATUS, sta);  //清除RX_DS中断标志
  37.                 if(flag)                              //接受完成
  38.                 {
  39.                         flag = 0;                        //清标志
  40.                         //命令为主机询问
  41.                         if(RX_BUF[0]==CMD[0]&&RX_BUF[1]==CMD[1]&&RX_BUF[2]==CMD[2]&&RX_BUF[3]==CMD[3])
  42.                         {
  43.                                 //打开接收成功指示
  44.                                 //无线答应信号湿度 温度       
  45.                                 RH();                                //DHT11读取               
  46.                                 TX_BUF[0]=0xaa;
  47.                                 //T温度
  48.                                 TX_BUF[1]=U8T_data_H;
  49.                                 //RH湿度
  50.                                 TX_BUF[2]=U8RH_data_H;
  51.                                 TX_BUF[3]=0xdd;
  52.                                 delay_ms(100);
  53.                                 RXLED_Y=1;                        //关闭接受射指示灯
  54.                                 TXLED_R=0;                        //打开发射指示灯
  55.                                 TX_Mode(TX_BUF);        // 把nRF24L01设置为发送模式并发送数据
  56.                                 Check_ACK(1);        // 等待发送完毕,清除TX FIFO
  57.                                 delay_ms(100);       
  58.                                 //发送成功指示
  59.                                 TXLED_R=1;                        //关闭发射指示灯
  60.                                 RX_Mode();                           // 设置为接收模式               
  61.                         }
  62.                 }
  63.         }
  64. }
复制代码
  1. 接收_温湿度控制程序
  2. //宏定义
  3. #define uchar unsigned char
  4. #define uint unsigned int


  5. //头函数
  6. #include <reg51.h>
  7. #include <intrins.h>
  8. //屏幕函数调用
  9. #include "Lcd.h"   
  10. //无线模块
  11. #include "api.h"
  12. #include "nRF24L01P.h"
  13. //继电器定义
  14. sbit jiangwen=P3^5;
  15. sbit shengwen=P3^4;
  16. sbit choushi=P3^3;
  17. sbit jiashi=P3^2;
  18. //LED 管脚定义
  19. sbit TXLED_R=P1^3;
  20. sbit RXLED_Y=P1^5;
  21. //蜂鸣器
  22. sbit Feng=P1^2;
  23. //蜂鸣器闪烁标志位
  24. bit shan=0;
  25. #include "KEY.h"



  26. //主机询问命令
  27. uchar CMD[]={0xaa,0xbb,0xcc,0xdd};
  28. uchar Mode=0;
  29. uchar temp=0;
  30. uchar KK=0;
  31. //报警温湿度
  32. uchar TNumber=30,RHNumber=50,TX=20,HX=40;

  33. //主函数
  34. void main()
  35. {
  36.         TH0=0x4b;
  37.         TL0=0xff;//赋初值
  38.         TMOD=0x01;//设置工作方式
  39.         EA=1;//打开中断总开关
  40.         ET0=1;//打开允许开关
  41.         TR0=1;
  42.         //LCD初始化显示
  43.         Init_LCD();
  44.         delay_ms(250);
  45.         TXLED_R=0;                                          //初始化
  46.         RXLED_Y=0;
  47.         init_io();                           //无线初始化IO
  48.         RX_Mode();                           //设置为接收模式
  49.         TXLED_R=1;
  50.         RXLED_Y=1;
  51.         /////////////////////////////////////////////
  52.         TXLED_R=0;                                          //发送指示灯
  53.         ////////////////////////////////////////////////////////////////////////////////
  54.         //循环显示
  55.         while(1)
  56.         {
  57.                 TXLED_R=0;                                          //发送指示灯       
  58.            TX_ACK();                                      //发送询问信号       
  59.                 sta = SPI_Read(STATUS);                  //读状态寄存器
  60.                 TXLED_R=1;                                          //发送指示灯       
  61.                 if(RX_DR)                                           //判断是否接受到数据
  62.                 {
  63.                         SPI_Read_Buf(RD_RX_PLOAD, RX_BUF, TX_PLOAD_WIDTH);  // 从RX FIFO读出数据
  64.                         flag = 1;
  65.                 }
  66.                 delay_ms(100);
  67.                 SPI_RW_Reg(WRITE_REG + STATUS, sta);  // 清除RX_DS中断标志
  68.                 if(flag==1)                            // 接受完成
  69.                 {
  70.                         Mode=0;
  71.                         flag=0;
  72.                 }
  73.                 else                                                 //设备丢失
  74.                 {
  75.                         Mode=1;
  76.                 }       

  77.                 //显示
  78.                 //数据显示
  79.                 if(Mode==0)
  80.                 {               
  81.                         RXLED_Y=0;                               
  82.                         if(temp!=1)//重新初始化
  83.                         {
  84.                                 display1();
  85.                                 temp=1;
  86.                         }
  87.                         display2(RX_BUF[1],RX_BUF[2]);//显示读数
  88.                         if(RX_BUF[1]>TNumber) //温度超标降温
  89.                         {
  90.                                 jiangwen=0;
  91.                         }
  92.                         else
  93.                         {
  94.                                 jiangwen=1;
  95.                         }
  96.                         if(RX_BUF[1]<TX) //温度过低升温
  97.                         {
  98.                                 shengwen=0;
  99.                         }
  100.                         else
  101.                         {
  102.                                 shengwen=1;
  103.                         }
  104.                         if(RX_BUF[2]>RHNumber) //湿度超标抽湿
  105.                         {
  106.                                 choushi=0;
  107.                         }
  108.                         else
  109.                         {
  110.                                 choushi=1;
  111.                         }
  112.                         if(RX_BUF[2]<HX) //湿度过低加湿
  113.                         {
  114.                                 jiashi=0;
  115.                         }
  116.                         else
  117.                         {
  118.                                 jiashi=1;
  119.                         }
  120.                         if(((RX_BUF[1]>TNumber||RX_BUF[2]>RHNumber||RX_BUF[1]<TX||RX_BUF[2]<HX))&&(shan==1)) //超阀值蜂鸣器报警
  121.                         {
  122.                                 Feng=0;
  123.                         }
  124.                         else
  125.                         {
  126.                                 Feng=1;
  127.                         }
  128.                         RXLED_Y=1;       
  129.                 }
  130.                 //读取键值
  131.                 KK=KEY_();
  132.                 if(KK==3)//调整模式
  133.                 {
  134.                         Mode=2;
  135.                         KK=0;
  136.                 }
  137.                 //数据显示不在线
  138.            if(Mode==1)
  139.                 {
  140.                         if(temp!=2)
  141.                                 NoLine();//设备丢失
  142.                         temp=2;
  143.                 }
  144.                 //键盘
  145.                 else if(Mode==2)
  146.                 {
  147.                         temp=3;
  148.                         display3();
  149.                         display4(TNumber,RHNumber,TX,HX);
  150.                         write_com(0x0f);//打开光标
  151.                         write_com(0x80+5);
  152.                         //调温上限
  153.                         while(KK!=3)
  154.                         {
  155.                                 //读取键值
  156.                                 KK=KEY_();
  157.                                 if(KK==1)//++
  158.                                 {
  159.                                         TNumber++;
  160.                                         if(TNumber==51)
  161.                                                 TNumber=50;
  162.                                         display4(TNumber,RHNumber,TX,HX);
  163.                                         write_com(0x0f);//打开光标
  164.                                         write_com(0x80+5);
  165.                                 }
  166.                                 if(KK==2)//--       
  167.                                 {
  168.                                         TNumber--;
  169.                                         if(TNumber==TX)
  170.                                                 TNumber++;
  171.                                         display4(TNumber,RHNumber,TX,HX);
  172.                                         write_com(0x0f);//打开光标
  173.                                         write_com(0x80+5);                               
  174.                                 }
  175.                         }
  176.                         KK=0;
  177.                         write_com(0x0f);//打开光标
  178.                         write_com(0x80+0x40+5);
  179.                         //调温x下限
  180.                         while(KK!=3)
  181.                         {
  182.                                 //读取键值
  183.                                 KK=KEY_();
  184.                                 if(KK==1)//++
  185.                                 {
  186.                                         TX++;
  187.                                         if(TX==TNumber)
  188.                                                 TX--;
  189.                                         display4(TNumber,RHNumber,TX,HX);
  190.                                         write_com(0x0f);//打开光标
  191.                                         write_com(0x80+0x40+5);
  192.                                 }
  193.                                 if(KK==2)//--       
  194.                                 {
  195.                                         TX--;
  196.                                         if(TX==0xff)
  197.                                                 TX=0;
  198.                                         display4(TNumber,RHNumber,TX,HX);
  199.                                         write_com(0x0f);//打开光标
  200.                                         write_com(0x80+0x40+5);                               
  201.                                 }
  202.                         }
  203.                         KK=0;
  204.                         write_com(0x0f);//打开光标
  205.                         write_com(0x80+14);
  206.                         //调湿 上
  207.                         while(KK!=3)
  208.                         {
  209.                                 //读取键值
  210.                                 KK=KEY_();       
  211.                                 if(KK==1)//++
  212.                                 {
  213.                                         RHNumber++;
  214.                                         if(RHNumber==91)
  215.                                                 RHNumber=90;
  216.                                         display4(TNumber,RHNumber,TX,HX);
  217.                                         write_com(0x0f);//打开光标
  218.                                         write_com(0x80+14);
  219.                                 }
  220.                                 if(KK==2)//--       
  221.                                 {
  222.                                         RHNumber--;
  223.                                         if(RHNumber==HX)
  224.                                                 RHNumber++;       
  225.                                         display4(TNumber,RHNumber,TX,HX);
  226.                                         write_com(0x0f);//打开光标
  227.                                         write_com(0x80+14);                       
  228.                                 }
  229.                         }
  230.                         KK=0;
  231.                         write_com(0x0f);//打开光标
  232.                         write_com(0x80+0x40+14);
  233.                                 //调湿 下
  234.                         while(KK!=3)
  235.                         {
  236.                                 //读取键值
  237.                                 KK=KEY_();       
  238.                                 if(KK==1)//++
  239.                                 {
  240.                                         HX++;
  241.                                         if(HX==RHNumber)
  242.                                                 HX--;
  243.                                         display4(TNumber,RHNumber,TX,HX);
  244.                                         write_com(0x0f);//打开光标
  245.                                         write_com(0x80+0x40+14);
  246.                                 }
  247.                                 if(KK==2)//--       
  248.                                 {
  249.                                         HX--;
  250.                                         if(HX==19)
  251.                                                 HX=20;       
  252.                                         display4(TNumber,RHNumber,TX,HX);
  253.                                         write_com(0x0f);//打开光标
  254.                                         write_com(0x80+0x40+14);                       
  255.                                 }
  256.                         }
  257.                         KK=0;
  258.                 }
  259.                 delay_ms(200);       
  260.                 delay_ms(200);
  261.                 delay_ms(200);               
  262.         }
  263. }
  264. void time0() interrupt 1//定时器函数
  265. {
  266.         uchar m;
  267.         TH0=0x4b;
  268.         TL0=0xff;//重新赋初值
  269.         m++;
  270.         if(m==4)
  271.         {
  272.                 shan=~shan;       
  273.                 m=0;
  274.         }
  275. }

复制代码

基于51单片机的无线温湿度控制系统.rar (542.46 KB, 下载次数: 245)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:452816 发表于 2019-4-4 19:11 | 显示全部楼层
学习到了!
回复

使用道具 举报

ID:486067 发表于 2019-4-10 10:59 | 显示全部楼层
感谢楼主,帮了我的大忙
回复

使用道具 举报

ID:496361 发表于 2019-5-8 00:10 | 显示全部楼层
求仿真啊楼主 跪求 有偿
回复

使用道具 举报

ID:528782 发表于 2019-5-13 14:58 | 显示全部楼层
楼主这是属于什么协议进行通信?
回复

使用道具 举报

ID:282650 发表于 2019-12-9 08:45 | 显示全部楼层
改一下应该可以多从机
回复

使用道具 举报

ID:662516 发表于 2019-12-13 19:28 | 显示全部楼层
轰多尼?
回复

使用道具 举报

ID:662516 发表于 2019-12-13 19:32 | 显示全部楼层
牛皮
回复

使用道具 举报

ID:701576 发表于 2020-3-3 10:35 | 显示全部楼层
请问能给一个最基础的51单片机控制温湿度的解释吗,小白求助
回复

使用道具 举报

ID:722714 发表于 2020-4-5 17:44 | 显示全部楼层
为什么要继电器驱动
回复

使用道具 举报

ID:543424 发表于 2020-4-23 19:56 | 显示全部楼层
为什么我下载测试,接收连通了开机始终采集不到?温度和湿度显示都是0,请问是什么问题求指导谢谢。
回复

使用道具 举报

ID:368810 发表于 2020-5-10 20:35 | 显示全部楼层
proteus仿真有吗,楼主
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表