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