欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: DHT11溫濕度傳感器設計報告(含單片機源碼+實物) [打印本頁]

作者: stepping1    時間: 2018-3-8 15:43
標題: DHT11溫濕度傳感器設計報告(含單片機源碼+實物)

DHT11溫濕度

傳感器設計報告

院系:信息工程與科學學院

電氣工程學院

專業:電子信息工程,自動化

:2014,2015

學生姓名:文*成,嚴*



二、實物圖





五、硬件設計分析以及使用

   1、程序通過usb數據線燒寫到單片機,單片機凹口靠usb下載口插入單片機底座,數據下載分別與單片機3.0和3.1(TXD和RXD)連接;

   2、自鎖開關未電源開關,按下通電,按起斷電;

   3、lcd1604引腳1接口靠usb下載口,對應引腳插入lcd1604液晶,液晶v0引腳接高精度電位器,液晶亮度可旋轉電位器調節,液晶DB0到DB7接口連接單片機的P0引腳,RS,RW和E分別連接單片機的P2^5,P2^6和P2^7引腳;

   4、8550三極管基極通過100歐電阻后與單片機P2^4引腳連接,發射極接vcc,集電極與蜂鳴器正極連接,蜂鳴器負極接地,當有信號觸發三極管懂啊同后,蜂鳴器發出響聲,集電極與蜂鳴器之間有跳線帽,拔開跳線帽則與蜂鳴器斷開,有無信號蜂鳴器均不會響;

   5、DHT11的數據引腳與單片機的P3^6引腳連接,負極與單片機的P3^7引腳連接,且又與電源負極連接,連接之間有跳線帽,拔開后可通過單片機控制DHT11的工作和停止工作,正極與電源正極相連

   6、5個電容按鍵從左到右,從上之下分別是時間設置按鍵,時間”+”按鍵,濕度設置按鍵,濕度”+”按鍵,系統復位按鍵。通電后,液晶顯示,第一行是時間設置數值,初始值為0,第二行是本產品實際工作時間,第三行是當前濕度以及設定控制濕度值,控制濕度值初始為0,第四行為當前溫度值。當時間設置鍵按下,光標閃爍,工作時間停止,按時間”+”按鍵設置指定工作時間,按一次進入秒設置,第二次分設置,第三次時設置,第四次設置完成,退出時間設置;同理,濕度設置,按一次進入設置,再按一次設置完畢,退出濕度設置;當時間到了設定值,蜂鳴器則發出響聲,當濕度低于設定值,蜂鳴器也會發出響聲。


AT89C52單片機

1個

蜂鳴器

1個

10k電阻

1G個

高精度電位器

1個

AT89C52單片機底座

1個

8550三極管

1個

極性電容10u

1個

DHT11溫濕度傳感器

1個

Usb母口

1個

跳線帽

2個

晶振11.0592

1個



Usb下載串口

1個

排針和母針

兩排

Lcd1604

1個



自鎖開關

1個

100歐電阻

1個

30pf電容

4個



電容按鍵

5個

導線

若干

萬用版

1個





四、程序

  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define unint unsigned int
  5. unsigned char code str4[12] ={' ',' ','0','0',':','0','0',':','0','0',' ',' '};
  6. unsigned char code str1[] ={"alarm:00:00:00"};
  7. //unsigned char num1[]={""};
  8. //unsigned char num2[]={""};
  9. unsigned char code dis1[] = {"RH: "};
  10. unsigned char code dis2[] = {"T: "};

  11. uchar numble,count,hour,minute,sound;
  12. int hours,minutes,sounds,flag,key1num;
  13. uchar TH_data,TL_data,RH_data,RL_data,CK_data;
  14. uchar TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
  15. uchar com_data,untemp,temp;
  16. uchar respond;
  17. uchar RH_shu,rhflag,key2num;
  18.             
  19. sbit TRH = P3^6;//溫濕度傳感器DHT11數據接入
  20. sbit LCD_RS = P2^5;            
  21. sbit LCD_RW = P2^6;
  22. sbit LCD_EN = P2^7;
  23. sbit key1 = P1^0;                 //時間調整選擇按鈕
  24. sbit key2 = P1^2;                //時間加按鈕
  25. sbit key3 = P3^2;              //濕度調整選擇按鈕
  26. sbit key4 = P3^5;              //濕度加按鈕
  27. sbit beep = P2^4;  //時間報警
  28. sbit alarm = P1^1;              //濕度報警
  29. void write_time(uchar time,uchar x);
  30. void write_time1(uchar time,uchar x);
  31. /*********************************************************************************/
  32. void timer() interrupt 1
  33. {
  34.               TH0=(65536-50000)/256;
  35.               TL0=(65536-50000)%256;
  36.               count++;
  37.               if(count==20)
  38.               {
  39.                             count=0;
  40.                             sound++;
  41.                             if(sound==60)
  42.                             {
  43.                                           sound=0;
  44.                                           minute++;
  45.                                           if(minute==60)
  46.                                           {
  47.                                                         minute=0;
  48.                                                         hour++;
  49.                                                         if(hour==24)
  50.                                                         {
  51.                                                                       hour = 0;
  52.                                                         }
  53.                                                         write_time(hour,4);
  54.                                           }
  55.                                           write_time(minute,7);
  56.                             }
  57.                             write_time(sound,10);
  58.               }
  59.             
  60. }
  61. void delay(unint k)
  62. {
  63.               unint x,y;
  64.               for(x=k;x>0;x--)
  65.                 for(y=110;y>0;y--);
  66. }
  67. void delayNOP()
  68. {
  69.         _nop_();
  70.         _nop_();
  71.         _nop_();
  72.         _nop_();
  73. }
  74. /*********************************************************************************/

  75. /*********************************************************************************/
  76. // 毫秒級延時子程序
  77. /*********************************************************************************/
  78. void delay_ms(unsigned char ms)
  79. {      
  80.         unsigned char i;
  81.         while(ms--)
  82.         {
  83.                 for(i = 0; i< 150; i++)
  84.                 {
  85.                         _nop_();
  86.                         _nop_();
  87.                         _nop_();
  88.                         _nop_();
  89.                 }
  90.         }
  91. }
  92. /*********************************************************************************/

  93. /*********************************************************************************/
  94. //5us級延時程序
  95. /*********************************************************************************/
  96. void delay_us()
  97. {
  98.         uchar i;
  99.         i--;
  100.         i--;
  101.         i--;
  102.         i--;
  103.         i--;
  104.         i--;
  105. }
  106. /********************************************************************************/


  107. /********************************************************************************/
  108. // 測試LCD忙碌狀態
  109. //lcd_busy()為1時,忙,等待。lcd_busy()為0時,閑,可寫指令與數據。
  110. /********************************************************************************/
  111. bit lcd_busy()
  112. {      
  113.         bit result;
  114.         LCD_RS = 0;
  115.         LCD_RW = 1;
  116.         LCD_EN = 1;
  117.         delayNOP();
  118.         result=(bit)(P0&0x80);
  119.         LCD_EN = 0;
  120.         return(result);
  121. }
  122. /*******************************************************************************/

  123. /*******************************************************************************/
  124. // 寫入指令數據到LCD
  125. /*******************************************************************************/
  126. void lcd_wcmd(unsigned char cmd)
  127. {      
  128.        while(lcd_busy());
  129.         LCD_RS = 0;
  130.         LCD_RW = 0;
  131.         LCD_EN = 0;
  132.         _nop_();
  133.         _nop_();
  134.         P0 = cmd;
  135.         delayNOP();
  136.         LCD_EN = 1;
  137.         delayNOP();
  138.         LCD_EN = 0;
  139. }
  140. /*****************************************************************************/

  141. /*****************************************************************************/
  142. //寫顯示數據到LCD                                               
  143. //RS=高電平,RW=低電平,E=高脈沖,D0-D7=數據。                           
  144. /*****************************************************************************/
  145. void lcd_wdata(unsigned char dat)
  146. {                        
  147.        while(lcd_busy());
  148.         LCD_RS = 1;
  149.         LCD_RW = 0;
  150.         LCD_EN = 0;
  151.         P0 = dat;
  152.         delayNOP();
  153.         LCD_EN = 1;
  154.         delayNOP();
  155.         LCD_EN = 0;
  156. }
  157. /****************************************************************************/

  158. /****************************************************************************/
  159. //LCD初始化設定
  160. /****************************************************************************/
  161. void lcd_init()
  162. {
  163.        // delay_ms(15);                  
  164.         lcd_wcmd(0x38);      //16*2顯示,5*7點陣,8位數據
  165.       //  delay_ms(5);
  166.         lcd_wcmd(0x38);        
  167.        // delay_ms(5);
  168.         lcd_wcmd(0x38);        
  169.        // delay_ms(5);
  170.         lcd_wcmd(0x0c);      //顯示開,關光標
  171.        // delay_ms(5);
  172.         lcd_wcmd(0x06);      //移動光標
  173.        // delay_ms(5);
  174.         //lcd_wcmd(0x01);      //清除LCD的顯示內容,如果屏幕過暗,可將這倆句刪除
  175.         //delay_ms(5);
  176.         lcd_wcmd(0x80+0x40+2);
  177.         for(numble=0;numble<10;numble++)
  178.         {
  179.                       lcd_wdata(str4[numble]);
  180.                             }
  181.                             lcd_wcmd(0x80+1);
  182.                             for(numble=0;numble<14;numble++)
  183.                             {
  184.                                           lcd_wdata(str1[numble]);
  185.                             }
  186.                             lcd_wcmd(0x90+11);
  187.                             lcd_wdata('0');
  188.                             lcd_wdata('0');
  189.                             lcd_wdata('%');
  190.                             lcd_wdata('R');
  191.                             lcd_wdata('H');
  192.                             TMOD = 0x01;
  193.                             TH0 = (65536-50000)/256;
  194.                             TL0 = (65536-50000)%256;
  195.                             EA = 1;
  196.                             ET0 = 1;
  197.                             TR0 = 1;
  198. }
  199. /****************************************************************************/
  200. void write_time(uchar time,uchar x)
  201. {
  202.               uchar shi , ge;
  203.               shi = time/10;
  204.               ge = time%10;
  205.               lcd_wcmd(0x80+0x40+x);
  206.               lcd_wdata(0x30+shi);
  207.               lcd_wdata(0x30+ge);
  208. }
  209. void write_time1(uchar time,uchar x)
  210. {
  211.               uchar shi , ge;
  212.               shi = time/10;
  213.               ge = time%10;
  214.               lcd_wcmd(0x80+x);
  215.               lcd_wdata(0x30+shi);
  216.               lcd_wdata(0x30+ge);
  217. }
  218. void write_rh(uchar time,uchar x)
  219. {
  220.               uchar shi , ge;
  221.               shi = time/10;
  222.               ge = time%10;
  223.               lcd_wcmd(0x90+x);
  224.               lcd_wdata(0x30+shi);
  225.               lcd_wdata(0x30+ge);
  226. }

  227. /****************************************************************************/
  228. void keyscan()
  229. {
  230.               if(key1==0)
  231.               {
  232.                             delay(5);
  233.                             if(key1==0)
  234.                             {
  235.                                           key1num++;
  236.                                           while(!key1);
  237.                                           switch(key1num)
  238.                                           {
  239.                                                         case 1:
  240.                                                                       TR0 = 0;
  241.                                                                       lcd_wcmd(0x80+13);
  242.                                                                       lcd_wcmd(0x0f);
  243.                                                                       break;
  244.                                                         case 2:
  245.                                                                       lcd_wcmd(0x80+10);
  246.                                                                       lcd_wcmd(0x0f);
  247.                                                                       break;
  248.                                                         case 3:
  249.                                                                       lcd_wcmd(0x80+7);
  250.                                                                       lcd_wcmd(0x0f);
  251.                                                                       break;
  252.                                                         case 4:
  253.                                                                       TR0 = 1;
  254.                                                                       lcd_wcmd(0x0c);
  255.                                                                       key1num = 0;
  256.                                                                       flag=1;
  257.                                                                       break;
  258.                                           }
  259.                             }
  260.               }
  261.               if(key1num!=0)
  262.               {
  263.                             if(key2 == 0)
  264.                             {
  265.                                           delay(5);
  266.                                           if(key2 == 0)
  267.                                           {
  268.                                                         while(!key2);
  269.                                                         switch(key1num)
  270.                                                         {
  271.                                                                       case 1:
  272.                                                                                     sounds++;
  273.                                                                                     if(sounds==60)
  274.                                                                                     sounds=0;
  275.                                                                                     write_time1(sounds,13);
  276.                                                                                     lcd_wcmd(0x80+13);
  277.                                                                                     break;
  278.                                                                       case 2:
  279.                                                                                     minutes++;
  280.                                                                                     if(minutes==60)
  281.                                                                                     minutes=0;
  282.                                                                                     write_time1(minutes,10);
  283.                                                                                     lcd_wcmd(0x80+10);
  284.                                                                                     break;
  285.                                                                       case 3:
  286.                                                                                     hours++;
  287.                                                                                     if(hours==24)
  288.                                                                                     hours=0;
  289.                                                                                     write_time1(hours,7);
  290.                                                                                     lcd_wcmd(0x80+7);
  291.                                                                                     break;
  292.                                                         }
  293.                                           }
  294.                             }
  295.               }
  296.               if(hour==hours&&minute==minutes&&sound==sounds&&flag==1)
  297.               {
  298.                             beep = 0;
  299.               }
  300.               if(key3==0)
  301.               {
  302.                             delay(5);
  303.                             if(key3==0)
  304.                             {
  305.                                           key2num++;
  306.                                           while(!key3);
  307.                                           switch(key2num)
  308.                                           {
  309.                                                         case 1:
  310.                                                                       lcd_wcmd(0x90+12);
  311.                                                                       lcd_wcmd(0x0f);
  312.                                                                       break;
  313.                                                         case 2:
  314.                                                             rhflag=1;
  315.                                                         case 3:
  316.                                                             key2num=0;
  317.                                                                       lcd_wcmd(0x0c);
  318.                                                                       break;
  319.                                           }
  320.                             }
  321.               }
  322.               if(key2num!=0)
  323.               {
  324.                             if(key4==0)
  325.                             {
  326.                                           delay(5);
  327.                                           if(key4==0)
  328.                                           {
  329.                                                         while(!key4);
  330.                                                         switch(key2num)
  331.                                                         {
  332.                                                                       case 1:
  333.                                                                                     RH_shu++;
  334.                                                                                     if(RH_shu==100)
  335.                                                                                     RH_shu=0;
  336.                                                                                     write_rh(RH_shu,11);
  337.                                                         //                            rhflag = 1;
  338.                                                                                     break;
  339.                                                         }
  340.                                           }
  341.                             }
  342.               }
  343. }
  344. //設定LCD顯示位置
  345. /****************************************************************************/
  346. void lcd_dis_pos(unsigned char pos)
  347. {      
  348.         lcd_wcmd(pos | 0x90); //數據指針=80+地址變量
  349. }
  350. /****************************************************************************/

  351. /****************************************************************************/
  352. //收發信號檢測,數據讀取
  353. /****************************************************************************/
  354. char receive()
  355. {   
  356. uchar i;
  357. com_data=0;
  358. for(i=0;i<=7;i++)   
  359. {
  360.         respond=2;
  361.         while((!TRH)&&respond++);
  362.         delay_us();
  363.         delay_us();
  364.         delay_us();
  365.         if(TRH)
  366.         {
  367.                 temp=1;
  368.                 respond=2;
  369.                 while((TRH)&&respond++);
  370.         }
  371.         else
  372.                 temp=0;
  373.         com_data<<=1;
  374.         com_data|=temp;   
  375. }
  376. return(com_data);
  377. }
  378. /****************************************************************************/

  379. /****************************************************************************/
  380. //濕度讀取子程序
  381. //溫度高8位== TL_data
  382. //溫度低8位== TH_data
  383. //濕度高8位== RH_data
  384. //濕度低8位== RH_data
  385. //校驗 8位 == CK_data
  386. //調用的程序有 delay();, Delay_5us();,RECEIVE();
  387. /***************************************************************************/
  388. void read_TRH()
  389. {
  390. //主機拉低18ms
  391. TRH=0;
  392. delay_ms(18);
  393. TRH=1;
  394. //DATA總線由上拉電阻拉高 主機延時20us
  395. delay_us();
  396. delay_us();
  397. delay_us();
  398. delay_us();
  399. //delay_us();
  400. //delay_us();delay_us();delay_us();delay_us();
  401. //主機設為輸入 判斷從機響應信號
  402. TRH=1;
  403. //判斷DHT11是否有低電平響應信號 如不響應則跳出,響應則向下運行  
  404. if(!TRH)  
  405. {
  406.         respond=2;                         //判斷DHT11發出 80us 的低電平響應信號是否結束
  407.         while((!TRH)&& respond++);
  408.         respond=2;                         //判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態
  409.         while(TRH && respond++);           //數據接收狀態  
  410.         RH_temp = receive();
  411.         RL_temp = receive();
  412.         TH_temp = receive();
  413.         TL_temp = receive();
  414.         CK_temp = receive();
  415.         TRH=1;                             //數據校驗
  416.         untemp=(RH_temp+RL_temp+TH_temp+TL_temp);
  417.         if(untemp==CK_temp)
  418.         {
  419.                 RH_data = RH_temp;
  420.                 RL_data = RL_temp;
  421.                 TH_data = TH_temp;
  422.                 TL_data = TL_temp;
  423.                 CK_data = CK_temp;
  424.         }
  425.     }
  426. }
  427. void lcd_display()
  428. {
  429.               lcd_dis_pos(0x03);
  430.               lcd_wdata(0x30+RH_data/10);
  431.               lcd_dis_pos(0x04);
  432.               lcd_wdata(0x30+RH_data%10);
  433.               lcd_dis_pos(0x05);
  434.               lcd_wdata(0x2e);
  435.               lcd_dis_pos(0x06);
  436.               lcd_wdata(0x30+RL_data%10);
  437. ……………………

  438. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
完整的Word格式文檔51黑下載地址:
DHT11設計報告.docx (1.15 MB, 下載次數: 154)





作者: 西瓜不懂檸檬    時間: 2019-4-28 13:39
無數據顯示是怎么回事呢
作者: 龍榮    時間: 2019-5-31 08:19
想看看   
作者: L1610320824    時間: 2019-6-20 14:30
請問能給出電路原理圖嗎




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1