找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11510|回复: 21
打印 上一主题 下一主题
收起左侧

单片机+DHT11温湿度检测程序+原理图等资料

  [复制链接]
跳转到指定楼层
楼主
基于DHT11温湿度报警系统LCD1602显示操作说明

本设计系统是DHT11温湿度报警系统LCD1602显示,可设置温度的高温报警值和低温报警值、湿度的高湿度报警值和低温度报警值,当有报警时蜂鸣器会发出滴滴的报警声,同时绿色发光二极管闪烁,在LCD1602液晶上还能很直观的看到报警信息。并具有掉电保存功能,数据保存在单片机内部EEPOM中,进入设置界面后如果没有键按下系统会在30秒后自动退出设置界面,人性化的按键设置,按键还具有连加、减功能,当按下按键时有按键声即蜂鸣器叫一声,按键声可以进入菜单内设置,可设置按键声打开或关闭。系统还设有取消报警回差值,增加的系统的抗干扰性。

报警方式:声光报警   
蜂鸣器滴滴报警声、发光二极管闪烁。
DHT11温湿度检测

单片机电路原理图:




蜂鸣器    蜂鸣器    B1
10uF    电容    C1
20pF    电容    C2, C3
D    指示灯    D1, D2, D3, D4,
LCD1602    液晶    LCD1
9012    三极管    Q1
10K    电阻    R3, R4
2K    电阻    R1
2K    电阻    R2, R5
SW-PB    按键    S1, S2, S3, S4, S5
sw-灰色    电源开关    SW1
U1    单片机    U1
DHT11    温湿度传感器    U2
12M    晶振    Y1

单片机源程序如下:
  1. #include <reg52.h>                 //调用单片机头文件
  2. #define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255
  3. #define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535

  4. sbit beep = P1^4;   //蜂鸣器

  5. int flag_300ms ;

  6. //  按键的IO变量的定义
  7. uchar key_can;                 //按键值的变量

  8. sbit wh_led = P2^2;  //温度报警指示灯IO口定义
  9. sbit wl_led = P2^3;  //温度报警指示灯IO口定义
  10. sbit sh_led = P2^1;  //湿度报警指示灯IO口定义
  11. sbit sl_led = P2^0;  //湿度报警指示灯IO口定义

  12. uchar flag_en = 1;

  13. uchar menu_1;        //菜单设计的变量
  14. uint t_high = 35,t_low = 10;        //温度报警参数
  15. uint s_high = 80,s_low = 10;        //湿度报警参数

  16. /***************************************************************
  17. * 名称 : delay_1ms()
  18. * 功能 : 延时1ms函数
  19. * 输入 : q
  20. * 输出 : 无
  21. ****************************************************************/
  22. void delay_1ms(uint q)
  23. {
  24.         uint i,j;
  25.         for(i=0;i<q;i++)
  26.                 for(j=0;j<120;j++);
  27. }

  28. sbit dht11=P1^5;         //温度传感器IO口定义
  29. uchar table_dht11[5]={1,2,3,4,5};

  30. uchar code table_num[]="0123456789abcdefg";

  31. sbit rs=P1^0;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
  32. sbit rw=P1^1;         //寄存器选择信号 H:数据寄存器          L:指令寄存器
  33. sbit e =P1^2;         //片选信号   下降沿触发

  34. /********************************************************************
  35. * 名称 : delay_uint()
  36. * 功能 : 小延时。
  37. * 输入 : 无
  38. * 输出 : 无
  39. ***********************************************************************/
  40. void delay_uint(uint q)
  41. {
  42.         while(q--);
  43. }

  44. /********************************************************************
  45. * 名称 : write_com(uchar com)
  46. * 功能 : 1602命令函数
  47. * 输入 : 输入的命令值
  48. * 输出 : 无
  49. ***********************************************************************/
  50. void write_com(uchar com)
  51. {
  52.         e=0;
  53.         rs=0;
  54.         rw=0;
  55.         P0=com;
  56.         delay_uint(25);
  57.         e=1;
  58.         delay_uint(100);
  59.         e=0;
  60. }

  61. /********************************************************************
  62. * 名称 : write_data(uchar dat)
  63. * 功能 : 1602写数据函数
  64. * 输入 : 需要写入1602的数据
  65. * 输出 : 无
  66. ***********************************************************************/
  67. void write_data(uchar dat)
  68. {
  69.         e=0;
  70.         rs=1;
  71.         rw=0;
  72.         P0=dat;
  73.         delay_uint(25);
  74.         e=1;
  75.         delay_uint(100);
  76.         e=0;       
  77. }


  78. /***********************lcd1602上显示特定的字符****0XDF 度********************/
  79. void write_zifu(uchar hang,uchar add,uchar date)
  80. {
  81.         if(hang==1)   
  82.                 write_com(0x80+add);
  83.         else
  84.                 write_com(0x80+0x40+add);
  85.         write_data(date);       
  86. }

  87. /***********************lcd1602上显示两位十进制数************************/
  88. void write_sfm2(uchar hang,uchar add,uint date)
  89. {
  90.         if(hang==1)   
  91.                 write_com(0x80+add);
  92.         else
  93.                 write_com(0x80+0x40+add);
  94.         write_data(0x30+date/10%10);
  95.         write_data(0x30+date%10);       
  96. }

  97. /***********************lcd1602上显示这字符函数************************/
  98. void write_string(uchar hang,uchar add,uchar *p)
  99. {
  100.         if(hang==1)   
  101.                 write_com(0x80+add);
  102.         else
  103.                 write_com(0x80+0x40+add);
  104.                 while(1)                                                                                                                 
  105.                 {
  106.                         if(*p == '\0')  break;
  107.                         write_data(*p);
  108.                         p++;
  109.                 }       
  110. }

  111. /***********************lcd1602初始化设置************************/
  112. void init_1602()        //lcd1602初始化
  113. {
  114.         write_com(0x38);       
  115.         write_com(0x0c);
  116.         write_com(0x06);
  117.         delay_uint(1000);
  118.         write_string(1,0,"Wd:00  H00  L00   ");       
  119.         write_string(2,0,"Sd:00% H00% L00% ");       
  120.         write_zifu(1,5,0xdf);        //显示度               
  121.         write_zifu(1,10,0xdf);        //显示度       
  122.         write_zifu(1,15,0xdf);        //显示度       
  123.         write_sfm2(1,3,table_dht11[2]);           //显示温度
  124.         write_sfm2(2,3,table_dht11[0]);   //显示湿度       
  125.         write_sfm2(1,7,t_high);          //显示温度
  126.         write_sfm2(2,7,s_high);   //显示湿度               
  127.         write_sfm2(1,10,t_low);          //显示温度
  128.         write_sfm2(2,10,s_low);   //显示湿度               
  129. }

  130. /********************独立按键程序*****************/
  131. uchar key_can;         //按键值

  132. void key()             //独立按键程序
  133. {
  134.         static uchar key_new;
  135.         key_can = 20;               //按键值还原
  136.         P3 |= 0xf0;
  137.         if((P3 & 0xf0) != 0xf0)                //按键按下
  138.         {
  139.                 delay_1ms(1);                     //按键消抖动
  140.                 if(((P3 & 0xf0) != 0xf0) && (key_new == 1))
  141.                 {                                                //确认是按键按下
  142.                         key_new = 0;
  143.                         switch(P3 & 0xf0)
  144.                         {
  145.                                 case 0xd0: key_can = 1; break;           //得到k1键值
  146.                                 case 0xb0: key_can = 2; break;           //得到K2键值
  147.                                 case 0x70: key_can = 3; break;           //得到k3键值
  148.                         }
  149.                 }                       
  150.         }
  151.         else
  152.                 key_new = 1;       
  153. }


  154. /****************按键显示函数***************/
  155. void key_with()
  156. {
  157.         if(key_can == 1)           //设置键
  158.         {
  159.                 menu_1 ++;
  160.                 if(menu_1 > 2)
  161.                 {
  162.                         menu_1 = 0;
  163.                         init_1602();  //lcd1602初始化                       
  164.                 }
  165.         }
  166.         if(menu_1 == 1)                        //设置高温报警
  167.         {
  168.                 if(key_can == 2)
  169.                 {
  170.                         t_high ++ ;                //设置高温值加1        
  171.                         if(t_high > 99)
  172.                                 t_high = 99;
  173.                 }
  174.                 if(key_can == 3)
  175.                 {
  176.                         t_high -- ;                //设置高温值减1        
  177.                         if(t_high <= t_low)
  178.                                 t_high = t_low + 1;
  179.                 }
  180.                 write_sfm2(1,8,t_high);           //显示温度
  181.                 write_com(0x80+8);             //将光标移动到秒个位
  182.                 write_com(0x0f);                    //显示光标并且闪烁       
  183.         }       
  184.         if(menu_1 == 2)                        //设置低温报警
  185.         {
  186.                 if(key_can == 2)
  187.                 {
  188.                         t_low ++ ;                        //设置低温值加1
  189.                         if(t_low >= t_high)
  190.                                 t_low = t_high - 1;
  191.                 }
  192.                 if(key_can == 3)                         //设置高温值减1
  193.                 {
  194.                         t_low -- ;                       
  195.                         if(t_low <= 1)
  196.                                 t_low = 1;
  197.                 }
  198.                 write_sfm2(1,13,t_low);   //显示湿度       
  199.                 write_com(0x80+13);            //将光标移动到秒个位
  200.                 write_com(0x0f);                    //显示光标并且闪烁       
  201.         }
  202.         if(menu_1 == 3)                        //设置高湿报警
  203.         {
  204.                 if(key_can == 2)
  205.                 {
  206.                         s_high ++ ;                //设置高湿值加1        
  207.                         if(s_high > 99)
  208.                                 s_high = 99;
  209.                 }
  210.                 if(key_can == 3)
  211.                 {
  212.                         s_high -- ;                //设置高湿值减1        
  213.                         if(s_high <= s_low)
  214.                                 s_high = s_low + 1;
  215.                 }
  216.                 write_sfm2(2,8,s_high);           //显示湿度
  217.                 write_com(0x80+0x40+8);             //将光标移动到秒个位
  218.                 write_com(0x0f);                    //显示光标并且闪烁       
  219.         }       
  220.         if(menu_1 == 4)                        //设置低湿报警
  221.         {
  222.                 if(key_can == 2)
  223.                 {
  224.                         s_low ++ ;                        //设置低湿值加1
  225.                         if(s_low >= s_high)
  226.                                 s_low = s_high - 1;
  227.                 }
  228.                 if(key_can == 3)                         //设置低湿值减1
  229.                 {
  230.                         s_low -- ;                       
  231.                         if(s_low <= 1)
  232.                                 s_low = 1;
  233.                 }
  234.                 write_sfm2(2,13,s_low);           //显示湿度
  235.                 write_com(0x80+0x40+13);            //将光标移动到秒个位
  236.                 write_com(0x0f);                    //显示光标并且闪烁       
  237.         }               
  238. }


  239. /*****************读温湿度传感器程序****************/
  240. void dst11()
  241. {
  242.         uchar i,j;                         
  243.         dht11 = 0;       
  244.         delay_1ms(5);
  245.         dht11 = 1;
  246.         delay_uint(4);         //50us
  247.         if(dht11 == 0)          //判断是否响应    0 为响应
  248.         {
  249.                 while(dht11 == 0);
  250.                 while(dht11 == 1);          //等待响应时间过完
  251.                 for(i=0;i<5;i++)
  252.                 {
  253.                         for(j=0;j<8;j++)
  254.                         {
  255.                                 table_dht11[i] <<= 1;
  256.                                 while(dht11 == 1);
  257.                                 delay_uint(4);         //50us         数据1的高电平时间为110us 低为27us
  258.                                 if(dht11 == 1)
  259.                                 {
  260.                                         table_dht11[i] |= 0x01;
  261.                                         while(dht11 == 1);          //等待响应时间过完
  262.                                 }                       
  263.                         }                       
  264.                 }                       
  265.         }
  266.         dht11 = 1;
  267. }


  268. /****************报警函数***************/
  269. void clock_h_l()
  270. {
  271.         if((table_dht11[2] >= t_high))
  272.         {                         
  273.                 wh_led = 0;                  //打开指示灯
  274.         }
  275.         else
  276.         {
  277.                 wh_led = 1;                  //关闭指示灯
  278.         }

  279.         if((table_dht11[2] <= t_low))
  280.         {                         
  281.                 wl_led = 0;                  //打开指示灯
  282.         }
  283.         else
  284.         {
  285.                 wl_led = 1;                  //关闭指示灯
  286.         }

  287.         if((table_dht11[0] >= s_high))
  288.         {
  289.                 sh_led = 0;                  //打开指示灯
  290.         }else
  291.         {
  292.                 sh_led = 1;                  //关闭指示灯
  293.         }

  294.         if((table_dht11[0] <= s_low))
  295.         {
  296.                 sl_led = 0;                  //打开指示灯
  297.         }else
  298.         {
  299.                 sl_led = 1;                  //关闭指示灯
  300.         }

  301.         if((wh_led == 0) || (wl_led == 0) || (sh_led == 0) || (sl_led == 0))
  302.         {
  303.                         if(flag_en == 1)
  304.                         beep = ~beep;           //蜂鸣器报警
  305.         }
  306.         else
  307.         {
  308.                 beep = 1;
  309.                 flag_en = 1;
  310.         }

  311. }


  312. /******************主程序**********************/          
  313. void main()
  314. {               

  315.         beep = 0;                                //开机叫一声   
  316.         delay_1ms(150);
  317.         P0 = P1 = P2 = P3 = 0xff;
  318.         init_1602();        //lcd1602初始化
  319.         while(1)
  320.         {
  321.                 flag_300ms ++;
  322.                 if(flag_300ms >= 300)
  323.                 {
  324.                         flag_300ms = 0;
  325.                         dst11();                //先读出温湿度1的值
  326.                         write_sfm2(2,3,table_dht11[0]);   //显示湿度       
  327.                         write_sfm2(1,3,table_dht11[2]);           //显示温度
  328.                         clock_h_l();   //报警函数
  329.                 }
  330.                 key();
  331.                 if(key_can < 10)
  332.                 {
  333.                         key_with();                            //设置报警温度       
  334.                         if(key_can == 3)
  335.                         {
  336.                                 flag_en = 0;   //手动取消报警
  337.                         }
  338.                 }
  339.                 delay_1ms(1);
  340.         }
  341. }
复制代码

所有资料51hei提供下载:
DHT11温湿度检测 发送资料.4个灯.rar (3.52 MB, 下载次数: 326)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏11 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:638594 发表于 2019-11-9 13:16 | 只看该作者
真棒
回复

使用道具 举报

板凳
ID:556679 发表于 2019-11-17 20:51 | 只看该作者
请问DHT11温湿度传感器在ISIS7中应该用什么元件替代?
回复

使用道具 举报

地板
ID:648362 发表于 2019-11-24 14:42 | 只看该作者
我想问下,为什么DHT11一值没有传回数据回来呢
回复

使用道具 举报

5#
ID:648362 发表于 2019-11-24 14:43 | 只看该作者
你是白痴 发表于 2019-11-17 20:51
请问DHT11温湿度传感器在ISIS7中应该用什么元件替代?

就画一个3个排针就好了
回复

使用道具 举报

6#
ID:421783 发表于 2020-4-3 23:23 | 只看该作者
楼主,小白我问个问题,为什么没看见定义按键的引脚,还有uchar key_can;        这个什么意思,求大佬告知
回复

使用道具 举报

7#
ID:350754 发表于 2020-4-21 15:26 | 只看该作者
您好,想问问您有proteus软件仿真图吗
回复

使用道具 举报

8#
ID:350754 发表于 2020-4-21 15:26 | 只看该作者
您好,请问您有proteus软件的仿真图吗
回复

使用道具 举报

9#
ID:747552 发表于 2020-5-11 19:10 | 只看该作者
在这里的代码齐全嘛?还是说 压缩包里得齐全?
回复

使用道具 举报

10#
ID:747552 发表于 2020-5-11 19:11 | 只看该作者
你现在的程序是完整的嘛?
回复

使用道具 举报

11#
ID:749778 发表于 2020-5-12 11:05 | 只看该作者
您好,请问您有proteus软件的仿真图吗
回复

使用道具 举报

12#
ID:749778 发表于 2020-5-12 11:06 | 只看该作者
您好,请问您有proteus软件的仿真图吗
回复

使用道具 举报

13#
ID:748803 发表于 2020-5-12 11:17 | 只看该作者
你好,请问程序可以运行吗
回复

使用道具 举报

14#
ID:171157 发表于 2020-5-17 11:30 | 只看该作者
不能用
回复

使用道具 举报

15#
ID:171157 发表于 2020-5-17 11:31 | 只看该作者
程序根本就没有读DHT11数据的程序
回复

使用道具 举报

16#
ID:171157 发表于 2020-5-17 11:31 | 只看该作者
少加点糖 发表于 2020-5-12 11:17
你好,请问程序可以运行吗

不用想了,不能运行的。程序里根本就没有读取DHT11的驱动程序
回复

使用道具 举报

17#
ID:761098 发表于 2020-5-25 21:26 | 只看该作者
强,向楼主学习
回复

使用道具 举报

18#
ID:767601 发表于 2020-6-3 20:50 来自手机 | 只看该作者
这个显示好像有些问题呀,
回复

使用道具 举报

19#
ID:717291 发表于 2020-7-3 17:33 | 只看该作者
这里是不是完整程序,还是说在压缩包里面
回复

使用道具 举报

20#
ID:717291 发表于 2020-7-3 17:33 | 只看该作者
newheyuan 发表于 2020-5-17 11:31
不用想了,不能运行的。程序里根本就没有读取DHT11的驱动程序

我也运行不了
回复

使用道具 举报

21#
ID:564944 发表于 2020-7-15 22:40 | 只看该作者
1847@wy 发表于 2020-6-3 20:50
这个显示好像有些问题呀,

我也觉得显示有问题,我弄了protues仿真,按下设置键显示不对
回复

使用道具 举报

22#
ID:597214 发表于 2020-7-24 09:33 | 只看该作者
接收不到 发表于 2019-11-24 14:42
我想问下,为什么DHT11一值没有传回数据回来呢

我试了一下这个读温湿度传感器程序,delay_1ms(5)应该是延时时间太短 根据DHT11的手册,起始信号拉低最少要延时18ms再拉高,所以改成delay_1ms(18)或者时间再长一点,就能读回数据
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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