找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7304|回復(fù): 7
收起左側(cè)

dht11溫濕度檢測系統(tǒng)的源程序和原理圖pretel99,拿來和大家分享

[復(fù)制鏈接]
ID:116330 發(fā)表于 2016-4-24 13:59 | 顯示全部樓層 |閱讀模式
溫濕度檢測系統(tǒng)的源程序和原理圖,拿來和大家分享
0.png
0.png

原理圖

0.png
全部資料(壓縮包)下載: 溫濕度檢測系統(tǒng)資料.zip (587.95 KB, 下載次數(shù): 82)

下面是部分程序預(yù)覽(完整版本請下載本帖附件):
dht11程序
  1. #include "dht.h"

  2. U8  U8FLAG,k;
  3. U8  U8count,U8temp;
  4. U8  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
  5. U8  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
  6. U8  U8comdata;
  7. U8  count, count_r=0;

  8. void Delay1(U16 j)
  9. {
  10.     U8 i;
  11.     for(;j>0;j--)
  12.     {        
  13.                 for(i=0;i<27;i++);
  14.     }
  15. }

  16. void  Delay_10us(void)
  17. {
  18.     U8 i;
  19.     i--;
  20.     i--;
  21.     i--;
  22.     i--;
  23.     i--;
  24.     i--;
  25. }

  26. void  COM(void)
  27. {
  28.     U8 i;
  29.     for(i=0;i<8;i++)          
  30.     {
  31.               U8FLAG=2;
  32.                    while((!DATA)&&U8FLAG++);
  33.                 Delay_10us();
  34.                 Delay_10us();
  35.                 Delay_10us();
  36.                   U8temp=0;
  37.         if(DATA)U8temp=1;
  38.                     U8FLAG=2;
  39.                 while((DATA)&&U8FLAG++);
  40.                    //超時則跳出for循環(huán)                  
  41.                    if(U8FLAG==1)break;
  42.                    //判斷數(shù)據(jù)位是0還是1         
  43.                      
  44.                 // 如果高電平高過預(yù)定0高電平值則數(shù)據(jù)位為 1
  45.                     
  46.                 U8comdata<<=1;
  47.                    U8comdata|=U8temp;        //0
  48.     }//rof
  49. }

  50. //--------------------------------
  51. //-----溫濕度讀取子程序 ------------
  52. //--------------------------------
  53. //----以下變量均為全局變量--------
  54. //----溫度高8位== U8T_data_H------
  55. //----溫度低8位== U8T_data_L------
  56. //----濕度高8位== U8RH_data_H-----
  57. //----濕度低8位== U8RH_data_L-----
  58. //----校驗 8位 == U8checkdata-----
  59. //----調(diào)用相關(guān)子程序如下----------
  60. //---- Delay();, Delay_10us();,COM();
  61. //--------------------------------
  62. U8 RH(void)
  63. {
  64.     //主機拉低18ms
  65.     DATA=0;
  66.         Delay1(180);  //原來為5
  67.         DATA=1;
  68.         //總線由上拉電阻拉高 主機延時20us
  69.         Delay_10us();
  70.         Delay_10us();
  71.         Delay_10us();
  72.         Delay_10us();
  73.         //主機設(shè)為輸入 判斷從機響應(yīng)信號
  74.         DATA=1;
  75.         //判斷從機是否有低電平響應(yīng)信號 如不響應(yīng)則跳出,響應(yīng)則向下運行          
  76.         if(!DATA)                 //T !          
  77.         {
  78.             U8FLAG=2;
  79.             //判斷從機是否發(fā)出 80us 的低電平響應(yīng)信號是否結(jié)束         
  80.             while((!DATA)&&U8FLAG++);
  81.             U8FLAG=2;
  82.             //判斷從機是否發(fā)出 80us 的高電平,如發(fā)出則進入數(shù)據(jù)接收狀態(tài)
  83.             while((DATA)&&U8FLAG++);
  84.             //數(shù)據(jù)接收狀態(tài)                 
  85.             COM();
  86.             U8RH_data_H_temp=U8comdata;
  87.             COM();
  88.             U8RH_data_L_temp=U8comdata;
  89.             COM();
  90.             U8T_data_H_temp=U8comdata;
  91.             COM();
  92.             U8T_data_L_temp=U8comdata;
  93.             COM();
  94.             U8checkdata_temp=U8comdata;
  95.             DATA=1;
  96.             //數(shù)據(jù)校驗
  97.             U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
  98.             if(U8temp==U8checkdata_temp)
  99.             {
  100.                       U8RH_data_H=U8RH_data_H_temp;
  101.                       U8RH_data_L=U8RH_data_L_temp;
  102.                       U8T_data_H=U8T_data_H_temp;
  103.                       U8T_data_L=U8T_data_L_temp;
  104.                       U8checkdata=U8checkdata_temp;
  105.             }//fi
  106.                 return 1;
  107.         }//fi
  108.         else   //傳感器不響應(yīng)
  109.         {
  110.            return 0;
  111.         }
  112. }
復(fù)制代碼

溫濕度檢測系統(tǒng)dht11主程序:
  1. #include <reg52.h>
  2. #include <math.h>
  3. #include "1602.h"
  4. #include "dht.h"
  5. #include "DS1302.h"

  6. //定義管腳
  7. sbit Key_Up = P3^2;
  8. sbit Key_Down = P3^5;
  9. sbit Key_Set = P3^3;

  10. //定義標(biāo)識
  11. volatile bit FlagStartRH = 0;  //開始溫濕度轉(zhuǎn)換標(biāo)志
  12. volatile bit FlagKeyPress = 0; //有鍵按下標(biāo)志
  13. volatile bit FlagAlert = 0;    //報警狀態(tài)標(biāo)志
  14. volatile bit FlagReview = 0;   //查詢標(biāo)志


  15. //定義溫濕度傳感器用外部變量
  16. extern U8  U8FLAG,k;
  17. extern U8  U8count,U8temp;
  18. extern U8  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
  19. extern U8  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
  20. extern U8  U8comdata;
  21. extern U8  count, count_r;
  22. //溫濕度傳感器用變量
  23. U16 temp;
  24. S16 temperature, humidity;
  25. U16 RHCounter;
  26. //按鍵響應(yīng)用變量
  27. U8 keyvalue, keyUp, keyDown, keySet;
  28. U8 FlagSet;                  
  29. //DS1302時鐘用變量
  30. SYSTEMTIME CurrentTime;
  31. uchar year, month, day, hour, minute, second;
  32. //報警及存儲用變量
  33. //char * pSave;
  34. //字符串顯示用變量
  35. uchar str1[6] = "000000";
  36. uchar AlertDate[9]="00-00-00", AlertTime[9]="00:00:00";
  37. uchar hide;
  38. //
  39. //函數(shù)聲明
  40. void int2str(int x, char* str);
  41. void Delay1ms(unsigned int count);
  42. void Data_Init();
  43. void Timer0_Init();
  44. void Timer0_ISR () ;

  45. void KeyProcess(uint num);



  46. //整型轉(zhuǎn)字符串的函數(shù),轉(zhuǎn)換范圍0--65536
  47. void int2str(int x, char* str)
  48. {
  49.     int i=1;
  50.     int tmp=10;
  51.     while(x/tmp!=0)
  52.     {
  53.         i++;
  54.         tmp*=10;
  55.     }
  56.     tmp=x;
  57.     str[i]='\0';
  58.     while(i>1)
  59.     {
  60.         str[--i]='0'+(tmp%10);
  61.         tmp/=10;
  62.     }
  63.     str[0]=tmp+'0';
  64. }




  65. void Delay1ms(unsigned int count)
  66. {
  67.         unsigned int i,j;
  68.         for(i=0;i<count;i++)
  69.         for(j=0;j<120;j++);
  70. }


  71. //數(shù)據(jù)初始化
  72. void Data_Init()
  73. {
  74.    RHCounter = 0;
  75.    keyvalue = 0;
  76.    keyUp = 1;
  77.    keyDown = 1;
  78.    keySet = 1;
  79.    FlagSet = 0;
  80.    hide = 0;
  81.    AlertDate[8]='\0';
  82.    AlertTime[8]='\0';

  83. }

  84. //定時器0初始化
  85. void Timer0_Init()
  86. {
  87.         ET0 = 1;        //允許定時器0中斷
  88.         TMOD = 1;       //定時器工作方式選擇
  89.         TL0 = 0x06;     
  90.         TH0 = 0xf8;     //定時器賦予初值
  91.         TR0 = 1;        //啟動定時器
  92. }

  93. //定時器0中斷
  94. void Timer0_ISR (void) interrupt 1 using 0
  95. {
  96.         TL0 = 0x06;
  97.         TH0 = 0xf8;     //定時器賦予初值

  98.         //每2秒鐘啟動一次溫濕度轉(zhuǎn)換
  99.     RHCounter ++;
  100.     if (RHCounter >= 450)
  101.     {
  102.        FlagStartRH = 1;
  103.            RHCounter = 0;
  104.            //設(shè)定閃爍標(biāo)志
  105.            if (hide == 1) hide = 0;
  106.            else hide = 1;
  107.     }
  108. }

  109. void KeyProcess(uint num)
  110. {
  111.    switch (num)
  112.    {
  113.       case 1:         //Up鍵被按下
  114.                  switch (FlagSet)
  115.                  {
  116.             case 0:
  117.                         case 1:
  118.                            break;
  119.                         case 2: //年
  120.                            if (year<99)        year++;
  121.                            Write1302(0x8e,0x00); //寫入允許
  122.                        DS1302_SetTime(DS1302_YEAR,year);
  123.                Write1302(0x8e,0x80); //禁止寫入
  124.                            break;
  125.                         case 3: //月
  126.                            if (month<12) month++;
  127.                            Write1302(0x8e,0x00); //寫入允許
  128.                        DS1302_SetTime(DS1302_MONTH,month);
  129.                Write1302(0x8e,0x80); //禁止寫入
  130.                            break;
  131.                         case 4: //日
  132.                            if (day<31) day++;
  133.                            Write1302(0x8e,0x00); //寫入允許
  134.                        DS1302_SetTime(DS1302_DAY,day);
  135.                Write1302(0x8e,0x80); //禁止寫入
  136.                            break;
  137.                         case 5: //時
  138.                            if (hour<23) hour++;
  139.                            Write1302(0x8e,0x00); //寫入允許
  140.                        DS1302_SetTime(DS1302_HOUR,hour);
  141.                Write1302(0x8e,0x80); //禁止寫入
  142.                            break;
  143.                         case 6: //分
  144.                            if (minute<60) minute++;
  145.                            Write1302(0x8e,0x00); //寫入允許
  146.                        DS1302_SetTime(DS1302_MINUTE,minute);
  147.                Write1302(0x8e,0x80); //禁止寫入
  148.                            break;
  149.                         case 7: //秒
  150.                            if (second<60) second++;
  151.                            Write1302(0x8e,0x00); //寫入允許
  152.                        DS1302_SetTime(DS1302_SECOND,second);
  153.                Write1302(0x8e,0x80); //禁止寫入
  154.                            break;
  155.              }
  156.                  break;
  157.           case 2:        //Down鍵被按下
  158.              switch (FlagSet)
  159.                  {
  160.             case 0:
  161.                         case 1:
  162.                            break;
  163.                         case 2: //年
  164.                            if (year>0)        year--;
  165.                            Write1302(0x8e,0x00); //寫入允許
  166.                        DS1302_SetTime(DS1302_YEAR,year);
  167.                Write1302(0x8e,0x80); //禁止寫入
  168.                            break;
  169.                         case 3: //月
  170.                            if (month>0) month--;
  171.                            Write1302(0x8e,0x00); //寫入允許
  172.                        DS1302_SetTime(DS1302_MONTH,month);
  173.                Write1302(0x8e,0x80); //禁止寫入
  174.                            break;
  175.                         case 4: //日
  176.                            if (day>0) day--;
  177.                            Write1302(0x8e,0x00); //寫入允許
  178.                        DS1302_SetTime(DS1302_DAY,day);
  179.                Write1302(0x8e,0x80); //禁止寫入
  180.                            break;
  181.                         case 5: //時
  182.                            if (hour>0) hour--;
  183.                            Write1302(0x8e,0x00); //寫入允許
  184.                        DS1302_SetTime(DS1302_HOUR,hour);
  185.                Write1302(0x8e,0x80); //禁止寫入
  186.                            break;
  187.                         case 6: //分
  188.                            if (minute>0) minute--;
  189.                            Write1302(0x8e,0x00); //寫入允許
  190.                        DS1302_SetTime(DS1302_MINUTE,minute);
  191.                Write1302(0x8e,0x80); //禁止寫入
  192.                            break;
  193.                         case 7: //秒
  194.                            if (second>0) second--;
  195.                            Write1302(0x8e,0x00); //寫入允許
  196.                        DS1302_SetTime(DS1302_SECOND,second);
  197.                Write1302(0x8e,0x80); //禁止寫入
  198.                            break;
  199.              }
  200.              break;
  201.           case 3:    //Set鍵被按下。FlagSet 0-報警;1-關(guān)報警;2-設(shè)置年;3-月;4-日;5-時;6-分;7-秒
  202.          if (FlagReview==0)  //只有不查詢時才能設(shè)定
  203.                  {
  204.                     FlagSet ++;
  205.                         if (FlagSet==1)
  206.                         {
  207.                            L1602_string(2,10," ");
  208.                         }
  209.                         else
  210.                         {
  211.                            L1602_string(2,10," ");
  212.                         }
  213.                     if (FlagSet>=8)
  214.                     {
  215.                        FlagSet = 0;
  216.                         }             
  217.                  }
  218.              break;                  
  219.           default:
  220.              break;
  221.    }
  222. }

  223. /********************************************************************
  224. * 名稱 : Main()
  225. * 功能 : 主函數(shù)
  226. ***********************************************************************/
  227. void main()
  228. {
  229.     U16 i, j, testnum;

  230.     EA = 0;

  231.         Timer0_Init();  //定時器0初始化
  232.     Data_Init();
  233.         Initial_DS1302();
  234.         EA = 1;

  235.         L1602_init();
  236.         L1602_string(1,1,"  Welcome to my ");
  237.         L1602_string(2,1," Infra Monitor! ");
  238.         //延時
  239.         for (i=0;i<1000;i++)
  240.            for (j=0;j<1000;j++)
  241.            {;}
  242.     //清屏
  243.         L1602_string(1,1,"           T   C");
  244.         L1602_string(2,1,"           H   %");

  245.   
  246.         while(1)
  247.         {
  248.              //查詢報警信號
  249.                  //FlagSet=0為報警狀態(tài),
  250.                  //FlagSet=1為關(guān)報警狀態(tài),
  251.                  //FlagSet=2,3,4,5,6,7依次為設(shè)置年,月,日,時,分,秒狀態(tài)
  252.                  if (FlagStartRH == 1)
  253.                  {
  254.              //溫濕度轉(zhuǎn)換標(biāo)志檢查
  255.                      TR0 = 0;
  256.              testnum = RH();
  257.                          FlagStartRH = 0;
  258.                          TR0 = 1;
  259.              //讀出溫濕度,只取整數(shù)部分
  260.                          humidity = U8RH_data_H;
  261.                          temperature = U8T_data_H;
  262.                  //讀出日期時間值
  263.                  DS1302_GetTime(&CurrentTime);
  264.                          year = CurrentTime.Year;
  265.              month = CurrentTime.Month;
  266.                          day = CurrentTime.Day;
  267.                          hour = CurrentTime.Hour;
  268.                          minute = CurrentTime.Minute;
  269.                          second = CurrentTime.Second;
  270.                  DateToStr(&CurrentTime);
  271.                  TimeToStr(&CurrentTime);
  272.              //如果不處于查詢狀態(tài)則顯示當(dāng)前日期時間溫度濕度
  273.                          if (FlagReview==0)
  274.                          {
  275.                             //清屏
  276.                        L1602_string(1,1,"           T   C");
  277.                                 L1602_string(2,1,"                  ");
  278.                                 L1602_string(2,12,"H   %");

  279.                                 //顯示溫濕度
  280.                             if (temperature<0)
  281.                             {
  282.                                L1602_string(2,7,"-");
  283.                             }
  284.                             temperature = abs(temperature);
  285.                             int2str(temperature,str1);
  286.                             L1602_string(1,14,str1);
  287.                             int2str(humidity,str1);
  288.                         L1602_string(2,14,str1);
  289.                     L1602_string(1,1,CurrentTime.DateString);
  290.                     L1602_string(2,1,CurrentTime.TimeString);
  291.                     //產(chǎn)生時間設(shè)定時的閃爍效果,只在未查詢且閃爍標(biāo)志置位時運行
  292.                     if (hide==1)
  293.                     {
  294.                               switch (FlagSet)
  295.                        {
  296.                           case 0:
  297.                                           case 1:
  298.                           break;
  299.                           case 2:                         //年
  300.                                  L1602_string(1,1,"  ");
  301.                                  break;
  302.                           case 3:                         //月
  303.                                  L1602_string(1,4,"  ");
  304.                                  break;
  305.                           case 4:                         //日
  306.                                  L1602_string(1,7,"  ");
  307.                                  break;
  308.                           case 5:                         //時
  309.                                  L1602_string(2,1,"  ");
  310.                                  break;
  311.                           case 6:                         //分
  312.                                  L1602_string(2,4,"  ");
  313.                                  break;
  314.                           case 7:                         //秒
  315.                                  L1602_string(2,7,"  ");
  316.                                  break;
  317.                           default:
  318.                              break;
  319.                            }
  320.                 }
  321.                          }
  322.                 }
  323.                 //以下為鍵盤查詢,當(dāng)有按鍵從按下到彈起時,該按鍵被響應(yīng)。
  324.                 if ((Key_Up)&&(keyUp==0)) {FlagKeyPress = 1; keyvalue = 1;}
  325.         else if ((Key_Down)&&(keyDown==0)) {FlagKeyPress = 1; keyvalue = 2;}
  326.         else if ((Key_Set)&&(keySet==0)) {FlagKeyPress = 1; keyvalue = 3;}
  327.                 if (FlagKeyPress == 1)
  328.                 {
  329.            KeyProcess(keyvalue);
  330.            FlagKeyPress = 0;           
  331.                 }
  332.         if (!Key_Up) keyUp = 0;
  333.                 else keyUp = 1;
  334.         if (!Key_Down) keyDown = 0;
  335.                 else keyDown = 1;
  336.         if (!Key_Set) keySet = 0;
  337.                 else keySet = 1;
  338.                 Delay1ms(100);
  339.         }       
  340. }


復(fù)制代碼


評分

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

查看全部評分

回復(fù)

使用道具 舉報

ID:149790 發(fā)表于 2016-11-24 14:19 | 顯示全部樓層
感謝分享,有用
回復(fù)

使用道具 舉報

ID:142383 發(fā)表于 2016-11-29 14:57 | 顯示全部樓層
下載了,測試成功,謝謝分享!
回復(fù)

使用道具 舉報

ID:170296 發(fā)表于 2017-3-13 13:04 | 顯示全部樓層
感謝分享,試試
回復(fù)

使用道具 舉報

ID:193406 發(fā)表于 2017-4-25 14:23 | 顯示全部樓層
很需要啊
回復(fù)

使用道具 舉報

ID:145935 發(fā)表于 2017-4-26 12:38 | 顯示全部樓層
學(xué)習(xí)中,謝謝分享!
回復(fù)

使用道具 舉報

ID:213117 發(fā)表于 2017-6-22 22:46 | 顯示全部樓層
正需要呢,感謝分享!
回復(fù)

使用道具 舉報

ID:68356 發(fā)表于 2017-6-23 16:29 | 顯示全部樓層
好東西啊,下載看看
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

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