找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 22663|回復(fù): 18
打印 上一主題 下一主題
收起左側(cè)

基于51單片機(jī)的DHT11溫濕度檢測(cè)裝置設(shè)計(jì) 含源碼與實(shí)物制作

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:306236 發(fā)表于 2018-8-21 05:04 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
總體來說,本次設(shè)計(jì)主要涉及了溫濕度的測(cè)量、顯示以及實(shí)現(xiàn)簡單控制。硬件方面有五個(gè)模塊,即單片機(jī)主控模塊、傳感器模塊、LCD1602液晶顯示模塊、報(bào)警模塊以及閾值設(shè)置模塊。其中主控模塊已經(jīng)給出,我們只需適當(dāng)增加驅(qū)動(dòng)電路即可。
傳感器模塊使用的是DHT11數(shù)字溫濕度傳感器。通過DHT11檢測(cè)出當(dāng)前環(huán)境下的溫濕度,將所測(cè)數(shù)據(jù)交給AT單片機(jī)進(jìn)行分析和處理,并分別存入不同數(shù)組以便顯示時(shí)候用。其中,為了顯示穩(wěn)定,本系統(tǒng)每間隔5s采集一次數(shù)據(jù)送入單片機(jī)。
1602液晶顯示模塊就是實(shí)現(xiàn)溫濕度檢測(cè)值和閾值的顯示。其分兩行顯示,上邊一行顯示濕度,下邊顯示溫度值,兩行的末尾兩位是閾值顯示位,正常工作的時(shí)候可以通過按鍵將其隱藏,需要調(diào)節(jié)閾值時(shí),再顯示出來方便調(diào)整,相對(duì)構(gòu)建了比較友好的人機(jī)交互。
小燈報(bào)警模塊實(shí)現(xiàn)了檢測(cè)值超過閾值的時(shí)候相應(yīng)顏色的燈亮報(bào)警。本系統(tǒng)采用的是不同顏色的led燈,實(shí)際可以換成繼電器驅(qū)動(dòng)電機(jī)、加熱器等,因此無論溫度還是濕度超出范圍led會(huì)進(jìn)行報(bào)警提示。提醒工作人員此時(shí)溫度濕度數(shù)據(jù)出現(xiàn)異常、需及時(shí)調(diào)整,及時(shí)啟用升溫器、加濕器、降溫風(fēng)扇以及噴霧器來有效的調(diào)整實(shí)驗(yàn)室內(nèi)溫濕度。
閾值設(shè)置模塊通過四個(gè)按鍵來實(shí)現(xiàn)閾值設(shè)置功能的。使得在不同環(huán)境下設(shè)置閾值提供了極大的方便,不需要每次都在程序里改動(dòng)然后再燒錄,省去了復(fù)雜的過程。
STC89C52單片機(jī)每2秒鐘從DHT11溫濕度傳感器中讀入溫度和濕度,在液晶屏上即時(shí)顯示。液晶屏上同時(shí)顯示溫濕度上限值,該上限值保存外外部EEPROM存儲(chǔ)器中,掉電不失,并且可以通過四只按鍵上調(diào)或下調(diào)。當(dāng)溫度或濕度值超過上限值時(shí),報(bào)警信號(hào)點(diǎn)亮相應(yīng)報(bào)警燈。該報(bào)警信號(hào)可以通過三極管驅(qū)動(dòng)繼電器,以控制外部風(fēng)機(jī)或加熱器。

制作出來的實(shí)物圖如下:


單片機(jī)源程序:
  1. #include <reg52.h>
  2. #include "1602.h"
  3. #include "dht.h"
  4. #include "2402.h"

  5. //定義三個(gè)LED燈
  6. sbit Led_qushi=P1^6;                //去濕燈
  7. sbit Led_jiangwen=P1^5;                //降溫?zé)?br />
  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. //定義標(biāo)識(shí)
  14. volatile bit FlagStartRH = 0;  //開始溫濕度轉(zhuǎn)換標(biāo)志
  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. //數(shù)據(jù)初始化
  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. //定時(shí)器0初始化
  47. void Timer0_Init()
  48. {
  49.         ET0 = 1;        //允許定時(shí)器0中斷
  50.         TMOD = 1;       //定時(shí)器工作方式選擇
  51.         TL0 = 0x06;     
  52.         TH0 = 0xf8;     //定時(shí)器賦予初值
  53.         TR0 = 1;        //啟動(dòng)定時(shí)器
  54. }

  55. //定時(shí)器0中斷
  56. void Timer0_ISR (void) interrupt 1 using 0
  57. {
  58.         TL0 = 0x06;
  59.         TH0 = 0xf8;     //定時(shí)器賦予初值

  60.         //每2秒鐘啟動(dòng)一次溫濕度轉(zhuǎn)換
  61.     RHCounter ++;
  62.     if (RHCounter >= 1000)
  63.     {
  64.        FlagStartRH = 1;
  65.            RHCounter = 0;
  66.     }
  67. }

  68. //存入設(shè)定值、
  69. void Save_Setting()
  70. {
  71.    pSave =  (char *)&TH;          //地址低位對(duì)應(yīng)低8位,高位對(duì)應(yīng)高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. //載入設(shè)定值、
  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. * 功能 : 主函數(shù)
  128. ***********************************************************************/
  129. void main()
  130. {
  131.     U16 i, j, testnum;

  132.     EA = 0;

  133.         Timer0_Init();  //定時(shí)器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.         //延時(shí)
  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.     //載入溫度上限和濕度上限設(shè)定值
  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.        //溫濕度轉(zhuǎn)換標(biāo)志檢查
  158.                  if (FlagStartRH == 1)
  159.                  {
  160.                      TR0 = 0;
  161.              testnum = RH();
  162.                           FlagStartRH = 0;
  163.                          TR0 = 1;
  164.              //讀出溫濕度,只取整數(shù)部分
  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.                 //鍵盤查詢,在彈起時(shí)響應(yīng)
  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. }
復(fù)制代碼

全部資料51hei下載地址:
溫濕度檢測(cè)程序.zip (82.08 KB, 下載次數(shù): 417)



評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏17 分享淘帖 頂5 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:465631 發(fā)表于 2019-1-10 12:17 | 只看該作者
怎么連線?
回復(fù)

使用道具 舉報(bào)

板凳
ID:306236 發(fā)表于 2019-1-19 17:29 | 只看該作者
電路原理圖附件

原理圖.pdf

51.46 KB, 下載次數(shù): 202, 下載積分: 黑幣 -5

回復(fù)

使用道具 舉報(bào)

地板
ID:477860 發(fā)表于 2019-2-18 19:49 | 只看該作者
好厲害啊
回復(fù)

使用道具 舉報(bào)

5#
ID:445069 發(fā)表于 2019-2-20 15:44 | 只看該作者
給樓主點(diǎn)贊!
回復(fù)

使用道具 舉報(bào)

6#
ID:484435 發(fā)表于 2019-12-20 09:52 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

7#
ID:421783 發(fā)表于 2020-4-3 21:32 來自手機(jī) | 只看該作者
是不是只能設(shè)置上限
回復(fù)

使用道具 舉報(bào)

8#
ID:246783 發(fā)表于 2020-4-3 22:46 來自手機(jī) | 只看該作者
DHT溫度實(shí)在不準(zhǔn)
回復(fù)

使用道具 舉報(bào)

9#
ID:304751 發(fā)表于 2020-4-4 11:06 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

10#
ID:698121 發(fā)表于 2020-4-17 12:29 來自手機(jī) | 只看該作者
請(qǐng)問這個(gè)是你自己焊接的嗎
回復(fù)

使用道具 舉報(bào)

11#
ID:747552 發(fā)表于 2020-5-13 14:09 | 只看該作者
怎么下載打不開。
回復(fù)

使用道具 舉報(bào)

12#
ID:750452 發(fā)表于 2020-5-13 14:53 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

13#
ID:159857 發(fā)表于 2020-5-14 21:40 | 只看該作者
謝謝樓主,
謝謝分享!
回復(fù)

使用道具 舉報(bào)

14#
ID:747552 發(fā)表于 2020-5-17 16:21 | 只看該作者
下載了 打不開程序
回復(fù)

使用道具 舉報(bào)

15#
ID:744896 發(fā)表于 2020-5-18 12:22 | 只看該作者
下載了,打不開程序
回復(fù)

使用道具 舉報(bào)

16#
ID:747552 發(fā)表于 2020-5-22 19:36 | 只看該作者
你所說四個(gè)按鍵 有個(gè)閾值設(shè)置 ??感覺原理圖不太符合啊?
回復(fù)

使用道具 舉報(bào)

17#
ID:89286 發(fā)表于 2020-7-3 12:14 | 只看該作者
thanks for sharing
回復(fù)

使用道具 舉報(bào)

18#
ID:1017642 發(fā)表于 2022-4-12 14:53 | 只看該作者
這個(gè)有電路板的文件嘛?
回復(fù)

使用道具 舉報(bào)

19#
ID:402026 發(fā)表于 2022-4-13 08:24 | 只看該作者

做的真是不錯(cuò),不點(diǎn)贊都不行,所以堅(jiān)定的點(diǎn)贊!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表