在日常生活及工農(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)警上下限。
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ī)定
由表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 | | | | | | |
LS字節(jié)
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)而完成溫度測(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)系表
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; }
|