单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的DHT11温湿度检测装置设计 含源码与实物制作

[复制链接]
跳转到指定楼层
楼主
troy8862 发表于 2018-8-21 05:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
总体来说,本次设计主要涉及了温湿度的测量、显示以及实现简单控制。硬件方面有五个模块,即单片机主控模块、传感器模块、LCD1602液晶显示模块、报警模块以及阈值设置模块。其中主控模块已经给出,我们只需适当增加驱动电路即可。
传感器模块使用的是DHT11数字温湿度传感器。通过DHT11检测出当前环境下的温湿度,将所测数据交给AT单片机进行分析和处理,并分别存入不同数组以便显示时候用。其中,为了显示稳定,本系统每间隔5s采集一次数据送入单片机。
1602液晶显示模块就是实现温湿度检测值和阈值的显示。其分两行显示,上边一行显示湿度,下边显示温度值,两行的末尾两位是阈值显示位,正常工作的时候可以通过按键将其隐藏,需要调节阈值时,再显示出来方便调整,相对构建了比较友好的人机交互。
小灯报警模块实现了检测值超过阈值的时候相应颜色的灯亮报警。本系统采用的是不同颜色的led灯,实际可以换成继电器驱动电机、加热器等,因此无论温度还是湿度超出范围led会进行报警提示。提醒工作人员此时温度湿度数据出现异常、需及时调整,及时启用升温器、加湿器、降温风扇以及喷雾器来有效的调整实验室内温湿度。
阈值设置模块通过四个按键来实现阈值设置功能的。使得在不同环境下设置阈值提供了极大的方便,不需要每次都在程序里改动然后再烧录,省去了复杂的过程。
STC89C52单片机每2秒钟从DHT11温湿度传感器中读入温度和湿度,在液晶屏上即时显示。液晶屏上同时显示温湿度上限值,该上限值保存外外部EEPROM存储器中,掉电不失,并且可以通过四只按键上调或下调。当温度或湿度值超过上限值时,报警信号点亮相应报警灯。该报警信号可以通过三极管驱动继电器,以控制外部风机或加热器。

制作出来的实物图如下:


单片机源程序:
  1. #include <reg52.h>
  2. #include "1602.h"
  3. #include "dht.h"
  4. #include "2402.h"

  5. //定义三个LED灯
  6. sbit Led_qushi=P1^6;                //去湿灯
  7. sbit Led_jiangwen=P1^5;                //降温灯
  8. sbit fmq=P1^3;        //蜂鸣器
  9. sbit Key_TH1 = P3^2;
  10. sbit Key_TH2 = P3^3;
  11. sbit Key_HH1 = P3^4;
  12. sbit Key_HH2 = P3^5;

  13. //定义标识
  14. volatile bit FlagStartRH = 0;  //开始温湿度转换标志
  15. volatile bit FlagKeyPress = 0; //有键按下
  16. volatile bit fmqt = 0;
  17. volatile bit fmqh = 0;
  18. //定义温湿度传感器用外部变量
  19. extern U8  U8FLAG,k;
  20. extern U8  U8count,U8temp;
  21. extern U8  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
  22. extern U8  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
  23. extern U8  U8comdata;
  24. extern U8  count, count_r;

  25. U16 temp;
  26. S16 temperature, humidity;
  27. S16 idata TH, HH;  //温度上限和湿度上限
  28. char * pSave;
  29. U8 keyvalue, keyTH1, keyTH2, keyHH1, keyHH2;

  30. //定义变量
  31. U16 RHCounter;


  32. //数据初始化
  33. void Data_Init()
  34. {
  35.    RHCounter = 0;
  36.    Led_qushi = 1;
  37.    Led_jiangwen = 1;
  38.    TH = 40;
  39.    HH = 85;
  40.    keyvalue = 0;
  41.    keyTH1 = 1;
  42.    keyTH2 = 1;
  43.    keyHH1 = 1;
  44.    keyHH2 = 1;

  45. }

  46. //定时器0初始化
  47. void Timer0_Init()
  48. {
  49.         ET0 = 1;        //允许定时器0中断
  50.         TMOD = 1;       //定时器工作方式选择
  51.         TL0 = 0x06;     
  52.         TH0 = 0xf8;     //定时器赋予初值
  53.         TR0 = 1;        //启动定时器
  54. }

  55. //定时器0中断
  56. void Timer0_ISR (void) interrupt 1 using 0
  57. {
  58.         TL0 = 0x06;
  59.         TH0 = 0xf8;     //定时器赋予初值

  60.         //每2秒钟启动一次温湿度转换
  61.     RHCounter ++;
  62.     if (RHCounter >= 1000)
  63.     {
  64.        FlagStartRH = 1;
  65.            RHCounter = 0;
  66.     }
  67. }

  68. //存入设定值、
  69. void Save_Setting()
  70. {
  71.    pSave =  (char *)&TH;          //地址低位对应低8位,高位对应高8位
  72.    wrteeprom(0, *pSave);          //存温度上限值TH低8位
  73.    DELAY(500);
  74.    pSave ++;
  75.    wrteeprom(1, *pSave);          //存温度上限值TH高8位
  76.    DELAY(500);
  77.    pSave =  (char *)&HH;
  78.    wrteeprom(2, *pSave);          //存湿度上限值RH低8位
  79.    DELAY(500);
  80.    pSave ++;
  81.    wrteeprom(3, *pSave);          //存湿度上限值RH高8位
  82.    DELAY(500);

  83. }

  84. //载入设定值、
  85. void Load_Setting()
  86. {
  87.    pSave =  (char *)&TH;
  88.    *pSave++ = rdeeprom(0);
  89.    *pSave = rdeeprom(1);
  90.    pSave = (char *)&HH;
  91.    *pSave++ = rdeeprom(2);
  92.    *pSave = rdeeprom(3);
  93.    if ((TH>99)||(TH<0)) TH = 40;
  94.    if ((HH>99)||(HH<0)) HH = 85;
  95. }

  96. void KeyProcess(uint num)
  97. {
  98.    switch (num)
  99.    {
  100.       case 1:
  101.              if (TH<99) TH++;
  102.              L1602_char(1, 15, TH/10+48);
  103.              L1602_char(1, 16, TH%10+48);
  104.              break;
  105.           case 2:
  106.              if (TH>1) TH--;
  107.              L1602_char(1, 15, TH/10+48);
  108.              L1602_char(1, 16, TH%10+48);
  109.              break;
  110.           case 3:
  111.              if (HH<99) HH++;
  112.              L1602_char(2, 15, HH/10+48);
  113.              L1602_char(2, 16, HH%10+48);
  114.              break;
  115.           case 4:
  116.              if (HH>1) HH--;
  117.              L1602_char(2, 15, HH/10+48);
  118.              L1602_char(2, 16, HH%10+48);
  119.              break;
  120.           default:
  121.              break;
  122.    }
  123.    Save_Setting();

  124. }

  125. /********************************************************************
  126. * 名称 : Main()
  127. * 功能 : 主函数
  128. ***********************************************************************/
  129. void main()
  130. {
  131.     U16 i, j, testnum;

  132.     EA = 0;

  133.         Timer0_Init();  //定时器0初始化

  134.     Data_Init();
  135.         EA = 1;

  136.         L1602_init();
  137.         L1602_string(1,1,"Hua Hua`s Design");
  138.         L1602_string(2,1,"HaHaHaHa");
  139.         //延时
  140.         for (i=0;i<700;i++)
  141.            for (j=0;j<700;j++)
  142.            {;}
  143.     //清屏
  144.         L1602_string(1,1,"                ");
  145.         L1602_string(2,1,"                ");
  146.     L1602_string(1,1,"Tem:   C  TH:");
  147.         L1602_string(2,1,"Hum:   %  HH:");
  148.    
  149.     //载入温度上限和湿度上限设定值
  150.         Load_Setting();
  151.         L1602_char(1, 15, TH/10+48);
  152.         L1602_char(1, 16, TH%10+48);
  153.         L1602_char(2, 15, HH/10+48);
  154.         L1602_char(2, 16, HH%10+48);


  155.         while(1)
  156.         {
  157.        //温湿度转换标志检查
  158.                  if (FlagStartRH == 1)
  159.                  {
  160.                      TR0 = 0;
  161.              testnum = RH();
  162.                           FlagStartRH = 0;
  163.                          TR0 = 1;
  164.              //读出温湿度,只取整数部分
  165.                          humidity = U8RH_data_H;
  166.                          temperature = U8T_data_H;
  167.                           //显示温湿度
  168.                          L1602_int(1,5,temperature);
  169.                      L1602_int(2,5,humidity);        
  170.                 }
  171.                 //温湿度控制
  172.                 if (temperature > TH)
  173.                 {
  174.                 Led_jiangwen = 0;
  175.                 fmqt=1;
  176.                 }
  177.                 else
  178.                 {
  179.                 Led_jiangwen = 1;
  180.                 fmqt=0;
  181.                 }                                //降温
  182.                 if (humidity > HH)
  183.                 {
  184.                 Led_qushi = 0;
  185.                 fmqh=1;
  186.                 }
  187.                 else
  188.                 {
  189.                 Led_qushi = 1;
  190.                 fmqh=0;
  191.                 }                                                //去湿
  192.                 if((fmqt==1)||(fmqh==1))
  193.                 fmq=0;
  194.                 else
  195.                 fmq=1;
  196.                  
  197.                 //键盘查询,在弹起时响应
  198.                 if ((Key_TH1)&&(keyTH1==0)) {FlagKeyPress = 1; keyvalue = 1;}
  199.         else if ((Key_TH2)&&(keyTH2==0)) {FlagKeyPress = 1; keyvalue = 2;}
  200.         else if ((Key_HH1)&&(keyHH1==0)) {FlagKeyPress = 1; keyvalue = 3;}
  201.         else if ((Key_HH2)&&(keyHH2==0)) {FlagKeyPress = 1; keyvalue = 4;}
  202.                 if (FlagKeyPress == 1)
  203.                 {
  204.            KeyProcess(keyvalue);
  205.            FlagKeyPress = 0;           
  206.                 }
  207.         if (!Key_TH1) keyTH1 = 0;
  208.                 else keyTH1 = 1;
  209.         if (!Key_TH2) keyTH2 = 0;
  210.                 else keyTH2 = 1;
  211.         if (!Key_HH1) keyHH1 = 0;
  212.                 else keyHH1 = 1;
  213.         if (!Key_HH2) keyHH2 = 0;
  214.                 else keyHH2 = 1;
  215.                  
  216.         }        
  217. }
复制代码

全部资料51hei下载地址:
温湿度检测程序.zip (82.08 KB, 下载次数: 77)



评分

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

查看全部评分

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

使用道具 举报

沙发
308154278 发表于 2019-1-10 12:17 | 只看该作者
怎么连线?
回复

使用道具 举报

板凳
 楼主| troy8862 发表于 2019-1-19 17:29 | 只看该作者
电路原理图附件

原理图.pdf

51.46 KB, 下载次数: 20, 下载积分: 黑币 -5

回复

使用道具 举报

地板
yxwdzero 发表于 2019-2-18 19:49 | 只看该作者
好厉害啊
回复

使用道具 举报

5#
ontheroad 发表于 2019-2-20 15:44 | 只看该作者
给楼主点赞!
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51Hei单片机16群 联系QQ:125739409;技术交流QQ群7344883

Powered by 单片机教程网

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