利用單片機及DS18B20實現溫度報警器的制作
利用單片機及DS18B20實現溫度報警器的制作 摘要:隨著電子技術的發展,家用電器和辦公設備的智能化、系統化已成為發展趨勢,而這些高性能幾乎都要通過單片機實現。同時,溫度作為與我們生活息息相關的一個環境參數,對其的測量和研究也變得極為重要。故溫度檢測報警系統在現代生活、生產中得到了越來越廣泛的應用。
本論文介紹了采用溫度傳感器DS18B20作為溫度采集器、AT89S51單片機為主控制器,外加顯示模塊以及報警電路實現該智能溫度測量報警器的設計方法、工作原理、電路組成等。DS18B20是美國DALLAS公司生產的單線數字溫度傳感器,它具有獨特的單線總線接口方式,使用起來比較方便,其精度也相當高。由于其以上特點,故將其應用于溫度檢測電路能夠使系統更簡單,更可靠。該溫度報警系統結構設計較為簡單,但可應用于生活、生產以及科研等多個領域,是一種經濟而實用的溫度控制系統,其優點很多,有很大實用價值。
關鍵詞:AT89S51;單片機;DS18B20;溫度控制;報警
1緒 論
溫度是與人們生活息息相關的環境參數,許多情況下都需要進行溫度測量及報警,溫度測量報警系統在現代日常生活、科研、工農業生產中已經得到了越來越廣泛的應用。所以對溫度的測量報警方法及設備的研究也變得極其重要。隨著人們生活水平的不斷提高以及應對各種復雜測量環境的需要,我們對溫度測量報警器的要求也越來越高,利用單片機來實現這些控制無疑是人們追求的目標之一,它帶給我們的方便是不可否定的。其中溫度檢測報警器就是一個典型的例子。要為現代人工作、科研、生活、提供更好的更方便的設施,就需要從單片機技術入手,向數字化,智能化控制方向發展。
本設計所介紹的溫度報警器,可以設置上下限報警溫度,當溫度不在設置范圍內時,可以報警 。與傳統的溫度測量系統相比,本設計中的數字溫度測量報警系統具有很多前者沒有的優點,如測溫范圍廣而且準確,采用LCD數字顯示,讀數方便等。
1.1 溫度報警器的研究意義
隨著電子技術的發展,家用電器和辦公設備的智能化、系統化已成為趨勢,而這些高性能幾乎都要通過單片機實現。同時,溫度作為與我們生活息息相關的一個環境參數,對其的測量和研究也變得極為重要。故溫度檢測報警系統在現代生活、生產中得到了越來越廣泛的應用。
工業生產帶動了人類社會的進步,同時也促進了各種新的傳感器的發展。在工業生產中溫度的準確測量是一個比較困難的事情。從最初的酒精、水銀溫度計到現在的數字化、集成化的溫度計可見傳感器的發展是飛快的。它的快速發展必將帶來新一輪的工業化革命和社會發展的飛躍。
本設計所介紹的溫度報警器可以設置上下限報警溫度,當溫度不在設定范圍內時可以報警 ,主要用于對測溫比較準確的場所,或科研實驗室使用。它具有結構簡單,不需外接元件,可由用戶設置溫度報警界限等特點,可廣泛用于食品庫、冷庫、糧庫等需要控制溫度的地方。目前,該類產品已在溫控系統中得到廣泛的應用。所以設計意義較為深遠。
1.2 溫度報警器的現狀及發展
溫度是一種在生產、科研、生活中需要測量和控制的重要物理量,是國際單位制七個基本量之一。其測量控制一般采用各式各樣形態的溫度傳感器。根據它們在訊號輸出方式上的不同可以分為模擬溫度傳感器和數字溫度傳感器。單片機技術的出現則是為現代工業測控領域帶來了一次新的技術革命,目前,單片機以其體積小、重量輕、抗干擾能力強、對環境要求不高、可靠性高、性價比高、開發較為容易等特點,在工業控制、數據采集、智能化儀器儀表、辦公自動化等諸多領域得到了極為廣泛的應用,并已走入我們的日常生活,現在,隨處都可以看到單片機的蹤影。目前溫度報警器的發展已經比較成熟了,它能幫助我們實現想要的溫度控制,解決身邊的很多問題。
1.2.1 智能溫度傳感器
智能溫度傳感器(亦稱數字溫度傳感器)是在20世紀90年代中期問世的。它是微電子技術、計算機技術和自動測試技術(ATE)的結晶。目前,國際上已開發出多種智能溫度傳感器系列產品。智能溫度傳感器內部都包含溫度傳感器、A/D轉換器、信號處理器、存儲器(或寄存器)和接口電路。有的產品還帶多路選擇器、中央控制器(CPU)、隨機存取存儲器(RAM)和只讀存儲器(ROM)。智能溫度傳感器的特點是能輸出溫度數據及相關的溫度控制量,適配各種微控制器(MCU);并且它是在硬件的基礎上通過軟件來實現測試功能的,其智能化程度也取決于軟件的開發水平。
1.2.2 傳感器發展趨勢
現代信息技術的三大基礎是信息采集(即傳感器技術)、信息傳輸(通信技術)和信息處理(計算機技術)。傳感器屬于信息技術的前沿尖端產品,尤其是溫度傳感器,它被廣泛用于工農業生產、科學研究和生活等領域,數量高居各種傳感器之首。近百年來,溫度傳感器的發展大致經歷了以下三個階段;(1)傳統的
分立式溫度傳感器(含敏感元件);(2)模擬集成溫度傳感器,控制器;(3)智能溫度傳感器。目前,國際上新型溫度傳感器正從模擬式向數字式、由集成化向智能化、網絡化的方向發展。
2 硬件設計
2.1 總體設計方案
本設計是一個基于單片機的溫度測量電路,傳統的溫度檢測系統采用熱敏電阻等溫度敏感元件,熱敏電阻雖然成本低,但是需要后續信號處理、A/D轉換處理等才能將溫度轉換成數字信號,不但電路復雜,可靠性和精度也相對較低,在應用中還需要解決引線誤差補償、干擾等問題,故傳統方案不可取。進而非常容易考慮到使用溫度傳感器,在單片機電路設計中,單片機除了可以測量電信號外,還可以用于溫度、濕度等非電信號的測量,能獨立工作的單片機溫度檢測、溫度控制系統已經廣泛的應用于很多領域。單片機的接口信號是數字信號,要用單片機作為控制器測量溫度這類非電信號,就要使用溫度傳感器將溫度信息轉換為電流或者電壓信號輸出,如果轉化的信號是模擬信號,還需要進行A/D轉化,以滿足單片機接口的需要。進一步聯想到可以采用一只溫度傳感器DS18B20,此傳感器,可以很容易直接讀取被測溫度值,進行轉換,成功地進行溫度采集以后,就可以利用單片機進行數據處理,然后通過LCD將溫度顯示出來,就可以滿足設計要求。硬件部分設計主要包括:測溫電路、傳感器電路及測溫電路與單片機的接口、報警電路與單片機的接口等組成的。
本設計中,溫度傳感器采用DS18B20,控制器采用AT89S51,顯示電路采用LCD1602液晶顯示器實現,總體方框圖如下:
圖3.1 總體方框圖
在研究出總體設計方案后,在這一階段主要的主要工作是查閱各芯片資料,熟悉其功能特性和技術參數,同時學習PROTEL DXP軟件,用其繪制出硬件原理圖,然后繼續分析各結構,查閱國內外相關技術資料,查缺補漏,反復修改設
4
計方案,力求完美;通過原理圖繪制PCB圖;制作PCB板,購買所需元件,完成硬件方面的設計。
2.2系統器件的選擇
2.2.1 單片機的選擇
AT89S系列的單片機是能用下載線進行在線編程的 ISP,使用簡單的HC244電路,就可以通過電腦上面的程序來進行對單片機的編程,是無須拆下來放到笨重的編程器上面寫片子的。AT89C系列則沒有這個功能并且C系列無法調試。 2.2.2溫度傳感器的選擇
本設計主要應用在機房、糧倉等地,測量溫度在-20到+75攝氏度之間,ds18b20溫度測量范圍從-55到+125攝氏度,精度為?0.5 ? C,適合設計要求,所以傳感器選擇ds18b20溫度傳感器。
2.2.3顯示模塊的選擇
1601顯示一行的16個字符,1602顯示兩行的16個字符,1602海可以顯示漢字,滿足設計要求,所以選擇LCD1602顯示模塊。
2.3傳感器模塊DS18B20
溫度傳感器是該系統的關鍵器件,本設計采用的DS18B20溫度傳感器是美國DALLAS半導體公司最新推出的一款改進型智能溫度傳感器,它集溫度測量、A/D轉換為一體,其溫度測量范圍從-55OC到+125OC,精度為?0.5? C,可在1秒鐘內把溫度變換成數字。DS18B20是世界上第一片支持“一線總線”接口的溫度傳感器,也就是說,它具有獨特的單總線接口,僅需要占用一個I/O端口即可以完成與微處理器間的通信,占用微處理器的端口較少,可節省大量的引線和邏輯電路,為讀寫以及溫度轉換帶來方便,同時,它可以從數據線本身獲得能量,不需要外接電源;它支持3V,5.5V 的電壓范圍, 使系統設計更靈活、方便;其工作電源既可在遠端引入, 也可采用寄生電源方式產生;此外,與傳統的熱敏電阻等測溫元件相比,DS18B20能直接讀出被測量的溫度,并且可以根據實際要求通過簡單的編程實現9,12位的數字值讀數方式,它可在1 秒鐘內把溫度變換成數字;由DS18B20 組建的溫度測量單元體積小, 便于攜帶和安裝。同時,DS18B20 可以直接與單片機連接,無需后接A/D 轉換, 控制簡單;還有,它具有負壓特性,電源極性接反時,僅僅是不能正常工作,但溫度計不會因發熱而
5
燒毀。Ds18b20內部結構主要由四部分組成:64位光刻ROM、溫度傳感器、非揮發的溫度報警觸發器TH和TL、配置寄存器。整體來說DS18B20的性能是新一代產品中最好的,性能價格比也非常出色,所以我們選擇它來作為設計部件。 2.3.1 注意事項:
Ds18b20雖然具有測溫系統簡單、測溫精度高、連接方便、占用口線少等優點,但在實際應用中葉應注意以下幾個方面的問題:
1在對ds18b20進行讀寫編程時,必須嚴格的保證讀寫時序,否則將無法讀取測溫結果。
2當單總線上所掛ds18b20超過8個小時,就需要解決微處理器的總線驅動問題。
3在用ds18b20進行長距離測溫系統設計是要充分考慮總線分布電容和阻抗匹配問題。
Ds18b20從測溫結束到將溫度值轉換成數字量需要一定的轉換時間。
圖2.2 DS18B20的外觀圖 圖2.3 DS18B20內部結構框圖
圖2.4 DS18B20引腳分布圖
DS18B20的主要技術指標如下:測量范圍:-55OC—+125OC;測量精度:0.5OC;
6
反應時間<=500ms。
2.3.2 引腳功能
2、DQ:數據輸入/輸出引腳。開漏單總線接口引腳。當被用在寄生電源下,此引腳可以向器件提供電源;漏極開路, 常態下為高電平. 通常要求外接一個約5kΩ的上拉電阻。
3、VDD:外接供電電源輸入端引腳。電壓范圍:3~5.5V;當工作于寄生電源時,此引腳必須接地
在本系統中用外接電源,DQ接到AT89S51的P2(0端,R1為信號和5V電源之間的上拉電阻。在實際中,若需要多點檢測是,可在單總線上掛多個DS18B20,但超過8個是要考慮驅動問題,軟件設計也變得復雜多了同事要考慮DS18B20單總線的長度問題,一般不超過50M,為實現更遠程的控制,可以考慮把系統設計成無線系統,以突破DA18B20單總線的長度限制。
表2.1 主要溫度與轉換后輸出的數字對應值表
溫度 /OC 二進制表示 十六進制表示
+125 0000 0111 1101 0000 07D0H
+85 0000 0101 0101 0000 0550H
+25.0625 0000 0001 1001 0000 0191H
+10.125 0000 0000 1010 0001 00A2H
+0.5 0000 0000 0000 1000 0008H
0 0000 0000 0000 0000 0000H
-0.5 1111 1111 1111 1000 FFF8H
-10.125 1111 1111 0101 1110 FFE5H
-25.0625 1111 1110 0110 1111 FE6FH
-55 1111 1100 1001 0000 FC90H
7
(a)寄生電源工作方式 (b)外接電源工作方式 2.3.3 ds18b20 ROM指令表
指 令 約定代碼 功 能
讀ROM 33H 讀DS1820溫度傳感器ROM中的編碼(即64位地址)
發出此命令之后,接著發出 64 位 ROM 編碼,訪
55H 問單總線上與該編碼相對應的 DS1820 使之作出響符合 ROM
應,為下一步對該 DS1820 的讀寫作準備。
用于確定掛接在同一總線上 DS1820 的個數和識
0FOH
搜索 ROM 別 64 位 ROM 地址。為操作各器件作好準備。
0CCH 忽略 64 位 ROM 地址,直接向 DS1820 發溫度變換命跳過 ROM
令。適用于單片工作。
0ECH 執行后只有溫度超過設定值上限或下限的片子才做出告警搜索命令
響應。
RAM指令表
約定代
指 令 功 能
碼
啟動DS1820進行溫度轉換,12位轉換
溫度變
44H 時最長為750ms(9位為93.75ms)。結果存
換
入內部9字節RAM中。
讀內部RAM中9字節的內容
8
讀暫存器 0BEH
發出向內部RAM的3、4字節寫上、下
限溫度數據命令,緊跟該命令之后,是傳
寫暫存器 4EH
送兩字節的數據。
將RAM中第3 、4字節的內容復制到EEPROM
復制暫存器 48H
中。
將EEPROM中內容恢復到RAM中的第3 、4字
重調 EEPROM 0B8H
節。
讀供電讀DS1820的供電模式。寄生供電時DS1820
0B4H
方式 發送“ 0 ”,外接電源供電 DS1820發送
“ 1 ”。
2.4主控制器模塊AT89S51
AT89S51是整個系統的核心處理器,單片機首先把通過傳感器測到的現場溫度與預先設置的溫度進行比較,如果大于或小于預先設置值,就輸出信號去控制加熱器的工作,從而實現溫度控制。At89s51還負責液晶顯示、報警以及與上位機進行通信等工作。
AT89S51是一種帶4K字節閃爍可編程可擦除只讀存儲器的低電壓、高性能位微處理器, 俗稱單片機。
9
圖3.6 AT89S51單片機
2.4.1 基本概述
管腳說明:
芯片共有40個引腳,引腳的排列順序為從靠芯片的缺口左邊那列引腳逆時針數起,依次為1、2、3、4......40,其中芯片的1腳頂上有個凹點。在單片機的40個引腳中,電源引腳線2根,外接晶體振蕩器引腳2根,控制引腳4根以及4組8位可編程I/O引腳3根。
1、電源引腳線(2根)
VCC(Pin40):電源輸入,接,5V電源
GND(Pin20):接地線
2、外接晶振引腳(2根)
XTAL1(Pin19):反向振蕩放大器的輸入及內部時鐘工作電路的輸入。 XTAL2(Pin20):片內振蕩電路的輸出端。
3、控制引腳(4根)
RST/VPP(Pin9):復位引腳,引腳上出現2個機器周期的高電平將使單片機復位。ALE/PROG(Pin30):地址鎖存允許信號,當訪問外部存儲器時,地址鎖存允許的
10
輸出電平用于鎖存地址的地位字節。在編程期間, 此引腳用于輸入編程脈沖。在平時, ALE端以不變的頻率周期輸出正脈沖信號, 此頻率為振蕩器頻率的1/6,因此它可用作對外部輸出的脈沖或用于定時目的。PSEN(Pin29):外部存儲器讀選通信號,外部程序存儲器的選通信號。在由外部程序存儲器取址期間, 每個機器周期兩次PSEN有效。但在訪問外部數據存儲器時,這兩次有效的/PSEN信號將不出現。EA/VPP(Pin31):程序存儲器的內外部選通,接低電平從外部程序存儲器讀指令,如果接高電平則從內部程序存儲器讀指令。在/EA保持低電平時, 則在此期間外部程序存儲器(0000H—FFFFH), 不管是否有內部程序存儲器。
4、可編程輸入/輸出引腳(32根)
AT89S51單片機有4組8位的可編程I/O口,分別位P0、P1、P2、P3口,每個口有8位(8根引腳),共32根。每一根引腳都可以編程,
PO口(Pin39,Pin32):名稱為P0.0,P0.7,8位雙向I/O口線, P0口為一個8位漏級開路雙向I/O口, 每腳可吸收8TTL門電流。當P1口的管腳第一次寫1時,被定義為高阻輸入,P0能夠用于外部程序數據存儲器,它可以被定義為數據/地址的低八位。
P1口(Pin1,Pin8):名稱為P1.0,P1.7 ,8位準雙向I/O口線, P1口是一個內部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流,P1口管腳寫入1后,被內部上拉為高, 可用作輸入, P1口被外部下拉為低電平時, 將輸出電流, 這是由于內部上拉的緣故。
P2口(Pin21,Pin28):名稱為P2.0,P2.7,8位準雙向I/O口線, P2口為一個內部上拉電阻的8位雙向I/O口,P2口緩沖器可接收輸出個4個TTL門電流。當P2口被寫1時, 其管腳被內部上拉電阻拉高, 且作為輸入。并因此作為輸入時, P2口的管腳被外部拉低, 將輸出電流, 這是由于內部上拉的緣故。P2口當用于外部程序存儲器或位地址外部數據存儲器進行存取時,P2口輸出地址的高八位。在給出地址1時,它利用內部上拉優勢, 當對外部八位地址數據存儲器進行讀寫時,P2口輸出其特殊功能寄存器的內容。
P3口(Pin10,Pin17):名稱為P3.0,P3.7,8位準雙向I/O口線, P3口管腳是8個帶內部上拉電阻的雙向I/O口, 可接收輸出4個TTL門電流。當口寫入1后,它們被內部上拉為高電平, 并用作輸入,作為輸入, 由于外部下拉為低電平, P3
11
口將輸出電流(ILL),這是由于上拉的緣故。
圖3.7 AT89S51方框圖
2.4.2 功能特性概述
AT89S51提供以下標準功能:4K字節Flash閃速存儲器,128字節內部RAM,32個I/O口線,看門狗(WDT),兩個數據指針,兩個16位定時/計數器,一個5向量兩級中斷結構,一個全雙工串行通信口,片內振蕩器及時鐘電路,同時,AT89S51可降至0HZ的靜態邏輯操作,并支持兩種軟件可選的節電工作模式。空閑方式停止CPU的工作,但允許RAM,定時/計數器,串行通信口及中斷系統繼續工作,掉電方式保存RAM中的內容,但振蕩器停止工作并禁止其它所有部件工作直到下一個硬件復位。
AT89S51的特點:
1、系統可編程特性: 創造了單片機學習開發系統的先例,可方便地在系統中實現程序下載,彌補了實時修改程序的不足之處,并可以立即從目標系統中反映出修改的結果,大大縮短單片機學習開發的周期,提高了工作效率。
2、代碼全速仿真: 彌補傳統學習系統不能全速仿真的缺陷,使系統運行
12
的結果完全反映代碼的執行情況,更切實地吻合人們工作、學習所需要的特點。其次,在軟件開發前的仿真調試后,完全可燒寫入目標芯片,并能獲得完全一致的代碼執行結果。是集學習、開發于一身的優良的目標系統。
3、資源的可重復利用性: 目標系統上的所有資源都能重復利用并能通過軟件調配或通過擴展槽增加其它的功能,進而提高系統的實用性。
4、軟硬結合,操作簡單方便:
在AT89S51提供硬件支持的同時,也提供良好的上位機控制軟件,只要通過軟件的功能操作就能實現:源代碼的調試編譯,查找與修改錯誤之處,在線代碼下載等功能。使單機的學習與開發一體化,集成化,更進一步體現系統學習的優越性。
晶體振蕩特性: AT89S51中有一個用于構成內部振蕩器的高增益反向放大器,引腳XTAL1和XTAL2分別是該放大器的輸入端和輸出端。這個放大器與作為反饋元件的片外石英晶體或陶瓷諧振器一起構成自激振蕩器。
外接石英晶體(或陶瓷振蕩器)及電容C1、C2接在放大器的反饋回路中構成并聯振蕩電路,對外接電容C1、C2雖然沒有十分嚴格的要求,但電容容量的大小會輕微影響振蕩頻率的高低、振蕩器工作的穩定性、起振的難易程序及溫度穩定性。如果使用石英晶體,則推薦電容使用30Pf+10pF,而如使用陶瓷諧振器建議選擇40Pf+10Pf。也可以采用外部時鐘,這種情況下,外部時鐘脈沖接到XTAL1端,即內部時鐘發生器的輸入端,XTAL2則懸空。
由于外部時鐘信號是通過一個2分頻觸發器后作為內部時鐘信號的,所以對外部時鐘信號的占空比沒有特殊要求,但最小高電平持續時間和最大低電平持續時間應符合技術條件要求。
圖3.8 晶體接線圖和外接時鐘線圖
13
AT89S51的極限參數:
工作溫度:-55OC to+125 OC 儲存溫度:-65 OC to +150 OC
任一引腳對地電壓:1.0V to7.0V 最大工作電壓:6.6V
DC輸出電流:15.0mA
2.5 顯示模塊LCD1602
2.5.1引腳功能和基本特征
圖3.9 LCD1602引腳分布圖
1602采用標準的16腳接口,引腳功能如下:
第1腳:VSS為地電源。
第2腳:VDD接5V正電源。
第3腳:V0為液晶顯示器對比度調整端,接正電源時對比度最弱,接地電源時對比度最高,故通常將此腳接地。
第4腳:RS為寄存器選擇,高電平時選擇數據寄存器、低電平時選擇指令寄存器。 第5腳:RW為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。當RS和RW共同為低電平時可以寫入指令或者顯示地址,當RS為低電平RW為高電平時可以讀忙信號,當RS為高電平RW為低電平時可以寫入數據。
第6腳:E端為使能端,當E端由高電平跳變成低電平時,液晶模塊執行命令。
第7,14腳:D0,D7為8位雙向數據線。
第15,16腳:空腳。
LCD1602的基本特征:
單5V電源電壓、低功耗、長壽命、高可靠性。
內置192種字符(160個5×7點陣字符和32個5×10點陣字符)。
具有64個字節的自定義字符RAM,可自定義8個5×8點陣字符或四個5×11點
14
陣字符。
顯示方式:STN、半透、正顯。
驅動方式:1/16DUTY,1/5BIAS。
視角方向:6點。
背光方式:底部LED。
通訊方式:4位或8位并口可選。
標準的借口特性,適配MC51和M6800系列MPU的操作時序。 2.5.2 模塊內部結構
圖3.10 LCD1602結構塊圖
模塊組件內部結構
模塊組件內部主要由LCD顯示屏(LCD panel)、控制器(controller)、列驅動器(segment driver)和偏壓產生電路構成。
LCD顯示屏為common和segment交叉形成的點陣,以5×8點陣的字符結構模式和設置的顯示字符樹木,選擇適宜的行數,分單屏、雙屏或者多屏顯示規定的字符。對于雙屏或者多屏顯示結構的LCD,每一顯示屏結構部分,均由各自獨立的使能信號E控制。
列驅動器與控制器配套使用,它接收來自控制器的振蕩、幀同步輸出、串行輸出的數據和移位以及鎖存脈沖,產生列segment交流掃描驅動信號。
控制器接收來自MPU的指令和數據,控制著整個模塊的工作,由CGROM、CGRAM和DDRAM等字符存儲區域、以及與MPU和列驅動器的I/O接口、指令寄存和譯碼機
15
構、地址計數器等部分組成。在控制器的控制下,模塊通過數據總線DB0—DB7和E、R/W、RS三個輸入控制端與MPU接口。這三根控制線按照規定的時序相互協調作用,使控制器通過數據總線DB接收MPU發送來的指令和數據,從CGROM中找到欲顯示字符的字符碼,送入DDRAM,在LCD顯示屏上與DDRAM存儲單元對應的規定位置顯示出該字符。控制器還可以根據MPU的指令,實現字符的顯示、閃爍和移位等顯示結果。
2.6鍵盤控制
鍵盤分為八個獨立按鍵,一端與單片機的p2口及50k上拉電阻相連,另一端接地,當任一按鍵按下時,p2口讀取低電平有效。系統上點后,進入鍵盤掃描子程序,以查詢的方式確定各按鍵,完成溫度初值的設定,系統進入主程序后按鍵功能無效。
2.7驅動電路
驅動電路采用繼電器驅動方式。通過控制繼電器在控制周期內通斷的時間,實現對加熱的開關控制。由單片機I/O口輸出的控制信號,經NPN晶體管放大,驅動繼電器工作。
2.8報警電路
本設計采用蜂鳴器報警電路,它由晶體管和蜂鳴器組成。由單片機I/O口輸出信號控制晶體管的導通或截止,晶體管導通,則蜂鳴器報警。通過單片機來控制蜂鳴器產生報警聲音。
2.9溫度控制的實現
系統工作時先由使用者設定預期達到的兩位溫度值,溫度值輸入后,打開電源,單片機自動復位,進行初始化,這時LED顯示器顯示設定溫度,以便操作人員核對設定溫度,然后溫度檢測電路將測點的溫度輸入單片機,經軟件濾波后作為實測溫度,此后顯示器將一直顯示實測溫度。若實測溫度高于設定溫度時,則通過驅動電路關上加熱器并報警;若實測溫度低于設定溫度是,則通過驅動電路打開加熱并報警;若在設定溫度范圍內,則加熱器狀態不變。2.10各接口電路
2.10.1 主控制模塊與溫度傳感模塊的連接
16
圖2.11 主控制器AT89S51與溫度傳感器DS18B20接口圖
溫度檢測系統原理如上圖所示,采用寄生電源供電方式。為保證在有效的DS18B20時鐘周期內,提供足夠的電流,我們用一個MOSFET管和89S51的一個I/O口(P1.0)來完成對DS1820總線的上拉。當DS1820處于寫存儲器操作和溫度A/D變換操作時,總線上必須有強的上拉,上拉開啟時間最大為10μs。采用寄生電源供電方式時VDD必須接地。這一部分的主要功能是電路接通以后,DS18B20進行溫度采集工作,然后將收集到的數據送入AT89S51進行處理,使得主控制器可以將數據處理好后送入下一部分電路進行工作。
17
2.10.2 主控制模塊與顯示模塊的連接
圖2.12 主控制器AT89S51與顯示模塊LCD連接圖
AT89S51與顯示模塊LCD1602連接形成顯示電路,接通電源后,DS18B20將采集到溫度傳送給主控制器AT89S51,主控制器進行計算、轉換等工作之后把數據傳給LCD1602模塊,則LCD1602顯示屏上會顯示出當前的溫度。此時我們按下各功能鍵可以根據自己的需要進行TH和TL的值設置,在LCD1602顯示屏幕上會出現設置的值,另外進行測試時相關溫度值也會直接出現在LCD1602屏幕上,一目了然。
18
2.10.3 系統整體硬件連接
+5
DS1U2R3140P1.0/TVccU32501KP1.1/TLED116339BG GNDP1.2P0.015438BGVCCP1.3P0.114537DB7P1.4P0.213636DB6P1.5P0.312735DB5P1.6P0.411834DB4P1.7P0.51033DB3P0.69932DB2RST/VPDP0.78DB171031DB0P3.0/RXDEA/VPP+5S611SW-DIP4LCD1602EP3.1/TXD5123018RWP3.2/INT0ALE/PROG4132927RSP3.3/INT1PSEN31436VOP3.4/T02152845VCC+5P3.5/T1P2.7R?11627GNDP3.6/WRP2.61726RESP3.7/RDP2.5LCD160225U1P2.418241XTAL2P2.3GNDC119232XTAL1P2.2I/O30PF223P2.1VDDR?2021DS24.7KGndP2.0DS18B20RESR2AT89S51Y2LED22+5
XTAL1
C2R4C1501K22PF30PFLS1VCC
Speaker
圖3.13 溫度測量報警系統原理圖 將分開的各功能模塊部分的設計工作完成以后,最后整體連接到一起,就得到這個設計的完整電路,在PROTELDXP中繪制好原理圖以后,下一步將其轉換為PCB圖,布線、修改、檢查,就完成該設計硬件部分的工作。
19
3 系統軟件設計
3.1 主程序設計
主程序的主要功能是負責溫度的實時顯示,讀出并處理DS18B20測量的當前溫度值,送入主控制器進行數據處理并轉換為數字信號后進行顯示,其流程圖如下所示。
圖2.1 主程序流程圖
系統軟件采用C 語言編寫。在中斷服務程序中,實現用戶輸入以及上位機的接口功能;在主程序中,實現溫度傳感器網絡的自動搜索、獲取溫度信息,并根據預先設定的溫度上下限,實現相應的報警功能。該系統中,根據不同的分辨率要求,可通過編程設定,該流程可滿足高精度設計要求。
20
3.2 子程序設計
3.2.1 測溫子程序流程
圖2.2 測溫子系統流程圖
在測溫時首先設置DS18B20的DQ為高電平,然后初始化DS18B20,在成功后DS18B20接收單片機的命令,為了簡單起見這里跳過ROM命令設置匹配過程,然后再次初始化DS18B20,在成功后啟動測溫,然后將溫度保存起來,返回。3.2.2 讀溫度流程
圖2.3 讀溫度流程圖
讀溫度子程序的主要功能是讀出RAM中的9字節,在讀出時需進行CRC校驗,校驗有錯時不進行溫度數據的改寫,如上圖。
21
3.2.3 顯示模塊子程序
在測得溫度后,將溫度數據轉換為十進制數的溫度表示,然后再通過查表調用液晶1602顯示在液晶上,這里面數據處理類似于由二進制轉換為十進制,再由十進制轉換為ASCII碼。
首先要對LCD進行初始化設置,寫入報警溫度的上、下限值,若傳感器正常工作,則LCD上會顯示“OK”以及當前溫度,同時進行溫度比較,若當時溫度在設定的上下限范圍內,則系統無反應,若溫度超過上、下限溫度,則蜂鳴器報警。
22
4 總體電路的實現與操作
4.1 設計結果的實現
在完成前期資料收集、方案構造、可行性研究以及軟硬件設計工作后,就可以進入器件調試階段。
4.1.1 電路板情況介紹
前期制作工作全部完成之后,呈現在我們面前的是制作成果:溫度報警器電路板,板子上方是一塊LCD1602顯示屏,往下是一個蜂鳴器,一個DS18B20,一塊AT89S51芯片,紅、黃兩個發光二極管,下方是編上號的1—4號開關按鈕,兩根電源線:紅色線接+5V電源,藍色線接地,另外還分布著電阻和電容。4.1.2 溫度報警器功能的操作步驟
將電路板接上電源,紅色線接+5V電源,藍色線接地,電路導通后紅色指示燈亮,LCD1602顯示工作狀態“OK”以及當前測量環境溫度。按下2號鍵,表示開始進行設定溫度,同時,2號鍵也為默認的上限溫度調節按鈕,1號鍵表示溫度調節加減轉換鍵,3號鍵調節下限溫度,了解了各鍵的功能后,便可以開始設置上下限溫度,比如說按一下3鍵后下限溫度下降一度,按下2鍵后上限溫度也下降一度;然后按一下1鍵后轉換加減功能,即每次減一度變為加一度。此時再按下3鍵,下限溫度上升一度,按下2鍵上限溫度上升一度。根據按此方法即可設定符合測量需求的上下限溫度上下限溫度設定好以后,按下4鍵表確認,DS18B20完成溫度轉換后,就把當前測得的溫度值與TH,TL作比較,若T>TH或T<TL,表明此時環境溫度不在設定范圍內,則將該器件內的告警標志置位,并對主機發出的告警搜索命令作出響應。即蜂鳴器報警,黃色二極管發亮。若當前溫度在設定的上下限范圍內,則報警系統繼續工作,無異常反應。
23
結 論
本設計所介紹的溫度計報警器與傳統的溫度計相比,可以設置上下報警溫度,當溫度不在設置范圍內時,可以進行報警 ,該系統主要用于對測溫比較準確的場所,或科研實驗室使用。它具有結構簡單,不需外接元件,可由用戶設置溫度報警界限等特點,可廣泛用于食品庫、冷庫、糧庫等需要控制溫度的地方。DS18B20集溫度測量、A/D 轉換于一體, 具有體積小、動態范圍寬、測量精度高、單總線結構、直接與CPU接口等特點。經試驗, 基于AT89S51單片機和DS18B20 的溫度測量儀,設計簡單, 控制方便, 測量準確, 測溫范圍寬,另外,利用單總線具有很強的擴展性, 還可以組建多點的溫度檢測網絡。因此, 基于AT89S51單片機和DS18B20的溫度測量儀,具有廣泛的應用前景。目前,該類產品已在溫度控制系統中得到了廣泛的應用。故該設計意義較為深遠。同時,該方案具有安裝方便、數字化程度高、精度高、適應性強等特點,在多種溫度檢測系統中都具有重大意義。
本設計實現了利用單片機以及DS18B20進行溫度報警器的制作,通過這次設計,使我接觸到了很多之前沒有學習過的理論知識,畢業設計是對大學四年學習生活的總結以及學習能力的一次綜合檢驗。通過這次設計,使我在電路知識方面有很大提高,學習并掌握了單片機應用的基本知識以及溫度傳感器DS18B20等芯片的使用方法;通過動手實踐操作,將理論知識應用于實際,使自己的知識更加生動豐富,經過一段時間的學習和制作,最終完成了利用單片及DS18B20實現溫度報警器制作的設計。
另外,通過本次設計,我了解到了溫度報警器電路設計在現代生活、生產領域的重要意義及應用情況。現代社會已經步入了一個數字時代,很多使人們生活更便捷的服務都是建立在電子技術的基礎上的,而單片機技術則可以看作是“基礎中的基礎”,可見,它已經深入了我們的生活和工作中,并發揮著巨大的作用。另外,通過這次設計還使我更加深刻地認識到網絡是一個巨大的資源寶庫,要學會科學合理利用這個大寶藏為我們的生活帶來更多的便捷。
24
致 謝
能夠完成本篇論文,在此,首先我要衷心地感謝我的畢業設計指導老師—李志偉老師, 在整個設計過程中, 李老師給了我很大的幫助,從資料收集到具體制作以及論文撰寫,每當遇到困難和問題,李老師總是耐心指導,為我指點迷津,幫助我開拓研究思路,精心點撥、熱忱鼓勵。在論文撰寫過程中,李老師還給了我很多修改意見,李老師一絲不茍的作風,嚴謹求實的態度,踏踏實實的精神,他教會了我們很多課堂上學不到的東西,將使我終生受益。在此謹向李老師致以誠摯的謝意和崇高的敬意。
另外,我還要感謝在實驗室一起做畢業設計的同學們,大家在一起相處得很愉快, 他們在設計中為我提供了許多好的意見和建議,有他們的幫助,我得以解決了很多設計以及調試方面的困難;我還要感謝寢室同學,他們給了我巨大的勇氣和戰勝困難的信心,很多同學還給我提供了不少的參考資料,在此我表示真誠的感謝~
25
參考文獻(References)
[1]嚴蕓.淺談溫度傳感器的現狀與發展[J].大眾科技,2006,(5):38-39. [2]譚浩強.C程序設計[M].清華大學出版社,1999.
[3]楊小川.Protel DXP設計指導教程[M].清華大學出版社,2003. [4]貴國慶.LCD1602液晶顯示秒表[J].電子制作,2006.(4):59-61.[ [5]朱蕤、張常年.基于AT89C51單片機的溫度傳感器控制電路[D].北方工業大學,2006. [6]黃繼昌. 傳感器工作原理及應用實例[M].人民郵電出版社.1998.[7]周航慈. 單片機程序設計基礎[M].北京航空航天大學出版社.2003. [8]謝宜仁. 單片機實用技術問答[M].人民郵電出版社.2003.
[9]朱善君. 單片機接口技術與應用[M].清華大學出版社.2005.
[10]郭亨禮. 傳感器實用電路[M].上海科學技術出版社.1992. [11]謝宜仁. 單片機實用技術問答[M].人民郵電出版社.2003.
[12]肖來勝.單片機技術實用教程[M].華中科技大學出版社.2004. [13]Transistor specificationsmanual.Howard W. Sams & Co., Inc[M].1972.
26
附 錄(C語言程序設計)
DS18B20溫度報警器顯示演示程序(LCD1602顯示)
開機時對DS18B20進行檢測,如果DS18B20檢測不正常,LCD1602顯示:
DS18B20 ERROR
PLEASE CHECK
蜂鳴器報警。
DS18B20檢測正常,LCD1602顯示(當前所測溫度):
DS18B20 OK
:C TEMP: **.*
- #include < reg51.h >
- #include < intrins.h >
- #define uchar unsigned char
- #define uint unsigned int
- sbit DQ = P2^2 ; //定義DS18B20端口DQ
- sbit BEEP=P3^4 ; //蜂鳴器驅動線
- bit presence ; //器件存在標志位
- uchar flag ; //溫度正負標志位
- sbit LCD_RS = P3^5 ;
- sbit LCD_RW = P3^6 ;
- sbit LCD_EN = P3^7 ;
- uchar code cdis1[ ] = {" DS18B20 OK "} ;
- uchar code cdis2[ ] = {" TEMP: . C "} ;
- uchar code cdis3[ ] = {" DS18B20 ERR0R "} ;
- uchar code cdis4[ ] = {" PLEASE CHECK "} ;
- uchar data temp_data[2] = {0x00,0x00} ; //讀出的溫度暫放
- uchar data display[5] = {0x00,0x00,0x00,0x00,0x00} ; //顯示溫度數據 uchar codeditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,
- 0x06,0x07,0x08,0x08,0x09,0x09} ; //溫度小數部分轉換表 void beep() ;
- uchar code mytab[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ;
- //自定義字符?(C左上方的圓圈)
- /*LCD延時ms程序*/
- void delay1(int ms)
- {
- unsigned char y ;
- while(ms--)
- {
- 27
- for(y = 250 ; y<250 ; y--)
- {
- _nop_() ;
- _nop_() ;
- _nop_() ;
- _nop_() ;
- }
- }
- }
- /*檢查LCD忙狀態*/
- /*lcd_busy為1時,忙,等待。lcd_busy為0時,閑,可寫指令與數據。*/
- bit lcd_busy()
- {
- bit result ;
- LCD_RS = 0 ;
- LCD_RW = 1 ;
- LCD_EN = 1 ;
- _nop_() ;_nop_() ;_nop_() ;_nop_() ;
- result = (bit)(P0&0x80) ;
- LCD_EN = 0 ;
- return(result) ;
- }
- /*寫指令數據到LCD*/
- /*RS=0,RW=0,E=高脈沖,D0-D7=指令碼。*/ void lcd_wcmd(uchar cmd) {
- while(lcd_busy()) ; //檢測LCD是否忙碌
- LCD_RS = 0 ;
- LCD_RW = 0 ;
- LCD_EN = 0 ;
- _nop_() ;
- _nop_() ;
- P0 = cmd ;
- _nop_() ;_nop_() ;_nop_() ;_nop_() ;
- LCD_EN = 1 ;
- _nop_() ;_nop_() ;_nop_() ;_nop_() ;
- LCD_EN = 0 ;
- }
- /*寫顯示數據到LCD*/
- /*RS=1,RW=0,E=高脈沖,D0-D7=數據。*/ void lcd_wdat(uchar dat) {
- while(lcd_busy()) ; //檢測LCD是否忙碌
- LCD_RS = 1 ;
- LCD_RW = 0 ;
- LCD_EN = 0 ;
- P0 = dat ;
- _nop_() ;_nop_() ;_nop_() ;_nop_() ;
- LCD_EN = 1 ;
- 28
- _nop_() ;_nop_() ;_nop_() ;_nop_() ;
- LCD_EN = 0 ;
- }
- /*LCD初始化設定*/
- void lcd_init()
- {
- delay1(15) ;
- lcd_wcmd(0x01) ; //清除LCD的顯示內容
- delay1(5) ;
- lcd_wcmd(0x38) ; //功能設置:8位數據,16*2雙行顯示,5*7點陣
- delay1(5) ;
- lcd_wcmd(0x0c) ; //整體顯示(D=1),關光標(C=0),字符不閃爍(B=0)
- delay1(5) ;
- lcd_wcmd(0x06) ; //設定輸入方式,增量不移位
- delay1(5) ;
- lcd_wcmd(0x01) ; //清除LCD的顯示內容
- delay1(5) ;
- }
- /*設定顯示位置*/
- void lcd_pos(uchar pos)
- {
- lcd_wcmd(pos | 0x80) ; //按位或,即:數據指針=80+地址變量(DDRAM的固有格式) }
- /*自定義字符寫入CGRAM(字符發生器)*/
- void writetab()
- {
- unsigned char i ;
- lcd_wcmd(0x40) ; //寫CGRAM,00H
- for (i = 0 ; i< 8 ; i++)
- lcd_wdat(mytab[ i ]) ; //寫入數據自定義字符?(C左上方的圓圈)
- }
- /*15us級延時函數*/
- void Delay15us(uchar num)
- {
- do
- { _nop_() ;_nop_() ;_nop_() ;
- _nop_() ;_nop_() ;_nop_() ;
- _nop_() ;_nop_() ;_nop_() ;
- _nop_() ;_nop_() ;_nop_() ;
- _nop_() ;
- }while( --num ) ;
- }
- /*初始化DS18B20,復位脈沖+存在脈沖*/
- Init_DS18B20(void)
- {
- DQ = 1 ; //DQ復位
- Delay15us(3) ; //稍做延時
- DQ = 0 ; //單片機將DQ拉低,發出復位脈沖(要求480us~960us)
- 29
- Delay15us(40) ; //精確延時600us
- DQ = 1 ; //拉高總線,產生復位脈沖,釋放總線(要求16~60us)
- Delay15us(3) ;
- presence = DQ ; //讀存在脈沖。如果=0 器件存在,初始化成功;
- //=1 器件不存在,初始化失敗
- Delay15us(6) ;
- DQ = 1 ;
- return(presence) ; //返回信號,0= presence,1= no presence
- }
- /*讀一個8位的字節,從DS18B20中讀取數據*/
- ReadOneChar(void)
- {
- unsigned char i = 0 ;
- unsigned char dat = 0 ;
- for (i = 8 ; i > 0 ; i--)
- {
- DQ = 0 ; //清零
- _nop_() ; //延時1us以上
- _nop_() ;
- dat >>= 1 ; //右移位
- DQ = 1 ; //釋放總線,等待DS18B20輸出數據
- _nop_() ; //data sheet要求大于1us小于15us時間段內控制器采樣
- _nop_() ;
- if(DQ) //控制器采樣
- dat |= 0x80 ; //若采樣位為1,則將dat相應的位置1,否則將由第一句的移位置0
- Delay15us(6) ; //延時90us,data sheet要求所有的讀時間間隙最少為60us
- }
- return (dat) ; //將讀出的數據返回給調用函數
- }
- /*寫一個8位的字節,寫入數據(命令)*/
- WriteOneChar(unsigned char dat) {
- unsigned char i = 0 ;
- for (i = 8 ; i > 0 ; i--)
- {
- DQ = 0 ; //清零,寫位操作均從零開始,無論寫1還是寫0
- _nop_() ; //延時1us以上
- _nop_() ;
- DQ = dat&0x01 ; //取傳遞過來的函數的最低位,并發送出去
- Delay15us(6) ; //延時90us,data sheet要求大于60小于120us,
- DQ = 1 ; //釋放總線
- dat>>=1 ; //數據向低端移位1位
- }
- }
- /*讀取溫度*/
- Read_Temperature(void)
- {
- Init_DS18B20() ; //初始化
- WriteOneChar(0xCC) ; //跳過讀序號列號的操作
- 30
- WriteOneChar(0x44) ; //啟動溫度轉換
- Init_DS18B20() ;
- WriteOneChar(0xCC) ; //跳過讀序號列號的操作
- WriteOneChar(0xBE) ; //讀取溫度寄存器(共可讀取9個寄存器,前兩個就是溫
- 度)
- temp_data[0] = ReadOneChar() ; //溫度低8位
- temp_data[1] = ReadOneChar() ; //溫度高8位 }
- /*數據轉換與溫度顯示*/
- Disp_Temperature()
- {
- flag = 0 ;
- if( temp_data[1] > 0x7f ) //判斷正、負數
- {
- temp_data[1]=0x100-temp_data[1] ; //用于負溫度求補碼,兩者相加為256(8位)
- temp_data[0]=0x100-temp_data[0] ;
- flag = 1 ;
- }
- display[4]=temp_data[0]&0x0f ; //低字節的低4位,即為溫度值的小數部分
- display[0]=ditab[display[4]]+0x30 ; //存放小數部分,查表得小數位的值
- display[3]=display[4]/100+0x30 ; //百位數轉換
- display[1]=display[4]%100 ;
- display[2]=display[1]/10+0x30 ; //十位數轉換
- display[1]=display[1]%10+0x30 ; //個位數轉換
- if(display[3]==0x30) //判斷是否高位為0
- {
- display[3]=0x20 ; //顯示空格,即不顯示
- if(display[2]==0x30) //判斷次高位是否為0
- {
- display[2]=0x20 ; //顯示空格,即不顯示
- }
- }
- if( flag==1 )
- {
- display[3]=0x2d ; //負溫度時最高位顯示“-”
- }
- lcd_pos(0x48) ;
- lcd_wdat(display[3]) ; //百位數顯示
- lcd_pos(0x49) ;
- lcd_wdat(display[2]) ; //十位數顯示
- lcd_pos(0x4a) ;
- lcd_wdat(display[1]) ; //個位數顯示
- lcd_pos(0x4c) ;
- lcd_wdat(display[0]) ; //小數位數顯示 }
- /*蜂鳴器響一聲*/
- void beep()
- {
- unsigned char y ;
- for (y=0 ; y<100 ; y++)
- 31
- {
- delay1(2) ;
- BEEP=!BEEP ; //BEEP取反,低電平發聲
- }
- BEEP=1 ; //關閉蜂鳴器
- uchar m ;
- lcd_init() ; //初始化LCD
- lcd_pos(0) ; //設置顯示位置為第一行的第1個字符
- m = 0 ;
- while(cdis1[m] != '\0')
- {
- lcd_wdat(cdis1[m]) ; //顯示字符(DS18B20 OK)
- m++ ;
- }
- lcd_pos(0x40) ; //設置顯示位置為第二行第1個字符
- m = 0 ;
- while(cdis2[m] != '\0')
- {
- lcd_wdat(cdis2[m]) ; //顯示字符(TEMP:××.×C),即當前所測溫度
- m++ ;
- }
- writetab() ; //自定義字符寫入CGRAM
- delay1(5) ;
- lcd_pos(0x4d) ;
- lcd_wdat(0x00) ; //顯示自定義字符
- }
- /*DS18B20 ERROR 顯示菜單*/
- void Error_Menu ()
- {
- uchar m ;
- lcd_init() ; //初始化LCD
- lcd_pos(0) ; //設置顯示位置為第一行的第1個字符
- m = 0 ;
- while(cdis3[m] != '\0')
- {
- lcd_wdat(cdis3[m]) ; //顯示字符(DS18B20 ERR0R)
- m++ ;
- }
- lcd_pos(0x40) ; //設置顯示位置為第二行第1個字符
- m = 0 ;
- while(cdis4[m] != '\0')
- {
- lcd_wdat(cdis4[m]) ; //顯示字符(PLEASE CHECK)
- m++ ;
- }
- }
- /*主函數*/
- void main()
- {
- Ok_Menu () ;
- do
- {
- Read_Temperature() ;
- 32
- Disp_Temperature() ;
- }
- while(!presence) ;
- Error_Menu () ;
- do
- {
- Init_DS18B20() ;
- beep() ;
- }
- while(presence) ; }
復制代碼
|