久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 12519|回復: 20
打印 上一主題 下一主題
收起左側

基于單片機的DHT11溫度濕度采集系統

  [復制鏈接]
跳轉到指定樓層
樓主
DHT11溫度濕度采集原理圖:


DHT11的單片機源程序:
  1. /****************************************************************

  2. 聲明:本程序僅供大家參考學習,未經本人同意禁止用于商業用途。

  3. ***************************************************************/
  4. #include <reg52.h>
  5. #define uint unsigned int
  6. #define uchar unsigned char
  7. #include <intrins.h>

  8. typedef bit BOOL  ;

  9. sbit io = P1^1 ;//(口線定義)
  10. sbit bee=P1^0;
  11. sbit rs = P2^5 ;
  12. sbit rw = P2^6 ;
  13. sbit ep = P2^7 ;
  14. bit flag_300ms ;

  15. sbit K1=P1^2;
  16. sbit K2=P1^3;
  17. sbit K3=P1^4;

  18. uchar yemian=0;//(定義變量)
  19. uchar flat=1;
  20. uchar data_byte;
  21. uchar RH,RL,TH,TL;
  22. uchar WenDu,ShiDu;//報警的溫度和濕度
  23. #include "eeprom52.h"


  24. /****************************延時程序****************************/
  25. void delay(uchar ms)
  26. {       // 延時子程序
  27.          uchar i ;
  28.          while(ms--)
  29.          {
  30.                   for(i = 0 ; i<250;i++) ;
  31.          }
  32. }

  33. void delay1()//延時10us
  34. {
  35.         uchar i;
  36.         i--;
  37.         i--;
  38.         i--;
  39.         i--;
  40.         i--;
  41.         i--;
  42. }
  43. void longdelay(uchar s) //長延時
  44. {
  45.          while(s--)
  46.          {
  47.                   delay(20) ;
  48.          }
  49. }



  50. /******************把數據保存到單片機內部eeprom中******************/
  51. void write_eeprom()
  52. {
  53.         SectorErase(0x2000);
  54.         byte_write(0x2000, WenDu);
  55.         byte_write(0x2001, ShiDu);
  56.         byte_write(0x2060, a_a);       
  57. }

  58. /******************把數據從單片機內部eeprom中讀出來*****************/
  59. void read_eeprom()
  60. {
  61.         WenDu   = byte_read(0x2000);
  62.   ShiDu = byte_read(0x2001);
  63.         a_a      = byte_read(0x2060);
  64. }

  65. /**************開機自檢eeprom初始化*****************/
  66. void init_eeprom()
  67. {
  68.         read_eeprom();                //先讀
  69.         if(a_a != 2)                //新的單片機初始單片機內問eeprom
  70.         {
  71.         WenDu   = 30;
  72.         ShiDu   = 80;
  73.                 a_a = 2;
  74.                 write_eeprom();
  75.         }       
  76. }



  77. /********************報警程序部分*******************/
  78. void warn()  //報警函數
  79. {
  80.        
  81.   if(TH>=WenDu)  //檢測的溫度高于設定溫度報警值
  82.                                              
  83.      {
  84.       bee=0; //報警
  85.                        
  86.      }      
  87.                  
  88.         if(RH>=ShiDu)  //檢測的濕度高于設定的濕度值
  89.                                              
  90.      {
  91.       bee=0; //報警
  92.      }      

  93.                  
  94.         if( TH<WenDu  &&  RH<ShiDu )         
  95.     {
  96.                   bee=1; //停止報警
  97.                 }
  98.                  
  99.   
  100. }

  101. /************************LCD模塊******************************************/

  102. BOOL lcd_bz()//測試LCD忙碌狀態
  103. {      
  104.          BOOL result ;
  105.          rs = 0 ;
  106.          rw = 1 ;
  107.          ep = 1 ;
  108.          result = (BOOL)(P0 & 0x80) ;
  109.          ep = 0 ;
  110.          return result ;
  111. }

  112. void write_cmd(uchar cmd)// 寫指令
  113. {      
  114.         while(lcd_bz()) ;
  115.         rs = 0 ;
  116.         rw = 0 ;
  117.         ep = 0 ;
  118.         P0 = cmd ;
  119.         ep = 1 ;
  120.         ep = 0 ;  
  121. }

  122. void write_addr(uchar addr)//寫地址
  123. {      
  124.         write_cmd(addr|0x80) ;
  125. }

  126. void write_byte(uchar dat)//寫字節
  127. {      
  128.         while(lcd_bz()) ;
  129.           rs = 1 ;
  130.           rw = 0 ;
  131.           ep = 0 ;
  132.           P0 = dat ;
  133.           ep = 1 ;
  134.           ep = 0 ;
  135. }

  136. void lcd_init()// 初始化
  137. {      
  138.          write_cmd(0x38) ;
  139.          delay(1);
  140.          write_cmd(0x08) ;  
  141.          delay(1);
  142.          write_cmd(0x01) ;
  143.          delay(1);
  144.          write_cmd(0x06) ;
  145.          delay(1);
  146.          write_cmd(0x0c) ;
  147.          delay(1);
  148. }

  149. void display(uchar addr, uchar q)//在某一地址上顯示一字節
  150. {          
  151.          delay(1) ;
  152.          write_addr(addr) ;
  153.    write_byte(q) ;
  154.          delay(1) ;
  155.          
  156. }

  157. /*********************** DHT11測試模塊***************************************/

  158. void start()//開始信號
  159. {
  160.         io=1;
  161.         delay1();
  162.         io=0;
  163.         delay(20);//>18ms
  164.         io=1;
  165.         delay1();//20-40us
  166.         delay1();
  167.         delay1();
  168.         delay1();
  169.         delay1();
  170. }
  171. uchar receive_byte()//接收一個字節
  172. {
  173.         uchar i,temp,count;
  174.         for(i=0;i<8;i++)
  175.         {
  176.         temp=0;
  177.                 delay1();delay1();delay1();delay1();
  178.                 if(io==1)temp=1;
  179.                 count=2;
  180.                 while((io)&&count++);
  181.                 if(count==1)break;
  182.                 data_byte<<=1;       
  183.                 data_byte|=temp;
  184.         }
  185.         return data_byte;
  186. }
  187. void receive()//接收數據
  188. {
  189.         uchar T_H,T_L,R_H,R_L,check,num_check;
  190.         uchar count;
  191.         start();//開始信號
  192.         io=1;
  193.         if(!io)//讀取DHT11響應信號
  194.         {
  195.        
  196.         while((io)&&count++);
  197.         R_H=receive_byte();
  198.         R_L=receive_byte();
  199.         T_H=receive_byte();
  200.         T_L=receive_byte();
  201.         check=receive_byte();
  202.         io=0;//拉低延時50us
  203.         delay1();delay1();delay1();delay1();delay1();
  204.         io=1;
  205.         num_check=R_H+R_L+T_H+T_L;
  206.         if(num_check=check)
  207.         {
  208.                 RH=R_H;
  209.                 RL=R_L;
  210.                 TH=T_H;
  211.                 TL=T_L;
  212.                 check=num_check;
  213.         }
  214.         }
  215. }


  216. void showw()   // 問候語函數
  217. {      
  218.            lcd_init(); //初始化
  219.             delay(10);
  220.        
  221.      display(0x05,'W');
  222.      display(0x06,'e');
  223.                  display(0x07,'l');
  224.                  display(0x08,'c');
  225.                  display(0x09,'o');
  226.                  display(0x0a,'m');
  227.      display(0x0b,'e');
  228.            delay(250); //短暫延時
  229.            delay(250);
  230.            delay(250);
  231.           

  232. /*********************************/
  233. /*
  234.            display(0x40,' ') ;
  235.                  display(0x41,'h');
  236.                  display(0x42,'e');
  237.                
  238. */
  239. }


  240. /*************定時器0初始化程序***************/
  241. void time_init()          
  242. {
  243.         EA   = 1;                   //開總中斷
  244.         TMOD = 0X01;          //定時器0、定時器1工作方式1
  245.         ET0  = 1;                  //開定時器0中斷
  246.         TR0  = 1;                  //允許定時器0定時
  247. }



  248. void key() //按鍵程序 選擇菜單模式
  249. {
  250.      
  251.           if(!K1)
  252.                    {  
  253.                           delay(20);
  254.                             if(!K1)
  255.                          {   
  256.                                                          while(!K1)
  257.                                            ;
  258.                                                           yemian++;
  259.                                                           flat++;
  260.                                                                 if(yemian>=3) { yemian=0; }
  261.                                                                
  262.              }
  263.                    }

  264.        
  265.        
  266. }


  267. shezhi()  //對里面的數值進行修改
  268. {
  269.     if(!K2)
  270.                    {  
  271.                           delay(50);
  272.                             if(!K2)
  273.                          {   
  274.                                                          ;
  275.                                                          
  276.                                                          if(yemian==1)
  277.                                                          {
  278.                                                           WenDu+=1;
  279.                                                                 if(WenDu>99) { WenDu=99; }  //濕度上限加
  280.                                                          }
  281.                                                          
  282.                                                          if(yemian==2)
  283.                                                          {
  284.                                                           ShiDu+=1;
  285.                                                                 if(ShiDu>99) { ShiDu=99; }  //濕度下限加
  286.                                                          }
  287.                                                          
  288.                                                                 write_eeprom();       //保存數據               
  289.              }
  290.                    }
  291.                          
  292.                           if(!K3)
  293.                    {  
  294.                             delay(50);
  295.                              if(!K3)
  296.                          {   
  297.                                                        
  298.                                            ;
  299.                                                            if(yemian==1)
  300.                                                              {
  301.                                                               WenDu-=1;          //濕度下限減
  302.                                                                     if(WenDu<1) {WenDu=1; }
  303.                                                              }
  304.                                                          
  305.                                                            if(yemian==2)
  306.                                                              {
  307.                                                               ShiDu-=1;         //濕度下限減
  308.                                                                     if(ShiDu<1) { ShiDu=1; }
  309.                                                              }
  310.                                                                 write_eeprom();       //保存數據               
  311.              }
  312.                    }

  313. }



  314. /***************************主程序*********************************/
  315. void main()
  316. {
  317.          init_eeprom();                              //讀eeprom數據
  318.    time_init();                                //初始化定時器
  319.    showw();    //顯示問候語 和名字
  320.   
  321.         while(1)
  322.         {   
  323.                
  324.                    key();
  325.                 //====================yemian==0時 進入工作狀態=================================
  326.                          if(yemian==0)  
  327.                         {
  328.                                 if(flat==1)
  329.                                  {
  330.            flat=0;
  331.                                          lcd_init(); //初始化
  332.                                                   
  333.                                          display(0x00,'T') ;    //Temp
  334.                        display(0x01,'e');
  335.                        display(0x02,'m');
  336.                                          display(0x03,'p');
  337.            display(0x04,':');
  338.                                          
  339.                                          display(0x08,0xdf); // 度
  340.                        display(0x09,'C');
  341.                                          
  342.                                          
  343.                                          display(0x40,'H') ;    //Humi
  344.                        display(0x41,'u');
  345.                        display(0x42,'m');
  346.                                          display(0x43,'i');
  347.            display(0x44,':');
  348.                                          
  349.                                          display(0x47,'%');
  350.                                          display(0x48,'R');
  351.                                          display(0x49,'H');
  352.                                          
  353.                                          display(0x0c,'T');
  354.            display(0x0d,':');
  355.            display(0x0e,WenDu/10+0x30);  //報警溫度
  356.                        display(0x0f,WenDu%10+0x30);
  357.                                   
  358.                                          display(0x4c,'H');
  359.            display(0x4d,':');
  360.                                    display(0x4e,ShiDu/10+0x30);  //報警濕度
  361.                        display(0x4f,ShiDu%10+0x30);
  362.          
  363.           }
  364.                        
  365.                          if(flag_300ms == 1)
  366.                      {               
  367.                              flag_300ms = 0;
  368.            receive();
  369.                                          
  370.                                          display(0x05,TH/10+0x30);  //溫度顯示
  371.                        display(0x06,TH%10+0x30);
  372.                                          
  373.            display(0x45,RH/10+0x30);  //濕度顯示
  374.                        display(0x46,RH%10+0x30);
  375.                                          
  376.                                        
  377.            warn();
  378.                      }
  379.                        
  380.         }               
  381.                        
  382.         //====================yemian==1 溫度設置===========================
  383.                                 if(yemian==1)  //溫度
  384.                             {
  385.                          if(flat==1)
  386.                                      {
  387.                flat=0;  
  388.                                                           bee=1;
  389.                lcd_init(); //初始化
  390.                                                          display(0x06,'T');
  391.                                                          display(0x07,'e');
  392.                                                          display(0x08,'m');
  393.                                                          display(0x09,'p');
  394.              }
  395.                                                  
  396.                                                 shezhi();
  397.                                                 display(0x47,WenDu/10+0x30);  //溫度
  398.                         display(0x48,WenDu%10+0x30);
  399.                       }
  400.                        
  401.                 //====================yemian==1濕度設置==========================       
  402.                                 if(yemian==2)   //濕度設置
  403.                             {
  404.                          if(flat==1)
  405.                                      {
  406.                flat=0;  
  407.                                                           bee=1;
  408.                lcd_init(); //初始化
  409.                                                          display(0x06,'H');
  410.                                                          display(0x07,'u');
  411.                                                          display(0x08,'m');
  412.                                                          display(0x09,'i');
  413.                                                  }
  414.                                                  shezhi();
  415.                                                  display(0x47,ShiDu/10+0x30);  //濕度
  416.                          display(0x48,ShiDu%10+0x30);
  417.                       }
  418.         }
  419. }



  420. /*************定時器0中斷服務程序***************/
  421. void time0_int() interrupt 1
  422. {       
  423.         static uchar value;
  424.         TH0 = 0x3c;
  425.         TL0 = 0xb0;     // 50ms
  426.          
  427.         if(value % 6 == 0)
  428.         {
  429.                 flag_300ms = 1;           //300ms
  430.                 value = 0;
  431.         }
  432. }
復制代碼



完整代碼下載:
基于單片機的溫度濕度采集系統.zip (64.72 KB, 下載次數: 212)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏10 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:209240 發表于 2017-6-8 15:55 | 只看該作者
學習學習
回復

使用道具 舉報

板凳
ID:209240 發表于 2017-6-10 09:39 | 只看該作者
請問   那三個開關是干什么的?

3WT{B65V2PCSC)75I)%A$M9.png (5.64 KB, 下載次數: 85)

3WT{B65V2PCSC)75I)%A$M9.png
回復

使用道具 舉報

地板
ID:194176 發表于 2017-6-12 15:28 | 只看該作者
電源采用好多啊,蜂鳴器和led串聯會不會出問題?
回復

使用道具 舉報

5#
ID:242055 發表于 2017-10-23 12:09 | 只看該作者
濕度采集模塊在哪呀,大佬?

回復

使用道具 舉報

6#
ID:323396 發表于 2018-5-6 17:37 | 只看該作者
學習學習
回復

使用道具 舉報

7#
ID:314461 發表于 2018-5-7 17:52 | 只看該作者
學習一下謝謝
回復

使用道具 舉報

8#
ID:324678 發表于 2018-5-7 23:30 來自手機 | 只看該作者
那個RH是幾進制,樓主?
回復

使用道具 舉報

9#
ID:328119 發表于 2018-10-28 13:18 | 只看該作者
直接串聯不會出問題?
回復

使用道具 舉報

10#
ID:402967 發表于 2018-10-28 17:25 | 只看該作者
學習一下謝謝
回復

使用道具 舉報

11#
ID:424610 發表于 2018-11-12 16:25 | 只看該作者
我怎么用不了,LCD顯示的是黑色方塊?
回復

使用道具 舉報

12#
ID:220936 發表于 2019-2-10 20:22 | 只看該作者
"eeprom52.h"是干什么用的
回復

使用道具 舉報

13#
ID:505938 發表于 2019-4-7 11:00 | 只看該作者
6.C(65): error C267: 'SectorErase': requires ANSI-style prototype
回復

使用道具 舉報

14#
ID:239977 發表于 2019-4-7 14:25 | 只看該作者
謝謝樓主的無私分享
回復

使用道具 舉報

15#
ID:528701 發表于 2019-5-6 16:47 | 只看該作者
RH和TH是幾進制的呢?
回復

使用道具 舉報

16#
ID:525629 發表于 2020-1-3 12:11 | 只看該作者
怪討喜 發表于 2018-11-12 16:25
我怎么用不了,LCD顯示的是黑色方塊?

我也是這樣,仿真后來都出來,但是實物里用不了
回復

使用道具 舉報

17#
ID:229772 發表于 2020-1-8 17:16 | 只看該作者
完完全全COPY例程,改都沒改。。。
回復

使用道具 舉報

18#
ID:387558 發表于 2020-1-12 12:38 來自手機 | 只看該作者
好資料感謝分享
回復

使用道具 舉報

19#
ID:637591 發表于 2020-12-8 21:29 | 只看該作者
lcd1602與單片機之間加個排阻
回復

使用道具 舉報

20#
ID:637591 發表于 2020-12-8 21:30 | 只看該作者
怪討喜 發表于 2018-11-12 16:25
我怎么用不了,LCD顯示的是黑色方塊?

lcd1602與單片機之間并一個排阻   通電后調節那個10K的電位器 能顯示出字
回復

使用道具 舉報

21#
ID:848824 發表于 2021-1-28 17:08 | 只看該作者
屏幕顯示正常,溫度濕度顯示0怎么回事啊
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一级看片免费视频囗交动图 | 久久国产精品无码网站 | av三级在线观看 | 日韩精品在线一区 | 伊人伊成久久人综合网站 | 欧美区在线观看 | 亚洲成人二区 | 欧美在线一区二区三区 | 久久久久久久久中文字幕 | 亚洲传媒在线 | 国产成人精品久久 | 日韩三级| 国产精品久久久久aaaa九色 | 91精品国产91久久综合桃花 | 久久久久无码国产精品一区 | 国产精品久久久久久久久久软件 | 国产精品一区一区三区 | 精精国产视频 | 欧美精品一区免费 | 韩国av电影网 | 色综合天天天天做夜夜夜夜做 | 国产精品自产av一区二区三区 | 狠狠综合久久av一区二区小说 | 国产人成精品一区二区三 | 91视频88av| 奇米四色在线观看 | 九九热在线视频免费观看 | 久久99国产精一区二区三区 | 狠狠干综合视频 | 少妇性l交大片免费一 | www九色| 国产欧美精品一区二区三区 | 羞羞的视频免费看 | 国产网站在线免费观看 | 欧美日韩一区二区三区在线观看 | 日韩欧美国产电影 | 欧美日韩亚| 国产精品一区二区视频 | 亚洲 成人 在线 | 天天操天天射天天 | 亚洲 中文 欧美 日韩 在线观看 |