版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 畢業(yè)論文</b></p><p><b> (2012 屆)</b></p><p> 基于單片機技術的數字溫濕度計設計</p><p> 學生姓名 </p><p> 學 號 </p>&l
2、t;p> 分 院 </p><p> 專 業(yè) </p><p> 指導教師 </p><p> 完成日期 2012年3月 日 </p><p> 基于單片機技術的數字溫濕度計設計</p><p> 摘 要 本論文介紹了
3、一種以單片機為主要控制器件,以DHT91為溫濕度傳感器的數字溫濕度計。主要包括硬件電路的設計和軟件程序的設計。硬件電路主要包括主控制器,測溫濕度電路和顯示電路三部分組成。主控制器采用單片機AT89C52,溫濕度傳感器采用,顯示電路采用8位共陽極LED數碼管,驅動電路用八個PNP型的三極管(S9012)。軟件程序主要包括主程序,測溫濕度子程序,顯示子程序和按鍵子程序等。另外,還介紹了軟件的調試分析。 本設計中采用了溫濕度傳感器DH
4、T91作為檢測元件,該傳感器包括一個電容性聚合體測濕敏感元件、一個用能隙材料制成的測溫元件,并在同一芯片上,與14 位的A/D 轉換器以及串行接口電路實現無縫連接。因此,它具有品質卓越、超快響應、抗干擾能力強、極高的性價比等優(yōu)點。每個傳感器芯片都在極為精確的濕度腔室中進行標定,在標定的過程中使用。傳感器在檢測信號的處理過程中要調用這些校準系數。兩線制的串行接口與內部的電壓調整,使外圍系統(tǒng)集成變得快速而簡單。微小的體積、極低的功耗。它具有
5、很好的發(fā)展前景。</p><p> 關鍵詞 溫濕度測量 AT89C52 DHT91</p><p><b> 目 錄</b></p><p> 第一章 數字溫濕度計的設計依據和意義1</p><p> 1.1 數字溫濕度計的設計依據1</p><p> 1.2 數字溫濕度計
6、的設計意義1</p><p> 第二章 總體設計要求及方案論證分析2</p><p> 2.1 總體設計要求2</p><p> 2.2 方案論證分析2</p><p> 2.2.1 方案論證2</p><p> 2.2.2 方案設計3</p><p> 2.3元器件
7、的選擇4</p><p> 2.3.1 主控制器芯片4</p><p> 2.3.2 數字溫濕度傳感器6</p><p> 2.4 驅動顯示電路6</p><p> 2.5 溫濕度測量的方法及分析7</p><p> 第三章 硬件電路的設計9</p><p>
8、3.1主控制電路和測溫濕控制電路9</p><p> 3.2驅動顯示電路10</p><p> 第四章 軟件設計及分析12</p><p> 4.1 DHT91傳輸時序和指令集12</p><p> 4.1.1 通訊復位時序12</p><p> 4.1.2 啟動傳輸時序13</p&
9、gt;<p> 4.1.3 數據傳輸和指令集13</p><p> 4.1.4 濕度的測量時序14</p><p> 4.1.5 輸出轉換為物理量14</p><p> 4.1.6 DHT91的DC特性。16</p><p> 4.2 程序流程圖17</p><p> 4.
10、3 程序的設計18</p><p> 4.3.1 通訊復位子程序18</p><p> 4.3.2 傳輸啟動子程序18</p><p> 4.3.3 一個字節(jié)子程序19</p><p> 4.3.4 讀一個字節(jié)子程序19</p><p> 4.3.5 數據處理子程序20</p&g
11、t;<p> 4.3.6 顯示子程序20</p><p> 4.3.7 按鍵子程序22</p><p> 4.3.8 中斷刷新顯示數碼管子程序23</p><p> 4.3.9 軟件在硬件上的調試分析24</p><p><b> 結 論26</b></p>&l
12、t;p><b> 致 謝27</b></p><p><b> 參考文獻28</b></p><p><b> 附 錄29</b></p><p><b> 引 言</b></p><p> 溫度和濕度的測量和控制是目前眾多行業(yè)
13、的重要工作目標之一,可謂與我們的生活息息相關。無論是在工農業(yè)生產、氣象部門,還是在環(huán)保、國防、科研等方面,常需對環(huán)境溫度與濕度進行測量和控制?,F在準確測量溫濕度在生物制藥、食品加工、造紙等行業(yè)更是至關重要的。</p><p> 測量溫濕度的關鍵是溫濕度傳感器。過去測量溫度與濕度是分開的,隨著技術的進步及人們生活的需要出現了溫濕度傳感器。溫度傳感器的發(fā)展經歷了3個階段:傳統(tǒng)的分立式溫度傳感器、模擬集成溫度傳感器、
14、智能集成溫度傳感器。目前,國際上新型溫度傳感器正從模擬式向數字式、從集成化向智能化、網絡化的方向發(fā)展。濕度傳感器也是經歷了這樣一個階段逐漸走向數字智能化。</p><p> 總之,本次設計運用DHT91傳感器,結合其優(yōu)點,將制作一個便攜式常用數字溫濕度計,必定對生產方面有一定作用。</p><p> 第一章 數字溫濕度計的設計依據和意義</p><p> 1
15、.1 數字溫濕度計的設計依據</p><p> 溫度與濕度與人們的生活息息相關。在工農業(yè)生產、氣象、環(huán)保、國防、科研等部門,經常需要對環(huán)境溫度與濕度進行測量及控制。準確測量溫濕度在生物制藥、食品加工、造紙等行業(yè)更是至關重要的。</p><p> 1.2 數字溫濕度計的設計意義</p><p> 傳統(tǒng)的溫度計是用水銀柱來顯示的,雖然結構簡單、價格便宜,但是它的精
16、確度不高,不易讀數。傳統(tǒng)的濕度計采用干濕球顯示法,不僅復雜而且測量精度不高。而采用單片機對溫濕度進行控制,不僅具有控制方便,簡單和靈活等優(yōu)點,而且可以大幅度提高溫度控制的技術指標。用LED來顯示溫濕度的數字看起來更加直觀。</p><p> DHT91傳感器具有超快響應,抗干擾能力強,性價比高等優(yōu)點。DHT91傳感器可以直接讀出被測的溫濕度值。同時單片機可以把測量出的數據通過串口傳到計算機上,來完成工業(yè)中的自動
17、控制,給工業(yè)生產帶來了極大的便利。用單片機控制的溫濕度計不僅硬件電路簡單,而且測量精度比較高。用數碼管顯示測量值看起來比較美觀。</p><p> 無論在日常生活中還是在工業(yè)、農業(yè)方面都不可避免的對周圍環(huán)境進行溫濕度的測量。因此,研究溫濕度的控制和測量具有重要意義。</p><p> 第二章 總體設計要求及方案論證分析</p><p> 2.1 總體設計要
18、求</p><p> 設計一個以單片機為核心的溫濕度測量系統(tǒng),可實現的功能為:</p><p> ?。?)測量溫度值精度為±0.4℃,測量濕度值精確3%;</p><p> (2)系統(tǒng)允許的誤差范圍為1℃和1%以內;(3)系統(tǒng)可由用戶預設溫度值和濕度值,測溫范圍-40℃—+128℃,測濕范圍 0 —100%; </p><p>
19、; (4)超出預設值時系統(tǒng)會自動報警,即發(fā)光二極管亮;</p><p> ?。?)系統(tǒng)采用數碼管顯示,能顯示設定溫濕度值和測得的實際溫濕度值。</p><p> {濕度精度(%RH) 溫度精度(°C@25)} </p><p> 2.2 方案論證分析</p><p>
20、 2.2.1 方案論證</p><p> 方案一,采用單片機AT89C51與SHTxx溫濕度傳感器相連組成外圍電路。</p><p> 方案二,采用DHT91數字溫濕度傳感器與單片機AT89C52相連外圍電路。</p><p> 經過之前的知識,我比較之后選擇采用第2個方案。由于采用DHT91數字溫濕度傳感器與單片機AT89C52相連外圍電路比較簡單。DHT9
21、1數字溫濕度傳感器作為檢測元件,能夠同時測試溫度和濕度。這類傳感器不僅易于焊接,而且只有四針管腳,減少了外圍電路的設計。且AT89C52與AT89C51不同之處是,P1.0和P1.1還可分別作為定時/計數器2的外部計數輸入(P1.0/T2)和輸入(P 1.1/T2EX),這樣可以方便報警系統(tǒng)的設計。 所以,本次設計以DHT91數字溫濕度傳感器為例,介紹基于單片機的數字溫濕度計的設計。</p><p> 2.2.
22、2 方案設計</p><p> 按照系統(tǒng)設計功能的要求,確定系統(tǒng)由5個模塊組成:主控制器,數字溫濕度傳感器,報警電路,按鍵電路及驅動顯示電路。</p><p> 圖2-1 總體電路框圖</p><p> 主控制器的功能由單片機來完成,主要負責處理由數字溫濕度傳感器送來數據,并把處理好的數據送向顯示模塊。數字溫濕傳感器主要用來采集周圍環(huán)境參數,并把所采集來的參數
23、送向主控制器。按鍵電路主要用來完成單片機的復位操作和溫濕度初始值的設定。這里需要四個按鍵,一個用來完成單片機的復位操作,一個用來切換顯示的數據(是設定值還是實際測得的值),另外兩個分別用來設定初始溫度和初始濕度的個位和十位。報警電路就是用一個發(fā)光二極管來實現的,用來判斷周圍環(huán)境的溫度或者濕度是否超出設定值了,任何一個超出設定值發(fā)光二極管就會被點亮。驅動顯示電路主要用來驅動八位數碼管發(fā)光的。由于單片機的輸出電流太?。ㄖ挥袔缀涟玻┎荒茯屖箶?/p>
24、碼管發(fā)光,所以這里必須增加一個驅動顯示模塊。</p><p><b> 2.3元器件的選擇</b></p><p> 2.3.1 主控制器芯片</p><p> 主控制器模塊選用單片機AT89C52。AT89C52是美國ATMEL公司生產的低電平,高性能CMOS 8位單片機,片內含8k bytes的可反復擦寫的只讀程序存儲器(PEROM
25、)和256 bytes的隨機存取數據存儲器(RAM ),器件采用ATMEL公司的高密度、非易失性存儲技術生產,與標準MCS-51指令系統(tǒng)及8052產品引腳兼容,片內置通用8位中央處理器(CPU)和Flash存儲單元,32個可編程I/O口線, 3個16位定時/計數器, 低功耗空閑和掉電模式。功能強大的AT89C52單片機適合于許多較為復雜控制應用場合。</p><p> AT89C52共有6個中斷向量:兩個外中斷
26、(INT0和INT1),3個定時器中斷(定時器0, 1, 2),串行口中斷和四個雙向I/0口。</p><p> P0口:P0口是一組8位漏極開路型雙向I/O口,也即地址/數據總線復用口。作為輸出口用時,每位能吸收電流的方式驅動8個TTL邏輯門電路,對端口P0寫“1”時可作為高阻抗輸入端用。</p><p> 在訪問外部數據存儲器或程序存儲器時,這組口線分時轉換地址(低8位)和數據總線
27、復位,應為輸出驅動級的漏極開路,所以必須外接上拉電阻,否則不能正常工作。</p><p> P1口:P1是一個帶內部上拉電阻的8位雙向I/O口,P1的輸出緩沖級可驅動(吸收或輸出電流)4個TTE邏輯門電路。對端口寫“1”,通過內部的上拉電阻把端口拉到高電平,此時可作輸入口。作輸入口使用時,因為內部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流(ILL)。</p><p> 表2-
28、1 P1.0和P1.1的第二功能</p><p> P2口:P2是一個帶有內部上拉電阻的8位雙向I/O口,P2的輸出緩沖級可驅動(吸收或輸出電流)4個TTL邏輯門電路。對端口P2寫“1”,通過內部的上拉電阻把端口拉到高電平,此時可作輸入口,作輸入口使用時,因為內部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流(ILL)。</p><p> P3口:P3口是一組帶有內部上拉電阻的8
29、位雙向I/O口。P3口輸出緩沖級可驅動(吸收或輸出電流)4個TTL邏輯門電路。對P3口寫入“1”時,它們被內部上拉電阻拉高并可作為輸入端口。此時,被外部拉低的P3口將用上拉電阻輸出電流(ILL)。</p><p> 2.3.2 數字溫濕度傳感器</p><p> 測溫濕模塊選用數字溫濕度傳感器DHT91?,F今國內外用的最多的溫濕度傳感器是SHTxx系列。不過很多客戶都反應SHTxx不
30、方便手工焊接,很容易在焊接的時候,由于溫度過高造成傳感器直接損害,因此利用SHTxx傳感器重新在國內封裝得到了DHT 9x系列。SHTxx系列單芯片傳感器是一款含有已校準數字信號輸出的溫濕度復合傳感器。它應用專利的工業(yè)COMS過程微加工技術(CMOSens®),具有極高的可靠性與卓越的長期穩(wěn)定性。傳感器包括一個電容式聚合體測濕元件和一個能隙式測溫元件,并與一個14位的A/D器以及串行接口電路在同一芯片上實現無縫鏈接,從而具有超
31、快響應,抗干擾能力強,性價比高等優(yōu)點。</p><p> 2.4 驅動顯示電路</p><p> 驅動顯示模塊選用八位共陽極數碼管和八個小功率放大三極管S9012。由于單片機的端口輸出電流太小,這里必須由外界電路來驅動數碼管顯示。S9012就是用來驅動這八位數碼管顯示的。</p><p> LED數碼管也稱半導體數碼管,是目前數字電路中最常用的顯示器件。它是
32、以發(fā)光二極管作段并按共陰極方式或共陽極方式連接后封裝而成的。圖2-2所示是兩種LED數碼管的外形與內部結構,+、-分別表示公共陽極和公共陰極,a~g是7個段電極,DP為小數點。LED數碼管型號較多,規(guī)格尺寸也各異,顯示顏色有紅、綠、橙等。</p><p> LED數碼管的主要特點如下:</p><p> (1) 發(fā)光響應時間極短(小于0.1μs),高頻特性好,單色性好,亮度高。<
33、/p><p> (2)能在低電壓、小電流條件下驅動發(fā)光,能與CMOS、ITL電路兼容。 </p><p> (3) 壽命長,使用壽命在10萬小時以上,甚至可達100萬小時。成本低。 </p><p> (4)體積小,重量輕,抗沖擊性能好。</p><p> 因此它被廣泛用作數字儀器儀表、數控裝置、計算機的數顯器件。小電壓大電流的小功率放大
34、三極管S9012的放大倍數共分六級:</p><p><b> D級:64-91 </b></p><p> E級:78-112 </p><p> F級:96-135 </p><p> G級:112-166 </p><p> H級:144-220 </p><p
35、> I級:190-300</p><p> 2.5 溫濕度測量的方法及分析</p><p> DHT91是一個兩線串行接口的數字溫濕度傳感器,一個接口是時鐘線,一個接口是數據線(支持雙向傳輸)。它是四針單排封裝,一個接電源,一個接地線,另兩個直接和單片機的P0_5和P0_6相連。不過數據線和時鐘線上需要接兩個10K的上拉電阻,因為AT89C52的P0口內部沒有上拉電阻。單片機
36、通過P0_5和P0_6向DHT91發(fā)送命令,DHT91接收到命令后做出相應的應答。由于DHT91內部包含一個14位A/D轉換器,所以單片機接收到就是數字信號,只需要做相應的處理就能得到所需要的數據。這里減少了很多外部的電路的連接,用起來比較方便。</p><p> 第三章 硬件電路的設計 </p><p> 3.1主控制電路和測溫濕控制電路</p><p>
37、 本次硬件設計的核心就是AT89C52,其他部件都是圍繞它設計的。數字溫濕度傳感器DHT91的DATA口和SCK口分別與AT89C52的P0_5口和P0_6口相連。因為P0口內部沒有上拉電阻,所以這里在DATA和SCK傳輸線上分別加了一個10K的上拉電阻。預置數電路就是三個按鍵分別與AT89C52的P0_1,P0_2和P0_3口相連,為了降低AT89C52的功耗在按鍵和單片機的端口間加了個10K的限流電阻。當有按鍵按下時單片機收到有效的
38、信號,S1鍵用來切換顯示的模式(分別顯示實際所測得的溫濕度,預置的溫度值和預置的濕度值),S2鍵用來設置初始溫度或者濕度的十位,S3鍵用來設置初始溫度或者濕度的個位。報警電路就是把個發(fā)光二極管和AT89C52的P0_4口相連,當P0_4口為低電平時放光二極管被點亮。發(fā)光二極管的壓降一般為1.5—2.0 V,其工作電流一般取10—20 mA為宜。使用LED作指示電路時,應該串接限流電阻,該電阻的阻值大小應根據不同的使用電壓和LED所需工作
39、電流來選擇。這個電流能使放光二極管正常放光。如果電流小于10mA放光二極管的亮度會減弱,如果電流大于20mA發(fā)光二極管亮度</p><p> 單片機復位有兩種:一種是上電復位,一種是按鍵復位。下圖用的就是按鍵復位,當按鍵按下時單片機的RST口從低電平變?yōu)楦唠娖?,從而進入復位狀態(tài)。當按鍵松開后,VCC給電容C3充電,從而把RST口拉至電平,單片機進入工作狀態(tài)。只要把下圖的RESET按鍵和R2電阻去掉就成了上電復位
40、了。</p><p> AT89C52中有一個用于構成內部振蕩器的高增益反相放大器,引腳XTAL1和XTAL2分別是該放大器的輸入端和輸出端。這個放大器與作為反饋元件的片外石英晶體或陶瓷諧振器構成自激振蕩器。外接石英晶體(或陶瓷諧振器)及電容C1、C2接在放大器的反饋回路中構成并聯振蕩電路,對外接電容C1、C2雖然沒有十分嚴格的要求,但電容容量的大小會輕微影響振蕩頻率的高低、振蕩器工作的穩(wěn)定性、起振的難易程度及
41、溫度穩(wěn)定性,如果使用石英晶體,我們推薦電容使用30pF士10pF,而如果使用陶瓷諧振器,建議選擇40pF士l0pF。這里用到的是12M的石英晶體振蕩器和兩個30pF的電容。</p><p><b> 3.2驅動顯示電路</b></p><p> 數碼管的顯示有兩種方法:一種是靜態(tài)顯示,一種是動態(tài)掃描顯示。靜態(tài)顯示就是數碼管的段選端一對一與單片機的I/O相連,位選端
42、則根據數碼管的極型來接地(GND)或者是高電平(VCC)。靜態(tài)顯示實現起來比較簡單,但是浪費了單片機的I/O口資源。動態(tài)掃描顯示就是幾個數碼管的段選端可以同時接到單片機的I/O口,位選端一對一的接到單片機的其它I/O口,當位選信號選中某個數碼管時,那個數碼管就被點亮,而其它數碼管不亮。動態(tài)掃描顯示節(jié)省了單片機的I/O資源。</p><p> 采用動態(tài)顯示方案,設計中使用八個共陰極數碼管作為顯示載體,通過八路并口
43、傳輸,共使用了十六個I/O口。顯示時采用循環(huán)移位法,即八位數碼管依次循環(huán)點亮,利用人眼睛的視覺暫留效果達到連續(xù)顯示,主程序每運行一遍便調用一次顯示子程序,將數據顯示出來。顯示部分為八位共陽極數碼管(四位一組),數碼管的段端A,B,C,D,E,F,G和DP與TA89C52的P1口相連,順序可以根據硬件接線方便而定。數碼管的字段通過八個PNP型的小功率放大三極管S9012與TA89C52的P2口相連。因為AT89C52的端口輸出電流太?。ㄖ?/p>
44、有幾mA)不能點亮這八位數碼管,所以這里用了八個S9012來驅動它們。具體原理圖見附錄一。</p><p> 第四章 軟件設計及分析</p><p> 4.1 DHT91傳輸時序和指令集</p><p> 4.1.1 通訊復位時序</p><p> 圖4-1通訊復位時序</p><p> 串行時鐘輸入
45、(SCK)用于微處理器與DTH91之間的通訊同步。由于接口包含了完全靜態(tài)邏輯,因而不存在最小SCK 頻率。串行數據 (DATA) 三態(tài)門用于數據的讀取。DATA 在SCK 時鐘下降沿到來之后改變狀態(tài),并僅在SCK 時鐘上升沿有效。數據傳輸期間,在SCK 時鐘高電平時,DATA 必須保持穩(wěn)定。為避免信號沖突,微處理器應驅動DATA 在低電平。需要一個外部的上拉電阻(例如:10kΩ)將信號提拉至高電平。</p><p&g
46、t; 如果與DTH91 通訊中斷,下列信號時序可以復位串口:當DATA 保持高電平時,觸發(fā)SCK 時鐘9 次或更多。這些時序只復位串口,狀態(tài)寄存器內容仍然保留。</p><p> 4.1.2 啟動傳輸時序</p><p> 圖4-2啟動傳輸時序</p><p> 用一組“啟動傳輸”時序,來表示數據傳輸的初始化。它包括:當SCK 時鐘高電平時DATA 翻轉為
47、低電平,緊接著SCK 變?yōu)榈碗娖剑S后是在SCK 時鐘高電平時DATA 翻轉為高電平。在下一次指令前,發(fā)送一個“傳輸啟動”時序。啟動傳輸時序如上圖4-2所示。</p><p> 4.1.3 數據傳輸和指令集</p><p> 后續(xù)命令包含三個地址位(目前只支持“000”),和五個命令位。DTH 91 會以下述方式表示已正確地接收到指令:在第8個SCK 時鐘的下降沿之后,將DATA 下
48、拉為低電平(ACK 位)。在第9個SCK 時鐘的下降之后,釋放DATA(恢復高電平)。發(fā)布一組測量命令(‘00000101 ’表示相對濕度RH,‘00000011 ’表示溫度T)后,控制器要等待測量結束。這個過程需要大約20/80/320ms ,分別對應8/12/14bit 測量。確切時間隨內部晶振速度的變化而變化,最多可能有-30%的變化。DTH91 通過下拉DATA 至低電平并進入空閑模式,表示測量的結束??刂破髟谠俅斡|發(fā)SCK 時
49、鐘前,必須等待這個“數據備妥”信號來讀出數據。檢測數據可以先被存儲,這樣控制器可以繼續(xù)執(zhí)行其它任務在需要時再讀出數據。接著傳輸2個字節(jié)的測量數據和1個字節(jié)的CRC 奇偶校驗。uC 需要通過下拉DATA 為低電平,以確認每個字節(jié)。所有的數據從MSB開始,右值有效(例如:對于12bit 數據,從第5個SCK 時鐘起算作MSB;而對于 8bit 數據,首字節(jié)則無意義)。</p><p> 用CRC 數據的確認位,表明
50、通訊結束。如果不使用CRC-8 校驗,控制器可以在測量值LSB 后,通過保持確認位ack 高電平,來中止通訊。在測量和通訊結束后,DTH91自動轉入休眠模式。</p><p> 4.1.4 濕度的測量時序</p><p> 圖4-3測量濕度的時序</p><p> 4.1.5 輸出轉換為物理量</p><p> 由能隙材料PTAT
51、 (正比于絕對溫度) 研發(fā)的溫度傳感器具有極好的線性。</p><p> 為了補償濕度傳感器的非線性以獲取準確數據,建議使用如下公式1修正輸出數值:</p><p> RHlinear = c1 + c2 .SORH + c3 .SORH (4-1)</p><p> c1,c2和c3值如下表4-1所示。</p>
52、<p> 表4-1 濕度轉換系數</p><p> 濕度傳感器相對濕度的溫度補償實際測量溫度與25℃ (-77℉)相差較大時,應考慮濕度傳感器的溫度修正系數:</p><p> RHtrue = (T°C -25).(t1 + t2 .SORH) + RHlinear</p><p> t1和t2的值如下表4-2所示。</p&g
53、t;<p> 表4-2 溫度補償系數</p><p> RHtrue:測量的濕度值。</p><p> 4.1.6 DHT91的DC特性。</p><p> DHT91的DC特性如下表4-3所示。</p><p> 表4-3 DHT91的DC特性</p><p> 4.2 程序流程圖<
54、;/p><p> 圖4-4主程序流程圖</p><p> 圖4-5報警程序流程圖</p><p> 4.3 程序的設計</p><p> 4.3.1 通訊復位子程序</p><p> void s_connectionreset(void)</p><p><b> {&l
55、t;/b></p><p> unsigned char i;</p><p><b> DATA=1;</b></p><p><b> SCK=0;</b></p><p> for(i=0;i<9;i++)</p><p><b> {&
56、lt;/b></p><p><b> SCK=1;</b></p><p><b> SCK=0;</b></p><p><b> }</b></p><p><b> }</b></p><p> 通訊復位子程
57、序用來復位串口的,當傳輸中斷或者傳輸過程中發(fā)生了錯誤時就需要從新對串口進行復位操作。</p><p> 4.3.2 傳輸啟動子程序</p><p> void s_transstart(void)</p><p><b> {</b></p><p><b> DATA=1;</b><
58、;/p><p><b> SCK=0;</b></p><p><b> _nop_();</b></p><p><b> SCK=1;</b></p><p><b> _nop_();</b></p><p><b&
59、gt; DATA=0;</b></p><p><b> _nop_();</b></p><p><b> SCK=0;</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b>
60、</p><p><b> _nop_();</b></p><p><b> SCK=1;</b></p><p><b> _nop_();</b></p><p><b> DATA=1;</b></p><p>&l
61、t;b> _nop_();</b></p><p><b> SCK=0;</b></p><p><b> }</b></p><p> 傳輸啟動子程序是用來表示數據傳輸的初始化。每次對傳感器進行寫命令或者讀命令前先進行以上程序方可。</p><p> 4.3.3 一
62、個字節(jié)子程序</p><p> char s_write_byte(unsigned char value)</p><p><b> {</b></p><p> unsigned char i,error=0;</p><p> for(i=0x80;i>0;i/=2)</p><p
63、><b> {</b></p><p> if(i&value)</p><p><b> DATA=1;</b></p><p><b> else</b></p><p><b> DATA=0;</b></p>
64、<p><b> SCK=1;</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> SC
65、K=0;</b></p><p><b> }</b></p><p><b> DATA=1;</b></p><p><b> SCK=1;</b></p><p> error=DATA;</p><p><b>
66、SCK=0;</b></p><p> return error;</p><p><b> }</b></p><p> 可以通過寫一個字節(jié)子程序對傳感器進行寫指令操作。若想讀出濕度值就向傳感器寫入‘00000101’如想讀出溫度值就向傳感器寫入‘00000011’。</p><p> 4.3.4
67、 讀一個字節(jié)子程序</p><p> char s_read_byte(unsigned char ack)</p><p><b> {</b></p><p> unsigned char i,val=0;</p><p><b> DATA=1;</b></p><
68、p> for(i=0x80;i>0;i/=2)</p><p><b> {</b></p><p><b> SCK=1;</b></p><p><b> if(DATA) </b></p><p><b> {</b></
69、p><p> val=(val|i);</p><p><b> }</b></p><p><b> SCK=0;</b></p><p><b> }</b></p><p> DATA=!ack;</p><p>&l
70、t;b> SCK=1;</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> SCK=0;</b&
71、gt;</p><p> DATA=1; </p><p> return val;</p><p><b>
72、; }</b></p><p> 通過讀一個字節(jié)子程序從傳感器讀出溫度值或濕度值,把相應的數據送到單片機的寄存器中。</p><p> 4.3.5 數據處理子程序</p><p> void calc_sth11(float *p_humidity,float *p_temperature)</p><p><b&
73、gt; {</b></p><p> const float C1=-4.0;</p><p> const float C2=0.0405;</p><p> const float C3=-0.0000028;</p><p> const float T1=0.01;</p><p> c
74、onst float T2=0.00008;</p><p> float rh=*p_humidity;</p><p> float t=*p_temperature;</p><p> float rh_lin;</p><p> float rh_true;</p><p> float t_c;&l
75、t;/p><p> t_c=t*0.01-40;</p><p> rh_lin=C3*rh*rh+C2*rh+C1;</p><p> rh_true=(t_c-25)*(T1+T2*rh)+rh_lin;</p><p> if(rh_true<0.1) rh_true=0.1;</p><p> *p
76、_temperature=t_c;</p><p> *p_humidity=rh_true;</p><p><b> }</b></p><p> 把從傳感器讀出的二進制數轉換成相應的十進制數。</p><p> 4.3.6 顯示子程序</p><p> void display(
77、float humi,float temp)</p><p><b> {</b></p><p> int humi1,temp1;</p><p> humi1=(humi*10); </p><p> temp1=(temp*10);</p><p> if(temp1<0)
78、</p><p><b> {</b></p><p> dispbuf[0]=10;</p><p> temp1=abs(temp1);</p><p><b> }</b></p><p><b> else</b></p>
79、<p><b> {</b></p><p> dispbuf[0]=11;</p><p><b> }</b></p><p> if(cnt==0)</p><p><b> {</b></p><p> dispbuf[1
80、]=temp1/100;</p><p> dispbuf[2]=temp1/10%10;</p><p> dispbuf[3]=temp1%10;</p><p> dispbuf[4]=11;</p><p> dispbuf[5]=humi1/100;</p><p> dispbuf[6]=humi
81、1/10%10;</p><p> dispbuf[7]=humi1%10;</p><p> if((humi>humiset)||(temp>tempset))</p><p><b> {</b></p><p><b> P0_4=0;</b></p>&l
82、t;p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b> P0_4='Z';</b></p><p><b> }</b>
83、</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> if(cnt==1)</p><p><b> {</b></p>
84、<p> if(temph>9)</p><p><b> {</b></p><p> dispbuf[0]=10;</p><p><b> }</b></p><p><b> else</b></p><p><b
85、> {</b></p><p> dispbuf[0]=11;</p><p><b> }</b></p><p> dispbuf[1]=temph%10;</p><p> dispbuf[2]=templ%10;</p><p> dispbuf[3]=11;
86、</p><p> dispbuf[4]=11;</p><p> dispbuf[5]=11;</p><p> dispbuf[6]=11;</p><p> dispbuf[7]=11;</p><p><b> }</b></p><p><b>
87、; else</b></p><p><b> {</b></p><p> dispbuf[0]=11;</p><p> dispbuf[1]=11;</p><p> dispbuf[2]=11;</p><p> dispbuf[3]=11;</p>
88、<p> dispbuf[4]=11;</p><p> dispbuf[5]=humih%10;</p><p> dispbuf[6]=humil%10;</p><p> dispbuf[7]=11;</p><p><b> }</b></p><p><b>
89、; }</b></p><p><b> }</b></p><p> 當cnt=0時數碼管顯示實際的溫濕度值,當cnt=1時數碼管顯示設定溫度值,當cnt=2時數碼管顯示設定濕度值。</p><p> 4.3.7 按鍵子程序</p><p> void key()</p><
90、p><b> {</b></p><p> if(P0_0==0)</p><p><b> {</b></p><p> for(i=5;i>0;i--)</p><p> for(j=248;j>0;j--);</p><p> if(P0_
91、0==0)</p><p><b> {</b></p><p><b> cnt++;</b></p><p><b> if(cnt>2)</b></p><p><b> {</b></p><p><b&
92、gt; cnt=0;</b></p><p><b> }</b></p><p><b> }</b></p><p> while(P0_0==0);</p><p><b> }</b></p><p> if(cnt==1
93、)</p><p><b> {</b></p><p> if(P0_1==0)</p><p><b> {</b></p><p> for(i=5;i>0;i--)</p><p> for(j=248;j>0;j--);</p>
94、<p> if(P0_1==0)</p><p><b> {</b></p><p><b> temph++;</b></p><p> if(temph==15)</p><p><b> {</b></p><p><b
95、> temph=0;</b></p><p><b> }</b></p><p><b> }</b></p><p> while(P0_1==0);</p><p><b> }</b></p><p> if(P0_
96、2==0)</p><p><b> {</b></p><p> for(i=5;i>0;i--)</p><p> for(j=248;j>0;j--);</p><p> if(P0_2==0)</p><p><b> {</b></p&g
97、t;<p><b> templ++;</b></p><p> if(templ==10)</p><p><b> {</b></p><p><b> templ=0;</b></p><p><b> }</b></p
98、><p><b> }</b></p><p> while(P0_2==0);</p><p><b> }</b></p><p><b> }</b></p><p><b> else</b></p>&
99、lt;p> if(cnt==2)</p><p><b> {</b></p><p> if(P0_1==0)</p><p><b> {</b></p><p> for(i=5;i>0;i--)</p><p> for(j=248;j>
100、0;j--);</p><p> if(P0_1==0)</p><p><b> {</b></p><p><b> humih++;</b></p><p> if(humih==10)</p><p><b> {</b></p&
101、gt;<p><b> humih=0;</b></p><p><b> }</b></p><p><b> }</b></p><p> while(P0_1==0);</p><p><b> }</b></p>
102、<p> if(P0_2==0)</p><p><b> {</b></p><p> for(i=5;i>0;i--)</p><p> for(j=248;j>0;j--);</p><p> if(P0_2==0)</p><p><b>
103、{</b></p><p><b> humil++;</b></p><p> if(humil==10)</p><p><b> {</b></p><p><b> humil=0;</b></p><p><b>
104、 }</b></p><p><b> }</b></p><p> while(P0_2==0);</p><p><b> }</b></p><p><b> }</b></p><p> if(temph<10)&l
105、t;/p><p><b> {</b></p><p> tempset=temph*10+templ;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b>&
106、lt;/p><p> tempset=(10-temph)-templ;</p><p><b> }</b></p><p> humiset=humih*10+humil;</p><p><b> }</b></p><p> S1鍵對應P0_0,S2鍵對應P0_
107、1,S3鍵對應P0_2。每按一次S1鍵,變量cnt加1,當cnt>2時cnt=0。當cnt=1時每按一次S2鍵,temph加1,當temph>14時temph=0,當temph為10,11,12,13,14時分別對應的是-,-1,-2,-3,-4,每按一次S3鍵,templ加1,當templ>9時templ=0。當cnt=2時S2,S3鍵調的是humih和humil。</p><p> 4.3
108、.8 中斷刷新顯示數碼管子程序</p><p> void t0(void) interrupt 1 </p><p><b> {</b></p><p><b> mstcnt++;</b></p><p> if(mstcnt==8)</p><p><
109、b> {</b></p><p><b> mstcnt=0;</b></p><p> if((dispbitcnt==2)||(dispbitcnt==6))</p><p><b> {</b></p><p> P1=dispcode[dispbuf[dispbi
110、tcnt]]&0xfb;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> P1=dispcode[dispbuf[dispbitcnt]];</p><
111、p><b> }</b></p><p> P2=dispbitcode[dispbitcnt];</p><p> dispbitcnt++;</p><p> if(dispbitcnt==8)</p><p><b> {</b></p><p> d
112、ispbitcnt=0;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> 每2mS刷新數碼管一次,人眼的視覺暫留時間大概是0.1S,所以可以讓人感覺到每個數碼管都在顯示。第三和七個數碼管
113、分別為溫度和濕度的個位,所以讓這兩個數碼管的小數點位一直顯示。</p><p> 4.3.9 軟件在硬件上的調試分析</p><p> 軟件在Keil里編譯通過以后還得在硬件電路上調試,讓數碼管顯示正確的溫濕度值,按鍵能夠設定初始值,led發(fā)光二極管能夠指示報警,這些功能都實現,本設計才能算基本完成。硬件電路是我本著連線簡單的原則焊接的,數碼管的段選信號端(A,B,C,D,E,F,G
114、,DP)并不是與單片機的P1口(從0-7)正好相互對應的。所以這里我們需要對數碼管所要顯示的0,1,2,3,4,5,6,7,8,9,-和“不顯示”從新編碼。在開始調試的時候我就忽略了這一點,我用的是資料書中常用到那種,所以數碼管顯示的是亂碼。我以為是硬件電路出了錯誤,我用萬用表把每根線從新測了一遍,發(fā)現硬件電路一切正常啊。這時我才忽然想到,是編碼這邊出現了錯誤。我根據硬件的連線從新對0,1,2,3,4,5,6,7,8,9,-和“不顯示”
115、進行了編碼。顯示的數值還是不正確,但是數碼管中顯示的數和我想要顯示的數有幾分相似。在編碼時我又忽略的一點,我們總是習慣性的從左往右寫數,我就在紙上從左往右一次寫了P1_0, P1_1,P1_2, P1_3, P1_4, P1_5, P1_6和 P1_7 。所以編出的結果與實際所要的結果高位與低位正好錯了位置。</p><p> 這次畢業(yè)設計讓我認識到了一般的設計流程以及設計中所要注意到的一些細節(jié)。在設計開始,應
116、該先要認識到這次設計所要完成的功能。接著大致分析一下所要用到的元器件??傮w思路清晰以后就要畫原理圖。根據原理圖焊接電路板,焊接的時候應該怎樣布線簡單怎樣焊接,盡量達到布線少,布線短,跳線少,美觀大方。硬件電路沒有任何問題后就可以根據我們所設計好的電路進行軟件編程了。</p><p><b> 結 論</b></p><p> 本次單片機的數字溫濕度的設計,包括硬
117、件和軟件設計兩部分。我先是在軟件上完全做好的基礎上再實行硬件電路的設計。</p><p> 在軟件設計過程中我是先編出數字鐘控制程序后,我才開始根據DHT91的時序圖進行軟件的編寫程序。在軟件設計過程中我也遇到了問題,經過xx老師的指點和同學之間的討論,終于解決并學到了編程技巧及一些編程思想。由于材料有限,本設計中的有些電容和電阻的數值并不是原理圖中設計的大小,但是不影響結果。在畫原理圖和制作PCB版圖的過程中
118、我熟練掌握了ALTIUM designer的基本應用。在制作PCB版圖方面,我的PCB版圖在布線方面還不夠完美,但是我會不斷努力爭取做的更好。</p><p> 經過軟件在硬件電路上的調試后,基本功能都能實現。溫度和濕度都是顯示到小數點后一位。如果手放到數字溫濕度傳感器DTH 91上,數碼管上顯示的溫度和濕度會立即發(fā)生變化,測出其溫度和濕度。</p><p> 本電路還是存在一些不足及
119、需要改進的地方,如可以加計算機串口傳輸,掉電存儲等模塊。</p><p><b> 致 謝</b></p><p> 本畢業(yè)設計是在xx老師的精心指導下完成,首先我要對xx老師表示最真誠的謝意。在論文設計這幾個月來的學習過程中xx老師在設計上給予我耐心的指導,同時我也學會了如何把專業(yè)知識應用于實際當中,為今后走上工作崗位打下了堅實的基礎。</p>
120、<p> 在我即將結束大學學習之際,我真心感謝三年來所有教過我的老師們,謝謝你們給予我的指導和關懷;同時我也感謝三年來在一起學習、生活的同窗好友們,謝謝你們給予我的照顧和關心。</p><p> 畢業(yè)設計結束后,我將踏上工作崗位,三年時間學習到的知識與經驗將成為我走向崗位的墊腳石。相信我定會更加努力拼搏,創(chuàng)造出我的世界。</p><p> 最后,懇請所有讀到本畢業(yè)設計的老師
121、多提寶貴意見,不吝賜教。</p><p> 再次表示衷心的感謝!</p><p><b> 參考文獻</b></p><p> 靳桅,潘育山,鄔芝權.單片機原理及應用.西南交通大學出版社,2002.</p><p> 李光飛,樓然苗,胡佳文等.單片機課程設計實例指導.北京:北京航空航天大學出版社,2004.<
122、;/p><p> 凌玉華.單片機原理及應用系統(tǒng)設計.長沙:中南大學出版社,2006.</p><p> 劉華東.單片機原理與應用.北京:電子工業(yè)出版社,2003.</p><p> 高鵬,安濤,寇懷成等.電路設計與制版--Protel99入門與提高.北京:人民郵電出版社,2004.</p><p> 王守剛.電路原理圖與電路板設計教程.北
123、京:北京希望電子出版社,2000.</p><p> 姚四改.Protel99SE電子線路設計教程.上海:上海交通大學出版社,2000.</p><p> 余家春.Protel99SE電路設計實用教程.北京:中國鐵道出版社,2004.</p><p> 肖金球.單片機原理與接口技術.北京:清華大學出版社,2004.</p><p>
124、余永權.FLASH單片機原理及應用.北京: 電子工業(yè)出版社,1997.</p><p> 何立民.單片機應用技術選編.北京: 北京航空航天大學出版社,1996.</p><p><b> 附 錄</b></p><p><b> 附錄1 電路原理圖</b></p><p> 附錄2 元器
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 畢業(yè)設計-- 單片機的溫濕度計設計
- 數字溫濕度計設計
- 畢業(yè)設計(論文)--數字溫濕度計的設計
- 畢業(yè)論文--基于單片機的室內溫濕度計的設計
- 單片機溫濕度畢業(yè)設計
- 數字溫濕度計--硬件設計畢業(yè)論文
- 畢業(yè)設計(論文)+基于msp430單片機的便攜式溫濕度計設計與開發(fā)
- 畢業(yè)設計--多功能空氣溫濕度計
- 單片機畢業(yè)設計--多功能空氣濕度計設計
- 基于單片機的溫濕度檢測儀【畢業(yè)設計】
- 單片機無線溫濕度測量系統(tǒng)畢業(yè)設計
- 基于單片機的倉庫溫濕度檢測系統(tǒng)設計畢業(yè)設計
- 多功能溫濕度計設計畢業(yè)論文
- 基于單片機的大棚溫濕度光強監(jiān)測畢業(yè)設計
- 基于單片機的溫濕度控制系統(tǒng)畢業(yè)設計
- 多功能溫濕度計設計畢業(yè)論文
- 畢業(yè)設計---基于單片機的倉庫溫濕度檢測系統(tǒng)
- 畢業(yè)設計_基于單片機的環(huán)境溫濕度檢測系統(tǒng)
- 基于單片機的溫濕度監(jiān)測與控制畢業(yè)設計
- 單片機的溫濕度檢測儀畢業(yè)設計
評論
0/150
提交評論