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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 16453|回復: 3
打印 上一主題 下一主題
收起左側(cè)

DHT11溫濕度傳感器設計報告(含單片機源碼+實物)

  [復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:282742 發(fā)表于 2018-3-8 15:43 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

DHT11溫濕度

傳感器設計報告

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

電氣工程學院

專業(yè):電子信息工程,自動化

:2014,2015

學生姓名:文*成,嚴*

  • 設計電路圖


二、實物圖





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

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

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

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

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

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

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


  • 元器件清單

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數(shù)據(jù)接入
  20. sbit LCD_RS = P2^5;            
  21. sbit LCD_RW = P2^6;
  22. sbit LCD_EN = P2^7;
  23. sbit key1 = P1^0;                 //時間調(diào)整選擇按鈕
  24. sbit key2 = P1^2;                //時間加按鈕
  25. sbit key3 = P3^2;              //濕度調(diào)整選擇按鈕
  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忙碌狀態(tài)
  109. //lcd_busy()為1時,忙,等待。lcd_busy()為0時,閑,可寫指令與數(shù)據(jù)。
  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. // 寫入指令數(shù)據(jù)到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. //寫顯示數(shù)據(jù)到LCD                                               
  143. //RS=高電平,RW=低電平,E=高脈沖,D0-D7=數(shù)據(jù)。                           
  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位數(shù)據(jù)
  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的顯示內(nèi)容,如果屏幕過暗,可將這倆句刪除
  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); //數(shù)據(jù)指針=80+地址變量
  349. }
  350. /****************************************************************************/

  351. /****************************************************************************/
  352. //收發(fā)信號檢測,數(shù)據(jù)讀取
  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. //調(diào)用的程序有 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發(fā)出 80us 的低電平響應信號是否結(jié)束
  407.         while((!TRH)&& respond++);
  408.         respond=2;                         //判斷從機是否發(fā)出 80us 的高電平,如發(fā)出則進入數(shù)據(jù)接收狀態(tài)
  409.         while(TRH && respond++);           //數(shù)據(jù)接收狀態(tài)  
  410.         RH_temp = receive();
  411.         RL_temp = receive();
  412.         TH_temp = receive();
  413.         TL_temp = receive();
  414.         CK_temp = receive();
  415.         TRH=1;                             //數(shù)據(jù)校驗
  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, 下載次數(shù): 154)




評分

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

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發(fā)
ID:501681 發(fā)表于 2019-4-28 13:39 | 只看該作者
無數(shù)據(jù)顯示是怎么回事呢
回復

使用道具 舉報

板凳
ID:551598 發(fā)表于 2019-5-31 08:19 | 只看該作者
想看看   
回復

使用道具 舉報

地板
ID:564512 發(fā)表于 2019-6-20 14:30 | 只看該作者
請問能給出電路原理圖嗎
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久性色 | 亚洲a视频 | 一区二区三区免费在线观看 | 欧美三级在线 | 亚洲欧美在线视频 | 九九综合 | 天天干狠狠操 | 91黄在线观看 | 99热精品6| 欧美亚洲视频在线观看 | 伊人网伊人网 | 午夜免费网站 | 免费观看国产视频在线 | 亚洲成人午夜在线 | 亚洲免费片 | 精品欧美乱码久久久久久1区2区 | 男人天堂99| 久久久精品视频一区二区三区 | 亚洲精品天堂 | 久草欧美 | 久久逼逼 | 亚洲综合大片69999 | 亚洲精品乱码8久久久久久日本 | 国产精品毛片一区二区在线看 | 久久久久国产精品一区 | 亚洲+变态+欧美+另类+精品 | 国产精品视频一二三区 | 欧美精品一区二区三区在线 | 国产精品一区二 | 在线播放中文字幕 | 国产亚洲精品精品国产亚洲综合 | 久久日本 | 日本不卡一区二区三区在线观看 | 色爱av| 91精品国产乱码久久久久久久久 | 日韩一区二区三区在线看 | 免费在线一区二区三区 | 男女污污动态图 | 99爱国产 | 久久久毛片 | 国产精品久久久久久久久久久新郎 |