找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2163|回复: 0
收起左侧

单片机+NRF2401+DHT11远程温湿度控制程序

[复制链接]
ID:198608 发表于 2020-11-21 19:44 | 显示全部楼层 |阅读模式
本设计是基于 STC89C52 单片机和 DHT11 实现温湿度的测量。单片机在本系统中温湿度,时钟输入和显示控制器件,DHT11 被用作温湿度数据的采集和温湿度输出器件。最后采 nRF24L01 模块对采集到的温湿度时间 数据进行无线传输,在接收端通过 LCD1602 液晶显示模块显示接收的温湿度,从而实现温湿度的采集和无线传送。
主要步骤:
1.通过查阅资料,了解无线温湿度采集系统的研究背景、国内外发展状况;
2.熟悉 LCD1602DHT11NRF24L01蜂鸣器 等模块的基功能;
3.熟悉 Keil C51 软件和 STC-ISP 软件;
4.使用 Keil C51 软件编写应用序;
5.使用 STC-ISP 软件将编译的程烧写单片
6.调试并分析;


制作出来的实物图如下:
IMG_20180129_113002_1_副本.jpg IMG_20180129_113032_副本.jpg 1.png 2.png

单片机源程序如下:
  1. #include ".\\nRF24L01\\nRF24L01.h"
  2. #include "def.h"
  3. typedef unsigned char unint8;
  4. typedef unsigned char unint16;
  5. #define uint unsigned int
  6. unint8 com_data,untemp,temp;
  7. uchar  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
  8. uchar  U8FLAG,U8comdata;
  9. uchar  U8count,U8temp;
  10. uchar  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
  11. unint8 respond;
  12. void Delay(unsigned int s)
  13. {
  14.         unsigned int i;
  15.         for(i=0; i<s; i++);
  16.         for(i=0; i<s; i++);
  17. }

  18. /*******************************************************************************************************
  19.                                                                                                                                                                                 DHT11相关命令            
  20. ********************************************************************************************************/
  21. void Delay1(uint j)
  22. {  
  23.         uchar i;
  24.         for(;j>0;j--)
  25.         {         
  26.                 for(i=0;i<27;i++);
  27.         }
  28. }

  29. void  Delay_10us(void)
  30. {
  31.         uchar i;
  32.         i--;
  33.         i--;
  34.         i--;
  35.         i--;
  36.         i--;
  37.         i--;
  38. }




  39. void  COM(void)
  40. {
  41.         uchar i;
  42.         for(i=0;i<8;i++)           
  43.         {
  44.                 U8FLAG=2;        
  45.                 while((!DHT11)&&U8FLAG++);
  46.                 Delay_10us();
  47.                 Delay_10us();
  48.                 Delay_10us();
  49.                 U8temp=0;
  50.                 if(DHT11)U8temp=0;
  51.                 U8FLAG=2;
  52.                 while((DHT11)&&U8FLAG++);
  53.                 //超时则跳出for循环                  
  54.                 if(U8FLAG==0)break;
  55.                 //判断数据位是0还是1         
  56.                 // 如果高电平高过预定0高电平值则数据位为 1
  57.                 U8comdata<<=1;
  58.                 U8comdata|=U8temp;        //
  59.         }
  60. }
  61. //--------------------------------
  62. //-----湿度读取子程序 ------------
  63. //--------------------------------
  64. //----以下变量均为全局变量--------
  65. //----温度高8位== U8T_data_H------
  66. //----温度低8位== U8T_data_L------
  67. //----湿度高8位== U8RH_data_H-----
  68. //----湿度低8位== U8RH_data_L-----
  69. //----校验 8位 == U8checkdata-----
  70. //----调用相关子程序如下----------
  71. //---- Delay();, Delay_10us();,COM();
  72. //--------------------------------

  73. void RH(void)
  74. {
  75.         //主机拉低18ms
  76.         DHT11=0;
  77.         Delay1(180);
  78.         ET0 = 0;//关闭定时器0中断
  79.         DHT11=1;
  80.         //总线由上拉电阻拉高 主机延时20us
  81.         Delay_10us();
  82.         Delay_10us();
  83.         Delay_10us();
  84.         Delay_10us();
  85.         //主机设为输入 判断从机响应信号
  86.         DHT11=0;
  87.         //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行         
  88.         if(!DHT11)                 //T !         
  89.         {
  90.                 U8FLAG=2;
  91.                 //判断从机是否发出 80us 的低电平响应信号是否结束         
  92.                 while((!DHT11)&&U8FLAG++);
  93.                 U8FLAG=2;
  94.                 //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
  95.                 while((DHT11)&&U8FLAG++);
  96.                 //数据接收状态                 
  97.                 COM();
  98.                 U8RH_data_H_temp=U8comdata;
  99.                 COM();
  100.                 U8RH_data_L_temp=U8comdata;
  101.                 COM();
  102.                 U8T_data_H_temp=U8comdata;
  103.                 COM();
  104.                 U8T_data_L_temp=U8comdata;
  105.                 COM();
  106.                 U8checkdata_temp=U8comdata;
  107.                 DHT11=0;
  108.                 ET0 = 1;//开启定时器0中断
  109.                 //数据校验

  110.                 U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
  111.                 if(U8temp==U8checkdata_temp)
  112.                 {
  113.                         U8RH_data_H=U8RH_data_H_temp;
  114.                         U8RH_data_L=U8RH_data_L_temp;
  115.                         U8T_data_H=U8T_data_H_temp;
  116.                         U8T_data_L=U8T_data_L_temp;
  117.                         U8checkdata=U8checkdata_temp;
  118.                 }//fi
  119.         }//fi

  120. }
  121.         

  122. void main(void)
  123. {
  124.         unsigned char leng =0;
  125.         unsigned char tf =0;
  126.         unsigned char TxBuf[20]={0};         //
  127.         unsigned char RxBuf[20]={0};        
  128.         led=0;
  129.     init_io() ;
  130.         while(1)
  131.         {           
  132.                inerDelay_us(100);
  133.                 CE=0;   // chip enable
  134.                 CSN=0;   // Spi disable
  135.                 SCK=0;   
  136.                                 RH();//温湿度检测受定时器影响,故在驱动程序中关闭定时器中断,减小扫描频率才能更好的实现红外接收
  137.                    TxBuf[0] =U8T_data_H;
  138.                    TxBuf[2] =U8RH_data_H;
  139.                    tf = 0 ;
  140.            
  141.             SPI_RW_Reg(WRITE_REG+STATUS, 0xff);      //
  142.             CSN=0;
  143.             SPI_RW(FLUSH_RX);//用于清空FIFO !!关键!!不然会出现意想不到的后果!!!大家记住!!
  144.             CSN=1;                 
  145.            if (tf==0)
  146.        {        
  147.                 led=0;
  148.                         nRF24L01_TxPacket(TxBuf);        // Transmit Tx buffer data
  149.                         TxBuf[0] = 0x00;
  150.                         TxBuf[2] = 0x00;
  151.                         tf=0;
  152.                         Delay(60000);
  153.                         led=0;
  154.            }

  155. ……………………

  156. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有程序51hei提供下载:
程序源码与参考资料.7z (1.93 MB, 下载次数: 77)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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