找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3608|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

精密數(shù)字溫度計(jì)設(shè)計(jì)論文 送福利了

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主



完整版本的論文下載: 51單片機(jī)設(shè)計(jì)的數(shù)字溫度計(jì)(畢業(yè)論文).pdf (392.24 KB, 下載次數(shù): 9)

下面是論文預(yù)覽(無圖):

摘  要
在日常生活及工農(nóng)業(yè)生產(chǎn)中,對(duì)溫度的檢測(cè)及控制時(shí)常顯得極其重要。因此,對(duì)數(shù)顯溫度計(jì)的設(shè)計(jì)有著實(shí)際意義和廣泛的應(yīng)用。本文介紹一種利用單片機(jī)實(shí)現(xiàn)對(duì)溫度智能控制及顯示的方案。本畢業(yè)設(shè)計(jì)主要研究的是高精度的數(shù)字溫度計(jì)的設(shè)計(jì),繼而實(shí)現(xiàn)對(duì)對(duì)象的測(cè)溫。測(cè)溫系統(tǒng)主要包括供電電源、數(shù)字溫度傳感器的數(shù)據(jù)采集電路、LED顯示電路、蜂鳴器報(bào)警電路、按鍵電路、單片機(jī)主板電路,數(shù)字溫度傳感器的數(shù)據(jù)采集電路與單片機(jī)主板電路是整個(gè)系統(tǒng)的關(guān)鍵。高精度數(shù)字溫度計(jì)的測(cè)溫過程,由數(shù)字溫度傳感器采集所測(cè)對(duì)象的溫度,并將溫度傳輸?shù)絾纹瑱C(jī),最終由液晶顯示器顯示溫度值。該數(shù)顯溫度計(jì)要求測(cè)溫范圍為-55℃~+99℃,精度誤差在0.1℃以內(nèi),LED數(shù)碼管直讀顯示。數(shù)字式溫度計(jì)完全可以代替?zhèn)鹘y(tǒng)的水銀溫度計(jì),可以在家庭中以及工業(yè)中都可以應(yīng)用,實(shí)用價(jià)值很高。

關(guān)鍵詞:單片機(jī);DS18B20;LED顯示


1  引言
溫度是日常生活、工業(yè)、醫(yī)學(xué)、環(huán)境保護(hù)、化工、石油等領(lǐng)域最常遇到的一個(gè)物理量。測(cè)量溫度的基本方法是使用溫度計(jì)直接讀取溫度。最常見到的測(cè)量溫度的工具是各種各樣的溫度計(jì),例如,水銀玻璃溫度計(jì),酒精溫度計(jì)或熱電阻溫度計(jì)等。它們常常以刻度的形式表示溫度的高低,人們必須通過讀取刻度值的多少來測(cè)量溫度。利用單片機(jī)和溫度傳感器構(gòu)成的電子式智能溫度計(jì)就可以直接測(cè)量溫度,得到溫度的數(shù)字值,既簡單方便,又直觀準(zhǔn)確。
在傳統(tǒng)的溫度測(cè)量系統(tǒng)設(shè)計(jì)中,往往采用模擬技術(shù)進(jìn)行設(shè)計(jì),這樣就不可避免地遇到諸如引線誤差補(bǔ)償、多點(diǎn)測(cè)量中的切換誤差和信號(hào)調(diào)理電路的誤差等問題;而其中某一環(huán)節(jié)處理不當(dāng),就可能造成整個(gè)系統(tǒng)性能的下降。隨著現(xiàn)代科學(xué)技術(shù)的飛速發(fā)展,特別是大規(guī)模集成電路設(shè)計(jì)技術(shù)的發(fā)展,微型化、集成化、數(shù)字化正成為傳感器發(fā)展的一個(gè)重要方向。美國Dallas半導(dǎo)體公司推出的數(shù)字溫度傳感器DSl8B20,具有獨(dú)特的單總線接口,僅需要占用一個(gè)通用I/O端口即可完成與微處理器的通信;用戶可編程設(shè)定9~12位的分辨率。以上特性使得DSl8B20非常適用于構(gòu)建高精度、多點(diǎn)溫度測(cè)量系統(tǒng)。
本課題設(shè)計(jì)的高精度數(shù)字溫度計(jì)選用DS18B20數(shù)字溫度傳感器,它與單片機(jī)組成一個(gè)測(cè)溫系統(tǒng),具有線路簡單、體積小等特點(diǎn),而且一條總線可連接多個(gè)器件,可以構(gòu)成一個(gè)低電壓低功耗的多點(diǎn)數(shù)字測(cè)溫系統(tǒng),十分方便,也適合于惡劣環(huán)境下進(jìn)行現(xiàn)場(chǎng)溫度測(cè)量,有廣泛的應(yīng)用前景。



2 概述2.1系統(tǒng)概述
在日常生活及工農(nóng)業(yè)生產(chǎn)中經(jīng)常要用到溫度的檢測(cè)及控制,傳統(tǒng)的測(cè)溫元件有熱電偶和熱電阻。而熱電偶和熱電阻測(cè)出的一般都是電壓,再轉(zhuǎn)換成對(duì)應(yīng)的溫度,需要比較多的外部硬度支持,硬件電路[1]復(fù)雜,軟件調(diào)試復(fù)雜,制作成本高。
故本設(shè)計(jì)使用集成傳感器DS18B20作為測(cè)溫傳感器。系統(tǒng)主要分為溫度采集模塊,數(shù)據(jù)傳輸模塊,報(bào)警模塊,LED顯示模塊和供電模塊。系統(tǒng)設(shè)計(jì)原理圖如圖2-1所示。


圖2--1  精密數(shù)字溫度計(jì)的設(shè)計(jì)原理圖
本數(shù)字溫度計(jì)設(shè)計(jì)采用美國DALLS[2]半導(dǎo)體公司繼DS18B20之后推出的一種改進(jìn)型智能溫度傳感器DS18B20作為檢測(cè)元件,測(cè)溫范圍為-55℃~+125℃,最大分辨率可達(dá)0.0625℃。DS18B20[3]可以直接讀出被測(cè)溫度值,而且采用3線制與單片機(jī)相連,減少了外部的硬件電路,具有低成本和易使用的特點(diǎn)。
數(shù)字溫度系統(tǒng)有以下幾個(gè)發(fā)展趨勢(shì):
(1)數(shù)字測(cè)溫系統(tǒng)的小型化,便于攜帶。測(cè)溫儀器的應(yīng)用場(chǎng)合已經(jīng)走出實(shí)驗(yàn)室,需要便攜式測(cè)溫計(jì)。超大規(guī)模集成(VLSI)新器件、微機(jī)電系統(tǒng)(MEMS)、圓片規(guī)模集成(WSI)和多芯片模塊(MCM)等,采用微控技術(shù)、微加工技術(shù)、微檢測(cè)技術(shù)、微光源、微分光光學(xué)系統(tǒng)、微傳感器等,使測(cè)溫儀器產(chǎn)品體積縮小,精度提高成為可能。
(2)數(shù)字測(cè)溫系統(tǒng)的精確化,使測(cè)溫能力更加精確。數(shù)字技術(shù)的出現(xiàn)把模擬儀器的準(zhǔn)確度、分辨力與測(cè)量速度提高了幾個(gè)量級(jí),單片機(jī)的引入,使儀器的功能發(fā)生了質(zhì)的變化,從單純的接受、顯示轉(zhuǎn)變?yōu)榭刂啤⒎治、處理、?jì)算與顯示輸出,從用單個(gè)儀器進(jìn)行測(cè)量轉(zhuǎn)變成用測(cè)量系統(tǒng)進(jìn)行測(cè)量。測(cè)量儀器技術(shù)指標(biāo)的提高是行業(yè)發(fā)展的追求,如測(cè)量范圍,電阻從超導(dǎo)到1014Ω,溫度從接近絕對(duì)零度到1010℃。如測(cè)量準(zhǔn)確度,時(shí)間測(cè)量從30萬年不差1秒提高到600萬年不差1秒。
(3)數(shù)字測(cè)溫系統(tǒng)的多用途化,不僅可以測(cè)室溫,液溫,甚至在極端條件下也能準(zhǔn)確地測(cè)溫。
2.2 本設(shè)計(jì)方案思路
本設(shè)計(jì)以檢測(cè)溫度并顯示溫度提供上下限報(bào)警為目的,按照系統(tǒng)設(shè)計(jì)功能的要求,確定系統(tǒng)由5個(gè)模塊組成:主控器[4]、測(cè)溫電路,報(bào)警電路,按鍵電路及顯示電路。
系統(tǒng)以DS18B20為傳感器用以將溫度模擬量轉(zhuǎn)化為電壓數(shù)字量以總線傳入單片機(jī),以ATmega16為主芯片,在主芯片對(duì)DS18B20傳入的溫度值進(jìn)行處理,由單片機(jī)程序控制,將經(jīng)處理后的溫度由LED數(shù)碼管顯示出來。
本系統(tǒng)具有電路簡潔,性能可靠等特點(diǎn),易于實(shí)現(xiàn)。
2.3  研發(fā)方向和技術(shù)關(guān)鍵
(1)合理使用溫度傳感器,提高系統(tǒng)的精度;
(2)外加存儲(chǔ)器,提供強(qiáng)大的存儲(chǔ)功能;
(3)與微機(jī)進(jìn)行數(shù)據(jù)傳輸,方便數(shù)據(jù)的統(tǒng)計(jì)、保存、顯示和查詢。
2.4 主要技術(shù)指標(biāo)
(1)測(cè)溫范圍:-55℃~+99℃
(2)測(cè)量精度:0.1℃
(3)數(shù)字顯示位數(shù):四位
(4)最大測(cè)量溫度:超過150℃


3  總體設(shè)計(jì)
數(shù)字溫度計(jì)是一種將模擬溫度數(shù)據(jù)轉(zhuǎn)化成數(shù)字溫度數(shù)據(jù)并加以顯示的系統(tǒng)。由傳感器測(cè)得模擬溫度數(shù)值,并將其轉(zhuǎn)化為數(shù)字信號(hào),通過串行通信的方法將數(shù)據(jù)傳送給單片機(jī),并由單片機(jī)處理后顯示。
本設(shè)計(jì)采用ATmega16為控制部件,用4位共LED數(shù)碼管動(dòng)態(tài)掃描的方式來顯示所測(cè)的溫度值,溫度值的最小精確度為0.1℃,基本上滿足一般的要求。溫度傳感器采用DS18B20,其傳感器為數(shù)字輸出,所以不需要進(jìn)行模數(shù)轉(zhuǎn)化直接由單片機(jī)控制讀取溫度值,這樣大大減少了硬件的成本。
此測(cè)溫電路的系統(tǒng)框圖如圖3-1所示:


圖3-1 數(shù)字溫度計(jì)總體電路結(jié)構(gòu)框圖

3.1  溫度的檢測(cè)
每次測(cè)溫由單片機(jī)向測(cè)溫傳感器發(fā)出特定脈沖,測(cè)溫傳感器能夠檢測(cè)到脈沖并做相應(yīng)的工作。傳感器將模擬溫度信號(hào)經(jīng)過采集,數(shù)字處理,放大后輸出。DS18B20使用一個(gè)單線接口發(fā)送或接受信息,因此在單片機(jī)和DS18B20之間只需要一條線鏈接,用于讀寫和溫度轉(zhuǎn)換的電源可以從數(shù)據(jù)線獲得,無需外接電源。
3.2 數(shù)字信號(hào)的處理
送入單片機(jī)內(nèi)部的數(shù)字信號(hào)經(jīng)過單片機(jī)的處理,將數(shù)據(jù)用LED數(shù)碼管顯示出來。其處理過程主要由單片機(jī)能存儲(chǔ)的程序進(jìn)行控制。
3.3  溫度的顯示
   使用4位共陽極LED數(shù)碼管顯示。單片機(jī)將溫度數(shù)據(jù)經(jīng)處理后由I/O口輸出,由特定的編碼用數(shù)碼管顯示出來。LED顯示具有顯示速度快,顯示結(jié)果明顯,易于制作等優(yōu)點(diǎn)。
3.4  按鍵檢測(cè)
   將按鍵的一段與單片機(jī)I/O口鏈接,一段與地鏈接,當(dāng)按鍵按下時(shí)可以由單片機(jī)內(nèi)的程序檢測(cè)到。通過按鍵使用者可以控制程序,使用不同的功能,開關(guān)系統(tǒng)等。按鍵使用普通紐扣按鍵,具有結(jié)構(gòu)簡單,價(jià)格低廉,使用方便等優(yōu)點(diǎn)。
3.5  報(bào)警功能
在單片機(jī)程序內(nèi)設(shè)置了報(bào)警溫度的上下限值,當(dāng)所測(cè)得的溫度超過了這一數(shù)值,將會(huì)由蜂鳴器發(fā)出報(bào)警。報(bào)警功能是本系統(tǒng)的重要功能之一,在工業(yè)應(yīng)用中常常需要在特定的溫度條件下進(jìn)行工作,所以當(dāng)溫度超出范圍時(shí)及時(shí)報(bào)警是十分有必要的。




4  硬件設(shè)計(jì)4.1總體電路設(shè)計(jì)
溫度計(jì)電路設(shè)計(jì)原理圖如圖2所示,控制器使用單片機(jī)mega16,溫度傳感器使用DS18B20,用4位共陽LED數(shù)碼管以動(dòng)態(tài)掃描法實(shí)現(xiàn)溫度顯示。采用USB燒入程序及供電,用16M晶振。電路還包括按鍵電路,復(fù)位電路,報(bào)警電路,單片機(jī)外設(shè)電路等。整個(gè)系統(tǒng)的原理圖如圖4-1所示:

file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image007.jpg
圖4-1 數(shù)字溫度計(jì)設(shè)計(jì)電路原理圖
4.2主控制器(ATmega16
ATmega16是基于增強(qiáng)的AVR RISC結(jié)構(gòu)的低功耗8 位CMOS微控制器。由于其先進(jìn)的指令集以及單時(shí)鐘周期指令執(zhí)行時(shí)間,ATmega16 的數(shù)據(jù)吞吐率高1MIPS/MHz,從而可以緩減系統(tǒng)在功耗和處理速度之間的矛盾。
AVR 內(nèi)核具有豐富的指令集和32 個(gè)通用工作寄存器。所有的寄存器都直接與算邏單元(ALU) 相連接,使得一條指令可以在一個(gè)時(shí)鐘周期內(nèi)同時(shí)訪問兩個(gè)獨(dú)立的寄存器。這種結(jié)構(gòu)大大提高了代碼效率,并且具有比普通的CISC 微控制器最高至10 倍的數(shù)據(jù)吞吐率。
ATmega16 有如下特點(diǎn):16K字節(jié)的系統(tǒng)內(nèi)可編程Flash(具有同時(shí)讀寫的能力,即RWW),512 字節(jié)EEPROM,1K 字節(jié)SRAM,32 個(gè)通用I/O 口線,32 個(gè)通用工作寄存器,用于邊界掃描的JTAG 接口,支持片內(nèi)調(diào)試與編程,三個(gè)具有比較模式的靈活的定時(shí)器/ 計(jì)數(shù)器(T/C),片內(nèi)/外中斷,可編程串行USART,有起始條件檢測(cè)器的通用串行接口,8路10位具有可選差分輸入級(jí)可編程增益(TQFP 封裝) 的ADC ,具有片內(nèi)振蕩器的可編程看門狗定時(shí)器,一個(gè)SPI 串行端口,以及六個(gè)可以通過軟件進(jìn)行選擇的省電模式。 工作于空閑模式時(shí)CPU 停止工作,而USART、兩線接口、A/D 轉(zhuǎn)換器、SRAM、T/C、SPI 端口以及中斷系統(tǒng)繼續(xù)工作;掉電模式時(shí)晶體振蕩器停止振蕩,所有功能除了中斷和硬件復(fù)位之外都停止工作;在省電模式下,異步定時(shí)器繼續(xù)運(yùn)行,允許用戶保持一個(gè)時(shí)間基準(zhǔn),而其余功能模塊處于休眠狀態(tài); ADC 噪聲抑制模式時(shí)終止CPU 和除了異步定時(shí)器與ADC 以外所有I/O 模塊的工作,以降低ADC 轉(zhuǎn)換時(shí)的開關(guān)噪聲; Standby 模式下只有晶體或諧振振蕩器運(yùn)行,其余功能模塊處于休眠狀態(tài),使得器件只消耗極少的電流,同時(shí)具有快速啟動(dòng)能力;擴(kuò)展Standby 模式下則允許振蕩器和異步定時(shí)器繼續(xù)工作。
本芯片是以Atmel 高密度非易失性存儲(chǔ)器技術(shù)生產(chǎn)的。片內(nèi)ISP Flash 允許程序存儲(chǔ)器通過ISP 串行接口,或者通用編程器進(jìn)行編程,也可以通過運(yùn)行于AVR 內(nèi)核之中的引導(dǎo)程序進(jìn)行編程。引導(dǎo)程序可以使用任意接口將應(yīng)用程序下載到應(yīng)用Flash存儲(chǔ)區(qū)(ApplicationFlashMemory)。在更新應(yīng)用Flash存儲(chǔ)區(qū)時(shí)引導(dǎo)Flash區(qū)(Boot Flash Memory)的程序繼續(xù)運(yùn)行,實(shí)現(xiàn)了RWW 操作。 通過將8 位RISC CPU 與系統(tǒng)內(nèi)可編程的Flash 集成在一個(gè)芯片內(nèi), ATmega16 成為一個(gè)功能強(qiáng)大的單片機(jī),為許多嵌入式控制應(yīng)用提供了靈活而低成本的解決方案。ATmega16 具有一整套的編程與系統(tǒng)開發(fā)工具,包括:C 語言 編譯器、宏匯編、 程序調(diào)試器/ 軟件仿真器、仿真器及評(píng)估板。

產(chǎn)品特性:
• 高性能、低功耗的 8 位AVR® 微處理器
• 先進(jìn)的RISC 結(jié)構(gòu)
– 131 條指令 – 大多數(shù)指令執(zhí)行時(shí)間為單個(gè)時(shí)鐘周期
– 32個(gè)8 位通用工作寄存器
– 全靜態(tài)工作
– 工作于16 MHz 時(shí)性能高達(dá)16 MIPS
– 只需兩個(gè)時(shí)鐘周期的硬件乘法器
• 非易失性程序和數(shù)據(jù)存儲(chǔ)器
– 16K 字節(jié)的系統(tǒng)內(nèi)可編程Flash
擦寫壽命: 10,000 次
– 具有獨(dú)立鎖定位的可選Boot 代碼區(qū)
通過片上Boot 程序?qū)崿F(xiàn)系統(tǒng)內(nèi)編程
真正的同時(shí)讀寫操作
– 512 字節(jié)的EEPROM
擦寫壽命: 100,000 次
– 1K字節(jié)的片內(nèi)SRAM
– 可以對(duì)鎖定位進(jìn)行編程以實(shí)現(xiàn)用戶程序的加密
• JTAG 接口( 與IEEE 1149.1 標(biāo)準(zhǔn)兼容)
– 符合JTAG 標(biāo)準(zhǔn)的邊界掃描功能
– 支持?jǐn)U展的片內(nèi)調(diào)試功能
– 通過JTAG 接口實(shí)現(xiàn)對(duì)Flash、EEPROM、熔絲位和鎖定位的編程
• 外設(shè)特點(diǎn)
– 兩個(gè)具有獨(dú)立預(yù)分頻器和比較器功能的8 位定時(shí)器/ 計(jì)數(shù)器
– 一個(gè)具有預(yù)分頻器、比較功能和捕捉功能的16 位定時(shí)器/ 計(jì)數(shù)器
– 具有獨(dú)立振蕩器的實(shí)時(shí)計(jì)數(shù)器RTC
– 8路10 位ADC
8 個(gè)單端通道
TQFP 封裝的7 個(gè)差分通道
2 個(gè)具有可編程增益(1x, 10x, 或200x)的差分通道
– 面向字節(jié)的兩線接口
– 兩個(gè)可編程的串行USART
– 可工作于主機(jī)/ 從機(jī)模式的SPI 串行接口
– 具有獨(dú)立片內(nèi)振蕩器的可編程看門狗定時(shí)器
ATmega16的引腳圖如圖4-2所示:
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg
                  圖4-2Mega16引腳圖

引腳說明:
VCC數(shù)字電路的電源
GND地端口A(PA7..PA0)端口A 做為A/D 轉(zhuǎn)換器的模擬輸入端。
端口A 為8 位雙向I/O 口,具有可編程的內(nèi)部上拉電阻。其輸出緩沖器具有對(duì)稱的驅(qū)動(dòng)特性,可以輸出和吸收大電流。作為輸入使用時(shí),若內(nèi)部上拉電阻使能,端口被外部電路拉低時(shí)將輸出電流。在復(fù)位過程中,即使系統(tǒng)時(shí)鐘還未起振,端口A 處于高阻狀態(tài)。
端口B(PB7..PB0)端口B 為8 位雙向I/O 口,具有可編程的內(nèi)部上拉電阻。其輸出緩沖器具有對(duì)稱的驅(qū)動(dòng)特
性,可以輸出和吸收大電流。作為輸入使用時(shí),若內(nèi)部上拉電阻使能,端口被外部電路拉低時(shí)將輸出電流。在復(fù)位過程中,即使系統(tǒng)時(shí)鐘還未起振,端口B 處于高阻狀態(tài)。端口B 也可以用做其他不同的特殊功能。
端口C(PC7..PC0)端口C 為8 位雙向I/O 口,具有可編程的內(nèi)部上拉電阻。其輸出緩沖器具有對(duì)稱的驅(qū)動(dòng)特性,可以輸出和吸收大電流。作為輸入使用時(shí),若內(nèi)部上拉電阻使能,端口被外部電路拉低時(shí)將輸出電流。在復(fù)位過程中,即使系統(tǒng)時(shí)鐘還未起振,端口C 處于高阻狀態(tài)。如果JTAG接口使能,即使復(fù)位出現(xiàn)引腳 PC5(TDI)、 PC3(TMS)與 PC2(TCK)的上拉電阻被激活。
端口D(PD7..PD0)端口D 為8 位雙向I/O 口,具有可編程的內(nèi)部上拉電阻。其輸出緩沖器具有對(duì)稱的驅(qū)動(dòng)特性,可以輸出和吸收大電流。作為輸入使用時(shí),若內(nèi)部上拉電阻使能,則端口被外部電路拉低時(shí)將輸出電流。在復(fù)位過程中,即使系統(tǒng)時(shí)鐘還未起振,端口D 處于高阻狀態(tài)。端口D 也可以用做其他不同的特殊功能。
RESET復(fù)位輸入引腳。持續(xù)時(shí)間超過最小門限時(shí)間的低電平將引起系統(tǒng)復(fù)位。持續(xù)時(shí)間小于門限間的脈沖不能保證可靠復(fù)位。
XTAL1反向振蕩放大器與片內(nèi)時(shí)鐘操作電路的輸入端。
XTAL2反向振蕩放大器的輸出端。
AVCCAVCC是端口A與A/D轉(zhuǎn)換器的電源。不使用ADC時(shí),該引腳應(yīng)直接與VCC連接。使用ADC時(shí)應(yīng)通過一個(gè)低通濾波器與VCC 連接。
AREFA/D 的模擬基準(zhǔn)輸入引腳。

AVR CPU 內(nèi)核:
為了獲得最高的性能以及并行性,AVR 采用了Harvard 結(jié)構(gòu),具有獨(dú)立的數(shù)據(jù)和程序總線。程序存儲(chǔ)器里的指令通過一級(jí)流水線運(yùn)行。CPU 在執(zhí)行一條指令的同時(shí)讀取下一條指令( 在本文稱為預(yù)取)。這個(gè)概念實(shí)現(xiàn)了指令的單時(shí)鐘周期運(yùn)行。程序存儲(chǔ)器是可以在線編程的FLASH?焖僭L問寄存器文件包括32 個(gè)8 位通用工作寄存器,訪問時(shí)間為一個(gè)時(shí)鐘周期。從而實(shí)現(xiàn)了單時(shí)鐘周期的ALU 操作。在典型的ALU 操作中,兩個(gè)位于寄存器文件中的操作數(shù)同時(shí)被訪問,然后執(zhí)行運(yùn)算,結(jié)果再被送回到寄存器文件。整個(gè)過程僅需一個(gè)時(shí)鐘周期。寄存器文件里有6 個(gè)寄存器可以用作3 個(gè)16 位的間接尋址寄存器指針以尋址數(shù)據(jù)空間,實(shí)現(xiàn)高效的地址運(yùn)算。其中一個(gè)指針還可以作為程序存儲(chǔ)器查詢表的地址指針。這些附加的功能寄存器即為16 位的X、Y、Z 寄存器。ALU支持寄存器之間以及寄存器和常數(shù)之間的算術(shù)和邏輯運(yùn)算。ALU也可以執(zhí)行單寄存器操作。運(yùn)算完成之后狀態(tài)寄存器的內(nèi)容得到更新以反映操作結(jié)果。程序流程通過有/ 無條件的跳轉(zhuǎn)指令和調(diào)用指令來控制,從而直接尋址整個(gè)地址空間。大多數(shù)指令長度為16 位,亦即每個(gè)程序存儲(chǔ)器地址都包含一條16 位或32 位的指令。程序存儲(chǔ)器空間分為兩個(gè)區(qū):引導(dǎo)程序區(qū)(Boot 區(qū)) 和應(yīng)用程序區(qū)。這兩個(gè)區(qū)都有專門的鎖定位以實(shí)現(xiàn)讀和讀/ 寫保護(hù)。用于寫應(yīng)用程序區(qū)的SPM 指令必須位于引導(dǎo)程序區(qū)。在中斷和調(diào)用子程序時(shí)返回地址的程序計(jì)數(shù)器(PC) 保存于堆棧之中。堆棧位于通用數(shù)據(jù)SRAM,因此其深度僅受限于SRAM 的大小。在復(fù)位例程里用戶首先要初始化堆棧指針SP。這個(gè)指針位于I/O 空間,可以進(jìn)行讀寫訪問。數(shù)據(jù)SRAM 可以通過5 種不同的尋址模式進(jìn)行訪問。AVR 存儲(chǔ)器空間為線性的平面結(jié)構(gòu)。AVR有一個(gè)靈活的中斷模塊?刂萍拇嫫魑挥贗/O空間。狀態(tài)寄存器里有全局中斷使能位。每個(gè)中斷在中斷向量表里都有獨(dú)立的中斷向量。各個(gè)中斷的優(yōu)先級(jí)與其在中斷向量表的位置有關(guān),中斷向量地址越低,優(yōu)先級(jí)越高。
4.3顯示電路
顯示電路用8位共陽極數(shù)碼管顯示,多位數(shù)碼管的各個(gè)位都可以顯示數(shù)據(jù),但以個(gè)時(shí)刻只能點(diǎn)亮一位,依次點(diǎn)亮多位數(shù)碼管的各個(gè)位,由于人眼的視覺暫留效應(yīng),看起來就像多個(gè)位同時(shí)點(diǎn)亮。
數(shù)碼管是一種把多個(gè)LED顯示段集成在一起的顯示設(shè)備。有兩種類型,一種是共陽型,一種是共陰型。共陽型就是把多個(gè)LED顯示段的陽極接在一起,又稱為公共端。共陰型就是把多個(gè)LED顯示段的陰極接在一起,即為公共端。陽極即為二極管的正極,又稱為正極,陰極即為二極管的負(fù)極,又稱為負(fù)極。通常的數(shù)碼管又分為8段,即8個(gè)LED顯示段,這是為工程應(yīng)用方便如設(shè)計(jì)的,分別為A、B、C、D、E、F、G、DP,其中DP 是小數(shù)點(diǎn)位段。而多位數(shù)碼管,除某一位的公共端會(huì)連接在一起,不同位的數(shù)碼管的相同端也會(huì)連接在一起。即所有的A段都會(huì)連在一起,其它的段也是如此,這是實(shí)際最常用的用法。
數(shù)碼管顯示方法可分為靜態(tài)顯示和動(dòng)態(tài)顯示兩種。靜態(tài)顯示就是數(shù)碼管的8段輸入及其公共端電平一直有效。動(dòng)態(tài)顯示的原理是,各個(gè)數(shù)碼管的相同段連接在一起,共同占用8 位段引管線;每位數(shù)碼管的陽極連在一起組成公共端。利用人眼的視覺暫留性,依次給出各個(gè)數(shù)碼管公共端加有效信號(hào),在此同時(shí)給出該數(shù)碼管加有效的數(shù)據(jù)信號(hào),當(dāng)全段掃描速度大于視覺暫留速度時(shí),顯示就會(huì)清晰顯示出來。
在此次設(shè)計(jì)中的數(shù)碼管為共陽極的數(shù)碼管,其對(duì)應(yīng)的圖如下:
當(dāng)需要顯示1時(shí),可以將左圖中的BC兩段點(diǎn)亮,由于在應(yīng)用中沒有涉及到類似數(shù)字計(jì)算的小數(shù)點(diǎn),所以DP端不接,而剩下七段代碼從G到A依次為:0000110。
同理可以得出0~F常用的16進(jìn)制的對(duì)應(yīng)代碼:
00111111 1 0000110 2 1011011 3 1001111
4 1100110 5 1101101 6 1111101 7 0000111
8 1111111 9 1101111 A1110111 B 1111100


C 0111001 D 1011110 E 1111001 F 1110001
顯示電路如圖4-3所示:

                 圖4-3 多位數(shù)碼管顯示電路

4.4 溫度傳感器工作原理
DS18B20溫度傳感器是美國DALLAS半導(dǎo)體公司最新推出的一種改進(jìn)型智能溫度傳感器,與傳統(tǒng)的熱敏電阻等測(cè)溫元件相比,它能直接讀出被測(cè)溫度,并且可根據(jù)實(shí)際要求通過簡單的編程實(shí)現(xiàn)9~12位的數(shù)字值讀數(shù)方式。
DS18B20的性能特點(diǎn)如下:
·獨(dú)特的單線接口僅需要一個(gè)端口引腳進(jìn)行通信;
·實(shí)際應(yīng)用中不需要外部任何元器件即可實(shí)現(xiàn)測(cè)溫;
·可通過數(shù)據(jù)線供電,電壓范圍為3.0~5.5V;
·在DS18B20中的每個(gè)器件上都有獨(dú)一無二的序列號(hào);
·溫度以9或12位數(shù)字量讀出;
·報(bào)警搜索命令識(shí)別并標(biāo)志超過程序限定溫度(溫度報(bào)警條件)的器件;
·負(fù)電壓特性,電源極性接反時(shí),溫度計(jì)不會(huì)因發(fā)熱而燒毀,但不能工作。

圖4-4 DS18B20內(nèi)部結(jié)構(gòu)圖

DS18B20采用3腳PR-35封裝或8腳SOIC封裝,其內(nèi)部結(jié)構(gòu)框圖如圖4-3所示。
64位ROM的位結(jié)構(gòu)如圖4所示。開始8位是產(chǎn)品類型的編號(hào),接著是每個(gè)器件的惟一的序號(hào),共有48位,最后8位是前56位的CRC檢驗(yàn)碼,這也是多個(gè)DS18B20可以采用一線進(jìn)行通信的原因。非易失性溫度報(bào)警觸發(fā)器TH和TL,可通過軟件寫入戶報(bào)警上下限。

  
8位檢驗(yàn)CRC
  
48位序列號(hào)
8位工廠代碼(10H)
MSB         LSB  MSB        LSB  MSB                 LSB
                  圖4-5  64位ROM結(jié)構(gòu)圖
DS18B20溫度傳感器的內(nèi)部存儲(chǔ)器還包括一個(gè)高速暫存RAM和一個(gè)非易失性的可電擦除的EERAM。高速暫存RAM的結(jié)構(gòu)為8字節(jié)的存儲(chǔ)器,結(jié)構(gòu)如圖5所示。                  頭2個(gè)字節(jié)包含測(cè)量得的溫度信息,第3和第4字節(jié)是TH和TL的拷貝,是易失的,每次上電復(fù)位時(shí)被刷新。第5個(gè)字節(jié)為配置寄存器[9],它的內(nèi)容用于確定溫度值的數(shù)字轉(zhuǎn)換分辯率。
DS18B20工作時(shí)按此寄存器中的分辯率將溫度轉(zhuǎn)換為相應(yīng)精度的數(shù)值。該字節(jié)各位的定義如圖4-5所示。低5位一直為1,TM是測(cè)試模式位,用于設(shè)置DS18B20在工作模式還是在測(cè)試模式。
在DS18B20出廠時(shí)該位被設(shè)置為0,用戶不要去改動(dòng),R1和R0決定溫度轉(zhuǎn)換的精度位數(shù),即用來設(shè)置分辯率,定義方法見表1。



圖4-6  高速暫存RAM結(jié)構(gòu)圖                 圖4-7   配置寄存器

表1  DS18B20分辯率的定義規(guī)定
  
R1
  
R0
分辯率/位
溫度最大轉(zhuǎn)換時(shí)間/ms
0
0
9
93.75
211  0
1
10
187.5
1
0
11
375
1
1
12
750

由表1可見,DS18B20溫度轉(zhuǎn)換的時(shí)間比較長,而且設(shè)定的分辯率越高,所需要的溫度數(shù)據(jù)轉(zhuǎn)換時(shí)間就越長。因此,在實(shí)際應(yīng)用中要將分辯率和轉(zhuǎn)換時(shí)間權(quán)衡考慮。
高速暫存RAM的第6、7、8字節(jié)保留未用,表現(xiàn)為全邏輯1。轉(zhuǎn)換完成后溫度值就以16位帶符號(hào)擴(kuò)展的二進(jìn)制補(bǔ)碼形式存儲(chǔ)在高速暫存存儲(chǔ)器的第1、2字節(jié)。單片機(jī)可以通過單線接口讀出該數(shù)據(jù),讀數(shù)據(jù)時(shí)低位在先,高位在后,數(shù)據(jù)格式以0.0625℃/LSB形式表示。溫度值格式如圖4-6所示。
當(dāng)符號(hào)位S=0時(shí),表示測(cè)得的溫度值為正值,可以直接將二進(jìn)制位轉(zhuǎn)換為十進(jìn)制;當(dāng)符號(hào)位S=1時(shí)。表示測(cè)得的溫度值為負(fù)值,要先將被補(bǔ)碼變成原碼,再計(jì)算十進(jìn)制值。表2是一部分溫度值對(duì)應(yīng)的二進(jìn)制溫度數(shù)據(jù)。

  
23
  
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image012.gif
21
20
2-1
2-2
2-3
2-4
LS字節(jié)

  
S     
  
S  
S  
S
S
26
25
24
MS字節(jié)
圖4-8溫度數(shù)據(jù)值格式
DS18B20完成溫度轉(zhuǎn)換后,就把測(cè)得的溫度值與RAM中的TH、TL字節(jié)內(nèi)容作比較。若T>TH或T<TL,則將該器件內(nèi)的報(bào)警標(biāo)志位置位,并對(duì)主機(jī)發(fā)出的報(bào)警搜索命令作出響應(yīng)。因此,可用多只DS18B20同時(shí)測(cè)量溫度并進(jìn)行報(bào)警搜索。
主機(jī)根據(jù)ROM的前56位來計(jì)算CRC值,并和存入DS18B20的CRC值作比較,以判斷主機(jī)收到的ROM數(shù)據(jù)是否正確。
DS18B20的測(cè)量原理如圖5.8所示。圖中低溫度系數(shù)晶振的振蕩頻率受溫度的影響很小,用于產(chǎn)生固定頻率的脈沖信號(hào)送給減法計(jì)數(shù)器1;高溫度系數(shù)晶振隨溫度變化其振蕩頻率明顯改變所產(chǎn)生的信號(hào)作為減法計(jì)數(shù)器2的脈沖輸入。圖中還隱含著計(jì)數(shù)門,當(dāng)計(jì)數(shù)門打開時(shí),DS18B20就對(duì)低溫度系數(shù)振蕩器產(chǎn)生的時(shí)鐘脈沖進(jìn)行計(jì)數(shù),
表2 DS18B20溫度與測(cè)得值對(duì)應(yīng)表
  
溫度/℃
  
二進(jìn)制表示
十六進(jìn)制表示
+125
0000 0111   1101 0000
07D0H
+85
0000 0101   0101 0000
0550H
+25.0625
0000 0001   1001 0001
0191H
+10.125
0000 0000   1010 0010
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
FF5EH
-25.0625
1111 1110   0110 1111
FE6FH
-55
1111 1100   1001 0000
FC90H
進(jìn)而完成溫度測(cè)量。計(jì)數(shù)門的開啟時(shí)間由高溫度系數(shù)振蕩器來決定,每次測(cè)量前,首先將-55℃所對(duì)應(yīng)的一個(gè)基數(shù)分別置入減法計(jì)數(shù)器1、溫度寄存器中,減法計(jì)數(shù)器1和溫度寄存器被預(yù)置在-55℃所對(duì)應(yīng)的一個(gè)基數(shù)值。
減法計(jì)數(shù)器1對(duì)低溫度系數(shù)晶振產(chǎn)生的脈沖信號(hào)進(jìn)行減法計(jì)數(shù),當(dāng)減法計(jì)數(shù)器1的預(yù)置值減到0時(shí),溫度寄存器的值將加1,減法計(jì)數(shù)器1的預(yù)置值將重新被裝入,減法計(jì)數(shù)器1重新開始對(duì)低溫度系數(shù)晶振產(chǎn)生的脈沖信號(hào)進(jìn)行計(jì)數(shù),如此循環(huán)直到減法計(jì)數(shù)器2計(jì)數(shù)到0時(shí),停止溫度寄存器值的累加,此時(shí)溫度寄存器中的數(shù)值就是所測(cè)溫度值。圖5.8中的斜率累加器用于補(bǔ)償和修正測(cè)溫過程中的非線形性,其輸出用于修正減法計(jì)數(shù)器的預(yù)置值,只要計(jì)數(shù)門仍未關(guān)閉就重復(fù)上述過程,直到溫度寄存器值達(dá)到被測(cè)溫度值。
    另外,由于DS18B20單線通信功能是分時(shí)完成的,它有嚴(yán)格的時(shí)隙概念,因此讀寫時(shí)序很重要。系統(tǒng)對(duì)DS18B20的各種操作必須按協(xié)議進(jìn)行。操作協(xié)議為:初始化DS18B20(發(fā)復(fù)位脈沖)—>發(fā)ROM功能命令—>發(fā)存儲(chǔ)器操作命令—>處理數(shù)據(jù)。
4.5DS18B20的其他介紹
DS18B20的存儲(chǔ)器包括高速暫存器RAM和可電擦除RAM,可電擦除RAM又包括溫度觸發(fā)器TH和TL,以及一個(gè)配置寄存器。存儲(chǔ)器能完整的確定一線端口的通訊,數(shù)字開始用寫寄存器的命令寫進(jìn)寄存器,接著也可以用讀寄存器的命令來確認(rèn)這些數(shù)字。當(dāng)確認(rèn)以后就可以用復(fù)制寄存器的命令來將這些數(shù)字轉(zhuǎn)移到可電擦除RAM中。當(dāng)修改過寄存器中的數(shù)時(shí),這個(gè)過程能確保數(shù)字的完整性。
高速暫存器RAM是由8個(gè)字節(jié)的存儲(chǔ)器組成;第一和第二個(gè)字節(jié)是溫度的顯示位。第三和第四個(gè)字節(jié)是復(fù)制TH和TL,同時(shí)第三和第四個(gè)字節(jié)的數(shù)字可以更新;第五個(gè)字節(jié)是復(fù)制配置寄存器,同時(shí)第五個(gè)字節(jié)的數(shù)字可以更新;六、七、八三個(gè)字節(jié)是計(jì)算機(jī)自身使用。用讀寄存器的命令能讀出第九個(gè)字節(jié),這個(gè)字節(jié)是對(duì)前面的八個(gè)字節(jié)進(jìn)行校驗(yàn)
DS18B20采用一線通信接口。因?yàn)橐痪通信接口,必須在先完成ROM設(shè)定,否則記憶和控制功能將無法使用。主要首先提供以下功能命令之一:讀ROM,ROM匹配,搜索ROM,跳過ROM,報(bào)警檢查。這些指令操作作用在沒有一個(gè)器件的64位光刻ROM序列號(hào),可以在掛在一線上多個(gè)器件選定某一個(gè)器件,同時(shí),總線也可以知道總線上掛有有多少,什么樣的設(shè)備。
DS18B20可以采用兩種方式供電,一種是采用電源供電方式,此時(shí)DS18B20的1腳接地,2腳作為信號(hào)線,3腳接電源。另一種是寄生電源供電方式。單片機(jī)端口接單線總線,為保證在有效的DS18B20時(shí)鐘周期內(nèi)提供足夠的電流,可用一個(gè)MOSFET管來完成對(duì)總線的上拉。DS18B20可以使用外部電源VDD,也可以使用內(nèi)部的寄生電源。當(dāng)VDD端口接3.0V—5.5V的電壓時(shí)是使用外部電源;當(dāng)VDD端口接地時(shí)使用了內(nèi)部的寄生電源。無論是內(nèi)部寄生電源還是外部供電,I/O口線要接5KΩ左右的上拉電阻。
當(dāng)DS18B20處于存儲(chǔ)器操作和溫度A/D轉(zhuǎn)換操作時(shí),總線上必須有強(qiáng)的上拉,上拉開啟時(shí)間最大為10μs。采用寄生電源供電方式時(shí)VDD和GND端均接地。由于單線制只有一根線,因此發(fā)送接口必須是三態(tài)的。
由于DS18B20采用的是1-Wire總線協(xié)議方式,即在一根數(shù)據(jù)線實(shí)現(xiàn)數(shù)據(jù)的雙向傳輸,而對(duì)AT89C2051單片機(jī)來說,硬件上并不支持單總線協(xié)議。因此,我們必須采用軟件的方法來模擬單總線的協(xié)議時(shí)序來完成對(duì)DS18B20芯片的訪問。
由于DS18B20是在一根I/O線上讀寫數(shù)據(jù),因此,對(duì)讀寫的數(shù)據(jù)位有著嚴(yán)格的時(shí)序要求。DS18B20有嚴(yán)格的通信協(xié)議來保證各位數(shù)據(jù)傳輸?shù)恼_性和完整性。該協(xié)議定義了幾種信號(hào)的時(shí)序:初始化時(shí)序、讀時(shí)序、寫時(shí)序。所有時(shí)序都是將主機(jī)作為主設(shè)備,單總線器件作為從設(shè)備。而每一次命令和數(shù)據(jù)的傳輸都是從主機(jī)主動(dòng)啟動(dòng)寫時(shí)序開始,如果要求單總線器件回送數(shù)據(jù),在進(jìn)行寫命令后,主機(jī)需啟動(dòng)讀時(shí)序完成數(shù)據(jù)接收。數(shù)據(jù)和命令的傳輸都是低位在先。
DS18B20的復(fù)位時(shí)序
DS18B20的讀時(shí)序分為讀0時(shí)序和讀1時(shí)序兩個(gè)過程。 對(duì)于DS18B20的讀時(shí)隙是從主機(jī)把單總線拉低之后,在15秒之內(nèi)就得釋放單總線,以讓DS18B20把數(shù)據(jù)傳輸?shù)絾慰偩上。DS18B20在完成一個(gè)讀時(shí)序過程,至少需要60μs才能完成。DS18B20的寫時(shí)序 對(duì)于DS18B20的寫時(shí)序仍然分為寫0時(shí)序和寫1時(shí)序兩個(gè)過程。 對(duì)于DS18B20寫0時(shí)序和寫1時(shí)序的要求不同,當(dāng)要寫0時(shí)序時(shí),單總線要被拉低至少60μs,保證DS18B20能夠在15μs到45μs之間能夠正確地采樣IO總線上的“0”電平,當(dāng)要寫1時(shí)序時(shí),單總線被拉低之后,在15μs之內(nèi)就得釋放單總線。
4.6 按鍵電路的設(shè)計(jì)
    按鍵電路將按鍵的一段與單片機(jī)I/O口鏈接,一段與地鏈接,當(dāng)按鍵按下時(shí)可以由單片機(jī)內(nèi)的程序檢測(cè)到。按鍵采用普通的按鈕按鍵。
4.7 蜂鳴器報(bào)警電路
當(dāng)所測(cè)溫度超出上、下限溫度極限值時(shí),為實(shí)現(xiàn)報(bào)警功能,設(shè)計(jì)了蜂鳴器報(bào)警電路。由單片機(jī)ATmega16的PB3引腳連接BELL,協(xié)調(diào)DS18B20實(shí)現(xiàn)系統(tǒng)的報(bào)警功能。蜂鳴器發(fā)聲原理是電流通過電磁線圈,使電磁線圈產(chǎn)生磁場(chǎng)來驅(qū)動(dòng)振動(dòng)膜發(fā)聲的,因此需要一定的電流才能驅(qū)動(dòng)它,單片機(jī)IO引腳輸出的電流較小,單片機(jī)輸出的TTL電平基本上驅(qū)動(dòng)不了蜂鳴器,因此需要增加一個(gè)電流放大的電路。如圖所示,蜂鳴器的正極接到VCC(+5V)電源上面,蜂鳴器的負(fù)極接地,三極管的基級(jí)B經(jīng)過限流電阻R1后由單片機(jī)的PB3引腳控制,當(dāng)PB3輸出高電平時(shí),三極管截止,沒有電流流過線圈,蜂鳴器不發(fā)聲;當(dāng)PB3輸出低電平時(shí),三極管導(dǎo)通,這樣蜂鳴器的電流形成回路,發(fā)出聲音。因此,我們可以通過程序控制PB3引腳的電平來使蜂鳴器發(fā)出聲音和關(guān)閉。報(bào)警電路如圖4-9所示。
蜂鳴器是一種一體化結(jié)構(gòu)的電子訊響器,采用直流電壓供電,廣泛應(yīng)用于計(jì)算機(jī)、打印機(jī)、復(fù)印機(jī)、報(bào)警器、電子玩具、汽車電子設(shè)備、電話機(jī)、定時(shí)器等電子產(chǎn)品中作發(fā)聲器件。蜂鳴器的分類 蜂鳴器主要分為壓電式蜂鳴器和電磁式蜂鳴器兩種類型。
壓電式蜂鳴器 壓電式蜂鳴器主要由多諧振蕩器、壓電蜂鳴片、阻抗匹配器及共鳴箱、外殼等組成。有的壓電式蜂鳴器外殼上還裝有發(fā)光二極管。
多諧振蕩器由晶體管或集成電路構(gòu)成。當(dāng)接通電源后(1.5~15V直流工作電壓),多諧振蕩器起振,輸出1.5~2.5kHZ的音頻信號(hào),阻抗匹配器推動(dòng)壓電蜂鳴片發(fā)聲。
壓電蜂鳴片由鋯鈦酸鉛或鈮鎂酸鉛壓電陶瓷材料制成。在陶瓷片的兩面鍍上銀電極,經(jīng)極化和老化處理后,再與黃銅片或不銹鋼片粘在一起。

圖4-9 報(bào)警電路


4.8 供電電路
在高精度數(shù)字溫度計(jì)的設(shè)計(jì)中,單片機(jī)ATmega16的工作電壓為4.5- 5.5V,數(shù)字溫度傳感器TMP101的電源電壓范圍為2.7V ~5.5V。所以整個(gè)測(cè)溫系統(tǒng)的供電電源由USB接口提供5V電壓,不僅符合要求,而且節(jié)省了資源,沒必要再另外設(shè)計(jì)電源,只需要在下載程序時(shí)連接計(jì)算機(jī)就可提供所需電壓,很方便。
5 系統(tǒng)軟件設(shè)計(jì)
系統(tǒng)程序主要包括主程序、讀出溫度子程序、溫度轉(zhuǎn)換命令子程序、計(jì)算溫度子程序、顯示數(shù)據(jù)刷新子程序等等。系統(tǒng)程序采用單片機(jī)C語言編寫。程序簡潔,可靠性高,可維護(hù)性好。

5.1讀出溫度子程序
讀出溫度子程序的主要功能是讀出RAM中的9字節(jié),在讀出時(shí)需進(jìn)行CRC校驗(yàn),檢驗(yàn)有錯(cuò)時(shí)不進(jìn)行溫度數(shù)據(jù)的改寫。其程序流程圖如圖5-1所示。




圖5-1 讀出溫度子程序流程圖


5.2 溫度轉(zhuǎn)換命令子程序
溫度轉(zhuǎn)換命令子程序主要是發(fā)溫度轉(zhuǎn)換開始命令,當(dāng)采用12位分辨率時(shí)轉(zhuǎn)換時(shí)間約為750ms,在本程序設(shè)計(jì)中采用1s顯示程序延時(shí)法等待轉(zhuǎn)換的完成。

5.3計(jì)算溫度子程序
計(jì)算溫度子程序?qū)AM[11]取值進(jìn)行BCD碼的轉(zhuǎn)換運(yùn)算,并進(jìn)行溫度值正負(fù)的判定,其程序流程圖如圖5-2所示。



圖5-2  計(jì)算溫度子程序流程圖


5.4顯示數(shù)據(jù)刷新子程序
顯示數(shù)據(jù)刷新子程序主要是對(duì)顯示緩沖器中的顯示數(shù)據(jù)進(jìn)行刷新操作,當(dāng)最高顯示位為0時(shí)將符號(hào)顯示位移入一下位,其程序流程圖如圖5-3所示。



圖5-3 顯示數(shù)據(jù)刷新子程序
5.5  DS18B20的各個(gè)ROM命令
Read ROM [33H]
這個(gè)命令允許總線控制器讀到DS18B20的8位系列編碼、惟一的序列號(hào)和8位CRC碼。只有在總線上存在單只DS18B20的時(shí)候才能使用這個(gè)命令。如果總線上有不止一個(gè)從機(jī),當(dāng)所有從機(jī)試圖同時(shí)傳送信號(hào)時(shí)就會(huì)發(fā)生數(shù)據(jù)沖突(漏極開路連在一起形成相“與”的效果)。
Math ROM [55H]
這個(gè)是匹配ROM命令,后跟64位ROM序列,讓總線控制器在多點(diǎn)總線上定位一只特定的DS18B20。只有和64位ROM序列完全匹配的DS18B20才能響應(yīng)隨后的存儲(chǔ)器操作。所有和64位ROM不匹配的從機(jī)都將等待復(fù)位脈沖。這條命令在總線有單個(gè)或多個(gè)器件時(shí)都可以使用。
Skip ROM [OCCH]
這條命令允許總線控制器不用提供64位ROM編碼就使用存儲(chǔ)器操作命令,在單點(diǎn)總線情況下,可以節(jié)省時(shí)間。如果總線上不止一個(gè)從機(jī),在Skip ROM命令之后 跟著發(fā)一條讀命令,由于多個(gè)從機(jī)同時(shí)傳送信號(hào)?偩上就會(huì)發(fā)生數(shù)據(jù)沖突(漏極開路下拉效果相“與”)。
Search ROM [0F0H]
當(dāng)一個(gè)系統(tǒng)初次啟動(dòng)時(shí),總線控制器可能并不知道單線總線上有多少器件或它們的64位ROM編碼。搜索ROM命令允許總線控制器用排除法識(shí)別總線上的所有從機(jī)的64位編碼。
Alarm Search [0ECH]
這條命令的流程和SearchROM相同。然而,只有在最近一次測(cè)量后遇到符合報(bào)警條件的情況,DS18B20才會(huì)響應(yīng)這條命令。報(bào)警條件定義為溫度高于TH或低于TL。只要DS18B20不掉電,報(bào)警狀態(tài)將一直保持,直到再一次測(cè)得的溫度值達(dá)不到報(bào)警條件。
Write Scratchpad [4EH]
這個(gè)命令向DS18B20的暫存器TH和TL中寫入數(shù)據(jù)?梢栽谌魏螘r(shí)刻發(fā)出復(fù)位命令來中止寫入。
Read Scratchpad [0BEH]
這個(gè)命令讀到暫存器的內(nèi)容。讀取從第1個(gè)字節(jié)開始,一直進(jìn)行下去,直到第9(CRC)字節(jié)讀完。如果不想讀完所有字節(jié),控制器可以在任何時(shí)間發(fā)出復(fù)位命令來路中止讀取。
Copy Scratchpad[48H]
這個(gè)命令暫存器的內(nèi)容拷貝到DS18B20的EEROM存儲(chǔ)器里,即把溫度報(bào)警觸發(fā)字節(jié)存入非易失性存儲(chǔ)器里。如果總線控制器在這條命令之后跟著發(fā)出讀時(shí)間隙,而DS18B20又忙于把暫存器拷貝到EEROM存儲(chǔ)器,DS18B20就會(huì)輸出一個(gè)0,如果拷貝結(jié)束的話,DS18B20則輸出1。如果使用寄生電源,總線控制器必須在這條命令發(fā)出后立即啟動(dòng)強(qiáng)上拉并最少保持10ms。
Convert T [44H]
這條命令啟動(dòng)一次溫度轉(zhuǎn)換而無需其它數(shù)據(jù)。溫度轉(zhuǎn)換命令執(zhí)行,而后DS18B20保持等待狀態(tài)。如果總線控制器在這條命令之后跟著發(fā)出時(shí)間隙,而DS18B20又忙于做時(shí)間轉(zhuǎn)換的話,DS18B20將總線上輸出0,若溫度轉(zhuǎn)換完成,則輸出1。如果使用寄生電源,總線控制器必須在發(fā)出這條命令后立即啟動(dòng)強(qiáng)上拉,并保持500ms以上時(shí)間。
RecallEE[0B8H]
這條命令把報(bào)警觸發(fā)器里的值拷貝回暫存器,這種拷貝操作在DS18B20上電時(shí)自動(dòng)執(zhí)行,這樣器件一上電暫存器里馬上就存在有效的數(shù)據(jù)了。若在這條命令發(fā)出之后發(fā)出讀數(shù)據(jù)隙,器件會(huì)輸出溫度轉(zhuǎn)換忙的標(biāo)識(shí):0為忙,1為完成。
Read PowerSupply [0B4H]
若把這條命令發(fā)給DS18B20后發(fā)出讀時(shí)間隙,器件會(huì)返回它的電源模式:0為寄生電源,1為外部電源。

5.6溫度數(shù)據(jù)的計(jì)算方法
從DS18B20讀到出的二進(jìn)制值必須先轉(zhuǎn)換成二進(jìn)制值,才能用于字符的顯示。因?yàn)镈S18B20的轉(zhuǎn)換精度為9~12位可選的。為了提高精度采用12位。在采用12位轉(zhuǎn)換精度時(shí),溫度寄存器里的值是以0.0625為步進(jìn)的,即溫度值為溫度寄存器里的二進(jìn)制值乘以0.0625,就是實(shí)際的十進(jìn)制溫度值。通過觀察表5.2可以發(fā)現(xiàn)一個(gè)十進(jìn)制值和二進(jìn)制值之間有很明顯的關(guān)系,就是把二進(jìn)制的高字節(jié)的低半字節(jié)和低字節(jié)的高半字節(jié)組成一個(gè)字節(jié),這個(gè)字節(jié)的二進(jìn)制值化為十進(jìn)制值后,就是溫度值的百、十、個(gè)位值,而剩下的低字節(jié)的低半字節(jié)化成十進(jìn)制后,就是溫度值的小數(shù)部分。小數(shù)部分因?yàn)槭前雮(gè)字節(jié),所以二進(jìn)制值范圍是0~F,轉(zhuǎn)換成十進(jìn)制小數(shù)值就是0.0625的倍數(shù)(0~15)。這樣需要4位的數(shù)碼管來顯示小數(shù)部分,實(shí)際應(yīng)用不必這么精度,采用1位數(shù)碼管來顯示小數(shù),可以精確到0.1℃。下表3就是二進(jìn)制和十進(jìn)制的近似對(duì)應(yīng)關(guān)系表。
表3小數(shù)部分二進(jìn)制和十進(jìn)制的近似對(duì)應(yīng)關(guān)系表
  
小數(shù)部分二進(jìn)制值
  
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
十進(jìn)制值
0
0
1
1
2
3
3
4
5
5
6
6
7
8
8
9



5.7 DS18B20的時(shí)序圖
DS18B20的初始化:
  (1) 先將數(shù)據(jù)線置高電平“1”。
  (2) 延時(shí)(該時(shí)間要求的不是很嚴(yán)格,但是盡可能的短一點(diǎn))
  (3) 數(shù)據(jù)線拉到低電平“0”。
  (4) 延時(shí)750微秒(該時(shí)間的時(shí)間范圍可以從480到960微秒)。
  (5) 數(shù)據(jù)線拉到高電平“1”。
  (6) 延時(shí)等待(如果初始化成功則在15到60毫秒時(shí)間之內(nèi)產(chǎn)生一個(gè)由DS18B20所返回的低電平“0”。據(jù)該狀態(tài)可以來確定它的存在,但是應(yīng)注意不能無限的進(jìn)行等待,不然會(huì)使程序進(jìn)入死循環(huán),所以要進(jìn)行超時(shí)控制)。
  (7) 若CPU讀到了數(shù)據(jù)線上的低電平“0”后,還要做延時(shí),其延時(shí)的時(shí)間從發(fā)出的高電平算起(第(5)步的時(shí)間算起)最少要480微秒。
8 將數(shù)據(jù)線再次拉高到高電平“1”后結(jié)束。
圖5-4為DS18B20的初始化操作時(shí)序。

file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image025.jpg
圖5-4 DS18B20的初始化操作時(shí)序

DS18B20的寫操作:
 (1) 數(shù)據(jù)線先置低電平“0”。
 (2) 延時(shí)確定的時(shí)間為15微秒。
。3) 按從低位到高位的順序發(fā)送字節(jié)(一次只發(fā)送一位)。
 (4) 延時(shí)時(shí)間為45微秒。
。5) 將數(shù)據(jù)線拉到高電平。
。6) 重復(fù)上(1)到(6)的操作直到所有的字節(jié)全部發(fā)送完為止。
。7) 最后將數(shù)據(jù)線拉高。

DS18B20的讀操作:
。1)將數(shù)據(jù)線拉高“1”。
 (2)延時(shí)2微秒。
。3)將數(shù)據(jù)線拉低“0”。
。4)延時(shí)15微秒。
。5)將數(shù)據(jù)線拉高“1”。
 (6)延時(shí)15微秒。
。7)讀數(shù)據(jù)線的狀態(tài)得到1個(gè)狀態(tài)位,并進(jìn)行數(shù)據(jù)處理。
 (8)延時(shí)30微秒。




圖5-5為DS18B20的1-Wire操作時(shí)序。


  
圖5-5 DS18B20的1-Wire操作時(shí)序

5.8整體程序
主程序的功能是判讀按鍵號(hào)數(shù),判斷當(dāng)前模式,根據(jù)不同模式做不同的工作。如負(fù)責(zé)溫度的實(shí)時(shí)顯示、讀出并處理DS18B20的測(cè)量溫度值,報(bào)警上下限的調(diào)整,將采集到得溫度存入MEGA16的E2PROM中等。打開程序首先進(jìn)行初始化,初始化包括變量初始化和端口初始化。初始化結(jié)束后將調(diào)用顯示函數(shù)顯示初始值。當(dāng)有按鍵按下時(shí)程序會(huì)對(duì)按下的按鍵進(jìn)行判斷,返回按下按鍵的號(hào)碼。當(dāng)按下的按鍵為1號(hào)按鍵時(shí),程序進(jìn)行模式切換,模式加1。當(dāng)按下的按鍵為2號(hào)按鍵時(shí),模式0下為讀溫度。模式1下為讀出存儲(chǔ)溫度。模式2下為報(bào)警功能開關(guān)。模式3下為溫度上下限的切換。當(dāng)按下的按鍵為3號(hào)鍵時(shí):模式0為存儲(chǔ)溫度。模式1和2為空按鍵,模式3為上下限加1。當(dāng)按下的按鍵為4號(hào)鍵時(shí),模式0,1,2都為空按鍵,模式3為上下限減1。
程序使用單片機(jī)C語言編寫,對(duì)于ATmega16的程序設(shè)計(jì),由于所需實(shí)現(xiàn)的功能較復(fù)雜,采用C語言的形式。編程軟件將使用IAR AVR軟件。該軟件是ATmega系列單片機(jī)程序設(shè)計(jì)的常用工具,既可用匯編,也支持C語言編譯。同時(shí)具有完善的調(diào)試功能。
6  系統(tǒng)調(diào)試與運(yùn)行6.1電路板的制作
在Protel DXP[12]的環(huán)境下,根據(jù)原理圖創(chuàng)建網(wǎng)絡(luò)表,再導(dǎo)入網(wǎng)絡(luò)表的設(shè)計(jì)規(guī)則,自動(dòng)生成PCB板布線圖。然后將布線圖打印到轉(zhuǎn)印紙上,通過轉(zhuǎn)印機(jī)將轉(zhuǎn)印紙上的圖轉(zhuǎn)印到覆銅板上,經(jīng)過三氯化鐵的腐蝕,即可生成電路板。
6.2 電路板的焊接
在焊接之前,以硬件電路原理圖為參照物,先對(duì)電路板進(jìn)行仔細(xì)的檢查,防止斷線、錯(cuò)線的產(chǎn)生;同時(shí)對(duì)所用的元器件進(jìn)行測(cè)量,防止有損壞的元器件被使用。在焊接時(shí),應(yīng)分塊焊接,及時(shí)測(cè)量,保證每個(gè)模塊均能正常工作,提高電路板制作的成功率。
6.3 調(diào)試及性能分析
系統(tǒng)的調(diào)試以程序?yàn)橹。軟件調(diào)試可以先編寫顯示程序并進(jìn)行硬件的性檢驗(yàn),然后分別進(jìn)行主程序、讀出溫度子程序、溫度轉(zhuǎn)換命令子程序、計(jì)算溫度子程序、顯示數(shù)據(jù)刷新等子程序的編程及調(diào)試,由于DS18B20與單片機(jī)采用串行數(shù)據(jù)傳送,因此,對(duì)DS18B20進(jìn)行讀寫編程時(shí)必須嚴(yán)格地保證讀寫時(shí)序,否則將無法讀取測(cè)量結(jié)果。本程序采用單片機(jī)C語言編寫,用EWAVR-KS4編譯器編程調(diào)試。軟件調(diào)試到能顯示溫度值,而且在有溫度變化時(shí)顯示溫度能改變就基本完成。
性能測(cè)試可用制作的溫度計(jì)和已有的成品溫度計(jì)來同時(shí)測(cè)量比較,由于DS18B20的精度很高,所以誤指標(biāo)可限制在0.1℃以內(nèi),另外-55~+125℃的測(cè)量范圍使得該溫度計(jì)完全適合一般的應(yīng)用場(chǎng)合,其低電壓供電特性可做成用電池供電的手持電子溫度計(jì)。
DS18B20溫度計(jì)還可以在高低溫報(bào)警、遠(yuǎn)距離多點(diǎn)測(cè)量控制等方面進(jìn)行應(yīng)用開發(fā),但在實(shí)際設(shè)計(jì)中應(yīng)注意以下問題:
(1)DS18B20工作時(shí)電流高達(dá)1.5mA,總線上掛接點(diǎn)數(shù)較多且同時(shí)進(jìn)行轉(zhuǎn)換時(shí),要考慮增加總線驅(qū)動(dòng),可用單片機(jī)端口在溫度轉(zhuǎn)換時(shí)導(dǎo)通一個(gè)MOSFET供電。
(2)連接DS18B20的總線電纜是有長度限制的,因此在用DS18B20進(jìn)行長距離測(cè)溫系統(tǒng)設(shè)計(jì)時(shí),要充分考慮總線分布電容和阻抗匹配等問題。
(3)在DS18B20測(cè)溫度程序設(shè)計(jì)中,向DS18B20發(fā)出溫度轉(zhuǎn)換命令后,程序總要等待DS18B20的返回信號(hào),一旦某個(gè)DS18B20接觸不好或斷線,當(dāng)程序讀該DS18B20時(shí),將沒有返回信號(hào),程序進(jìn)入死循環(huán),這一點(diǎn)在進(jìn)行DS18B20硬件連接和軟件設(shè)計(jì)時(shí)要給予一定的重視。
7結(jié)論
本設(shè)計(jì)方案達(dá)到了任務(wù)書的要求,實(shí)現(xiàn)了高精度數(shù)字溫度計(jì)的設(shè)計(jì),實(shí)現(xiàn)了較為精確的測(cè)溫功能:
(1)對(duì)被測(cè)對(duì)象的測(cè)溫結(jié)果精度可以達(dá)到0.1℃,突出了本設(shè)計(jì)的特點(diǎn);
(2)所測(cè)溫度值的范圍在-55℃~+99℃,符合指定工作溫度范圍;
(3)由蜂鳴器報(bào)警電路控制的報(bào)警功能也調(diào)試實(shí)現(xiàn),并在LED上正確顯示了溫度值;
本設(shè)計(jì)中的數(shù)字溫度計(jì)直接測(cè)溫的方式,該溫度計(jì)的靈敏度高、反應(yīng)時(shí)間短、抗干擾能力強(qiáng),而且具有測(cè)量范圍大、讀數(shù)方便等優(yōu)點(diǎn)。在接通電源時(shí),數(shù)碼管上顯示的數(shù)字如果出現(xiàn)不清晰或者出現(xiàn)抖動(dòng),這是由于電源電壓不穩(wěn)定或是接觸不良所引起的,可以使用接濾波電容的方法來解決上述現(xiàn)象。該系統(tǒng)所用的IC很少,所以成本較低,器件均為常用元件,有很高的工程應(yīng)用價(jià)值。如稍加改動(dòng)程序,可將本系統(tǒng)做成帶有控制功能的溫控系統(tǒng)。
由于時(shí)間緊迫以及本人知識(shí)水平和技術(shù)水平有限,設(shè)計(jì)當(dāng)中還有許多不足之處,程序的編寫也還不夠簡潔明了,希望在以后的學(xué)習(xí)中能學(xué)到更多的知識(shí),提高自己的技術(shù)水平,使自己的設(shè)計(jì)更好,更優(yōu)秀。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image031.jpg





8程序
#include<reg52.h>
#include <intrins.h>
#define uchar  unsigned  char
#define uint   unsigned  int
sbit DATA = P1^1; //DS18B20接入口
uchar codetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共陰極字型碼
int temp; //溫度值
int ss;                //中間的一個(gè)變量
int dd;
int j;
uchar data b;//定時(shí)器中斷次數(shù)
uchar data buf[4];//字型顯示中間變量
int alarmH=320;          //默認(rèn)報(bào)警值
int alarmL=100;
//定義開關(guān)的接入口
sbit k1=P2^5;//+
sbit k2=P2^6;//-
sbit k3=P2^7;//確認(rèn)
sbit k4=P2^4; //切換
sbit bell=P1^0; //蜂鳴器
sbit HLight=P1^2; //正溫指示燈
sbit LLight=P1^3; //負(fù)溫度指示燈
sbit warn=P1^4;  //報(bào)警指示燈
sbit Red=P1^6;          //溫度上限設(shè)置指示燈
sbit Green=P1^7; //溫度下限設(shè)置指示燈
bit set=0;        //初始化
bit Flag=0;        //設(shè)置標(biāo)志
int n;
//函數(shù)的聲明區(qū)
void key_to1();
void key_to2();
void delay(uint);
void key();
void Show();
//函數(shù)的定義區(qū)
/*延時(shí)子函數(shù)*/
void delay(uint num)
{
       while(num--) ;
}

//DS18b20溫度傳感器所需函數(shù),分為初始化,讀寫字節(jié),讀取溫度4個(gè)函數(shù)
Init_DS18B20(void)                   //傳感器初始化
{
        uchar x=0;
        DATA = 1;    //DQ復(fù)位
        delay(10);  //稍做延時(shí)
        DATA = 0;    //單片機(jī)將DQ拉低
        delay(80); //精確延時(shí) 大于 480us    //450
        DATA = 1;    //拉高總線
        delay(20);
         x=DATA;      //稍做延時(shí)后如果x=0則初始化成功 x=1則初始化失敗
        delay(30);
}
ReadOneChar(void)  //讀一個(gè)字節(jié)
{
       uchar i=0;
       uchar dat = 0;
       for (i=8;i>0;i--)
        {
                  DATA = 0; // 給脈沖信號(hào)
                  dat>>=1;
                  DATA = 1; // 給脈沖信號(hào)
                  if(DATA)
                   dat|=0x80;
                  delay(8);
        }
        return(dat);
}
WriteOneChar(unsigned char dat)        //寫一個(gè)字節(jié)
{
        uchar i=0;
        for (i=8; i>0; i--)
        {
                  DATA = 0;
                  DATA = dat&0x01;
         delay(10);
         DATA = 1;
         dat>>=1;
        }
       delay(8);
}
int ReadTemperature(void) //讀取溫度
{
       uchar a=0;
       uchar b=0;
       int t=0;
       float tt=0;
       Init_DS18B20();
       WriteOneChar(0xCC); // 跳過讀序號(hào)列號(hào)的操作
       WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換
       Init_DS18B20();
       WriteOneChar(0xCC); //跳過讀序號(hào)列號(hào)的操作
       WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度
       a=ReadOneChar();//低位
       b=ReadOneChar();//高位
       t=b;
       t<<=8;
       t=t|a;
       tt=t*0.0625;
       t= tt*10+0.5;
       return(t);
}
void display00()     //*********顯示負(fù)值子函數(shù)
{      
   dd=-(temp-1);
   buf[1]=dd/100;
        buf[2]=dd/100;
       buf[3]=dd%100/10;
       buf[0]=dd%10;
       //動(dòng)態(tài)顯示
       for(j=0;j<5;j++)
    {
       P2=0xff;                                    // 初始燈為滅的
   P0=0x00;
       P2=0xfd; //顯示小數(shù)點(diǎn)
       P0=0x80; //顯示小數(shù)點(diǎn)
       delay(100);               
   P2=0xff;  // 初始燈為滅的
   P0=0x00;
   P2=0xf7; //片選LCD1
   P0=0x40;
       delay(100);
        P2=0xff;
   P0=0x00;
   P2=0xfb;  //片選LCD2
   P0=table[buf[2]];
       delay(100);
       P2=0xff;
   P0=0x00;
       P2=0Xfd;//片選LCD3
       P0=table[buf[3]];
       delay(100);
       P2=0xff;
   P0=0x00;
       P2=0Xfe;
       P0=table[buf[0]];                 //片選LCD4        
       delay(100);
       P2=0xff;   
    }
}
//顯示正值子函數(shù)
void display()
{               
       buf[1]=temp/1000;//顯示百位
       buf[2]=temp/100%10;//顯示十位
       buf[3]=temp%100/10;//顯示個(gè)位
       buf[0]=temp%10; //小數(shù)位
       for(j=0;j<3;j++)
       {
       P2=0xff;                                    // 初始燈為滅的
   P0=0x00;
       P2=0xfd; //顯示小數(shù)點(diǎn)
       P0=0x80; //顯示小數(shù)點(diǎn)
       delay(300);               
   P2=0xff;                                    // 初始燈為滅的
   P0=0x00;
   P2=0xf7;                                     //片選LCD1
   P0=table[buf[1]];
       delay(300);
        P2=0xff;
   P0=0x00;
   P2=0xfb;                             //片選LCD2
   P0=table[buf[2]];
       delay(300);
       P2=0xff;
   P0=0x00;
       P2=0Xfd;                  //片選LCD3
       P0=table[buf[3]];
       delay(300);
       P2=0xff;
   P0=0x00;
       P2=0Xfe;
       P0=table[buf[0]];                 //片選LCD4        
       delay(300);
       P2=0xff;
       }
}
void key()        //按鍵掃描子程序
{  if(k1!=1)
       {
          delay(20);
          if(k1!=1)
          {
                while(k1!=1)
                  { key_to1();
                    for(n=0;n<8;n++)
                    Show();
               }
          }
       }
       if(k2!=1)
       {
                delay(20);
                if(k2!=1)
               {
                  while(k2!=1)
                        { key_to2();
                          for(n=0;n<8;n++)
                      Show();
                        }

                }
       }         
       if(k3!=1)
       {        TR0=1; //復(fù)位,開定時(shí)
       temp=ReadTemperature();
       }
       if(k4!=1)
       {  delay(20);
          if(k4!=1)
          {  while(k4!=1);
              set=!set;
                   if(set==0)
                   { Red=0;Green=1;}
                   else { Green=0;Red=1;}
                }
        }
}
void key_to1()
{
           TR0=0;               //關(guān)定時(shí)器
       temp+=10;
                if(temp>=1100)
                   {temp=-550;}
       if(set==0)
                {alarmH=temp;}
                else {alarmL=temp;}        
}
void key_to2()
{
           TR0=0;
      //關(guān)定時(shí)器
       temp-=10;
                if(temp<=-550)
                    {temp=1100;}
       if(set==0)
                { alarmH=temp;}
                else { alarmL=temp;}
}

void alarm(void)
{
   if(temp>alarmH||temp<alarmL)
       {   //bell=1;
           //delay(50);
                //bell=0;
                Flag=1;
    }else {Flag=0;}
}

logo()//開機(jī)的Logo  
{  P0=0x40;

   P2=0xf7;
       delay(50);
   P2=0xfb;
       delay(50);
       P2=0Xfd;
       delay(50);
       P2=0Xfe;
       delay(50);
   P1 = 0xff;         //關(guān)閉顯示
}

void Show() //顯示函數(shù),分別表示溫度正負(fù)值
{           if(temp>=0)
                {HLight=1;LLight=0;display();}
                if(temp<0)
               {HLight=0;LLight=1;display00();}
}
void main()
{      
   TCON=0x01; //定時(shí)器T0工作在01模式下
   TMOD=0X01;        
       TH0=0XD8;//裝入初值
       TL0=0XF0;
       EA=1;  //開總中斷
       ET0=1; //T0中斷
       TR0=1; //T0開始運(yùn)行計(jì)數(shù)
       EX0=1; //開外部中斷0

       for(n=0;n<500;n++)//顯示啟動(dòng)LOGo"- - - -"
       {bell=1;warn=1;logo();}
        Red=0;
       while(1)
       {
           key();
                ss=ReadTemperature();
       Show();
                alarm();   //報(bào)警函數(shù)
                if(Flag==1)
                {bell=!bell;
                 warn=!warn;}  //蜂鳴器滴滴響
                else {bell=1;
                      warn=1;}        
       }         
}
voidtime0(void) interrupt 1 using 1  //每隔10ms執(zhí)行一次此子程序
{       TH0=0X56;
       TL0=0XDC;        
       temp=ss;
}


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表