找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11643|回复: 14
收起左侧

基于51单片机的DHT11温度湿度采集系统制作 含PCB源文件与程序

  [复制链接]
ID:254851 发表于 2018-5-14 16:14 | 显示全部楼层 |阅读模式
  本人使用DHT11和51单片机制作了一个温度湿度检测仪,因为DHT11传感器主要是用于温度的检测,所以实验成品温度的精度还行,湿度可能稍微差一点,然后很多人做温湿度检测器都会使用DS18B20传感器,但我是另辟蹊径,而且和DS18B20 一样DHT11传感器也是一个数字传感器,不需要外加AD转换模块,可以省去较为复杂的硬件电路,但是另一方面,硬件的简化必将带来软件的复杂,所以如果对这个作品感兴趣,欢迎大家下载,文件中包含原理图,元件清单,AD图,程序流程图,程序,实物图,基本上都有。

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
0.png 0.png 0.jpg

单片机源码:
  1. #include <reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #include <intrins.h>
  5. typedef bit BOOL  ;
  6. sbit io = P1^1 ;//(口线定义)
  7. sbit bee= P1^0 ;
  8. sbit rs = P2^5 ;
  9. sbit rw = P2^6 ;
  10. sbit ep = P2^7 ;
  11. sbit led =P1^5 ;
  12. bit flag_300ms ;
  13. sbit K1=P1^2;
  14. sbit K2=P1^3;
  15. sbit K3=P1^4;
  16. uchar yemian=0;//(定义变量)
  17. uchar flat=1;
  18. uchar data_byte;
  19. uchar RH,RL,TH,TL;
  20. uchar WenDu,ShiDu;//报警的温度和湿度
  21. uchar value;
  22. /****************************延时程序****************************/
  23. void delay(uchar ms)
  24. {      //   延时子程序
  25.           uchar i ;
  26.           while(ms--)
  27.           {
  28.                for(i= 0 ; i<120;i++) ;
  29.           }
  30. }
  31. void delay1()//延时10us                        
  32. {
  33. _nop_();
  34. _nop_();
  35. _nop_();
  36. _nop_();
  37. _nop_();
  38. _nop_();
  39. }
  40. /********************报警程序部分*******************/
  41. void warn() //报警函数
  42. {
  43.          
  44.          if(TH>WenDu)  //检测的温度高于设定温度报警值
  45.                                                
  46.     {
  47.      bee=0;                                      //报警
  48.            led=0;delay(10);led=~led;                         //灯快闪烁            
  49.     }      
  50.                   
  51.          if(RH>ShiDu)  //检测的湿度高于设定湿度报警值
  52.                                                
  53.     {
  54.      bee=0;                                      //报警
  55.            led=0;delay(10);led=~led;                         //灯快闪烁
  56.     }      
  57.                   
  58.          if(TH<WenDu  &&  RH<ShiDu )
  59.     {
  60.                     bee=1;                              //停止报警
  61.                     led=1;                              //停止闪烁
  62.           }
  63.                   
  64.   
  65. }
  66. /************************LCD模块******************************************/
  67. BOOL lcd_bz()//测试LCD忙碌状态
  68. {     
  69.           BOOL result ;
  70.           rs = 0 ;
  71.           rw = 1 ;
  72.           ep = 1 ;
  73.           result = (BOOL)(P0 & 0x80) ;
  74.           ep = 0 ;
  75.           return result ;
  76. }
  77. void write_cmd(uchar cmd)// 写指令
  78. {      
  79.         while(lcd_bz()) ;
  80.          rs= 0 ;
  81.          rw= 0 ;
  82.          ep= 0 ;
  83.          P0= cmd ;
  84.          ep= 1 ;
  85.          ep= 0 ;  
  86. }
  87. void write_addr(uchar addr)//写地址
  88. {      
  89.         write_cmd(addr|0x80) ;
  90. }
  91. void write_byte(uchar dat)//写字节
  92. {     
  93.         while(lcd_bz()) ;
  94.       rs = 1 ;
  95.       rw = 0 ;
  96.       ep = 0 ;
  97.       P0 = dat ;
  98.       ep = 1 ;
  99.       ep = 0 ;
  100. }
  101. void lcd_init()// 初始化
  102. {      
  103.           write_cmd(0x38) ;
  104.           delay(1);
  105.           write_cmd(0x08) ;  
  106.           delay(1);
  107.           write_cmd(0x01) ;
  108.           delay(1);
  109.           write_cmd(0x06) ;
  110.           delay(1);
  111.           write_cmd(0x0c) ;
  112.           delay(1);
  113. }
  114. void display(uchar addr, uchar q)//在某一地址上显示一字节
  115. {      
  116.           delay(1) ;
  117.           write_addr(addr) ;
  118.     write_byte(q) ;
  119.           delay(1) ;
  120.          
  121. }
  122. /*********************** DHT11测试模块***************************************/
  123. void start()//开始信号
  124. {
  125.          io=0;
  126.          delay(18);//>18ms
  127.          io=1;
  128.          delay1();//20-40us
  129.          delay1();
  130.          delay1();
  131.          delay1();
  132. }
  133. uchar receive_byte()//接收一个字节
  134. {
  135.          uchari;
  136.          for(i=0;i<8;i++)
  137.          {      
  138.              data_byte<<=1;                                                                   //循环左移
  139.                   while(!io);                                                                        //每发送一位数据间隔50us低电平
  140.                   delay1();delay1();delay1();delay1();        //延迟40us
  141.                   if(io==1)
  142.                   {
  143.                     data_byte=data_byte|0x01;
  144.                     while(io);
  145.                   }
  146.                   else
  147.                   {
  148.                    data_byte=data_byte|0x00;
  149.                   }
  150.          }
  151.          returndata_byte;
  152. }
  153. void receive()//接收数据
  154. {
  155.          ucharT_H,T_L,R_H,R_L,check;
  156.          start();//开始信号
  157.          io=1;
  158.          if(!io)//读取DHT11响应信号
  159.          {
  160.    while(!io) ;                                    //判断输出低电平
  161.    while( io) ;                                                            //判断输出高电平
  162.          R_H=receive_byte();      
  163.          R_L=receive_byte();
  164.          T_H=receive_byte();
  165.          T_L=receive_byte();
  166.          check=receive_byte();
  167.          io=0;                                
  168.          delay1();delay1();delay1();delay1();delay1();//拉低延时50us
  169.          io=1;
  170.          if(R_H+R_L+T_H+T_L==check)                        //矫正
  171.          {
  172.                   RH=R_H;
  173.                   RL=R_L;
  174.                   TH=T_H;
  175.                   TL=T_L;
  176.          }
  177.          }
  178. }
  179. void showw()   // 问候语函数
  180. {     
  181.             lcd_init(); //初始化
  182.             delay(10);
  183.          
  184.             display(0x01,'I');
  185.       display(0x02,' ');
  186.             display(0x03,'a');
  187.             display(0x04,'m');
  188.             display(0x05,' ');
  189.             display(0x06,'s');
  190.       display(0x07,'u');
  191.             display(0x08,'p');
  192.             display(0x09,'e');
  193.             display(0x0a,'r');
  194.             display(0x0b,'m');
  195.       display(0x0c,'a');
  196.             display(0x0d,'n');
  197.             display(0x0e,'!');
  198.             delay(250); //短暂延时
  199.             delay(250);
  200.             delay(250);
  201.             delay(250);
  202.             
  203. }
  204.             
  205. /*************定时器0初始化程序***************/
  206. void time_init()         
  207. {
  208.          TMOD= 0X01;           //定时器0、定时器1工作方式1
  209.          ET0  = 1;                   //开定时器0中断
  210.          TR0  = 1;                   //允许定时器0定时
  211.          EA   = 1;                 //开总中断
  212. }
  213. void caidan() //按键程序 选择菜单模式
  214. {
  215.      
  216.            if(!K1)
  217.                      {  
  218.                             delay(20);
  219.                               if(!K1)
  220.                            {  
  221.                                                        while(!K1)
  222.                                                 ;
  223.                                                                yemian++;
  224.                                                                flat++;
  225.                                                                       if(yemian>=3)
  226.                                                                       {
  227.                                                                        yemian=0;
  228.                                                                       }
  229.                                                                      
  230.                  }
  231.                      }
  232.          
  233.          
  234. }
复制代码
0.png

更多程序请下载文件:
基于单片机的温度湿度采集系统.zip (9.97 MB, 下载次数: 586)

评分

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

查看全部评分

回复

使用道具 举报

ID:284500 发表于 2018-5-15 15:48 | 显示全部楼层
这个看起来不错。
回复

使用道具 举报

ID:350589 发表于 2018-7-15 08:56 | 显示全部楼层
康康。好东西啊
回复

使用道具 举报

ID:418649 发表于 2018-11-1 20:34 | 显示全部楼层
DHT11检测土壤的温度湿度时候,是插到把银角放到土壤里吗?
回复

使用道具 举报

ID:410591 发表于 2018-11-20 11:37 | 显示全部楼层
必须要顶啊
回复

使用道具 举报

ID:484890 发表于 2019-3-5 14:54 | 显示全部楼层
好棒啊啊啊啊啊啊啊啊啊 想下载 谢谢楼主喔
回复

使用道具 举报

ID:513529 发表于 2019-4-16 12:57 | 显示全部楼层
学习学习  好东西
回复

使用道具 举报

ID:567928 发表于 2019-6-20 14:50 | 显示全部楼层
想下载啊  想下载   肯定是个好东西!
回复

使用道具 举报

ID:576686 发表于 2019-7-2 20:21 | 显示全部楼层
好东西,想下载看一看
回复

使用道具 举报

ID:427492 发表于 2019-7-14 21:32 | 显示全部楼层
关于DHT11部分代码,我找了好多个。就你的读数据是能用的,非常感谢
回复

使用道具 举报

ID:612440 发表于 2019-10-10 22:17 | 显示全部楼层
很给力
回复

使用道具 举报

ID:67344 发表于 2019-10-24 21:11 | 显示全部楼层
上面有人说就这个能用吗?下载来
回复

使用道具 举报

ID:470971 发表于 2020-4-10 11:15 | 显示全部楼层
照着操作后温湿度传感器没反应时什么原因呢,求大神告知
回复

使用道具 举报

ID:764884 发表于 2020-5-30 11:09 | 显示全部楼层
回复

使用道具 举报

ID:761098 发表于 2020-5-31 21:07 | 显示全部楼层
多谢大佬,终于有数据可以用了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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