電路原理圖如下:
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
一、總體(ti) 設計要求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
六、心得體(ti) 會(hui) 8
七、參考文獻9
一、總體(ti) 設計要求:
1、能夠檢測出環境中的溫度和濕度,並且顯示在LCD1602上麵
2、技術參數有以下要求:
濕度測量範圍:0%~100%RH;溫度測量範圍-40~+110℃。
濕度測量分辨率:1%RH;溫度測量分辨率:1℃。
濕度測量精度:±2.0%RH;溫度測量精度:±0.5℃。
3、電源工作範圍:DC 4.5~5.5V。
二、構思與(yu) 選擇:
方案一:
使用AM2301數字溫濕度傳(chuan) 感器。該型號溫濕度傳(chuan) 感器,采用3.3—6V直流電源供電,它的各部分參數:濕度測量範圍為(wei) 20%~90%RH;溫度測量的範圍為(wei) 0~+50℃;濕度測量精度為(wei) ±5.0%RH;溫度測量精度為(wei) ±2.0℃。雖然它的價(jia) 格比較便宜,單測溫的範圍和測濕的範圍太小,溫度的精度和濕度的精度太低,不符合設計的要求。
方案二:
使用AM2302電容式數字溫濕度傳(chuan) 感器。它的各部分參數如下:由於(yu) 傳(chuan) 感器參數:濕度0%~100%相對是濕度的測量範圍;溫度測量範圍為(wei) 40~+80℃;濕度的測量精度為(wei) ±3.0%RH;溫度的測量精度為(wei) ±0.5℃。價(jia) 格也比較適合,基本可以滿足設計要求。
方案三:
使用數字溫濕度傳(chuan) 感器SHT11。濕度測量範圍:0%~100%RH;溫度測量範圍:40~+120℃;濕度測量精度:±2%相對濕度;溫度測量精度:±0.2%℃溫度測量精度。改傳(chuan) 感器價(jia) 格便宜。溫度和濕度都達到或超過了標題的精度要求,屬於(yu) 低功率傳(chuan) 感器。
綜上分析,設計應以最大化利用內(nei) 部資源,電路簡易,節約成本為(wei) 原則,而且利用從(cong) 係統技術參數要求和低功率方麵考慮。因此采用方案三。
三、係統硬件設計:
3.1複位電路:
複位是單片機的初始化操作。單片機啟動運行時,都需要先複位,作用是使CPU和係統中其他部件處於(yu) 一個(ge) 確定的初始狀態,並從(cong) 這個(ge) 狀態開始工作。因此,複位是一個(ge) 很重要的操作方式。但單片機本身是不能自動進行複位的,必須配合相應的外部電路才能實現。
單片機通電時,從(cong) 初始態開始執行程序,稱為(wei) 上電複位。單片機死機時,通過手工按“重啟”鍵使其從(cong) 初始態開始執行程序,稱為(wei) 手工複位。
複位條件:複位引腳RST(全稱RESET)出現2個(ge) 機器周期以上的高電平時,單片機就執行複位操作;但如果RST持續為(wei) 高電平,單片機就處於(yu) 循環複位狀態。
3.2時鍾電路:
1.時鍾電路
利用芯片內(nei) 部的振蕩電路,在XTAL1、XTAL2的引腳上外接定時元件,內(nei) 部振蕩器便能產(chan) 生自激振蕩。定時元件可以采用石英晶體(ti) 和電容組成的並聯諧振電路。
晶振可以在1.2~12MHZ之間任選,甚至可以達到24MHz,但是頻率越高功耗也就越大。和晶振並聯的電容C1、C2的大小對振蕩頻率有微小影響,可以起到頻率微調作用。當采用石英晶振時,電容可以在20~40pF之間選擇。晶體(ti) 和電容應盡可能與(yu) 單機片芯片靠近,以減少引線的寄生電容,保證振蕩器可靠工作。
3.3.溫濕度測量電路:
SHT11是瑞士Scnsirion公司推出的一款數字溫濕度傳(chuan) 感器芯片。該芯片廣泛應用於(yu) 暖通空調、汽車、消費電子、自動控製等領域。共主要特點如下: 高度集成,將溫度感測、濕度感測、信號變換、A/D轉換和加熱器等功能集成到一個(ge) 芯片上;提供二線數字串行接口SCK和DATA,接口簡單,支持CRC傳(chuan) 輸校驗,傳(chuan) 輸可靠性高;測量精度可編程調節,內(nei) 置A/D轉換器(分辨率為(wei) 8~12位,可以通過對芯片內(nei) 部寄存器編程選擇); 測量精確度高,由於(yu) 同時集成溫濕度傳(chuan) 感器,可以提供溫度補償(chang) 的濕度測量值和高質量的露點計算功能;封裝尺寸超小(7.62 mm×5.08mm×2.5 mm),測量和通信結束後,自動轉入低功耗模式; 高可靠性,采用CMOSens工藝,測量時可將感測頭完全浸於(yu) 水中。SHT11溫濕度傳(chuan) 感器采用SMD(LCC)表麵貼片封裝形式,接口非常簡單,引腳名稱及排列順序如圖下所示。
仿真電路圖
3.4、顯示電路:
3.4.1電路工作原理
該模塊采用LCD1602液晶屏將電子時鍾工作的實時狀態顯示在屏幕上,結構簡單,顯示清晰。其中GND接地,VCC接VCC,LCD偏壓輸入引腳V0通過接一個(ge) 電位器來調節顯示屏的背光度,數據/命令選擇端RS、讀/寫(xie) 控製信號端RW、LCD使能端分別由單片機引腳P2.6、P2.5、P2.7進行控製。數據傳(chuan) 輸端D0-D7則用單片機的P0口進行控製。如圖是LCD1602詳細的電路引腳連線圖。
3.4.2LCD顯示模塊電路圖
係統軟件設計:
4.1.1 DHT11軟件設計
微處理器和溫濕度傳(chuan) 感器通信采用串行二線接口SCK和DATA,其中SCK為(wei) 時鍾線,DATA為(wei) 數據線。該二線串行通信協議和I2C協議是不兼容的。在程序開始,微處理器需要用一組"啟動傳(chuan) 輸"時序表示數據傳(chuan) 輸的啟動,當SCK時鍾為(wei) 高電平時,DATA翻轉為(wei) 低電平;緊接著SCK變為(wei) 低電平,隨後又變為(wei) 高電平;在SCK時鍾為(wei) 高電平時,DATA再次翻轉為(wei) 高電平。
根據SHT11濕度測試時序可以知道。主機發出啟動命令,隨後發出一個(ge) 後續8位命令碼,該命令碼包含3個(ge) 地址位(芯片設定地址為(wei) 000)和5個(ge) 命令位;發送完該命令碼,將DATA總線設為(wei) 輸入狀態等待SHT11的響應;SHT11接收到上述地址和命令碼後,在第8個(ge) 時鍾下降沿,將DATA下拉為(wei) 低電平作為(wei) 從(cong) 機的ACK;在第9個(ge) 時鍾下降沿之後,從(cong) 機釋放DATA(恢複高電平)總線;釋放總線後,從(cong) 機開始測量當前濕度,測量結束後,再次將DATA總線拉為(wei) 低電平;主機檢測到DATA總線被拉低後,得知濕度測量已經結束,給出SCK時鍾信號;從(cong) 機在第8個(ge) 時鍾下降沿,先輸出高字節數據;在第9個(ge) 時鍾下降沿,主機將DATA總線拉低作為(wei) ACK信號。然後釋放總線DATA;在隨後8個(ge) SCK周期下降沿,從(cong) 機發出低字節數據;接下來的SCK下降沿,主機再次將DATA總線拉低作為(wei) 接收數據的ACK信號;最後8個(ge) SCK下降沿從(cong) 機發出CRC校驗數據,主機不予應答(NACK)則 表示測量結束。
4.1.2總體(ti) 程序流圖的設計:
4.3.原理圖以及原理分析:
通過AD19繪製出如上圖所示的原理圖,包括時鍾電路、晶振電路、DHT11溫濕度檢測電路、lcd1602顯示電路,因為(wei) 溫濕度傳(chuan) 感器與(yu) 單片機連接電路比較簡單。所以可以容易的繪製出電路圖。
五、仿真圖及仿真分析:
5.1、總體(ti) 仿真結果:
5.2、仿真分析:
首先,將程序的hex文件加載到單片機中,開始仿真。可以清楚地看到LCD1602上麵顯示了SHT11當前的溫度和濕度,雖然有誤差但是誤差並不是很大可以忽略不計,調節傳(chuan) 感器上麵的按鈕可以實時的將傳(chuan) 感器所在環境的溫度顯示到LCD1602上麵,具有可控性,而且顯示性和可控性較好。
六、心得體(ti) 會(hui) :
我這次做的是基於(yu) 單片機的溫濕度測量儀(yi) 。我們(men) 知道,單片機和傳(chuan) 感器的應用如今已經在工業(ye) 、電子等方方麵麵展示出了它的優(you) 越性,利用單片機和傳(chuan) 感器設計電路也逐漸成了趨勢,它與(yu) 外圍的簡單電路再加上優(you) 化程序就可以構建任意的產(chan) 品,使得這次設計成為(wei) 現實。隨著單片機和傳(chuan) 感器的日益發展,它們(men) 必將在未來顯示出更大的活力,為(wei) 人們(men) 提供更好的產(chan) 品。
雖然這個(ge) 電路我已經設計出來了,但是在這次的設計當中,我遇到了不少的問題。最開始我不知道要用哪一種傳(chuan) 感器作為(wei) 我的設計,糾結了好久,最終我確定了選擇用DHT11作為(wei) 我的溫濕度傳(chuan) 感器模塊,因為(wei) 老師說不能用書(shu) 本上的DS18B20作為(wei) 此次設計模塊,因為(wei) 書(shu) 上有該模塊的詳細電路圖原理圖以及寫(xie) 好的程序,所以我就仔細的查閱資料,結合以前在實驗室學習(xi) 的經驗,通過一個(ge) 多星期的時間來準備,從(cong) 方案的選擇原理圖的繪製再到程序的編寫(xie) 和仿真圖的繪製和調試,最終順利的完成了這一次的傳(chuan) 感器設計。
在學習(xi) 傳(chuan) 感器與(yu) 檢測技術這門中,我的收獲是特別大的,完成這次設計,不僅(jin) 鞏固了單片機的知識,而且對傳(chuan) 感器與(yu) 單片機的應用也熟悉了基本的操作方法。相信在以後的設計中,就會(hui) 排除現在遇到的問題,更好的完成設計。以前我不知道傳(chuan) 感器到底是什麽(me) ,隻是在字麵上理解它的意思,把一個(ge) 物理量轉換成另外一個(ge) 物理量。但是傳(chuan) 感器沒有我們(men) 想象的那麽(me) 簡單,它有它的工作原理,使用條件。通過這一個(ge) 學期的學習(xi) ,我學習(xi) 了好多傳(chuan) 感器,比如說:溫度傳(chuan) 感器、濕度傳(chuan) 感器、位移傳(chuan) 感器、壓力傳(chuan) 感器等等,現在的我大致地能理解他們(men) 的一些特性,也能夠運用他們(men) 來設計作品。在這裏,我非常感謝我的老師。同時,對於(yu) 這門課,我也想提出一些建議,希望我們(men) 班能夠經常開設一些關(guan) 於(yu) 傳(chuan) 感器設計與(yu) 製作的活動。這樣既能提高我們(men) 的動手水平,也能開發我們(men) 設計傳(chuan) 感器的思維。
單片機源程序如下:
#include "all.h" typedef union { uint i; //定義(yi) 了兩(liang) 個(ge) 共用體(ti) float f; } value; enum { TEMP,HUMI //TEMP=0,HUMI=1 }; void s_transstart(void) // 生成傳(chuan) 輸啟動 { DATA=1; SCK=0; _nop_(); SCK=1; _nop_(); DATA=0; _nop_(); SCK=0; _nop_();_nop_();_nop_(); SCK=1; _nop_(); DATA=1; _nop_(); SCK=0; } void s_connectionreset(void) { uchar i; DATA=1; SCK=0; for(i=0;i<9;i++) { SCK=1; SCK=0; } s_transstart(); //傳(chuan) 輸開始 } char s_write_byte(uchar value) //在敏總線上寫(xie) 入一個(ge) 字節並檢查應答 { uchar i,error=0; for (i=0x80;i>0;i/=2) { if(i&value) DATA=1; //用i屏蔽值,寫(xie) 入敏總線 else DATA=0; SCK=1; _nop_();_nop_();_nop_(); SCK=0; } DATA=1; //釋放數據線 SCK=1; error=DATA; //DATA在第9個(ge) 上升沿將被DHT90自動下拉為(wei) 低電平。 _nop_();_nop_();_nop_(); SCK=0; DATA=1; //釋放數據線 return error; //返回:0成功,1失敗 } char s_read_byte(uchar ack) // 從(cong) 敏感總線讀取字節,並在“ack=1”的情況下給出確認 { uchar i,val=0; DATA=1; //釋放數據線 for (i=0x80;i>0;i/=2) //shift bit for masking { SCK=1; //clk for SENSI-BUS if (DATA) val=(val|i); //read bit _nop_();_nop_();_nop_(); //pulswith約3 us SCK=0; } if(ack==1) DATA=0; //如果“ack==1”下拉數據線 else DATA=1; //如果是校驗(ack==0),讀取完後結束通訊 _nop_();_nop_();_nop_(); //pulswith約3 us SCK=1; //clk #9 for ack _nop_();_nop_();_nop_(); //pulswith約3 us SCK=0; _nop_();_nop_();_nop_(); //pulswith約3 us DATA=1; //釋放數據線 return val; } char s_measure(uchar *p_value,uchar *p_checksum,uchar mode) //用校驗和進行測量(濕度/溫度) { uint error=0; uint i; s_transstart(); //傳(chuan) 輸開始 switch(mode) { //發送命令給傳(chuan) 感器 case TEMP : error+=s_write_byte(MEASURE_TEMP); break; case HUMI : error+=s_write_byte(MEASURE_HUMI); break; default: break; } for (i=0;i<65535;i++) if(DATA==0) break; //等待傳(chuan) 感器完成測量 if(DATA) error+=1; // 或超時(~2秒) *(p_value) =s_read_byte(ACK); //讀取第一個(ge) 字節(MSB) *(p_value+1)=s_read_byte(ACK); //讀取第二個(ge) 字節(LSB) *p_checksum =s_read_byte(noACK); //讀取校驗和 return error; } void calc_dht90(float *p_humidity ,float *p_temperature) { const float C1=-4.0; // 12位 const float C2=+0.0405; // 12位 const float C3=-0.0000028; // 12位 const float T1=+0.01; // 14位 const float T2=+0.00008; // 14位 float rh=*p_humidity; // rh: 濕度[滴答聲]12位 float t=*p_temperature; // t: 溫度[刻度]14位 float rh_lin; // rh_lin: 濕度線性 float rh_true; // rh_true: 溫度補償(chang) 濕度 float t_C; // t_C : 溫度 [C] t_C=t*0.01-40; // 溫度從(cong) 刻度到[C] rh_lin=C3*rh*rh+C2*rh+C1; rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //.溫度補償(chang) 濕度[%RH] if(rh_true>100)rh_true=100; //如果值在外麵,則削減 if(rh_true<0.1)rh_true=0.1; //物理可能範圍 …………………… …………限於(yu) 本文篇幅 餘(yu) 下代碼請從(cong) 下載附件…………
基於(yu) 51單片機的SHT11溫濕度測量儀(yi) 設計.rar
www.fpxing.com/Article/UploadFiles/202307/2023070115583466.rar