久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3585|回復: 0
打印 上一主題 下一主題
收起左側

精密數字溫度計設計論文 送福利了

[復制鏈接]
跳轉到指定樓層
樓主



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

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

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

關鍵詞:單片機;DS18B20;LED顯示


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



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


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


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


圖3-1 數字溫度計總體電路結構框圖

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




4  硬件設計4.1總體電路設計
溫度計電路設計原理圖如圖2所示,控制器使用單片機mega16,溫度傳感器使用DS18B20,用4位共陽LED數碼管以動態掃描法實現溫度顯示。采用USB燒入程序及供電,用16M晶振。電路還包括按鍵電路,復位電路,報警電路,單片機外設電路等。整個系統的原理圖如圖4-1所示:

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

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

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

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

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

圖4-4 DS18B20內部結構圖

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

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



圖4-6  高速暫存RAM結構圖                 圖4-7   配置寄存器

表1  DS18B20分辯率的定義規定
  
R1
  
R0
分辯率/位
溫度最大轉換時間/ms
0
0
9
93.75
211  0
1
10
187.5
1
0
11
375
1
1
12
750

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

  
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字節

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

圖4-9 報警電路


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

5.1讀出溫度子程序
讀出溫度子程序的主要功能是讀出RAM中的9字節,在讀出時需進行CRC校驗,檢驗有錯時不進行溫度數據的改寫。其程序流程圖如圖5-1所示。




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


5.2 溫度轉換命令子程序
溫度轉換命令子程序主要是發溫度轉換開始命令,當采用12位分辨率時轉換時間約為750ms,在本程序設計中采用1s顯示程序延時法等待轉換的完成。

5.3計算溫度子程序
計算溫度子程序將RAM[11]取值進行BCD碼的轉換運算,并進行溫度值正負的判定,其程序流程圖如圖5-2所示。



圖5-2  計算溫度子程序流程圖


5.4顯示數據刷新子程序
顯示數據刷新子程序主要是對顯示緩沖器中的顯示數據進行刷新操作,當最高顯示位為0時將符號顯示位移入一下位,其程序流程圖如圖5-3所示。



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

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



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

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

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

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




圖5-5為DS18B20的1-Wire操作時序。


  
圖5-5 DS18B20的1-Wire操作時序

5.8整體程序
主程序的功能是判讀按鍵號數,判斷當前模式,根據不同模式做不同的工作。如負責溫度的實時顯示、讀出并處理DS18B20的測量溫度值,報警上下限的調整,將采集到得溫度存入MEGA16的E2PROM中等。打開程序首先進行初始化,初始化包括變量初始化和端口初始化。初始化結束后將調用顯示函數顯示初始值。當有按鍵按下時程序會對按下的按鍵進行判斷,返回按下按鍵的號碼。當按下的按鍵為1號按鍵時,程序進行模式切換,模式加1。當按下的按鍵為2號按鍵時,模式0下為讀溫度。模式1下為讀出存儲溫度。模式2下為報警功能開關。模式3下為溫度上下限的切換。當按下的按鍵為3號鍵時:模式0為存儲溫度。模式1和2為空按鍵,模式3為上下限加1。當按下的按鍵為4號鍵時,模式0,1,2都為空按鍵,模式3為上下限減1。
程序使用單片機C語言編寫,對于ATmega16的程序設計,由于所需實現的功能較復雜,采用C語言的形式。編程軟件將使用IAR AVR軟件。該軟件是ATmega系列單片機程序設計的常用工具,既可用匯編,也支持C語言編譯。同時具有完善的調試功能。
6  系統調試與運行6.1電路板的制作
在Protel DXP[12]的環境下,根據原理圖創建網絡表,再導入網絡表的設計規則,自動生成PCB板布線圖。然后將布線圖打印到轉印紙上,通過轉印機將轉印紙上的圖轉印到覆銅板上,經過三氯化鐵的腐蝕,即可生成電路板。
6.2 電路板的焊接
在焊接之前,以硬件電路原理圖為參照物,先對電路板進行仔細的檢查,防止斷線、錯線的產生;同時對所用的元器件進行測量,防止有損壞的元器件被使用。在焊接時,應分塊焊接,及時測量,保證每個模塊均能正常工作,提高電路板制作的成功率。
6.3 調試及性能分析
系統的調試以程序為主。軟件調試可以先編寫顯示程序并進行硬件的性檢驗,然后分別進行主程序、讀出溫度子程序、溫度轉換命令子程序、計算溫度子程序、顯示數據刷新等子程序的編程及調試,由于DS18B20與單片機采用串行數據傳送,因此,對DS18B20進行讀寫編程時必須嚴格地保證讀寫時序,否則將無法讀取測量結果。本程序采用單片機C語言編寫,用EWAVR-KS4編譯器編程調試。軟件調試到能顯示溫度值,而且在有溫度變化時顯示溫度能改變就基本完成。
性能測試可用制作的溫度計和已有的成品溫度計來同時測量比較,由于DS18B20的精度很高,所以誤指標可限制在0.1℃以內,另外-55~+125℃的測量范圍使得該溫度計完全適合一般的應用場合,其低電壓供電特性可做成用電池供電的手持電子溫度計。
DS18B20溫度計還可以在高低溫報警、遠距離多點測量控制等方面進行應用開發,但在實際設計中應注意以下問題:
(1)DS18B20工作時電流高達1.5mA,總線上掛接點數較多且同時進行轉換時,要考慮增加總線驅動,可用單片機端口在溫度轉換時導通一個MOSFET供電。
(2)連接DS18B20的總線電纜是有長度限制的,因此在用DS18B20進行長距離測溫系統設計時,要充分考慮總線分布電容和阻抗匹配等問題。
(3)在DS18B20測溫度程序設計中,向DS18B20發出溫度轉換命令后,程序總要等待DS18B20的返回信號,一旦某個DS18B20接觸不好或斷線,當程序讀該DS18B20時,將沒有返回信號,程序進入死循環,這一點在進行DS18B20硬件連接和軟件設計時要給予一定的重視。
7結論
本設計方案達到了任務書的要求,實現了高精度數字溫度計的設計,實現了較為精確的測溫功能:
(1)對被測對象的測溫結果精度可以達到0.1℃,突出了本設計的特點;
(2)所測溫度值的范圍在-55℃~+99℃,符合指定工作溫度范圍;
(3)由蜂鳴器報警電路控制的報警功能也調試實現,并在LED上正確顯示了溫度值;
本設計中的數字溫度計直接測溫的方式,該溫度計的靈敏度高、反應時間短、抗干擾能力強,而且具有測量范圍大、讀數方便等優點。在接通電源時,數碼管上顯示的數字如果出現不清晰或者出現抖動,這是由于電源電壓不穩定或是接觸不良所引起的,可以使用接濾波電容的方法來解決上述現象。該系統所用的IC很少,所以成本較低,器件均為常用元件,有很高的工程應用價值。如稍加改動程序,可將本系統做成帶有控制功能的溫控系統。
由于時間緊迫以及本人知識水平和技術水平有限,設計當中還有許多不足之處,程序的編寫也還不夠簡潔明了,希望在以后的學習中能學到更多的知識,提高自己的技術水平,使自己的設計更好,更優秀。
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;                //中間的一個變量
int dd;
int j;
uchar data b;//定時器中斷次數
uchar data buf[4];//字型顯示中間變量
int alarmH=320;          //默認報警值
int alarmL=100;
//定義開關的接入口
sbit k1=P2^5;//+
sbit k2=P2^6;//-
sbit k3=P2^7;//確認
sbit k4=P2^4; //切換
sbit bell=P1^0; //蜂鳴器
sbit HLight=P1^2; //正溫指示燈
sbit LLight=P1^3; //負溫度指示燈
sbit warn=P1^4;  //報警指示燈
sbit Red=P1^6;          //溫度上限設置指示燈
sbit Green=P1^7; //溫度下限設置指示燈
bit set=0;        //初始化
bit Flag=0;        //設置標志
int n;
//函數的聲明區
void key_to1();
void key_to2();
void delay(uint);
void key();
void Show();
//函數的定義區
/*延時子函數*/
void delay(uint num)
{
       while(num--) ;
}

//DS18b20溫度傳感器所需函數,分為初始化,讀寫字節,讀取溫度4個函數
Init_DS18B20(void)                   //傳感器初始化
{
        uchar x=0;
        DATA = 1;    //DQ復位
        delay(10);  //稍做延時
        DATA = 0;    //單片機將DQ拉低
        delay(80); //精確延時 大于 480us    //450
        DATA = 1;    //拉高總線
        delay(20);
         x=DATA;      //稍做延時后如果x=0則初始化成功 x=1則初始化失敗
        delay(30);
}
ReadOneChar(void)  //讀一個字節
{
       uchar i=0;
       uchar dat = 0;
       for (i=8;i>0;i--)
        {
                  DATA = 0; // 給脈沖信號
                  dat>>=1;
                  DATA = 1; // 給脈沖信號
                  if(DATA)
                   dat|=0x80;
                  delay(8);
        }
        return(dat);
}
WriteOneChar(unsigned char dat)        //寫一個字節
{
        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); // 跳過讀序號列號的操作
       WriteOneChar(0x44); // 啟動溫度轉換
       Init_DS18B20();
       WriteOneChar(0xCC); //跳過讀序號列號的操作
       WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
       a=ReadOneChar();//低位
       b=ReadOneChar();//高位
       t=b;
       t<<=8;
       t=t|a;
       tt=t*0.0625;
       t= tt*10+0.5;
       return(t);
}
void display00()     //*********顯示負值子函數
{      
   dd=-(temp-1);
   buf[1]=dd/100;
        buf[2]=dd/100;
       buf[3]=dd%100/10;
       buf[0]=dd%10;
       //動態顯示
       for(j=0;j<5;j++)
    {
       P2=0xff;                                    // 初始燈為滅的
   P0=0x00;
       P2=0xfd; //顯示小數點
       P0=0x80; //顯示小數點
       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;   
    }
}
//顯示正值子函數
void display()
{               
       buf[1]=temp/1000;//顯示百位
       buf[2]=temp/100%10;//顯示十位
       buf[3]=temp%100/10;//顯示個位
       buf[0]=temp%10; //小數位
       for(j=0;j<3;j++)
       {
       P2=0xff;                                    // 初始燈為滅的
   P0=0x00;
       P2=0xfd; //顯示小數點
       P0=0x80; //顯示小數點
       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; //復位,開定時
       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;               //關定時器
       temp+=10;
                if(temp>=1100)
                   {temp=-550;}
       if(set==0)
                {alarmH=temp;}
                else {alarmL=temp;}        
}
void key_to2()
{
           TR0=0;
      //關定時器
       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()//開機的Logo  
{  P0=0x40;

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

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

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


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧洲亚洲精品久久久久 | 羞羞视频在线观看免费观看 | 久久免费视频2 | 国产91视频一区二区 | 91不卡| 国产一区2区 | 一区二区在线免费观看 | 人人干免费| 中文字幕亚洲精品在线观看 | 婷婷亚洲综合 | 超碰伊人久久 | 亚洲九九精品 | 国产精品久久久久久久岛一牛影视 | 在线观看亚洲一区二区 | 亚洲乱码一区二区三区在线观看 | 欧美日本久久 | 97精品国产一区二区三区 | 国产精品视频一区二区三区四区国 | 日本成人中文字幕 | 亚洲一区中文字幕 | .国产精品成人自产拍在线观看6 | 国产精品美女一区二区 | 久久精品男人的天堂 | 瑟瑟免费视频 | 亚洲精品久久区二区三区蜜桃臀 | 99久久久久 | 91久久精品日日躁夜夜躁欧美 | 二区视频| 一级欧美 | 久久久久国产精品一区二区 | 久久蜜桃av一区二区天堂 | 9999久久 | 亚洲综合区| 久久国产成人午夜av影院武则天 | 午夜视频大全 | 人人干人人看 | 操夜夜 | 久久人人网 | 久久久国产一区 | 成人在线视频网站 | 精品久久九 |