畢 業(yè) 設(shè) 計(jì)( 論 文 )數(shù)字溫度顯示報(bào)警系統(tǒng)
?畢 業(yè) 設(shè) 計(jì)( 論? 文 )
?
題??? 目:? 數(shù)字溫度顯示報(bào)警系統(tǒng)?
專??? 業(yè):????? 電子信息工程?????
班??? 級:?????? 06(2)班???????
姓??? 名:? ? ? ? 石昊? ? ? ??
學(xué)??? 號:????? 2006654212???????
指導(dǎo)教師:?????? 葉凡??????????
日??? 期:???? 2010年6月5日????
?
?
?
?
目?? ??錄
?
引言. 2
2. 設(shè)計(jì)要求. 2
2.1基本功能. 2
2.2擴(kuò)展功能. 2
3. 總體設(shè)計(jì)方案. 3
3.1數(shù)字溫度計(jì)設(shè)計(jì)方案論證. 3
3.1.1 方案一. 3
3.1.2 方案二. 3
3.2 總體設(shè)計(jì)框圖. 3
3.3單片機(jī)的選擇. 3
3.4 溫度傳感器的選擇. 5
3.4.1 DS18B20的介紹. 5
3.5 顯示模塊選擇. 7
3.5.1數(shù)碼管的分類. 8
3.5.2數(shù)碼管驅(qū)動原理. 8
4. 系統(tǒng)硬件電路設(shè)計(jì). 9
4.1系統(tǒng)整體電路圖. 9
4.2 單片機(jī)最小系統(tǒng). 10
4.3 溫度傳感器系統(tǒng). 10
4.3.1 DS18B20的測溫原理. 11
4.4 報(bào)警電路設(shè)計(jì). 12
4.5 顯示電路設(shè)計(jì). 12
4.6電源電路設(shè)計(jì). 13
5. 系統(tǒng)軟件設(shè)計(jì). 14
5.1主程序. 14
5.2讀出溫度子程序. 15
5.3溫度轉(zhuǎn)換命令子程序. 15
5.4 計(jì)算溫度子程序. 15
5.4 鍵盤掃描流程圖. 17
6. 測試與結(jié)果分析. 17
6.1仿真軟件介紹. 17
6.2 仿真結(jié)果. 18
6.2.1 用Keil進(jìn)行程序編譯. 18
6.2.2 在Proteus中仿真. 19
7. 總結(jié)與致謝. 22
參考文獻(xiàn):. 23
英文摘要:. 24
附錄:源程序. 25
數(shù)字溫度顯示報(bào)警系統(tǒng)
?
摘要:隨著時(shí)代的進(jìn)步和發(fā)展,單片機(jī)技術(shù)已經(jīng)普及到我們生活,工作,科研,各個領(lǐng)域,已經(jīng)成為一種比較成熟的技術(shù),本文將介紹一種基于單片機(jī)控制的數(shù)字溫度計(jì),利用單片機(jī)AT89S52設(shè)計(jì)了一種數(shù)字溫度計(jì),它由單片機(jī)、DS18B20傳感器以及LED 數(shù)碼管等部件組成,本溫度計(jì)屬于多功能溫度計(jì),功能較強(qiáng),可以設(shè)置上下限報(bào)警溫度,且測量準(zhǔn)確、誤差小。當(dāng)測量溫度超過設(shè)定的溫度上下限時(shí),啟動蜂鳴器和指示燈報(bào)警。
關(guān)鍵詞:單片機(jī)AT89S52;溫度計(jì);DS18B20;溫度顯示
引言
溫度是工業(yè)控制中主要的被控參數(shù)之一,特別是在冶金、化工、建材、食品、機(jī)械、石油等工業(yè)中,具有舉足重輕的作用。對于不同場所、不同工藝、所需溫度高低范圍不同、精度不同,則采用的測溫元件、測溫方法以及對溫度的控制方法也將不同;產(chǎn)品工藝不同、控制溫度的精度不同、時(shí)效不同,則對數(shù)據(jù)采集的精度和采用的控制算法也不同,因而,對溫度的測控方法多種多樣。隨著電子技術(shù)和微型計(jì)算機(jī)的迅速發(fā)展,微機(jī)測量和控制技術(shù)也得到了迅速的發(fā)展和廣泛的應(yīng)用[1]。利用微機(jī)對溫度進(jìn)行測控的技術(shù),也便隨之而生,并得到日益發(fā)展和完善,越來越顯示出其優(yōu)越性。
隨著人們生活水平的不斷提高,單片機(jī)控制無疑是人們追求的目標(biāo)之一,它所給人帶來的方便也是不可否定的,其中數(shù)字溫度計(jì)就是一個典型的例子,但人們對它的要求越來越高,要為現(xiàn)代人工作、科研、生活、提供更好的更方便的設(shè)施就需要從數(shù)單片機(jī)技術(shù)入手,一切向著數(shù)字化控制,智能化控制方向發(fā)展[2]。
本設(shè)計(jì)即用單片機(jī)對溫度進(jìn)行實(shí)時(shí)檢測與控制,本文所介紹的數(shù)字溫度計(jì)與傳統(tǒng)的溫度計(jì)相比,具有讀數(shù)方便,測溫范圍廣,測溫準(zhǔn)確,其輸出溫度采用數(shù)字顯示,主要用于對測溫比較準(zhǔn)確的場所,或科研實(shí)驗(yàn)室使用,該設(shè)計(jì)控制器使用單片機(jī)AT89S52,測溫傳感器使用DS18B20,用4位共陽極LED數(shù)碼管以串口傳送數(shù)據(jù),實(shí)現(xiàn)溫度顯示,能準(zhǔn)確達(dá)到設(shè)計(jì)要求。本溫度計(jì)屬于多功能溫度計(jì),功能較強(qiáng),可以設(shè)置上下限報(bào)警溫度,且測量準(zhǔn)確、誤差小。當(dāng)測量溫度超過設(shè)定的溫度上下限時(shí),啟動蜂鳴器和指示燈報(bào)警。
2. 設(shè)計(jì)要求
2.1基本功能
■? 基本范圍0℃-99℃
■? 精度誤差小于0.5℃
■? LED數(shù)碼直讀顯示
2.2擴(kuò)展功能
■? 實(shí)現(xiàn)聲光報(bào)警
■? 可以任意設(shè)定溫度的上下限報(bào)警功能
3. 總體設(shè)計(jì)方案
3.1數(shù)字溫度計(jì)設(shè)計(jì)方案論證
3.1.1 方案一
由于本設(shè)計(jì)是測溫電路,根據(jù)設(shè)計(jì)要求可以使用熱敏電阻之類的感溫器件利用其感溫效應(yīng),然后將隨被測溫度變化的電壓或電流采集過來,經(jīng)過A/D轉(zhuǎn)換后,將數(shù)據(jù)傳輸?shù)絾纹瑱C(jī)進(jìn)行數(shù)據(jù)的處理,然后在顯示電路上顯示,這樣就可以將被測溫度顯示出來,這種設(shè)計(jì)需要用到A/D轉(zhuǎn)換電路,感溫電路比較麻煩。
3.1.2 方案二
在單片機(jī)電路設(shè)計(jì)中,大多都是使用傳感器,這是非常容易想到利用數(shù)字溫度傳感器,所以可以采用一只溫度傳感器DS18B20,此傳感器,可以很容易直接讀取被測溫度值,進(jìn)行轉(zhuǎn)換,然后傳輸給單片機(jī)進(jìn)行數(shù)據(jù)處理,就可以滿足設(shè)計(jì)要求。
從以上兩種方案,很容易看出,采用方案二,電路設(shè)計(jì)比較簡潔,軟件設(shè)計(jì)也比較簡單,故采用方案二。
3.2 總體設(shè)計(jì)框圖
溫度計(jì)電路設(shè)計(jì)總體設(shè)計(jì)方框圖如圖3.2.1所示,控制器采用單片機(jī)AT89S52,溫度傳感器采用DS18B20,用4位LED數(shù)碼管以串口傳送數(shù)據(jù)實(shí)現(xiàn)溫度顯示。
?
?
?
?
?
?
?
?
?
圖3.2.1 總體設(shè)計(jì)方框圖
3.3單片機(jī)的選擇
方案一:選擇Microchip公司的PIC系列單片機(jī)
作為世界上最為頂尖的單片機(jī)研發(fā)與生產(chǎn)企業(yè),微芯公司設(shè)計(jì)的PIC系列單片機(jī)一度風(fēng)靡全球,其優(yōu)秀的性能和卓越的品質(zhì)受到了許多人的青睞,其優(yōu)點(diǎn)毋庸贅述。但是,高知名度的缺點(diǎn)也顯而易見,價(jià)格昂貴,性價(jià)比不高是其軟肋[3]。
方案二:選擇德州儀器的MSP430系列單片機(jī)
MSP430單片機(jī)是一個 16 位的、具有精簡指令集的混合型單片機(jī),它具有極低的功耗、豐富的片內(nèi)外設(shè)和方便靈活的開發(fā)手段。但是,由于MSP430單片機(jī)系列價(jià)格較高,比較適合于較為復(fù)雜的應(yīng)用系統(tǒng)[4]。
方案三:選擇Atmel公司的AT89S52單片機(jī)
AT89S52單片機(jī)是一個低功耗,高性能CMOS 8位單片機(jī),片內(nèi)含8k Bytes ISP(In-system programmable)的可反復(fù)擦寫1000次的Flash只讀程序存儲器,器件采用ATMEL公司的高密度、非易失性存儲技術(shù)制造,兼容標(biāo)準(zhǔn)MCS-51指令系統(tǒng)及80C51引腳結(jié)構(gòu),芯片內(nèi)集成了通用8位中央處理器和ISP Flash存儲單元,片上Flash允許程序存儲器在系統(tǒng)可編程,亦適于 常規(guī)編程器,在功能強(qiáng)大的微型計(jì)算機(jī)的AT89S52單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使得AT89S52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、超有效的解決方案可為許多嵌入式控制應(yīng)用系統(tǒng)提供高性價(jià)比的解決方案[5]。AT89S52引腳結(jié)構(gòu)圖如圖3.3.1:
?
?
圖3.3.1? AT89S52結(jié)構(gòu)圖
?
AT89S52 實(shí)物圖如圖3.3.2:
圖 3.3.2? AT89S52 實(shí)物圖
基于對成本和性能的比較,我們選擇AT89S52單片機(jī)。
3.4 溫度傳感器的選擇
3.4.1 DS18B20的介紹
溫度傳感器的種類眾多,在應(yīng)用與高精度、高可靠性的場合時(shí) DALLAS(達(dá)拉斯)公司生產(chǎn)的 DS18B20 溫度傳感器當(dāng)仁不讓。超小的體積,超低的硬件開消,抗干擾能力強(qiáng),精度高,附加功能強(qiáng),使得 DS18B20 更受歡迎。
DS18B20 的主要特征:
● 全數(shù)字溫度轉(zhuǎn)換及輸出;
● 最高 12 位分辨率,精度可達(dá)土 0.5攝氏度;
● 12 位分辨率時(shí)的最大工作周期為 750 毫秒;
● 可選擇寄生工作方式;
● 檢測溫度范圍為–55°C~+125°C (–67°F ~+257°F);
● 內(nèi)置 EEPROM,限溫報(bào)警功能。用戶可定義報(bào)警設(shè)置 ;
● 64 位光刻 ROM,內(nèi)置產(chǎn)品序列號,方便多機(jī)掛接;
● 多樣封裝形式,適應(yīng)不同硬件系統(tǒng);
● 獨(dú)特的單線接口僅需要一個端口引腳進(jìn)行通信;
● 多個DS18B20 可以并聯(lián)在惟一的三線上,實(shí)現(xiàn)多點(diǎn)組網(wǎng)功能;
● 無須外部器件;
● 可通過數(shù)據(jù)線供電,電壓范圍為3.0~5.5V;
● 零待機(jī)功耗;
● 溫度以9 或12 位數(shù)字;
● 報(bào)警搜索命令識別并標(biāo)志超過程序限定溫度(溫度報(bào)警條件)的器件;
● 負(fù)電壓特性,電源極性接反時(shí),溫度計(jì)不會因發(fā)熱而燒毀,但不能正常工作;
DS18B20它有64 位ROM 的結(jié)構(gòu)開始8 位是產(chǎn)品類型的編號,接著是每個器件的惟一的序號,共有48 位,最后8 位是前面56位的CRC 檢驗(yàn)碼,這也是多個DS18B20 可以采用一線進(jìn)行通信的原因。溫度報(bào)警觸發(fā)器TH 和TL,可通過軟件寫入戶報(bào)警上下限[6]。
另外,由于DS18B20 單線通信功能是分時(shí)完成的,它有嚴(yán)格的時(shí)隙概念,因此讀寫時(shí)序很重要。系統(tǒng)對DS18B20 的各種操作按協(xié)議進(jìn)行。操作協(xié)議為:初始化DS18B20(發(fā)復(fù)位脈沖)→發(fā)ROM 功能命令→發(fā)存儲器操作命令→處理數(shù)據(jù)。
DS18B20芯片封裝結(jié)構(gòu)如圖3.4.1:
圖 3.4.1? DS18B20芯片封裝結(jié)構(gòu)
DS18B20采用3腳PR-35封裝或8腳SOIC封裝,其內(nèi)部結(jié)構(gòu)框圖如圖3.4.2所示。
?
?
I/O
?圖 3.4.2? DS18B20內(nèi)部結(jié)構(gòu)框
DS18B20 工作原理
DS18B20 的溫度檢測與數(shù)字?jǐn)?shù)據(jù)輸出全集成于一個芯片之上,從而抗干擾力更強(qiáng)。其一個工作周期可分為兩個部分,即溫度檢測和數(shù)據(jù)處理。在講解其工作流程之前我們有必要了解18B20的內(nèi)部存儲器資源。DS18B20 共有三種形態(tài)的存儲器資源,它們分別是:
ROM? 只讀存儲器,用于存放 DS18B20ID 編碼,其前 8 位是單線系列編碼(DS18B20 的編碼是19H),后面48 位是芯片唯一的序列號,最后 8位是以上 56的位的 CRC碼(冗余校驗(yàn))。數(shù)據(jù)在出產(chǎn)時(shí)設(shè)置不由用戶更改。DS18B20 共 64 位 ROM。
RAM? 數(shù)據(jù)暫存器,用于內(nèi)部計(jì)算和數(shù)據(jù)存取,數(shù)據(jù)在掉電后丟失,DS18B20 共9 個字節(jié) RAM,每個字節(jié)為 8 位。第1、2 個字節(jié)是溫度轉(zhuǎn)換后的數(shù)據(jù)值信息,第 3、4 個字節(jié)是用戶 EEPROM(常用于溫度報(bào)警值儲存)的鏡像。在上電復(fù)位時(shí)其值將被刷新。第 5 個字節(jié)則是用戶第 3 個 EEPROM的鏡像。第 6、7、8 個字節(jié)為計(jì)數(shù)寄存器,是為了讓用戶得到更高的溫度分辨率而設(shè)計(jì)的,同樣也是內(nèi)部溫度轉(zhuǎn)換、計(jì)算的暫存單元。第 9 個字節(jié)為前 8個字節(jié)的 CRC碼。
EEPROM? 非易失性記憶體,用于存放長期需要保存的數(shù)據(jù),上下限溫度報(bào)警值和校驗(yàn)數(shù)據(jù),DS18B20共3位EEPROM,并在 RAM 都存在鏡像,以方便用戶操作[7]。
DS18B20工作時(shí)寄存器中的分辨率轉(zhuǎn)換為相應(yīng)精度的溫度數(shù)值。該字節(jié)各位的定義如圖3.4.3所示。低5位一直為1,TM是工作模式位,用于設(shè)置DS18B20在工作模式還是在測試模式,DS18B20出廠時(shí)該位被設(shè)置為0,用戶要去改動,R1和R0決定溫度轉(zhuǎn)換的精度位數(shù),來設(shè)置分辨率。
?
溫度? LSB
溫度? MSB
TH用戶字節(jié)1
TL用戶字節(jié)2
配置寄存器
保留
保留
保留
CRC
?
?
?
?
?
?
?
?
?
?
TM
R1
R0
1
1
1
1
1
?
圖3.4.3 DS18B20字節(jié)定義
?
3.5 顯示模塊選擇
數(shù)碼管是一種半導(dǎo)體發(fā)光器件,其基本單元是發(fā)光二極管。
?3.5.1數(shù)碼管的分類
數(shù)碼管按段數(shù)分為七段數(shù)碼管和八段數(shù)碼管,八段數(shù)碼管比七段數(shù)碼管多一個發(fā)光二極管單元(多一個小數(shù)點(diǎn)顯示);按能顯示多少個“8”可分為1位、2位、4位等等數(shù)碼管;按發(fā)光二極管單元連接方式分為共陽極數(shù)碼管和共陰極數(shù)碼管。共陽數(shù)碼管是指將所有發(fā)光二極管的陽極接到一起形成公共陽極(COM)的數(shù)碼管。共陽數(shù)碼管在應(yīng)用時(shí)應(yīng)將公共極COM接到+5V,當(dāng)某一字段發(fā)光二極管的陰極為低電平時(shí),相應(yīng)字段就點(diǎn)亮。當(dāng)某一字段的陰極為高電平時(shí),相應(yīng)字段就不亮。。共陰數(shù)碼管是指將所有發(fā)光二極管的陰極接到一起形成公共陰極(COM)的數(shù)碼管。共陰數(shù)碼管在應(yīng)用時(shí)應(yīng)將公共極COM接到地線GND上,當(dāng)某一字段發(fā)光二極管的陽極為高電平時(shí),相應(yīng)字段就點(diǎn)亮。當(dāng)某一字段的陽極為低電平時(shí),相應(yīng)字段就不亮[8]。如圖3.5.1
??? ???????????
?
圖3.5.1 八段數(shù)碼管事物圖
3.5.2數(shù)碼管驅(qū)動原理
?數(shù)碼管要正常顯示,就要用驅(qū)動電路來驅(qū)動數(shù)碼管的各個段碼,從而顯示出我們要的數(shù)字,在有些時(shí)候需要做一個簡單的顯示系統(tǒng)。那么在單片機(jī)I/O資源夠用的情況下可以直接用單片機(jī)的I/O口驅(qū)動數(shù)碼管,也可以根據(jù)數(shù)碼管的驅(qū)動方式的不同,可以分為靜態(tài)式和動態(tài)式兩類。
(1)靜態(tài)顯示驅(qū)動:靜態(tài)驅(qū)動也稱直流驅(qū)動。靜態(tài)驅(qū)動是指每個數(shù)碼管的每一個段碼都由一個單片機(jī)的I/O端口進(jìn)行驅(qū)動,或者使用如BCD碼二-十進(jìn)制譯碼器譯碼進(jìn)行驅(qū)動。靜態(tài)驅(qū)動的優(yōu)點(diǎn)是編程簡單,顯示亮度高,缺點(diǎn)是占用I/O端口多,如驅(qū)動5個數(shù)碼管靜態(tài)顯示則需要5×8=40根I/O端口來驅(qū)動,要知道一個89S51單片機(jī)可用的I/O端口才32個呢),實(shí)際應(yīng)用時(shí)必須增加譯碼驅(qū)動器進(jìn)行驅(qū)動,增加了硬件電路的復(fù)雜性[8]。
(2)動態(tài)顯示驅(qū)動:數(shù)碼管動態(tài)顯示接口是單片機(jī)中應(yīng)用最為廣泛的一種顯示方式之一,動態(tài)驅(qū)動是將所有數(shù)碼管的8個顯示筆劃"a,b,c,d,e,f,g,dp"的同名端連在一起,另外為每個數(shù)碼管的公共極COM增加位選通控制電路,位選通由各自獨(dú)立的I/O線控制,當(dāng)單片機(jī)輸出字形碼時(shí),所有數(shù)碼管都接收到相同的字形碼,但究竟是那個數(shù)碼管會顯示出字形,取決于單片機(jī)對位選通COM端電路的控制,所以我們只要將需要顯示的數(shù)碼管的選通控制打開,該位就顯示出字形,沒有選通的數(shù)碼管就不會亮[9]。通過分時(shí)輪流控制各個數(shù)碼管的的COM端,就使各個數(shù)碼管輪流受控顯示,這就是動態(tài)驅(qū)動。在輪流顯示過程中,每位數(shù)碼管的點(diǎn)亮?xí)r間為1~2ms,由于人的視覺暫留現(xiàn)象及發(fā)光二極管的余輝效應(yīng),盡管實(shí)際上各位數(shù)碼管并非同時(shí)點(diǎn)亮,但只要掃描的速度足夠快,給人的印象就是一組穩(wěn)定的顯示數(shù)據(jù),不會有閃爍感,動態(tài)顯示的效果和靜態(tài)顯示是一樣的,能夠節(jié)省大量的I/O端口,而且功耗更低[10]。
靜態(tài)驅(qū)動方式簡單不容易出錯,如果電路設(shè)計(jì)合適,也能夠用較少的線完成多個數(shù)碼管的驅(qū)動。但是動態(tài)驅(qū)動方式省單片機(jī)的資源,如今已經(jīng)有很多這樣成熟的基于動態(tài)掃描的芯片。
所以能滿足本文顯示設(shè)計(jì)要求,采用LG3641BH LED數(shù)碼管做為顯示電路,數(shù)碼管顯示電路采用4位共陽LED數(shù)碼管從P14,P15,P16,P17串口輸出段碼。
4. 系統(tǒng)硬件電路設(shè)計(jì)
4.1系統(tǒng)整體電路圖
該系統(tǒng)電路主要包括:單片機(jī)最小系統(tǒng)、DS18B20溫度傳感器系統(tǒng)、報(bào)警系統(tǒng)、LED顯示模塊電路及電源接口和數(shù)據(jù)下載接口等電路,如圖 4.1.1所示。
圖中有三個獨(dú)立式按鍵可以分別調(diào)整溫度計(jì)的上下限報(bào)警設(shè)置,圖中蜂鳴器可以在被測溫度不在上下限范圍內(nèi)時(shí),發(fā)出報(bào)警鳴叫聲音,同時(shí)LED數(shù)碼管將沒有被測溫度值顯示,這時(shí)可以調(diào)整報(bào)警上下限,從而測出被測的溫度值。
??? 圖中的按健復(fù)位電路是上電復(fù)位加手動復(fù)位,使用比較方便,在程序跑飛時(shí),可以手動復(fù)位,這樣就不用在重起單片機(jī)電源,就可以實(shí)現(xiàn)復(fù)位。????????
圖 4.1.1 系統(tǒng)整體電路圖
?
?
4.2 單片機(jī)最小系統(tǒng)
最小系統(tǒng)包括晶振電路、復(fù)位電路、按鍵設(shè)置部分,AT89S52單片機(jī)最小系統(tǒng)的電路如圖:4.2.1
單片機(jī)AT89S52具有低電壓供電和體積小等特點(diǎn),四個端口只需要兩個口就能滿足電路系統(tǒng)的設(shè)計(jì)需要[11],很適合便攜手持式產(chǎn)品的設(shè)計(jì)使用系統(tǒng)可用二節(jié)電池供電。
?
??????????????????????????? 圖 4.2.1 單片機(jī)最小系統(tǒng)電路
4.3 溫度傳感器系統(tǒng)
DS18B20溫度傳感器電路,如圖 4.3.1。
圖 4.3.1? DS18B20溫度傳感器系統(tǒng)
DS18B20采用單線進(jìn)行數(shù)據(jù)傳輸,外接一個4.7k上拉電阻與單片機(jī)的P10口相連進(jìn)行數(shù)據(jù)的雙向傳輸[12]。
4.3.1 DS18B20的測溫原理
器件中低溫度系數(shù)晶振的振蕩頻率受溫度的影響很小,用于產(chǎn)生固定頻率的脈沖信號送給減法計(jì)數(shù)器1;高溫度系數(shù)晶振隨溫度變化其振蕩頻率明顯改變,所產(chǎn)生的信號作為減法計(jì)數(shù)器2的脈沖輸入。器件中還有一個計(jì)數(shù)門,當(dāng)計(jì)數(shù)門打開時(shí),DS18B20就對低溫度系數(shù)振蕩器產(chǎn)生的時(shí)鐘脈沖進(jìn)行計(jì)數(shù)進(jìn)而完成溫度測量。計(jì)數(shù)門的開啟時(shí)間由高溫度系數(shù)振蕩器來決定,每次測量前,首先將-55℃所對應(yīng)的一個基數(shù)分別置入減法計(jì)數(shù)器1、溫度寄存器中,計(jì)數(shù)器1和溫度寄存器被預(yù)置在-55℃所對應(yīng)的一個基數(shù)值。
減法計(jì)數(shù)器1對低溫度系數(shù)晶振產(chǎn)生的脈沖信號進(jìn)行減法計(jì)數(shù),當(dāng)減法計(jì)數(shù)器1的預(yù)置值減到0時(shí),溫度寄存器的值將加1,減法計(jì)數(shù)器1的預(yù)置將重新被裝入,減法計(jì)數(shù)器1重新開始對低溫度系數(shù)晶振產(chǎn)生的脈沖信號進(jìn)行計(jì)數(shù),如此循環(huán)直到減法計(jì)數(shù)器計(jì)數(shù)到0時(shí),停止溫度寄存器的累加,此時(shí)溫度寄存器中的數(shù)值就是所測溫度值。其輸出用于修正減法計(jì)數(shù)器的預(yù)置值,只要計(jì)數(shù)器門仍未關(guān)閉就重復(fù)上述過程,直到溫度寄存器值大致被測溫度值[13]。
由表1可見,DS18B20溫度轉(zhuǎn)換的時(shí)間比較長,而且分辨率越高,所需要的溫度數(shù)據(jù)轉(zhuǎn)換時(shí)間越長。因此,在實(shí)際應(yīng)用中要將分辨率和轉(zhuǎn)換時(shí)間權(quán)衡考慮。
高速暫存RAM的第6、7、8字節(jié)保留未用,表現(xiàn)為全邏輯1。第9字節(jié)讀出前面所有8字節(jié)的CRC碼,可用來檢驗(yàn)數(shù)據(jù),從而保證通信數(shù)據(jù)的正確性。
當(dāng)DS18B20接收到溫度轉(zhuǎn)換命令后,開始啟動轉(zhuǎn)換。轉(zhuǎn)換完成后的溫度值就以16位帶符號擴(kuò)展的二進(jìn)制補(bǔ)碼形式存儲在高速暫存存儲器的第1、2字節(jié)。單片機(jī)可以通過單線接口讀出該數(shù)據(jù),讀數(shù)據(jù)時(shí)低位在先,高位在后,數(shù)據(jù)格式以0.0625℃/LSB形式表示。
當(dāng)符號位S=0時(shí),表示測得的溫度值為正值,可以直接將二進(jìn)制位轉(zhuǎn)換為十進(jìn)制;當(dāng)符號位S=1時(shí),表示測得的溫度值為負(fù)值,要先將補(bǔ)碼變成原碼,再計(jì)算十進(jìn)制數(shù)值。表2是一部分溫度值對應(yīng)的二進(jìn)制溫度數(shù)據(jù)[14]。
?
表1 DS18B20溫度轉(zhuǎn)換時(shí)間表
R1
R0
分辨率/位
溫度最大轉(zhuǎn)向時(shí)間/ms
0
0
9
93.75
0
1
10
187.5
1
0
11
375
1
1
12
750
?
DS18B20完成溫度轉(zhuǎn)換后,就把測得的溫度值與RAM中的TH、TL字節(jié)內(nèi)容作比較。若T>TH或T<TL,則將該器件內(nèi)的報(bào)警標(biāo)志位置位,并對主機(jī)發(fā)出的報(bào)警搜索命令作出響應(yīng)。因此,可用多只DS18B20同時(shí)測量溫度并進(jìn)行報(bào)警搜索。
在64位ROM的最高有效字節(jié)中存儲有循環(huán)冗余檢驗(yàn)碼(CRC)。主機(jī)ROM的前56位來計(jì)算CRC值,并和存入DS18B20的CRC值作比較,以判斷主機(jī)收到的ROM數(shù)據(jù)是否正確。
?
?
表2 一部分溫度對應(yīng)值表
溫度/℃
二進(jìn)制表示
十六進(jìn)制表示
+125
0000 0111??? 1101 0000
07D0H
+85
0000 0101??? 0101 0000
0550H
+25.0625
0000 0001??? 1001 0000
0191H
+10.125
0000 0000??? 1010 0001
00A2H
+0.5
0000 0000??? 0000 0010
0008H
0
0000 0000??? 0000 1000
0000H
-0.5
1111 1111??? 1111 0000
FFF8H
-10.125
1111 1111??? 0101 1110
FF5EH
-25.0625
1111 1110??? 0110 1111
FE6FH
-55
1111 1100??? 1001 0000
FC90H
?
4.4 報(bào)警電路設(shè)計(jì)
報(bào)警電路中加一PNP三極管驅(qū)動,基極接單片機(jī)P11口,當(dāng)端口變成低電平時(shí),驅(qū)動三極管會導(dǎo)通,VCC電壓加載到蜂鳴器使其發(fā)聲、報(bào)警發(fā)光二極管亮,如圖4.4.1。
圖 4.4.1 報(bào)警電路
?
4.5 顯示電路設(shè)計(jì)
如圖4.5.1,采用LG3641BH LED數(shù)碼管顯示電路采用4位共陽LED數(shù)碼管從P14,P15,P16,P17串口輸出段碼。用PNP三極管進(jìn)行驅(qū)動,當(dāng)相應(yīng)的端口變成低電平時(shí),驅(qū)動相應(yīng)的三極管會導(dǎo)通,驅(qū)動三極管給數(shù)碼管相應(yīng)的位供電,這時(shí)只要P0口送出數(shù)字的顯示代碼,數(shù)碼管就能正常顯示數(shù)字。
?
?
圖 4.5.1 數(shù)碼管顯示電路
4.6電源電路設(shè)計(jì)
我們選用的是串聯(lián)起來的4節(jié)1.5v的5號電池,從經(jīng)濟(jì)的角度考慮的,干電池比較便宜,但其還有不足之處,干電池存儲的是電量。隨著電量的消耗,它的供電電壓就會不斷的下降,所有我們需要使用一個穩(wěn)壓器,來保證電源供給的是標(biāo)準(zhǔn)的5v電壓。4節(jié)1.5v串聯(lián)起來產(chǎn)生的和電壓最大是6v,而本文的AT89S52單片機(jī)工作電壓的范圍是4v—5.5v,在該系統(tǒng)中我們使用的電壓是5v。這時(shí)我們可以用LM7805穩(wěn)壓器來產(chǎn)生穩(wěn)定的5v電壓[15]。穩(wěn)壓電路如下圖4.6.1所示:
圖4.6.1? LM7805穩(wěn)壓電路
在該電路中,C12是極性電容,起到穩(wěn)壓的作用,而C2是非極性電容,它起的作用是濾除輸出電壓中不是直流的成分,即濾波。
LM7805穩(wěn)壓芯片的穩(wěn)壓壓差為2V左右,在實(shí)際使用中容易出現(xiàn)電壓過低的狀態(tài),此時(shí)提供的電源達(dá)不到系統(tǒng)的電源要求,會出現(xiàn)程序跑飛的現(xiàn)象,而另一款LM2904的穩(wěn)壓壓差可以達(dá)到40mV,效果比LM7805好很多,但考慮到經(jīng)濟(jì)原因我們采用LM7805,只要在穩(wěn)壓前端提供較大的電源供應(yīng)即可。
5. 系統(tǒng)軟件設(shè)計(jì)
系統(tǒng)程序主要包括主程序,讀出溫度子程序,溫度轉(zhuǎn)換命令子程序,計(jì)算溫度子程序,按鍵掃描。
5.1主程序
主程序的主要功能是負(fù)責(zé)讀出并處理DS18B20的測量的當(dāng)前溫度值,溫度的實(shí)時(shí)顯示,并根據(jù)設(shè)置的上下限判斷是否報(bào)警。系統(tǒng)開始運(yùn)行時(shí),溫度傳感器測量并計(jì)算溫度值通過P1.0口傳輸進(jìn)單片機(jī)里進(jìn)行處理,經(jīng)過處理后的數(shù)據(jù)再通過P0口傳輸?shù)綌?shù)碼管進(jìn)行顯示。通過按鍵設(shè)置溫度報(bào)警界限,當(dāng)超過報(bào)警界限時(shí)單片機(jī)將相應(yīng)的數(shù)據(jù)通過P1.1口傳輸進(jìn)行聲光報(bào)警。溫度測量每1s進(jìn)行一次。這樣可以在一秒之內(nèi)測量一次被測溫度,其程序流程見圖5.1.1所示。
圖5.1.1 ?主程序流程圖
5.2讀出溫度子程序
讀出溫度子程序的主要功能是讀出RAM中的9字節(jié),在讀出時(shí)需進(jìn)行CRC校驗(yàn),校驗(yàn)有錯時(shí)不進(jìn)行溫度數(shù)據(jù)的改寫。其程序流程圖如圖5.2.1示
??
?
圖5.2.1讀溫度流程圖
5.3溫度轉(zhuǎn)換命令子程序
溫度轉(zhuǎn)換命令子程序主要是發(fā)溫度轉(zhuǎn)換開始命令,當(dāng)采用12位分辨率時(shí)轉(zhuǎn)換時(shí)間約為750ms,在本程序設(shè)計(jì)中采用1s顯示程序延時(shí)法等待轉(zhuǎn)換的完成[16]。溫度轉(zhuǎn)換命令子程序流程圖如上圖,圖5.3.1所示
5.4 計(jì)算溫度子程序
計(jì)算溫度子程序?qū)AM中讀取值進(jìn)行BCD碼的轉(zhuǎn)換運(yùn)算,并進(jìn)行溫度值正負(fù)的判定,其程序流程圖如圖5.4.1所示。
?
?
圖 5.3.1? 溫度轉(zhuǎn)換流程圖
?
?
?
圖 5.4.1 計(jì)算溫度流程圖
5.4 鍵盤掃描流程圖
?
圖 5.4.1 按鍵掃描流程圖
6. 測試與結(jié)果分析
6.1仿真軟件介紹
本次仿真用了Proteus軟件,Proteus(海神)的ISIS是一款Labcenter出品的電路分析實(shí)物仿真系統(tǒng),可仿真各種電路和IC,并支持單片機(jī),元件庫齊全,使用方便,是不可多得的專業(yè)的單片機(jī)軟件仿真系統(tǒng)[17]。
該軟件的特點(diǎn):
?。?)全部滿足我們提出的單片機(jī)軟件仿真系統(tǒng)的標(biāo)準(zhǔn),并在同類產(chǎn)品中具有明顯的優(yōu)勢。(2)具有模擬電路仿真、數(shù)字電路仿真、單片機(jī)及其外圍電路組成的系統(tǒng)的仿真、RS一232動態(tài)仿真、1 C調(diào)試器、SPI調(diào)試器、鍵盤和LCD系統(tǒng)仿真的功能;有各種虛擬儀器,如示波器、邏輯分析儀、信號發(fā)生器等。(3)目前支持的單片機(jī)類型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各種外圍芯片。(4)支持大量的存儲器和外圍芯片??傊撥浖且豢罴瘑纹瑱C(jī)和SPICE分析于一身的仿真軟件,功能極其強(qiáng)大 ,可仿真51、AVR、PIC。
Proteus與其它單片機(jī)仿真軟件不同的是,它不僅能仿真單片機(jī)CPU的工作情況,也能仿真單片機(jī)外圍電路或沒有單片機(jī)參與的其它電路的工作情況。因此在仿真和程序調(diào)試時(shí),關(guān)心的不再是某些語句執(zhí)行時(shí)單片機(jī)寄存器和存儲器內(nèi)容的改變,而是從工程的角度直接看程序運(yùn)行和電路工作的過程和結(jié)果。對于這樣的仿真實(shí)驗(yàn),從某種意義上講,是彌補(bǔ)了實(shí)驗(yàn)和工程應(yīng)用間脫節(jié)的矛盾和現(xiàn)象[18]。
程序編譯用Keil軟件, Keil C51生成的目標(biāo)代碼效率非常之高,多數(shù)語句生成的匯編代碼很緊湊,容易理解。在開發(fā)大型軟件時(shí)更能體現(xiàn)高級語言的優(yōu)勢。
6.2 仿真結(jié)果
6.2.1 用Keil進(jìn)行程序編譯
運(yùn)用keil軟件編譯C語言程序,其結(jié)果如下圖6.2.1和圖6.2.2所示,在結(jié)果欄顯示“cao cx”—0 Error(s),0 warning(s).說明此程序在軟件編譯上無語法等錯誤。將此程序生成*.hex文件調(diào)入硬件中用Proteus進(jìn)行調(diào)試仿真。
圖6.1.1 Keil編譯C語言程序
圖6.1.2 Keil編譯C語言程序
6.2.2 在Proteus中仿真
將生成的cao.hex文件調(diào)入Proteus電路圖的單片機(jī)中,點(diǎn)擊圖左下角的開始鍵運(yùn)行,程序的開始界面如圖6.2.1,數(shù)碼管顯示“— — — —”。
?
圖6.2.1 仿真程序初始化
程序初始化后通過調(diào)節(jié)DS18B20溫度傳感器的數(shù)值,數(shù)碼管會顯示相應(yīng)的數(shù)值,例如10℃,其結(jié)果如圖6.2.2所示。
圖6.2.2 仿真程序正常運(yùn)行結(jié)果
在設(shè)置系統(tǒng)報(bào)警溫度上下限時(shí),按下按鍵S1,數(shù)碼管會顯示“H38C”(系統(tǒng)默認(rèn)上限為38℃),此時(shí)進(jìn)入溫度上限設(shè)置模式,可通過調(diào)節(jié)S2和S3分別增加和減小數(shù)碼管上顯示的數(shù)字,例如設(shè)置上限為39℃,如圖6.2.3所示。
接著再次按下鍵S1,數(shù)碼管會顯示“L05C”(系統(tǒng)默認(rèn)下限為5℃),此時(shí)進(jìn)入溫度下限設(shè)置模式,可通過調(diào)節(jié)S2和S3分別增加和減小數(shù)碼管上顯示的數(shù)字,例如設(shè)置下限為5℃,如圖6.2.4所示。
圖6.2.3 仿真設(shè)置最高溫度報(bào)警線
?
?
圖6.2.4仿真設(shè)置溫度報(bào)警最低線
當(dāng)溫度超過設(shè)置的上下限時(shí),系統(tǒng)會進(jìn)行聲光報(bào)警,蜂鳴器會發(fā)出“滴……滴……滴”蜂鳴聲,同時(shí)LED燈會閃爍。
當(dāng)系統(tǒng)未檢測的到DS18B20溫度傳感器或運(yùn)行錯誤時(shí),數(shù)碼管會顯示錯誤的數(shù)字“8.8.8.8”,如圖6.2.5所示。
圖6.2.5 仿真程序出錯
?
7. 總結(jié)與致謝
做為對大學(xué)四年所學(xué)知識的總結(jié),通過本次的畢業(yè)論文設(shè)計(jì),我學(xué)到了很多東西,同時(shí)在做的過程中也發(fā)現(xiàn)很多的問題,從最初的課題選擇到對相關(guān)課題資料的搜集與摘選,再到自己論文內(nèi)容的思路的設(shè)計(jì)、編寫以致最后階段的修改與完善。在這一過程中,我對我們大學(xué)四年所學(xué)習(xí)的相關(guān)電子知識又有了更深一層的學(xué)習(xí)和理解,讓我對自己所學(xué)的又有了更深的掌握。雖然以前還做過這樣的設(shè)計(jì)但這次設(shè)計(jì)真的讓我長進(jìn)了很多,單片機(jī)課程設(shè)計(jì)重點(diǎn)就在于軟件算法的設(shè)計(jì),需要有很巧妙的程序算法,雖然以前寫過幾次程序,但我覺的寫好一個程序并不是一件簡單的事,舉個例子,以前寫的那幾次,數(shù)據(jù)加減時(shí),我用的都是BCD碼,這一次,我全部用的都是16進(jìn)制的數(shù)直接加減,顯示處理時(shí)在用除法去刪分,感覺效果比較好,有好多的東西,只有我們?nèi)ピ囍隽?,才能真正的掌握,只學(xué)習(xí)理論有些東西而不結(jié)合實(shí)踐是很難理解的,更談不上掌握。
從這次的畢業(yè)設(shè)計(jì)中,我真真正正的意識到,在以后的學(xué)習(xí)中,要理論聯(lián)系實(shí)際,把我們所學(xué)的理論知識用到實(shí)際當(dāng)中,學(xué)習(xí)單機(jī)片機(jī)更是如此,程序只有在經(jīng)常的寫與讀的過程中才能提高,這就是我在這次課程設(shè)計(jì)中的最大收獲。
在此過程中,我也要感謝對我一直悉心指導(dǎo)和幫助的指導(dǎo)教師——葉愛芹老師。正是在她不厭其煩的指導(dǎo)和對我們的啟發(fā)中,讓我對我的論文設(shè)計(jì)思路逐漸清晰明朗,每當(dāng)在我論文設(shè)計(jì)中遇到困難時(shí)充滿希望,總能迎刃而解,總之非常感謝她這段時(shí)間對我們的鼓勵和指導(dǎo)。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
參考文獻(xiàn):
[1] 李朝青.單片機(jī)原理及接口技術(shù)(簡明修訂版).杭州:北京航空航天大學(xué)出版社,1998
[2] 李廣弟.單片機(jī)基礎(chǔ)[M].北京:北京航空航天大學(xué)出版社,1994
[3] 江力.單片機(jī)原理與應(yīng)用技術(shù)? .清華大學(xué)出版社 .2006
[4] 蔡美琴等.MCS一51系列單片機(jī)系統(tǒng)及其應(yīng)用[M].北京:高等教育出版社,1999.
[5]?? 王樹勛.MCS一51單片微型計(jì)算機(jī)原理與開發(fā).北京:機(jī)械工業(yè)出版社,1995
[6]?? 何希才.傳感器及其應(yīng)用電路.北京:電子工業(yè)出版社,2001
[7]?? 劉迎春、葉湘濱.傳感器原理設(shè)計(jì)與應(yīng)用(第三版) [M].長沙:國防科技大學(xué)出版社,
1997
[8]? ?靳達(dá).單片機(jī)應(yīng)用系統(tǒng)開發(fā)實(shí)例導(dǎo)航.北京:人民郵電出版社,2003.
[9]?? 潘新民,王燕芳.微型計(jì)算機(jī)實(shí)用系統(tǒng)設(shè)計(jì)[M].北京:人民郵電出版社,1992.
[10]? 胡漢才.單片機(jī)原理及接口技術(shù).北京:清華大學(xué)出版社,1996
[11]? 何力民.MCS一51系列單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì).北京:北京航空航天大學(xué)出版社,1993
?
[12]? 江曉安.等數(shù)字電子技術(shù) . 編著. 西安電子科技大學(xué)出版社 .1993
[13] ?閻石.數(shù)字電子技術(shù)基礎(chǔ)(第三版). 北京:高等教育出版社,1989
[14] ?廖常初.現(xiàn)場總線概述[J].電工技術(shù),1999.
[15] ?靳達(dá).單片機(jī)典型模塊設(shè)計(jì)實(shí)例導(dǎo)航.北京:人民郵電出版社,2003.
[16] ?王松武,于鑫,武思軍.電子創(chuàng)新設(shè)計(jì)與實(shí)踐.北京:國防工業(yè)出版社,2005
[17]? Artori S,ZHANG G X. Geometric Error Measurement and Compensation of Machines.
Annals of the CIRP. 1995
[18] ?Bolton W. Instrumentation&process measurement. Longman Scientific&Technical. 1991
?
?
?
?
?
?
?
?
?
?
?
?
?
?
英文摘要:
Digital temperature display alarming system
Abstract: along with the progress of The Times and development, technology has spread to our life, work, scientific research, each domain, has become a more mature technology, this paper introduces a method based on single-chip microcomputer control, the digital thermometer AT89S52 SCM design using a digital thermometer, it by MCU, LED digital sensors and DS18B20 pipe etc components, this thermometer belongs to the multi-function thermometer, function, can install strong upper temperature, and the measurement accuracy alarm and small error. When measuring temperature exceeds the upper limit set temperature, light buzzer and alarm.
Keywords: SCM AT89S52; thermometer; DS18B20; temperature display
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
附錄:源程序
/******************************************************************
程序名稱:DS18B20溫度測量、報(bào)警系統(tǒng)
簡要說明:DS18B20溫度計(jì),溫度測量范圍0~99.9攝氏度
??? 可設(shè)置上限報(bào)警溫度、下限報(bào)警溫度
??? 即高于上限值或者低于下限值時(shí)蜂鳴器報(bào)警
??? 默認(rèn)上限報(bào)警溫度為38℃、默認(rèn)下限報(bào)警溫度為5℃
??? 報(bào)警值可設(shè)置范圍:最低上限報(bào)警值等于當(dāng)前下限報(bào)警值
??? 最高下限報(bào)警值等于當(dāng)前上限報(bào)警值
??? 將下限報(bào)警值調(diào)為0時(shí)為關(guān)閉下限報(bào)警功能???
******************************************************************/
#include <AT89X52.h>
#include "DS18B20.h"??
#define uint unsigned int
#define uchar unsigned char?? //宏定義
#define SET? P3_1??? //定義調(diào)整鍵
#define DEC? P3_2??? //定義減少鍵
#define ADD? P3_3??? //定義增加鍵
#define BEEP P3_7??? //定義蜂鳴器
bit shanshuo_st;??? //閃爍間隔標(biāo)志
bit beep_st;???? //蜂鳴器間隔標(biāo)志
sbit DIAN = P2^7;??????? //小數(shù)點(diǎn)
uchar x=0;????? //計(jì)數(shù)器
signed char m;???? //溫度值全局變量
uchar n;????? //溫度值全局變量
uchar set_st=0;???? //狀態(tài)標(biāo)志
signed char shangxian=38;? //上限報(bào)警溫度,默認(rèn)值為38
signed char xiaxian=5;?? //下限報(bào)警溫度,默認(rèn)值為5
uchar
code? LEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
/*****延時(shí)子程序*****/
void Delay(uint num)
{
?while( --num );
}
/*****初始化定時(shí)器0*****/
void InitTimer(void)
{
? TMOD=0x1;
? TH0=0x3c;
? TL0=0xb0;???? //50ms(晶振12M)
}
/*****定時(shí)器0中斷服務(wù)程序*****/
void timer0(void) interrupt 1
{
?TH0=0x3c;
?TL0=0xb0;
?x++;
}
/*****外部中斷0服務(wù)程序*****/
void int0(void) interrupt 0
{
?EX0=0;????? //關(guān)外部中斷0
?if(DEC==0&&set_st==1)
?{
? shangxian--;
? if(shangxian<xiaxian)shangxian=xiaxian;
?}
?else if(DEC==0&&set_st==2)
?{
? xiaxian--;
? if(xiaxian<0)xiaxian=0;
?}
}
/*****外部中斷1服務(wù)程序*****/
void int1(void) interrupt 2
{
?EX1=0;????? //關(guān)外部中斷1
?if(ADD==0&&set_st==1)
?{
? shangxian++;
? if(shangxian>99)shangxian=99;
?}
?else if(ADD==0&&set_st==2)
?{
? xiaxian++;
? if(xiaxian>shangxian)xiaxian=shangxian;
?}?
}
/*****讀取溫度*****/
void check_wendu(void)
{
?uint a,b,c;
?c=ReadTemperature()-5;? //獲取溫度值并減去DS18B20的溫漂誤差
?a=c/100; ????//計(jì)算得到十位數(shù)字
?b=c/10-a*10;??? //計(jì)算得到個位數(shù)字
?m=c/10;????? //計(jì)算得到整數(shù)位
?n=c-a*100-b*10;??? //計(jì)算得到小數(shù)位
?if(m<0){m=0;n=0;}?? //設(shè)置溫度顯示上限
?if(m>99){m=99;n=9;}?? //設(shè)置溫度顯示上限???
}
/*****顯示開機(jī)初始化等待畫面*****/
Disp_init()???
{
?P2 = 0xbf;????? //顯示-
?P1 = 0xf7;
?Delay(200);
?P1 = 0xfb;
?Delay(200);??
?P1 = 0xfd;
?Delay(200);
?P1 = 0xfe;
?Delay(200);
?P1 = 0xff;???????? //關(guān)閉顯示
}
/*****顯示溫度子程序*****/
Disp_Temperature()???? //顯示溫度
{
?P2 =0xc6;????? //顯示C
?P1 = 0xf7;
?Delay(300);
?P2 =LEDData[n];??? //顯示個位
?P1 = 0xfb;
?Delay(300);
?P2 =LEDData[m%10];??? //顯示十位
?DIAN = 0;???????? //顯示小數(shù)點(diǎn)
?P1 = 0xfd;
?Delay(300);
?P2 =LEDData[m/10];??? //顯示百位
?P1 = 0xfe;
?Delay(300);
?P1 = 0xff;???????? //關(guān)閉顯示
}
/*****顯示報(bào)警溫度子程序*****/
Disp_alarm(uchar baojing)
{
?P2 =0xc6;????? //顯示C
?P1 = 0xf7;
?Delay(200);
?P2 =LEDData[baojing%10]; //顯示十位
?P1 = 0xfb;
?Delay(200);
?P2 =LEDData[baojing/10]; //顯示百位
?P1 = 0xfd;
?Delay(200);
?if(set_st==1)P2 =0x89;
?else if(set_st==2)P2 =0xc7; //上限H、下限L標(biāo)示
?P1 = 0xfe;
?Delay(200);
?P1 = 0xff;???????? //關(guān)閉顯示
}
/*****報(bào)警子程序*****/
void Alarm()
{
?if(x>=10){beep_st=~beep_st;x=0;}
?if((m>=shangxian&&beep_st==1)||(m<xiaxian&&beep_st==1))BEEP=0;
?else BEEP=1;
}
/*****主函數(shù)*****/
void main(void)
{
??? uint z;
?InitTimer();??? //初始化定時(shí)器
?EA=1;????? //全局中斷開關(guān)
?TR0=1;
?ET0=1;????? //開啟定時(shí)器0
?IT0=1;???????
?IT1=1;
?check_wendu();
?check_wendu();
?for(z=0;z<300;z++)
?{
? Disp_init();???????
? }
?while(1)
? {
? if(SET==0)
? {
?? Delay(2000);
?? do{}while(SET==0);
?? set_st++;x=0;shanshuo_st=1;
?? if(set_st>2)set_st=0;
? }
? if(set_st==0)
? {
?? EX0=0;??? //關(guān)閉外部中斷0
?? EX1=0;??? //關(guān)閉外部中斷1
??? check_wendu();
????? Disp_Temperature();
?? Alarm();?? //報(bào)警檢測
? }
? else if(set_st==1)
? {
?? BEEP=1;??? //關(guān)閉蜂鳴器
?? EX0=1;??? //開啟外部中斷0
?? EX1=1;??? //開啟外部中斷1
?? if(x>=10){shanshuo_st=~shanshuo_st;x=0;}
?? if(shanshuo_st) {Disp_alarm(shangxian);}
? }
? else if(set_st==2)
? {
?? BEEP=1;??? //關(guān)閉蜂鳴器
?? EX0=1;??? //開啟外部中斷0
?? EX1=1;??? //開啟外部中斷1
?? if(x>=10){shanshuo_st=~shanshuo_st;x=0;}
?? if(shanshuo_st) {Disp_alarm(xiaxian);}
? }
??? }
}
/*****END*****/
DS18B20.h:
#include <AT89X52.h>
#define? DQ? P3_6???? //定義DS18B20總線I/O
/*****延時(shí)子程序*****/
void Delay_DS18B20(int num)
{
? while(num--) ;
}
/*****初始化DS18B20*****/
void Init_DS18B20(void)
{
? unsigned char x=0;
? DQ = 1;???????? //DQ復(fù)位
? Delay_DS18B20(8);??? //稍做延時(shí)
? DQ = 0;???????? //單片機(jī)將DQ拉低
? Delay_DS18B20(80);?? //精確延時(shí),大于480us
? DQ = 1;???????? //拉高總線
? Delay_DS18B20(14);
? x = DQ;?????????? //稍做延時(shí)后,如果x=0則初始化成功,x=1則初始化失敗
? Delay_DS18B20(20);
}
/*****讀一個字節(jié)*****/
unsigned char ReadOneChar(void)
{
? unsigned char i=0;
? unsigned char dat = 0;
? for (i=8;i>0;i--)
? {
??? DQ = 0;???? // 給脈沖信號
??? dat>>=1;
??? DQ = 1;???? // 給脈沖信號
??? if(DQ)
??? dat|=0x80;
??? Delay_DS18B20(4);
? }
? return(dat);
}
/*****寫一個字節(jié)*****/
void WriteOneChar(unsigned char dat)
{
? unsigned char i=0;
? for (i=8; i>0; i--)
? {
??? DQ = 0;
??? DQ = dat&0x01;
??? Delay_DS18B20(5);
??? DQ = 1;
??? dat>>=1;
? }
}
/*****讀取溫度*****/
unsigned int ReadTemperature(void)
{
? unsigned char a=0;
? unsigned char b=0;
? unsigned int t=0;
? float tt=0;
? Init_DS18B20();
? WriteOneChar(0xCC);? //跳過讀序號列號的操作
? WriteOneChar(0x44);? //啟動溫度轉(zhuǎn)換
? Init_DS18B20();
? WriteOneChar(0xCC);? //跳過讀序號列號的操作
? WriteOneChar(0xBE);? //讀取溫度寄存器
? a=ReadOneChar();???? //讀低8位
? b=ReadOneChar();??? //讀高8位
? t=b;
? t<<=8;
? t=t|a;
? tt=t*0.0625;
? t= tt*10+0.5;???? //放大10倍輸出并四舍五入
? return(t);
}
/*****END*****/