1 設計要求與方案論證
首先明確設計要求,再討論方案,一一攻破設計的難點。
1.1 設計要求
基本范圍0℃-99℃ ;
精度誤差小于 0.1℃ ;
數碼管直讀顯示;
擴展功能:可以任意設定溫度的上下限報警功能,并可以掉電保持上下限溫度值。
1.2 系統基本方案選擇和論證
1.2.1 單片機芯片的選擇方案和論證
由于單片機具有以下的很多優點,被我們選定為制作該作品的首選芯片
單片機特點:
(1)高集成度,體積小,高可靠性
單片機將各功能部件集成在一塊晶體芯片上,集成度很高,體積自然也是最小的。芯片本身是按工業測控環境要求設計的,內部布線很短,其抗工業噪音性能優于一般通用的CPU。單片機程序指令,常數及表格等固化在ROM中不易破壞,許多信號通道均在一個芯片內,故可靠性高。
(2)控制功能強
為了滿足對對象的控制要求,單片機的指令系統均有極豐富的條件:分支轉移能力,I/O口的邏輯操作及位處理能力,非常適用于專門的控制功能。
(3)低電壓,低功耗,便于生產便攜式產品
為了滿足廣泛使用于便攜式系統,許多單片機內的最低工作電壓僅為1.8V~3.6V,而工作電流僅為數百微安。
(4)易擴展
片內具有計算機正常運行所必需的部件。芯片外部有許多供擴展用的三總線及并行、串行輸入/輸出管腳,很容易構成各種規模的計算機應用系統。
(5)優異的性價比
單片機的性能極高。為了提高速度和運行效率,單片機已開始使用RISC流水線和DSP等技術。單片機的尋址能力也已突破64KB的限制,有的已可達到1MB和16MB,片內的ROM容量可達62MB,RAM容量則可達2MB。由于單片機的廣泛使用,因而銷量極大,各大公司的商業競爭更使其價格十分低廉,其性能價格比極高。
方案一:
采用STC89C51芯片作為硬件核心。STC89C51內部具有8KB ROM 存儲空間,512字節數據存儲空間,帶有2K字節的EEPROM存儲空間,與MCS-51系列單片機完全兼容,STC89C51可以通過串口下載。
方案二:
采用AT89S51。AT89S51片內具有8K字節程序存儲空間,256字節的數據存儲空間沒有EEPROM存儲空間,也與MCS-51系列單片機完全兼容,具有在線編程可擦除技術。
兩種單片機都完全能夠滿足設計需要,STC89C51相對ATS89C52價格便宜,且抗干擾能力強。考慮到成本因素,因此選用STC89C51。
1.2.2 溫度傳感器設計方案論證
利用物質各種物理性質隨溫度變化的規律把溫度轉換為電量的傳感器。這些呈現規律性變化的物理性質主要有體。溫度傳感器是溫度測量儀表的核心部分,品種繁多。按測量方式可分為接觸式和非接觸式兩大類,按照傳感器材料及電子元件特性分為熱電阻和熱電偶兩類。
現代信息技術的三大基礎是信息采集(即傳感器技術)、信息傳輸(通信技術)和信息處理(計算機技術)。溫度傳感器的發展大致經歷了以下三個階段;(1)傳統的分立式溫度傳感器(含敏感元件);(2)模擬集成溫度傳感器/控制器;(3)智能溫度傳感器。國際上新型溫度傳感器正從模擬式向數字式、由集成化向智能化、網絡化的方向發展。在20世紀90年代中期最早推出的智能溫度傳感器,采用的是8位A/D轉換器,其測溫精度較低,分辨力只能達到1°C。國外已相繼推出多種高精度、高分辨力的智能溫度傳感器,所用的是9~12位A/D轉換器,分辨力一般可達0.5~0.0625°C。由美國DALLAS半導體公司新研制的DS1624型高分辨力智能溫度傳感器,能輸出13位二進制數據,其分辨力高達0.03125°C,測溫精度為±0.2°C。為了提高多通道智能溫度傳感器的轉換速率,也有的芯片采用高速逐次逼近式A/D轉換器。目前,智能溫度傳感器的總線技術也實現了標準化、規范化,所采用的總線主要有單線(1-Wire)總線、I2C總線、SMBus總線和spI總線。溫度傳感器作為從機可通過專用總線接口與主機進行通信。
方案一:
由于本設計是測溫電路,可以使用熱敏電阻之類的器件利用其感溫效應,在將隨被測溫度變化 的電壓或電流采集過來,進行 A/D 轉換后,就可以用單片機進行數據的處理,在顯示電路上,就可以將被測溫度顯示出來,這種設計需要用到 A/D 轉換電路,感溫電路比較麻煩。
方案二:
進而考慮到用溫度傳感器,在單片機電路設計中,大多都是使用傳感器,所以這是非常容易想到的,所以可以采用一只溫度傳感器 DS18B20,此傳感器,可以很容易直接讀取被測溫度值,進行轉換,就可以滿足設計要求。
從以上兩種方案,兩種都完全能夠滿足設計需要,很容易看出,采用方案二,電路比較簡單,軟件設計也比較簡單,故采用了方案二。
1.2.3 掉電保持方案論證
為了方便使用,本設計采用串行E2PROMI2C-BUS的存儲器件AT24C02,由于其具有接口方便,體積小,數據掉電不丟失等特點,在儀器儀表及工業自動化控制中得到大量的應用。本設計就是采用此功能。
1.3 電路設計最終方案決定
綜上各方案所述,對此次作品的方案選定:采用STC89C51單片機作為主控制系統;采用DS18B20為傳感器;采用AT24C02作為數據記錄系統;采用數碼管作為顯示器件。
2 主要元件介紹
2.1 STC89C51介紹
STC89C51是由深圳宏晶科技公司生產的與工業標準MCS-51指令集和輸出管腳相兼容的單片機。
2.1.1 STC89C51主要功能及PDIP封裝
STC89C51主要功能如表1所示,其PDIP封裝如圖1所示
表1:STC89C51主要功能
2.1.2 STC89C51引腳介紹
① 主電源引腳(2根)
VCC(Pin40):電源輸入,接+5V電源
GND(Pin20):接地線
②外接晶振引腳(2根)
XTAL1(Pin19):片內振蕩電路的輸入端
XTAL2(Pin20):片內振蕩電路的輸出端
③控制引腳(4根)
RST/VPP(Pin9):復位引腳,引腳上出現2個機器周期的高電平將使單片機復位。
ALE/PROG(Pin30):地址鎖存允許信號
PSEN(Pin29):外部存儲器讀選通信號
EA/VPP(Pin31):程序存儲器的內外部選通,接低電平從外部程序存儲器讀指令,如果接高電平則從內部程序存儲器讀指令。
④可編程輸入/輸出引腳(32根)
STC89C51單片機有4組8位的可編程I/O口,分別位P0、P1、P2、P3口,每個口有8位(8根引腳),共32根。
P0口(Pin39~Pin32):8位雙向I/O口線,名稱為P0.0~P0.7
P1口(Pin1~Pin8):8位準雙向I/O口線,名稱為P1.0~P1.7
P2口(Pin21~Pin28):8位準雙向I/O口線,名稱為P2.0~P2.7
P3口(Pin10~Pin17):8位準雙向I/O口線,名稱為P3.0~P3.7

圖1:STC89C51封裝圖
2.1.3 單片機最小系統:
當在STC89C51單片機的RST引腳引入高電平并保持2個機器周期時,單片機內部就執行復位操作,按鍵手動復位有電平方式和脈沖方式兩種。其中電平復位是通過RST端經過電阻與電源VCC接通而實現的。最小系統如圖2所示。

圖2 單片機最小系統電路
電路以STC89C51單片機最小系統為控制核心,測溫電路由DS18B20提供,輸入部分采用三個獨立式按鍵S1、S2、S3。數碼管顯示部分。具體電路連接,詳見附錄1。
2.2 DS18B20傳感器介紹
2.2.1 DS18B20概述
在現代檢測技術中,傳感器占據著不可動搖的重要位置。主機對數據的處理能力已經相當的強,但是對現實世界中的模擬量卻無能為力。如果沒有各種精確可靠的傳感器對非電量和模擬信號進行檢測并提供可靠的數據,那計算機也無法發揮他應有的作用。傳感器把非電量轉換為電量,經過放大處理后,轉換為數字量輸入計算機,由計算機對信號進行分析處理。從而傳感器技術與計算機技術結合起來,對自動化和信息化起重要作用。
采用各種傳感器和微處理技術可以對各種工業參數及工業產品進行測控及檢驗,準確測量產品性能,及時發現隱患。為提高產品質量、改進產品性能,防止事故發生提供必要的信息和更可靠的數據。由于系統的工作環境比較惡劣,且對測量要求比較高,所以選擇合適的傳感器很重要。目前,國際上新型溫度傳感器正從模擬式向數字式、從集成化向智能化和網絡化的方向飛速發展。智能溫度傳感器DS18B20正是朝著高精度、多功能、總線標準化、高可靠性及安全性、開發虛擬傳感器和網絡傳感器、研制單片測溫系統等高科技的方向迅速發展。因此,智能溫度傳感器DS18B20作為溫度測量裝置已廣泛應用于人民的日常生活和工農業生產中。
美國DALLAS公司生產的 DS18B20可組網數字溫度傳感器芯片外加不銹鋼保護管封裝而成,具有耐磨耐碰,體積小,使用方便,封裝形式多樣,適用于各種狹小空間設備數字測溫和控制領域。有獨特的單線接口方式,DS1820在與微處理器連接時僅需要一條口線即可實現微處理器與DS1820的雙向通訊;其測溫范圍 -55℃~+125℃,固有測溫分辨率0.5℃;支持多點組網功能;多個DS1820可以并聯在唯一的三線上,實現多點測溫;工作電源為3~5V/DC;在使用中不需要任何外圍元件。
DS18B20的性能特點如下:
(1) 采用DALLAS公司獨特的單線接口方式:DS18B20與微處理器連接時僅需要一條口線即可實現微處理器與DS18B20的雙向通訊;
(2)在使用中不需要任何外圍元件;
(3)可用數據線供電,供電電壓范圍:+3.0V~+5.5V;
(4)測溫范圍:-55~+125℃。固有測溫分辨率為0.5℃。當在-10℃~+85℃范圍內,可確保測量誤差不超過0.5℃,在-55~+125℃范圍內,測量誤差也不超過2℃;
(5)通過編程可實現9~12位的數字讀數方式;
(6)用戶可自設定非易失性的報警上下限值;
(7)支持多點的組網功能,多個DS18B20可以并聯在唯一的三線上,實現多點測溫
(8)負壓特性,即具有電源反接保護電路。當電源電壓的極性反接時,能保護DS18B20不會因發熱而燒毀,但此時芯片無法正常工作;
(9)DS18B20的轉換速率比較高,進行9位的溫度值轉換只需93.75ms;
(10)適配各種單片機或系統;
(11)內含64位激光修正的只讀存儲ROM,扣除8位產品系列號和8位循環冗余校驗碼(CRC)之后,產品序號占48位。出廠前產品序號存入其ROM中。在構成大型溫控系統時,允許在單線總線上掛接多片DS18B20。
2.2.2 DS18B20引腳介紹

圖3:DS18B20引腳
各引腳功能為:I/O為數據輸入/輸出端(即單線總線),它屬于漏極開路輸出,外接上拉電阻后,常態下呈高電平。UDD是可供選用的外部電源端,不用時接地,GND為地,NC空腳。
2.2.3 DS18B20的內部結構
DS18B20的內部結構主要包括7部分:寄生電源、溫度傳感器、64位激光(loser)ROM與單線接口、高速暫存器(即便筏式RAM,用于存放中間數據)、TH觸發寄存器和TL觸發寄存器,分別用來存儲用戶設定的溫度上下限值、存儲和控制邏輯、位循環冗余校驗碼(CRC)發生器。

圖4:DS18B20內部結構
2.2.4 DS18B20的程序流程圖

圖5程序流程圖
2.3 數碼管介紹
數碼管是一種半導體發光器件,其基本單元是發光二極管。數碼管按段數分為七段數碼管和八段數碼管,八段數碼管比七段數碼管多一個發光二極管單元(多一個小數點顯示);按能顯示多少個“8”可分為1位、2位、4位等等數碼管;
按發光二極管單元連接方式分為共陽極數碼管和共陰極數碼管。共陽數碼管是指將所有發光二極管的陽極接到一起形成公共陽極(COM)的數碼管,共陽數碼管在應用時應將公共極COM接到+5V,當某一字段發光二極管的陰極為低電平時,相應字段就點亮,當某一字段的陰極為高電平時,相應字段就不亮。共陰數碼管是指將所有發光二極管的陰極接到一起形成公共陰極(COM)的數碼管,共陰數碼管在應用時應將公共極COM接到地線GND上,當某一字段發光二極管的陽極為高電平時,相應字段就點亮,當某一字段的陽極為低電平時,相應字段就不亮。
2.3.1 數碼管概述

圖5:數碼管
數碼顯示器是一種由LED發光二極管組合顯示字符的顯示器件,它使用了8個Led發光二極管,其中七個用于顯示字符,一個顯示小數點,所以通稱為七段發光二極管數碼顯示器。4位一體數碼管,其內部段已連接好,引腳如圖所示(數碼管的正面朝自己,小數點在下方)。a、b、c、d、e、f、g、dp為段引腳,S1、S2、S3、S4分別表示四個數碼管的位。
2.4 AT24C02簡介
如圖1為AT24C02的芯片引腳圖。

圖3-1 AT24C02的芯片引腳圖
AT24C02提供電可擦除的串行1024位存儲或可編程只讀存儲器(EEPROM)128字(8位/字)。
芯片在低壓的工業與商業應用中進行了最優化。AT24C01的封裝為8腳PDIP、8腳JEDEC
SOIC、8腳TSSOP,通過2線制串行接口進行數據傳輸。另外,整個系列有2.7V(2.7V至5.5V)和1.8V (1.8V至5.5V)兩個版本。
設備操作:
C L O C K 和 D A T A 變化:SDA管腳通常外都要拉高。SDA管腳上的數據只能在SCL低期間改變。數據在SCL高期間改變定義為一個開始或停止信號。
開始狀態:在任何操作之前必須有一個開始信號----在SCL為高時SDA上產生一個下降沿。
停止狀態: SCL為高時SDA產生一個上升沿是停止信號,停止信號后將停止所有通信。
在一個讀的序列之后,停止信號將讓EEPROM進入備用電源模式。
2.4.1 I2C總線說明
I2C(Inter-Integrated Circuit)總線是一種由PHILIPS公司開發的兩線式串行總線,用于連接微控制器及其外圍設備。I2C總線產生于在80年代,最初為音頻和視頻設備開發,如今主要在服務器管理中使用,其中包括單個組件狀態的通信。例如管理員可對各個組件進行查詢,以管理系統的配置或掌握組件的功能狀態,如電源和系統風扇?呻S時監控內存、硬盤、網絡、系統溫度等多個參數,增加了系統的安全性,方便了管理。
1 I2C總線的硬件結構
I2C串行總線一般有兩根信號線,一根是雙向的數據線SDA,另一根是時鐘線SCL。所有接到I2C總線設備上的串行數據SDA都接到總線的SDA上,各設備的時鐘線SCL接到總線的SCL上。
為了避免總線信號的混亂,要求各設備連接到總線的輸出端時必須是開漏輸出或集電極開路輸出。設備上的串行數據線SDA接口電路應該是雙向的,輸出電路用于向總線上發送數據,輸入電路用于接收總線上的數據。而串行時鐘線也應是雙向的,作為控制總線數據傳送的主機,一方面要通過SCL輸出電路發送時鐘信號,另一方面還要檢測總線上的SCL電平,以決定什么時候發送下一個時鐘脈沖電平;作為接受主機命令的從機,要按總線上的SCL信號發出或接收SDA上的信號,也可以向SCL線發出低電平信號以延長總線時鐘信號周期?偩空閑時,因各設備都是開漏輸出,上拉電阻RP使SDA和SCL線都保持高電平。任一設備輸出的低電平都將使相應的總線信號線變低,也就是說:各設備的SDA是“與”關系,SCL也是“與”關系。
總線對設備接口電路的制造工藝和電平都沒有特殊的要求(NMOS、CMOS都可以兼容)。在I2C總線上的數據傳送率可高達每秒十萬位,高速方式時在每秒四十萬位以上。另外,總線上允許連接的設備數以其電容量不超過400pF為限。
總線的運行(數據傳輸)由主機控制。所謂主機是指啟動數據的傳送(發出啟動信號)、發出時鐘信號以及傳送結束時發出停止信號的設備,通常主機都是微處理器。被主機尋訪的設備稱為從機。為了進行通訊,每個接到I2C總線的設備都有一個唯一的地址,以便于主機尋訪。主機和從機的數據傳送,可以由主機發送數據到從機,也可以由從機發到主機。凡是發送數據到總線的設備稱為發送器,從總線上接收數據的設備被稱為接受器。
I2C總線在傳送數據過程中共有三種類型信號, 它們分別是:開始信號、結束信號和應答信號。
開始信號:SCL為高電平時,SDA由高電平向低電平跳變,開始傳送數據。
結束信號:SCL為高電平時,SDA由低電平向高電平跳變,結束傳送數據。
應答信號:接收數據的IC在接收到8bit數據后,向發送數據的IC發出特定的低電平脈沖,表示已收到數據。CPU向受控單元發出一個信號后,等待受控單元發出一個應答信號,CPU接收到應答信號后,根據實際情況作出是否繼續傳遞信號的判斷。若未收到應答信號,由判斷為受控單元出現故障。如圖3-2所示:

圖3-2 開始、結束信號圖
目前有很多半導體集成電路上都集成了I2C接口。帶有I2C接口的單片機有:CYGNAL的 C8051F0XX系列,PHILIPSP87LPC7XX系列,MICROCHIP的PIC16C6XX系列等。很多外圍器件如存儲器、監控芯片等也提供I2C接口。
總線基本操作:
I2C規程運用主/從雙向通訊。器件發送數據到總線上,則定義為發送器,器件接收數據則定義為接收器。主器件和從器件都可以工作于接收和發送狀態。 總線必須由主器件(通常為微控制器)控制,主器件產生串行時鐘(SCL)控制總線的傳輸方向,并產生起始和停止條件。SDA線上的數據狀態僅在SCL為低電平的期間才能改變,SCL為高電平的期間,SDA狀態的改變被用來表示起始和停止條件。
控制字節:在起始條件之后,必須是器件的控制字節,其中高四位為器件類型識別符(不同的芯片類型有不同的定義,EEPROM一般應為1010),接著三位為片選,最后一位為讀寫位,當為1時為讀操作,為0時為寫操作。
寫操作:寫操作分為字節寫和頁面寫兩種操作,對于頁面寫根據芯片的一次裝載的字節不同有所不同。
讀操作:讀操作有三種基本操作:當前地址讀、隨機讀和順序讀。圖4給出的是順序讀的時序圖。應當注意的是:最后一個讀操作的第9個時鐘周期不是“不關心”。為了結束讀操作,主機必須在第9個周期時發出停止條件或者在第9個時鐘周期內保持SDA為高電平、然后發出停止條件。
3 程序流程圖
圖6:程序流程圖
結論
通過對自己在大學兩年時間里所學的知識的回顧,并充分發揮對所學知識的理解和對畢業設計的思考及書面表達能力,最終完成了本設計。這為自己今后進一步深化學習,積累了一定寶貴的經驗。撰寫論文的過程也是專業知識的學習過程,它使我運用已有的專業基礎知識,對其進行設計,分析和解決一個理論問題或實際問題,把知識轉化為能力的實際訓練。培養了我運用所學知識解決實際問題的能力。
本次論文設計,使我加深了對單片機的認識,并且熟悉了單片機系統的設計流程,收獲豐碩。技術在不斷進步,機械式時鐘已經被淘汰,電子時代已經到來。做為新時代的我們,更應該提高自身能力,適應新時代的發展。知識來自實踐,多從生活中探尋所需要的。
從這次的論文設計中,我真正的體會到,知識的重要性,特別是要理論聯系實際,把我們所學的理論知識運用到實際生活當中,要用知識改變一切。
參考文獻
[1] 陳權昌,李興富.單片機原理及應用[M].廣州:華南理工大學出版社,2007.84~102
[2] 李慶亮.C語言程序設計實用教程[M].北京:機械工業出版社,2005.32~58
[3] 楊志忠.數字電子技術[M].北京:高等教育出版社,2003.125~132
[4] 及力.Protel 99 SE原理圖與PCB設計教程[M].北京:電子工業出版社,2007.89~150
[5] 徐江海.單片機實用教程[M].北京:機械工業出版社,2006.128~156
[6] 胡宴如.模擬電子技術[M].北京:高等教育出版社,2008.60~104
[7] 汪文,陳林.單片機原理及應用[M].湖北:華中科技大學出版社,2007.36~68
[8] 康華光.電子技術基礎數字部分[M].北京:高等教育出版社,2008.203~209
[9] 楊欣.電子設計從零開始[M].北京:清華大學出版社,2005.28~102
致謝
首先,感謝學校三年來對我的培養。為我們營造了一個良好的學習氛圍,建設一流的教學設施,使我們身心愉快的投入到學習中。
其次,感謝尊敬的指導老師,有了他的諄諄教誨,處處提點,才使本論文的前期準備以及整個研究過程順利完成。指導老師的嚴謹治學態度、扎實的理論基礎、全身心投入工作的精神以及對學生盡心盡力的態度給了我極大的幫助與鼓勵,使我受益匪淺。從指導老師的教學態度上,我學到的不僅僅只有書本上的知識,還有做人的道理。他嚴肅的科學態度,嚴謹的治學精神,精益求精的工作作風,深深地感染和激勵著我。在此謹向指導老師致以誠摯的謝意和崇高的敬意。
最后,感謝我的父母多年來給予我的支持和關懷,同時感謝我的舍友和朋友對我的幫助。
附錄1 系統原理圖

附錄2 C語言程序
單片機源程序如下:
- #include<reg52.h>
- #define ui unsigned int
- #define uc unsigned char //宏定義
- sbit SET=P3^1; //定義調整鍵
- sbit DEC=P3^2; //定義減少鍵
- sbit ADD=P3^3; //定義增加鍵
- sbit BEEP=P3^6; //定義蜂鳴器
- sbit ALAM=P1^2; //定義燈光報警
- sbit ALAM1=P1^4;
- sbit DQ =P3^7; //定義DS18B20總線I/O
- sbit SCL=P1^6;
- sbit SDA=P1^7;
- sbit DIAN=P0^5; //小數點
- bit bdata shanshuo_st; //閃爍間隔標志
- bit bdata beep_st; //蜂鳴器間隔標志
-
- uc x=0; //計數器
- ui bai,shi,ge;
- uc set_st=0; //狀態標志
- char shangxian,xiaxian;
- code LEDData[]={0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x47,0xDF,0xD7,0xCF,0xDA,0x9B,0xDC,0x9B,0x8B};
-
- //====================================DS18B20=========================================
- /*****延時子程序*****/
- void Delay_DS18B20(int num)
- {
- while(num--) ;
- }
- void delay()//5微秒延時函數
- { ;; }
- void start() //開始信號
- {
- SDA=1;
- delay();
- SCL=1;
- delay();
- SDA=0;
- delay();
- }
- void stop() //終止信號
- {
- SDA=0;
- delay();
- SCL=1;
- delay();
- SDA=1;
- delay();
- }
- void respons() //應答
- {
- uc i;
- SCL=1;
- delay();
- while((SDA==1)&&(i<250))i++;//如果SDA為低應答有效,或者超過一定時間默認應答有效
- SCL=0;
- delay();
- }
- void init24c04()//I2C總線初始化
- {
- SDA=1;
- delay();
- SCL=1;
- delay();
- }
- void write_byte(uc date)//寫操作
- {
- uc i,temp;
- temp=date;
- for(i=0;i<8;i++)
- {
- temp=temp<<1;
- SCL=0;
- delay();
- SDA=CY;
- delay();
- SCL=1;
- delay();
- }
- SCL=0;
- delay();
- SDA=1;
- delay();
- }
- uc read_byte()//讀操作
- {
- uc i,k;
- SCL=0;
- delay();
- SDA=1;
- delay();
- for(i=0;i<8;i++)
- {
- SCL=1;
- delay();
- k=(k<<1)|SDA;
- SCL=0;
- delay();
- }
- return k;
- }
- void write_add(uc address,uc date)//往任意地址存數據
- {
- start();
- write_byte(0xa0);//0xa0代表寫入
- respons();
- write_byte(address);
- respons();
- write_byte(date);
- respons();
- stop();
- }
- uc read_add(uc address)//讀隨意地址內容
- {
- uc date;
- start();
- write_byte(0xa0);//0xa0代表寫入
- respons();
- write_byte(address);
- respons();
- start();
- write_byte(0xa1);//0xa1代表讀出
- respons();
- date=read_byte();
- stop();
- return date;//返回值
- }
- /*****初始化DS18B20*****/
- void Init_DS18B20(void)
- {
- uc w=0;
- DQ = 1; //DQ復位
- Delay_DS18B20(8); //稍做延時
- DQ = 0; //單片機將DQ拉低
- Delay_DS18B20(80); //精確延時,大于480us
- DQ = 1; //拉高總線
- Delay_DS18B20(14);
- w = DQ; //稍做延時后,如果x=0則初始化成功,x=1則初始化失敗
- Delay_DS18B20(20);
- }
- /*****讀一個字節*****/
- unsigned char ReadOneChar(void)
- {
- uc i=0;
- uc dat = 0;
- for (i=8;i>0;i--)
- {
- DQ = 0; // 給脈沖信號
- dat>>=1;
- DQ = 1; // 給脈沖信號
- if(DQ)
- dat|=0x80;
- Delay_DS18B20(4);
- }
- return(dat);
- }
- /*****寫一個字節*****/
- void WriteOneChar(uc dat)
- {
- uc i=0;
- for (i=8; i>0; i--)
- {
- DQ = 0;
- DQ = dat&0x01;
- Delay_DS18B20(5);
- DQ = 1;
- dat>>=1;
- }
- }
- /*****讀取溫度*****/
- ui ReadTemperature(void)
- {
- ui b=0;
- ui t=0;
- ui a=0;
- Init_DS18B20();
- WriteOneChar(0xCC); //跳過讀序號列號的操作
- WriteOneChar(0x44); //啟動溫度轉換
- 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);
- }
- /*****延時子程序*****/
- void Delay(ui num)
- {
- while( --num );
- }
- /*****初始化定時器0*****/
- void InitTimer(void)
- {
- TMOD=0x01;
- TH0=0x3c;
- TL0=0xb0; //50ms(晶振12M)
- }
-
- /*****讀取溫度*****/
- void check_wendu(void)
- {
- ui f;
- f=ReadTemperature()-5; //獲取溫度值并減去DS18B20的溫漂誤差
- if(f<0)f=0;
- if(f>999)f=999;
- bai=f/100; //計算得到十位數字
- shi=(f%100)/10; //計算得到個位數字
- ge=(f%100)%10; //計算得到整數位
- }
- /*****顯示開機初始化等待畫面*****/
- void Disp_init(void)
- {
- P0 = ~0x80; //顯示----
- P2 = 0x7F;
- Delay(200);
- P2 = 0xDF;
- Delay(200);
- P2 = 0xF7;
- Delay(200);
- P2 = 0xFD;
- Delay(200);
- P2 = 0xFF; //關閉顯示
- }
- /*****顯示溫度子程序*****/
- void Disp_Temperature(void) //顯示溫度
- {
- P0 = ~0x98; //顯示C
- P2 = 0x7F;
- Delay(400);
- P0=~LEDData[ge]; //顯示個位
- P2 = 0xDF;
- Delay(400);
- P0 =~LEDData[shi]; //顯示十位
- DIAN = 0; //顯示小數點
- P2 = 0xF7;
- Delay(400);
- P0 =~LEDData[bai]; //顯示百位
- P2 = 0xFD;
- Delay(400);
- P2 = 0xff; //關閉顯示
- }
- /*****顯示報警溫度子程序*****/
- void Disp_alarm(uc baojing)
- {
- P0 =~0x98; //顯示C
- Delay(200);
- P0 =~LEDData[baojing%10]; //顯示十位
- P2 = 0xDF;
- Delay(200);
- P0 =~LEDData[baojing/10]; //顯示百位
- P2 = 0xF7;
- Delay(200);
- if(set_st==1)P0 =~0xCE;
- else if(set_st==2)P0 =~0x1A; //上限H、下限L標示
- P2 = 0xFD;
- Delay(200);
- P2 = 0xff; //關閉顯示
- }
- /*****報警子程序*****/
- void Alarm()
- {
- if(x>=10){beep_st=~beep_st;x=0;}
- if((bai*10+shi)>=shangxian&&beep_st==1)
- {
- BEEP=0;
- ALAM1=0;
- }
- else if((bai*10+shi)>=shangxian&&beep_st==0)
- {
- BEEP=1;
- ALAM1=0;
- }
- if((bai*10+shi)<xiaxian&&beep_st==1)
- {
- BEEP=0;
- ALAM=0;
- }
- else if((bai*10+shi)<xiaxian&&beep_st==0)
- {
- BEEP=1;
- ALAM=0;
- }
- if(((bai*10+shi)<shangxian)&&((bai*10+shi)>=xiaxian))
- {
- BEEP=1;
- ALAM1=1;
- ALAM=1;
- }
- }
- /*****主函數*****/
- void main(void)
- {
- ui z;
- InitTimer(); //初始化定時器
- EA=1; //全局中斷開關
- ET0=1; //開啟定時器0
- check_wendu();
- check_wendu();
- shangxian=read_add(10);
- xiaxian=read_add(20);
- 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)
- {
- check_wendu();
- Disp_Temperature();
- Alarm(); //報警檢測
- }
- else if(set_st==1)
- {
- BEEP=1; //關閉蜂鳴器
- ALAM=1;
- ALAM1=1;
- if(x>=10){shanshuo_st=~shanshuo_st;x=0;}
- if(shanshuo_st) {Disp_alarm(shangxian);}
- if(ADD==0)
- {
- do{Disp_alarm(shangxian);}
- while(ADD==0);
- shangxian++;
- if(shangxian>99)shangxian=99;
- write_add(10,shangxian);
- }
- else if(DEC==0)
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
DS18B20溫度報警器畢業論文.doc
(247.5 KB, 下載次數: 274)
2018-4-13 19:19 上傳
點擊文件名下載附件
溫度報警