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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 22062|回復: 26
收起左側

基于51單片機的SHT11溫濕度測量儀設計(源碼+仿真+文檔)

  [復制鏈接]
ID:166208 發表于 2018-12-26 10:29 | 顯示全部樓層 |閱讀模式
電路原理圖如下:

原理圖截圖

原理圖截圖


仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)

仿真截圖

仿真截圖

程序截圖

程序截圖

資源文件

資源文件


一、總體設計要求3
二、方案論證 3
三、系統硬件設計 3
3.1復位電路3
3.2時鐘電路3
3.3 溫濕度測量電路4
3.4顯示電路5
四、系統軟件設計
4.1DHT11軟件設計6
4.2軟件設計流程圖 6
4.3 原理圖以及原理分析7
五、電路仿真及仿真結果分析
5.1電路仿真圖 7
5.2仿真結果分析 8
六、心得體會8
七、參考文獻9

一、總體設計要求:

1、能夠檢測出環境中的溫度和濕度,并且顯示在LCD1602上面

2、技術參數有以下要求:

濕度測量范圍:0%~100%RH;溫度測量范圍-40~+110℃。

濕度測量分辨率:1%RH;溫度測量分辨率:1℃。

濕度測量精度:±2.0%RH;溫度測量精度:±0.5℃。

3、電源工作范圍:DC 4.5~5.5V。

二、構思與選擇:

方案一:

使用AM2301數字溫濕度傳感器。該型號溫濕度傳感器,采用3.3—6V直流電源供電,它的各部分參數:濕度測量范圍為20%~90%RH;溫度測量的范圍為0~+50℃;濕度測量精度為±5.0%RH;溫度測量精度為±2.0℃。雖然它的價格比較便宜,單測溫的范圍和測濕的范圍太小,溫度的精度和濕度的精度太低,不符合設計的要求。

方案二:

使用AM2302電容式數字溫濕度傳感器。它的各部分參數如下:由于傳感器參數:濕度0%~100%相對是濕度的測量范圍;溫度測量范圍為40~+80℃;濕度的測量精度為±3.0%RH;溫度的測量精度為±0.5℃。價格也比較適合,基本可以滿足設計要求。

方案三:

使用數字溫濕度傳感器SHT11。濕度測量范圍:0%~100%RH;溫度測量范圍:40~+120℃;濕度測量精度:±2%相對濕度;溫度測量精度:±0.2%℃溫度測量精度。改傳感器價格便宜。溫度和濕度都達到或超過了標題的精度要求,屬于低功率傳感器。

綜上分析,設計應以最大化利用內部資源,電路簡易,節約成本為原則,而且利用從系統技術參數要求和低功率方面考慮。因此采用方案三。

三、系統硬件設計:

3.1復位電路:

復位是單片機的初始化操作。單片機啟動運行時,都需要先復位,作用是使CPU和系統中其他部件處于一個確定的初始狀態,并從這個狀態開始工作。因此,復位是一個很重要的操作方式。但單片機本身是不能自動進行復位的,必須配合相應的外部電路才能實現。

單片機通電時,從初始態開始執行程序,稱為上電復位。單片機死機時,通過手工按“重啟”鍵使其從初始態開始執行程序,稱為手工復位。

復位條件:復位引腳RST(全稱RESET)出現2個機器周期以上的高電平時,單片機就執行復位操作;但如果RST持續為高電平,單片機就處于循環復位狀態。

3.2時鐘電路:

1.時鐘電路

利用芯片內部的振蕩電路,在XTAL1、XTAL2的引腳上外接定時元件,內部振蕩器便能產生自激振蕩。定時元件可以采用石英晶體和電容組成的并聯諧振電路。

晶振可以在1.2~12MHZ之間任選,甚至可以達到24MHz,但是頻率越高功耗也就越大。和晶振并聯的電容C1、C2的大小對振蕩頻率有微小影響,可以起到頻率微調作用。當采用石英晶振時,電容可以在20~40pF之間選擇。晶體和電容應盡可能與單機片芯片靠近,以減少引線的寄生電容,保證振蕩器可靠工作。


3.3.溫濕度測量電路

SHT11是瑞士Scnsirion公司推出的一款數字溫濕度傳感器芯片。該芯片廣泛應用于暖通空調、汽車、消費電子、自動控制等領域。共主要特點如下: 高度集成,將溫度感測、濕度感測、信號變換、A/D轉換和加熱器等功能集成到一個芯片上;提供二線數字串行接口SCK和DATA,接口簡單,支持CRC傳輸校驗,傳輸可靠性高;測量精度可編程調節,內置A/D轉換器(分辨率為8~12位,可以通過對芯片內部寄存器編程選擇); 測量精確度高,由于同時集成溫濕度傳感器,可以提供溫度補償的濕度測量值和高質量的露點計算功能;封裝尺寸超小(7.62 mm×5.08mm×2.5 mm),測量和通信結束后,自動轉入低功耗模式; 高可靠性,采用CMOSens工藝,測量時可將感測頭完全浸于水中。SHT11溫濕度傳感器采用SMD(LCC)表面貼片封裝形式,接口非常簡單,引腳名稱及排列順序如圖下所示。


仿真電路圖


3.4、顯示電路:

3.4.1電路工作原理

該模塊采用LCD1602液晶屏將電子時鐘工作的實時狀態顯示在屏幕上,結構簡單,顯示清晰。其中GND接地,VCC接VCC,LCD偏壓輸入引腳V0通過接一個電位器來調節顯示屏的背光度,數據/命令選擇端RS、讀/寫控制信號端RW、LCD使能端分別由單片機引腳P2.6、P2.5、P2.7進行控制。數據傳輸端D0-D7則用單片機的P0口進行控制。如圖是LCD1602詳細的電路引腳連線圖。

3.4.2LCD顯示模塊電路圖


  • 系統軟件設計:
   4.1.1 DHT11軟件設計
微處理器和溫濕度傳感器通信采用串行二線接口SCK和DATA,其中SCK為時鐘線,DATA為數據線。該二線串行通信協議和I2C協議是不兼容的。在程序開始,微處理器需要用一組"啟動傳輸"時序表示數據傳輸的啟動,當SCK時鐘為高電平時,DATA翻轉為低電平;緊接著SCK變為低電平,隨后又變為高電平;在SCK時鐘為高電平時,DATA再次翻轉為高電平。
根據SHT11濕度測試時序可以知道。主機發出啟動命令,隨后發出一個后續8位命令碼,該命令碼包含3個地址位(芯片設定地址為000)和5個命令位;發送完該命令碼,將DATA總線設為輸入狀態等待SHT11的響應;SHT11接收到上述地址和命令碼后,在第8個時鐘下降沿,將DATA下拉為低電平作為從機的ACK;在第9個時鐘下降沿之后,從機釋放DATA(恢復高電平)總線;釋放總線后,從機開始測量當前濕度,測量結束后,再次將DATA總線拉為低電平;主機檢測到DATA總線被拉低后,得知濕度測量已經結束,給出SCK時鐘信號;從機在第8個時鐘下降沿,先輸出高字節數據;在第9個時鐘下降沿,主機將DATA總線拉低作為ACK信號。然后釋放總線DATA;在隨后8個SCK周期下降沿,從機發出低字節數據;接下來的SCK下降沿,主機再次將DATA總線拉低作為接收數據的ACK信號;最后8個SCK下降沿從機發出CRC校驗數據,主機不予應答(NACK)則 表示測量結束。

4.1.2總體程序流圖的設計:


4.3.原理圖以及原理分析



通過AD19繪制出如上圖所示的原理圖,包括時鐘電路、晶振電路、DHT11溫濕度檢測電路、lcd1602顯示電路,因為溫濕度傳感器與單片機連接電路比較簡單。所以可以容易的繪制出電路圖。


五、仿真圖及仿真分析:


5.1、總體仿真結果:



5.2、仿真分析:

首先,將程序的hex文件加載到單片機中,開始仿真。可以清楚地看到LCD1602上面顯示了SHT11當前的溫度和濕度,雖然有誤差但是誤差并不是很大可以忽略不計,調節傳感器上面的按鈕可以實時的將傳感器所在環境的溫度顯示到LCD1602上面,具有可控性,而且顯示性和可控性較好。


六、心得體會:

我這次做的是基于單片機的溫濕度測量儀。我們知道,單片機和傳感器的應用如今已經在工業、電子等方方面面展示出了它的優越性,利用單片機和傳感器設計電路也逐漸成了趨勢,它與外圍的簡單電路再加上優化程序就可以構建任意的產品,使得這次設計成為現實。隨著單片機和傳感器的日益發展,它們必將在未來顯示出更大的活力,為人們提供更好的產品。
雖然這個電路我已經設計出來了,但是在這次的設計當中,我遇到了不少的問題。最開始我不知道要用哪一種傳感器作為我的設計,糾結了好久,最終我確定了選擇用DHT11作為我的溫濕度傳感器模塊,因為老師說不能用書本上的DS18B20作為此次設計模塊,因為書上有該模塊的詳細電路圖原理圖以及寫好的程序,所以我就仔細的查閱資料,結合以前在實驗室學習的經驗,通過一個多星期的時間來準備,從方案的選擇原理圖的繪制再到程序的編寫和仿真圖的繪制和調試,最終順利的完成了這一次的傳感器設計。
在學習傳感器與檢測技術這門中,我的收獲是特別大的,完成這次設計,不僅鞏固了單片機的知識,而且對傳感器與單片機的應用也熟悉了基本的操作方法。相信在以后的設計中,就會排除現在遇到的問題,更好的完成設計。以前我不知道傳感器到底是什么,只是在字面上理解它的意思,把一個物理量轉換成另外一個物理量。但是傳感器沒有我們想象的那么簡單,它有它的工作原理,使用條件。通過這一個學期的學習,我學習了好多傳感器,比如說:溫度傳感器、濕度傳感器、位移傳感器、壓力傳感器等等,現在的我大致地能理解他們的一些特性,也能夠運用他們來設計作品。在這里,我非常感謝我的老師。同時,對于這門課,我也想提出一些建議,希望我們班能夠經常開設一些關于傳感器設計與制作的活動。這樣既能提高我們的動手水平,也能開發我們設計傳感器的思維。

單片機源程序如下:
  1. #include "all.h"

  2. typedef union   
  3. {
  4.   uint i;        //定義了兩個共用體   
  5.   float f;  
  6. } value;   
  7.   enum
  8.   {
  9.           TEMP,HUMI   //TEMP=0,HUMI=1
  10.   };

  11. void s_transstart(void)   // 生成傳輸啟動
  12. {        
  13.         DATA=1;
  14.         SCK=0;              
  15.         _nop_();     
  16.         SCK=1;     
  17.         _nop_();     
  18.         DATA=0;     
  19.         _nop_();     
  20.         SCK=0;        
  21.         _nop_();_nop_();_nop_();     
  22.         SCK=1;     
  23.         _nop_();      
  24.         DATA=1;           
  25.         _nop_();      
  26.         SCK=0;        
  27. }

  28. void s_connectionreset(void)  
  29. {      
  30.         uchar i;      
  31.         DATA=1;
  32.         SCK=0;                          
  33.         for(i=0;i<9;i++)                  
  34.         {      
  35.                 SCK=1;     
  36.                 SCK=0;   
  37.         }     
  38.         s_transstart();                   //傳輸開始
  39. }

  40. char s_write_byte(uchar value)   //在敏總線上寫入一個字節并檢查應答  
  41. {      
  42.         uchar i,error=0;      
  43.         for (i=0x80;i>0;i/=2)              
  44.         {        
  45.                 if(i&value)
  46.                         DATA=1;          //用i屏蔽值,寫入敏總線   
  47.                 else
  48.                         DATA=0;                              
  49.                 SCK=1;                           
  50.                 _nop_();_nop_();_nop_();         
  51.                 SCK=0;   
  52.         }     
  53.         DATA=1;                           //釋放數據線
  54.         SCK=1;                              
  55.         error=DATA;                       //DATA在第9個上升沿將被DHT90自動下拉為低電平。   
  56.         _nop_();_nop_();_nop_();   
  57.         SCK=0;   
  58.         DATA=1;                           //釋放數據線
  59.         return error;                     //返回:0成功,1失敗
  60. }

  61. char s_read_byte(uchar ack)        // 從敏感總線讀取字節,并在“ack=1”的情況下給出確認
  62. {      
  63.         uchar i,val=0;     
  64.         DATA=1;                           //釋放數據線
  65.         for (i=0x80;i>0;i/=2)             //shift bit for masking
  66.         {
  67.                 SCK=1;                          //clk for SENSI-BUS      
  68.                 if (DATA) val=(val|i);        //read bit      
  69.                 _nop_();_nop_();_nop_();        //pulswith約3 us     
  70.                 SCK=0;                 
  71.         }     
  72.         if(ack==1)
  73.             DATA=0;                          //如果“ack==1”下拉數據線   
  74.         else DATA=1;                      //如果是校驗(ack==0),讀取完后結束通訊   
  75.             _nop_();_nop_();_nop_();          //pulswith約3 us   
  76.         SCK=1;                            //clk #9 for ack   
  77.         _nop_();_nop_();_nop_();          //pulswith約3 us     
  78.         SCK=0;                     
  79.         _nop_();_nop_();_nop_();          //pulswith約3 us   
  80.         DATA=1;                           //釋放數據線   
  81.         return val;  
  82. }

  83. char s_measure(uchar *p_value,uchar *p_checksum,uchar mode)  //用校驗和進行測量(濕度/溫度)
  84. {      
  85.         uint error=0;   
  86.         uint i;      
  87.         s_transstart();                   //傳輸開始  
  88.         switch(mode)
  89.         {                                //發送命令給傳感器
  90.                 case TEMP : error+=s_write_byte(MEASURE_TEMP); break;     
  91.                 case HUMI : error+=s_write_byte(MEASURE_HUMI); break;     
  92.                 default:
  93.                         break;      
  94.         }     
  95.         for (i=0;i<65535;i++)
  96.         if(DATA==0)
  97.                 break;                        //等待傳感器完成測量
  98.         if(DATA) error+=1;                // 或超時(~2秒)   
  99.                 *(p_value)  =s_read_byte(ACK);    //讀取第一個字節(MSB)
  100.                 *(p_value+1)=s_read_byte(ACK);    //讀取第二個字節(LSB)
  101.                 *p_checksum =s_read_byte(noACK);  //讀取校驗和
  102.         return error;  
  103. }

  104. void calc_dht90(float *p_humidity ,float *p_temperature)

  105. {
  106.         const float C1=-4.0;              // 12位
  107.         const float C2=+0.0405;           // 12位
  108.         const float C3=-0.0000028;        // 12位   
  109.         const float T1=+0.01;             // 14位   
  110.         const float T2=+0.00008;           // 14位
  111.         float rh=*p_humidity;             // rh:      濕度[滴答聲]12位   
  112.         float t=*p_temperature;           // t:       溫度[刻度]14位  
  113.         float rh_lin;                     // rh_lin:  濕度線性   
  114.         float rh_true;                    // rh_true: 溫度補償濕度
  115.         float t_C;                        // t_C   :  溫度 [C]     
  116.         t_C=t*0.01-40;                  // 溫度從刻度到[C]  
  117.         rh_lin=C3*rh*rh+C2*rh+C1;     
  118.         rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;   //.溫度補償濕度[%RH]
  119.         if(rh_true>100)rh_true=100;       //如果值在外面,則削減   
  120.         if(rh_true<0.1)rh_true=0.1;       //物理可能范圍  
  121. ……………………

  122. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

程序仿真文檔51hei附件下載:
仿真程序原理圖文檔.7z (419.5 KB, 下載次數: 630)

評分

參與人數 3黑幣 +78 收起 理由
xxpp2011 + 8 共享資料的黑幣獎勵!
Bulbzero + 20 淡定
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:1 發表于 2018-12-29 22:13 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

ID:345368 發表于 2019-2-20 15:02 | 顯示全部樓層
第一項數據誤差有點大啊
回復

使用道具 舉報

ID:137005 發表于 2019-2-20 20:54 | 顯示全部樓層
溫濕度傳感器是SHT11,還是DHT11呢?
回復

使用道具 舉報

ID:370485 發表于 2019-3-25 14:52 | 顯示全部樓層
好東西
回復

使用道具 舉報

ID:147069 發表于 2019-4-8 11:30 | 顯示全部樓層
頂一個
回復

使用道具 舉報

ID:291815 發表于 2019-4-9 18:25 | 顯示全部樓層
挺好的,剛好學習學習
回復

使用道具 舉報

ID:502112 發表于 2019-4-11 01:28 | 顯示全部樓層
從理論到實踐,學習一下,感謝分享
回復

使用道具 舉報

ID:523526 發表于 2019-4-28 11:40 | 顯示全部樓層
bucuo keyiyong
回復

使用道具 舉報

ID:523526 發表于 2019-4-28 11:42 | 顯示全部樓層
適合初學者
回復

使用道具 舉報

ID:549936 發表于 2019-5-29 10:03 | 顯示全部樓層
想問問仿真像圖上那樣顯示是對的嗎?
回復

使用道具 舉報

ID:552193 發表于 2019-5-31 23:30 來自手機 | 顯示全部樓層
我剛下載啦!等明天看看能否運行,謝謝編輯
回復

使用道具 舉報

ID:245466 發表于 2019-6-1 19:27 | 顯示全部樓層
資料好詳細啊,51有你更精彩~!
回復

使用道具 舉報

ID:715731 發表于 2020-3-25 23:49 | 顯示全部樓層
101544 發表于 2019-5-29 10:03
想問問仿真像圖上那樣顯示是對的嗎?

對啊,似乎濕度才是要百分之幾顯示的
回復

使用道具 舉報

ID:724207 發表于 2020-4-7 17:41 來自手機 | 顯示全部樓層
molo 發表于 2019-2-20 20:54
溫濕度傳感器是SHT11,還是DHT11呢?

應該是SHT11
回復

使用道具 舉報

ID:755834 發表于 2020-5-19 16:35 | 顯示全部樓層
初學者表示十分好
回復

使用道具 舉報

ID:187802 發表于 2020-5-20 10:34 | 顯示全部樓層

謝謝分享
回復

使用道具 舉報

ID:767948 發表于 2020-6-6 15:51 | 顯示全部樓層
感謝分享
回復

使用道具 舉報

ID:772396 發表于 2020-6-8 08:53 來自手機 | 顯示全部樓層
好東西
回復

使用道具 舉報

ID:493532 發表于 2020-6-8 11:38 | 顯示全部樓層
好!!
回復

使用道具 舉報

ID:772720 發表于 2020-6-8 12:57 | 顯示全部樓層
有DS18B20的設計嘛
回復

使用道具 舉報

ID:772720 發表于 2020-6-8 12:57 | 顯示全部樓層
就是引腳設計咋辦嘛
回復

使用道具 舉報

ID:419084 發表于 2020-6-21 09:16 | 顯示全部樓層
捉個蟲,顯示器的溫度濕度寫反了
回復

使用道具 舉報

ID:639106 發表于 2020-6-21 12:44 | 顯示全部樓層
感謝分享
回復

使用道具 舉報

ID:883911 發表于 2021-3-5 19:35 | 顯示全部樓層
樓主辛苦了~學習學習
回復

使用道具 舉報

ID:1020489 發表于 2022-5-4 15:58 來自手機 | 顯示全部樓層
我按照上面的程序基礎上設計了 按鍵設定溫濕度數值,并與讀取的值比較進行降溫除濕,設定值只有個位和十位,但仿真時只顯示沒有比較,想問問是怎么改改
回復

使用道具 舉報

ID:195496 發表于 2022-5-15 11:46 | 顯示全部樓層
想不到PROTEUS里面還有SHT11,真是太牛了,這么老的軟件里有,說明這個器件很早就有了,只是我沒有用到,不清楚。唉,可悲。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 波多野结衣中文字幕一区二区三区 | 色婷婷一区二区三区四区 | 国产羞羞视频在线观看 | 久久一起草 | 黄色大片视频 | 麻豆视频国产在线观看 | 女女百合av大片一区二区三区九县 | 亚洲97 | 最近中文字幕在线视频1 | 免费在线观看成人 | 成人免费视频网址 | 五月天婷婷狠狠 | 色精品| 日韩三级一区 | 色综合天天天天做夜夜夜夜做 | 激情福利视频 | 欧美在线综合 | 欧美一区二区三区在线观看 | 欧美久久视频 | 亚洲免费精品 | 亚洲国产成人精品久久久国产成人一区 | 久久亚洲国产 | 亚洲超碰在线观看 | 午夜激情免费视频 | 精品美女 | 亚洲国产精品一区 | 成年精品 | 亚洲成人av| 国产在线观看一区二区 | 国产欧美日韩一区二区三区在线观看 | 精品国产一区二区三区久久影院 | 国产精品精品视频一区二区三区 | 日韩中文字幕在线视频观看 | 91视频进入 | 日韩在线一区二区三区 | 日韩一级免费观看 | av影音资源 | 欧美精品一区二区三区在线播放 | 在线欧美视频 | 久久999| 国产一区二区精 |