基于單片機的溫度測量警報器秒表_第1頁
基于單片機的溫度測量警報器秒表_第2頁
基于單片機的溫度測量警報器秒表_第3頁
基于單片機的溫度測量警報器秒表_第4頁
基于單片機的溫度測量警報器秒表_第5頁
已閱讀5頁,還剩22頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 基于單片機的溫度測量報警器+秒表 華碧摘 要溫度是日常生活中不可缺少的物理量,溫度在各個領域都有積極的意義。很多行業(yè)中以與日常生活中都有大量的用電加熱設備,如用于加熱處理的加熱熱水器,用于洗浴的電熱水器與各種不同用途的溫度箱等,采用單片機對它們進行檢測具有檢測方便、簡單、靈活性大等特點,而且還可以大幅提高被控系統(tǒng)的性能,從而能被大大提高產品的質量。因此,智能化溫度檢測技術正被廣泛地應用。本溫度設計采用現在流行的STC89C52單片機為檢測器,用DS18B20檢測的方法,再配以其他電路對熱水器的水溫進行檢測。關鍵詞:STC89C52;DS18B20;42 / 27緒論研究背景溫度是人類生產生活

2、中非常關鍵的一項物理量,溫度檢測系統(tǒng)廣泛應用于社會生活的各個領域 ,如家電、汽車、材料、電力電子等 。溫度檢測是工業(yè)生產過程中和日常生活中經常遇到的檢測問題,人們需要對各種加熱爐、熱處理爐、家用熱水器中溫度進行監(jiān)測。特別是在冶金 、化工、建材、食品、機械、石油等工業(yè)中,具有舉足重輕的作用,因而設計一種較為理想的溫度檢測系統(tǒng)是非常有價值的。工業(yè)生產中溫度檢測具有單向性、時滯性、大慣性和時變性的特征,同時要實現溫度檢測的快速性和準確性,對于提高產品質量具有很重要的現實意義。對于不同場所、不同工藝、所需溫度高低圍不同、精度不同,則采用的測溫元件、測溫方法也將不同;產品工藝不同、檢測溫度的精度不同、時

3、效不同,則對數據采集的精度和采用的檢測算法也不同。因而,對溫度的測量方法要多種多樣。隨著電子技術和微型計算機的迅速發(fā)展,微機測量和檢測技術也得到了迅速的發(fā)展和廣泛的應用。利用微機對溫度進行測量的技術,也便隨之而生,并得到日益發(fā)展和完善,越來越顯示出其優(yōu)越性。研究容本設計的容是溫度檢測系統(tǒng),檢測對象是空氣的溫度。溫度檢測在日常生活與工業(yè)領域應用相當廣泛,比如電熱水器,孵化器,發(fā)酵缸等場所的溫度檢測。這些場合都需要有一種能夠比較精確快速實現所需溫度的測量器。本文設計的目的就是實現一種可連續(xù)高精度調溫的溫度測量器。需要實現以下功能:(1)調節(jié)設置溫度。(2)通過實際溫度反饋快速準確的實現所需溫度。(

4、3)在液晶屏幕中顯示溫度值。(4)超溫報警。(5)檢測溫度的同時進行計時。1. 系統(tǒng)方案論證與設計1.1 系統(tǒng)方案設計對于空氣溫度測量系統(tǒng)來說方案有很多:如采用單片機檢測、PLC檢測、PC機檢測等。利用單片機實現溫度測量利用單片機實現空氣氣溫的檢測,系統(tǒng)主要包括現場溫度采集、溫度顯示、報警裝置和以單片機stc89c52作為微處理器。溫度采集電路以數字形式將現場溫度傳至單片機,單片機結合現場溫度與用戶設定的目標溫度,輸送到lcd顯示。1.2系統(tǒng)方案論證用單片機作為檢測器,外圍電路直接連接到單片機的檢測方法具有靈活性高,易擴展的優(yōu)勢,并且現在的單片機一般都具有通信接口能夠實現與外檢測器通信,包括P

5、C機。單片機經過發(fā)展其可靠性已得到大家的認可,并且經濟價格便宜,具有大規(guī)模應用的條件。更重要的是單片機體積小,能夠直接放置在需要檢測的裝置中去,不用另外設計安裝空間。1.3 系統(tǒng)方案實現本文選用單片機作為檢測器,但要實現所需的溫度檢測的功能我們還需要另外的電子元器件組成電路,并發(fā)送和接受相應的電信號來組成一個完整的檢測系統(tǒng)。所需的電路模塊如圖1-1所示:單片機數據顯示電源超溫報警晶振溫度傳感器被檢測系統(tǒng)執(zhí)行器圖1-1 系統(tǒng)框圖3. 硬件電路硬件合理選擇和優(yōu)化配置直接決定了空氣溫度檢測系統(tǒng)的可靠性,以與檢測效果的優(yōu)劣,根據認真仔細的比較本文選用如下的硬件來實現系統(tǒng)要求的功能。3.STC89C52

6、單片機簡介STC89C52是一個低電壓,高性能單片機,帶有4K字節(jié)的可反復擦寫的程序存儲器(PENROM)。和128字節(jié)的存取數據存儲器(RAM),這種器件采用ATMEL公司的高密度、不容易丟失存儲技術生產,并且能夠與MCS-51系列的單片機兼容。片含有8位中央處理器和閃爍存儲單元,所以功能較強的STC89C52單片機能夠提供一種安全可靠的檢測方案,而被應用到檢測領域中。STC89C52單片機的引腳如圖3-1所示:圖3-1 STC89C52STC89C52單片機主要功能部件包括中央處理器、片數據存儲器、片程序存儲器、震蕩電路、電源與復位電路并行I/O接口、定時器/計數器、中斷系統(tǒng)組成。簡要介紹

7、一下本文用到的一些部件3.1.1 中央處理器中央處理器(CPU)是STC89C52單片機的核心部件,其字長為8位,主要由運算器和檢測器等部件組成。運算器用于實現對操作數的算術邏輯運算和位操作。檢測器是單片機的智慧檢測部件,檢測器的主要任務是識別指令,并根據指令的性質檢測單片機各功能部件,從而保證單片機各部分能自動而協(xié)調地工作。3.1.2 片數據存儲器89c52單片機部數據存儲器容量僅為256B,與片外數據存儲器空間(64K)相獨立,采用8位地址碼尋址。其中低地址空間的128B(007FH)供用戶使用,可按規(guī)定規(guī)劃為工作寄存區(qū)、堆棧區(qū)、位尋址數據存儲器區(qū)和通用數據存儲器區(qū);高地址空間的128B(

8、80FFH)為特殊功能寄存器(FSR),實際中只用到26B,其地址分布并不連續(xù)。3.1.3 片程序存儲區(qū)89C52單片機部程序存儲器容量為4KB,分布在整個64K程序存儲器空間的低地址空間.3.1.4 振蕩器和時序電路89C52單片機部有震蕩電路,只需外接石英晶體振蕩器和頻率微調電容即可產生024MHz震蕩脈沖信號(震蕩周期為單片機工作的最小時間單位),震蕩脈沖經定時電路處理,產生CPU工作的各種時序信號。3.1.5 電源與復位89C52單片機采用DC5V供電工作電流為30mA左右,在掉電方式下,電流消耗可大大降低。89C52單片機需要外部電路提供上電或手動復位信號(高電平脈沖),使單片機各部

9、件回到初始狀態(tài)。3.1.6 并行I/O端口89C52單片機有四個8位并行I/O(輸入/輸出)端口,每個端口均是準雙向口,助記符分別為P0、P1、P2、P3,通過32個引腳將各I/O端口線全部引出,與外部建立聯(lián)絡。外圍電路的連接就主要通過這些I/O口實現與單片機的數據傳輸。3.1.7 定時/計數器在單片機實際應用中,往往需要精確的定時或對外部事件進行計數。89C52單片機部設置的兩個定時/計時器為此提供了便利。兩個定時/計數器的助記符分別為T0、T1,可以設置為計數方式,實現對外部事件的計數;也可以設置為定時方式,實現精確定時。3.1.8 中斷系統(tǒng)89C52單片機采用向量中斷邏輯,可以處理5個中

10、斷源的中斷請求,并依據中斷優(yōu)先級安排進入相應的中斷服務程序。5個中斷源的中斷向量為固定值,采用高低兩級優(yōu)先權隊列和固定優(yōu)先級相結合的管理模式。由于堆棧區(qū)容量限制,僅允許兩級中斷嵌套,即高優(yōu)先權隊列的中斷請求可中斷低優(yōu)先權隊列的中斷服務,但同等優(yōu)先權隊列的高級別中斷不能中斷該隊列中的低優(yōu)先級中斷服務。3.2 時鐘電路時鐘電路用于產生單片機工作時所必須的時鐘檢測信號。89C52單片機的部電路在時鐘信號檢測下,嚴格地按照時序執(zhí)行指令進行工作。單片機各功能部件的運行都是以時鐘檢測信號為基準工作的。因此,時鐘頻率直接影響單片機的速度,時鐘電路的質量也直接影響單片機系統(tǒng)的穩(wěn)定運行。常用的時鐘電路設計有兩種

11、方式,一種是部時鐘方式,另一種為外部時鐘方式。部時鐘方式受到的影響較少,能夠提供更加穩(wěn)定的信號,所以本文采用部時鐘方式。部時鐘方式的電路連接圖3-2所示:圖3-2 晶振硬件連接電路中的電容C1和C2典型值通常選擇為30pF左右。對外接電容的值雖然沒有嚴格的要求,但電容的大小會影響振蕩器頻率的高低、振蕩器的穩(wěn)定性和起振的快速性。晶振的震蕩頻率的圍通常是在1.2MHz12MHz之間。但時鐘頻率越高單片機的運行速度越快,但對電子器件的要求越高。考慮到所需的定時時間以與擴展和PC機的通信,本文選用11.0592MHz的頻率3.3 單總線數字溫度傳感器DS18B20單線總線特點單總線即只有一根數據線,系

12、統(tǒng)中的數據交換,控制都由這根線完成。單總線通常要求外接一個約為 4.7K10K 的上拉電阻,這樣,當總線閑置時其狀態(tài)為高電平DS18B20的特點DS18B20 單線數字溫度傳感器,即“一線器件”,其具有獨特的優(yōu)點:     ( 1 )采用單總線的接口方式與微處理器連接時僅需要一條口線即可實現微處理器與 DS18B20 的雙向通訊。單總線具有經濟性好,抗干擾能力強,適合于惡劣環(huán)境的現場溫度測量,使用方便等優(yōu)點,使用戶可輕松地組建傳感器網絡,為測量系統(tǒng)的構建引入全新概念。     ( 2 )測量溫度圍寬,測量精度高 D

13、S18B20 的測量圍為 -55 + 125 ;在 -10+ 85°C 圍,精度為± 0.5°C 。  ( 3 )在使用中不需要任何外圍元件。     ( 4 )持多點組網功能多個 DS18B20 可以并聯(lián)在惟一的單線上,實現多點測溫。    ( 5 )供電方式靈活 DS18B20 可以通過部寄生電路從數據線上獲取電源。因此,當數據線上的時序滿足一定的要求時,可以不接外部電源,從而使系統(tǒng)結構更趨簡單,可靠性更高。( 6 )測量參數可配置 DS18B20 的測量分辨率可通過程序設定 91

14、2 位( 7 )負壓特性電源極性接反時,溫度計不會因發(fā)熱而燒毀,但不能正常工作。( 8 )掉電保護功能 DS18B20 部含有 EEPROM ,在系統(tǒng)掉電以后,它仍可保存分辨率與報警溫度的設定值。   DS18B20 具有體積更小、適用電壓更寬、更經濟、可選更小的封裝方式,更寬的電壓適用圍,適合于構建自己的經濟的測溫系統(tǒng),因此也就被設計者們所青睞。DS18B20部結構如圖所示,主要由4部分組成:64 位ROM、溫度傳感器、非揮發(fā)的溫度報警觸發(fā)器TH和TL、配置寄存器。ROM中的64位序列號是出廠前被光刻好的,它可以看作是該DS18B20的地址序列碼,每個DS18B20的64

15、位序列號均不一樣。64位ROM的排的循環(huán)冗余校驗碼(CRC=X8X5X41)。 ROM的作用是使每一個DS18B20都各不一樣,這樣就可以實現一根總線上掛接多個DS18B20的目的。DS18B20部構成n DS18B20 部結構主要由四部分組成: 64 位光刻 ROM 、溫度傳感器、非揮發(fā)的溫度報警觸發(fā)器 TH 和 TL 、配置寄存器。n      光刻 ROM 中的 64 位序列號是出廠前被光刻好的,它可以看作是該 DS18B20 的地址序列碼。 64 位光刻 ROM 的排列是:開始 8 位(地址: 28H )是產品類型標號,接著的 48 位是該 DS

16、18B20 自身的序列號,并且每個 DS18B20 的序列號都不一樣,因此它可以看作是該 DS18B20 的地址序列碼;最后 8 位則是前面 56 位的循環(huán)冗余校驗碼( CRC=X8+X5+X4+1 )。由于每一個 DS18B20 的 ROM 數據都各不一樣,因此微控制器就可以通過單總線對多個 DS18B20 進行尋址,從而實現一根總線上掛接多個 DS18B20 的目的。3.8 報警電路當檢測到實際溫度大于設置溫度32時,可認為空氣溫度過高,此時應發(fā)出報警信號,提醒人們注意。報警信號輸出端定義為P2.4腳,連接電路如圖3-13所示:圖3-13 報警電路(注意:圖中的平1.2應為2.4)發(fā)聲元件

17、采用最常見的有源蜂鳴器,兩端施加直流電壓時就可以發(fā)聲。三極管在電路中作用為開關器件。蜂鳴器本質是一個感性元件,其電流不能瞬變,因此必須有一個續(xù)留二極管提供續(xù)流,否則,在蜂鳴器兩端會產生幾十伏的尖峰電壓,可能損壞驅動三極管,并干擾整個電路系統(tǒng)的其他部分。4. 軟件結構和程序框圖系統(tǒng)的軟件由三大模塊組成:主程序模塊、功能實現模塊和運算檢測器模塊4.1 主程序模塊主程序的作用為循環(huán)調用各個子模塊,通過調用各個子模塊不斷更新全局變量,然后各個子模塊使用新的變量來實現檢測的要求。4.2 功能實現模塊功能實現模塊按照各個檢測單元實現分別實現不同的功能,然后把個功能通過單片機聯(lián)系起來組成一個完整的能較好實現

18、預定功能的系統(tǒng)。4.2.3 溫度采集子模塊溫度采集模塊是用單片機采集ds18b20中的溫度數字信號,然后保存在單片機中,作為檢測的依據。由于ds18b20傳輸過來的為二進制信號,一位一位的傳送到P3.4,所以要將其按權轉化為單片機能夠使用的十進制。d示。圖4-4 讀取溫度流程圖4.2.4 顯示子模塊顯示子程序使用lcd示的方式,把設定溫度和實際溫度顯示在lcd中.圖4-5 顯示流程圖圖4-7 定時器T1流程圖結論本文通過對系統(tǒng)整體然后對每一個子模塊的詳細設計,我們得到了一個穩(wěn)定可靠的空氣溫度檢測系統(tǒng)。本系統(tǒng)能夠準確地檢測空氣溫度到設定的溫度,具有較好額調節(jié)功能??赡茉趯嶋H工作中會出現或大或小的

19、檢測偏差。由于本文使用的檢測器為89C52,而這種單片機具有串口通信的功能,如果對其加上串行總線就能和外部其他的檢測器進行通信,比如將溫度信號傳遞給PC機,從PC機設置設定溫度等。而PC機能夠連接到互聯(lián)網,這就能組成一個遠程的檢測網絡,從而組成物聯(lián)網一樣的檢測網絡。致 論文的設計過程中,我查閱了許多有關溫度檢測系統(tǒng)設計方面的文獻資料,使我對溫度檢測的設計和使用有了更深的認識。從論文選題到完成論文,賴友源老師付出了大量的時間和心血,在設計過程中,賴友源老師從多方面進行指導。在此,我要由衷地感同時,我也要感給予我?guī)椭耐瑢W,在不懂的環(huán)節(jié)為我努力探討。報告的完成,不僅是我大學知識積累的體現,而且也是

20、機械與電子工程學院所有老師悉心教導的結果,感他們讓我掌握了一定的專業(yè)知識,專業(yè)技能和一些為人處世的道理。最要感激父母,是他們給我學習的機會,并且在學業(yè)期間給我大力支持和為我付出!參考文獻1 毅剛單片機原理與應用M高等教育,20032 盧勝利單片機原理與應用技術實踐M 機械工業(yè) ,20093 步月基于單片機的測試技術原理與應用M 機械工業(yè) ,20074 于海生微型計算機檢測技術M第2版清華大學,20095 胡壽松自動檢測原理M第5版科學,20096 夕松 汪木蘭過程檢測系統(tǒng)M科學,20097 王兆安 黃俊電力電子技術M第4版 機械工業(yè),20108 振全 世鳳MATLAB語言與檢測系統(tǒng)仿真M 化學

21、工業(yè),20099 譚浩強C程序設計M第3版清華大學,200510 景波PROTEL 99SE電路設計與制板M機械工業(yè),201011 曉帆 根和高精度溫度檢測J學院學報,2007附錄部分程序如下:文件1:/#include <at89x51.h>/用AT89C51時就用這個頭文件#include <reg52.h>/用華邦W78E58B時必須用這個頭文件#include <absacc.h>#include <ctype.h>#include <math.h>#include <stdio.h>#include <st

22、ring.h>#include <DS18B20.h>#include <lcd.c> /液晶顯示頭文件#include <lcd-1.c> /液晶顯示頭文件/sbit DQ = P34; /定義DQ引腳為P3.4unsigned char t2,*pt;/用來存放溫度值,測溫程序就是通過這個數組與主函數通信的unsigned char TempBuffer19=0x2b,0x31,0x32,0x32,0x2e,0x30,0x30,0x43,'0'/顯示實時溫度,上電時顯示+125.00Cunsigned char TempBuffer

23、017=0x54,0x48,0x3a,0x2b,0x31,0x32,0x35,0x20,0x54,0x4c,0x3a,0x2b,0x31,0x32,0x34,0x43,'0'/顯示溫度上下限,上電時顯示TH:+125 TL:+124Cunsigned char code dotcode4=0,25,50,75;/*因顯示分辨率為0.25,但小數運算比較麻煩,故采用查表的方法*再將表值分離出十位和個位后送到十分位和百分位*/void covert0( unsigned char TH, unsigned char TL)/將溫度上下限轉換為LCD顯示的數據 if(TH>0x

24、7F) /判斷正負,如果為負溫,將其轉化為其絕對值 TempBuffer03=0x2d;/ /0x2d為"-"的ASCII碼TH=TH;TH+; else TempBuffer03=0x2b;/0x2B為"+"的ASCII碼 if(TL>0x7f) TempBuffer011=0x2d;/ /0x2d為"-"的ASCII碼 TL=TL+1; else TempBuffer011=0x2b;/0x2B為"+"的ASCII碼 TempBuffer04=TH/100+0x30; /分離出TH的百十個位 if( Te

25、mpBuffer04=0x30) TempBuffer04=0xfe; /百位數消隱 TempBuffer05=(TH%100)/10+0x30;/分離出十位 TempBuffer06=(TH%100)%10+0x30; /分離出個位 TempBuffer012=TL/100+0x30; /分離出TL的百十個位 if( TempBuffer012=0x30) TempBuffer012=0xfe; /百位數消隱 TempBuffer013=(TL%100)/10+0x30;/分離出十位 TempBuffer014=(TL%100)%10+0x30; /分離出個位void covert1(voi

26、d)/將溫度轉換為LCD顯示的數據 unsigned char x=0x00,y=0x00; t0=*pt; pt+; t1=*pt; if(t1>0x07) /判斷正負溫度 TempBuffer10=0x2d; /0x2d為"-"的ASCII碼t1=t1; /*下面幾句把負數的補碼*/t0=t0; /* 換算成絕對值*/x=t0+1; /*/t0=x; /*/if(x>255) /*/t1+; /*/ else TempBuffer10=0x2b;/0xfe為變"+"的ASCII碼 t1<<=4;/將高字節(jié)左移4位 t1=t1&

27、amp;0x70;/取出高字節(jié)的3個有效數字位 x=t0;/將t0暫存到X,因為取小數部分還要用到它 x>>=4;/右移4位 x=x&0x0f;/和前面兩句就是取出t0的高四位 t1=t1|x;/將高低字節(jié)的有效值的整數部分拼成一個字節(jié) TempBuffer11=t1/100+0x30; /+0x30 為變 09 ASCII碼 if( TempBuffer11=0x30) TempBuffer11=0xfe; /百位數消隱 TempBuffer12=(t1%100)/10+0x30;/分離出十位 TempBuffer13=(t1%100)%10+0x30; /分離出個位 t

28、0=t0&0x0c;/取有效的兩位小數 t0>>=2;/左移兩位,以便查表 x=t0; y=dotcodex;/查表換算成實際的小數 TempBuffer15=y/10+0x30;/分離出十分位 TempBuffer16=y%10+0x30;/分離出百分位void delay(unsigned char i)while(i-);main() unsigned char TH=32,TL=0; /讀取溫度,溫度值存放在一個兩個字節(jié)的數組中, unsigned intw,maini; /測溫函數返回這個數組的頭地址 T0init(); /定時器0初始化 while(1) spe

29、=0; LCD_Initial();/lcd初始化/for(maini=0;maini<25;maini+) main_1();LCD_Initial(); pt=ReadTemperature(TH,TL,0x3f); /上限溫度+110,下限-20,分辨率10位,也就是0.25Cdelay(100); /讀取溫度,溫度值存放在一個兩個字節(jié)的數組中, covert1(); /將溫度轉換為LCD顯示的數據covert0(TH,TL); /將溫度上下限轉換為LCD顯示的數據 /第一個參數列號,第二個為行號,為0表示第一行/為1表示第二行,第三個參數為顯示數據的首地址LCD_Print(1,

30、1,TempBuffer0); /下一步擴展時可能通過這兩個變量,調節(jié)上下限LCD_Print(1,0,TempBuffer1);for(w=0;w<999;w+) /*/ delay(400); /*/ /報警復位/ void timer0()interrupt 1TH0=(65536-50000)/256;TL0=(65536-50000)%256;/定時50MSif(-timecount=0)timecount=20;/執(zhí)行20次后秒標志位置1timeflag=1; /1Sif(+timecount1>1)timecount1 = 0;bit_100ms = 1; /置100

31、MS標志位文件2:/#include <at89x51.h>/用AT89C51時就用這個頭文件#include <reg52.h>/用華邦W78E58B時必須用這個頭文件sbit DQ = P34;/定義DQ引腳為P3.4 sbit spe=P24;/sbit spe=P37;/*ds18b20延遲子函數(晶振12MHz )*/ /*DS18B20對時間要求很嚴,但只能長不能短*在11.0592M下也行,因為時間長些*/*6u秒*/void delay_18B20(unsigned int i)while(i-);/*ds18b20初始化函數*/void Init_DS

32、18B20(void) unsigned char x=0; DQ = 1; /DQ復位 delay_18B20(8); /稍做延時 DQ = 0; /單片機將DQ拉低 delay_18B20(80); /精確延時 大于 480us DQ = 1; /拉高總線 delay_18B20(14); x=DQ; /稍做延時后 如果x=0則初始化成功 x=1則初始化失敗 delay_18B20(20);/*ds18b20讀一個字節(jié)*/ unsigned char ReadOneChar(void)unsigned char i=0;unsigned char dat = 0;for (i=8;i>

33、;0;i-) DQ = 0; / 給脈沖信號 dat>>=1; DQ = 1; / 給脈沖信號 if(DQ) dat|=0x80; delay_18B20(4); return(dat);/*ds18b20寫一個字節(jié)*/ void WriteOneChar(unsigned char dat) unsigned char i=0; for (i=8; i>0; i-) DQ = 0; DQ = dat&0x01; delay_18B20(5); DQ = 1; dat>>=1; /*讀取ds18b20當前溫度*/unsigned char *ReadTem

34、perature(char TH,char TL,unsigned char RS)unsigned char tt2;Init_DS18B20(); /初始化/WriteOneChar(0xCC); / 跳過讀序號列號的操作/WriteOneChar(0x4E); /寫入"寫暫存器"命令,修改TH和TL和分辯率配置寄存器 /先寫TH,再寫TL,最后寫配置寄存器/WriteOneChar(TH);/寫入想設定的溫度報警上限/WriteOneChar(TL);/寫入想設定的溫度報警下限/WriteOneChar(RS);/寫配置寄存器,格式為0 R1 R0 1,1 1 1 1

35、/R1R0=00分辨率婁9位,R1R0=11分辨率為12位/delay_18B20(80); / this message is wery important/Init_DS18B20();WriteOneChar(0xCC); / 跳過讀序號列號的操作/WriteOneChar(0x44); / 啟動溫度轉換/delay_18B20(80); / this message is wery importantInit_DS18B20();WriteOneChar(0xCC); /跳過讀序號列號的操作WriteOneChar(0xBE); /讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度d

36、elay_18B20(80);tt0=ReadOneChar(); /讀取溫度值低位tt1=ReadOneChar(); /讀取溫度值高位if(tt1>0x01) spe=1; /報警/return(tt);文件3:#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code wlcome16=" Hua Bi"/定義第一行顯示數組uchar lcdtimer16=" 00 : 00 : 00.0"/定義第二行顯示數組uchar timec

37、ount; /時間計數寄存器uchar timecount1;bit timeflag;/時間標志位bitbit_100ms;sbit e=P22;sbit rw=P21;sbit rs=P20;/-/延時函數,晶振為12MHZ,延時約為40US*dell/-void delay1(uint del1)uchar del2;for(;del1>0;del1-)for(del2=10;del2>0;del2-);/-/液晶1602顯示判忙函數/-void busy()uchar temp;temp=0x00;rs=0;/指令rw=1;/讀BF值while(temp&0x80)

38、=0x80)/如果BF值為1:P1=0xff;e=1;/允許讀寫temp=P1;/讀取P1狀態(tài)e=0;/禁止讀寫/-/向液晶顯示器寫命令函數/-void WR_(uchar temp)busy();/調用判忙函數rs=0;/指令rw=0;/寫P1=temp;/把指令寫入RAMe=1;/允許讀寫e=0;/禁止讀寫/-/向液晶顯示器寫數據函數/-void WR_data(uchar num)busy();/調用判忙函數rs=1;/數據rw=0;/寫P1=num;/把數據寫入RAMe=1;/允許讀寫e=0;/禁止讀寫/-/寫顯示數據函數(首地址:第一行還是/ 第二行?,待顯示數組首地址)/-void

39、 disp_lcd(uchar addr,uchar *temp1)uchar i;WR_(addr);/設置DDRAM地址delay1(100);for(i=0;i<16;i+)WR_data(temp1i);/寫入要顯示的數據delay1(100);/-/液晶顯示器初始化函數/-void lcd_ini()char i;for(i=3;i>0;i-)P1=0x30;/8位數據接口rs=0;/指令rw=0;/讀e=1;/禁止讀寫e=0;/允許讀寫delay1(100);P1=0x38;/兩行顯示rs=0;/指令rw=0;/寫e=1;/允許讀寫e=0;/禁止讀寫delay1(100

40、);/-/液晶顯示器復位函數/-void lcd_reset()WR_(0x01);/清屏delay1(100);WR_(0x06);/數據讀、寫后,AC加1delay1(100);WR_(0x0c);/顯示開delay1(100);/-/定時器初始化函數/-void T0init()TMOD=0x01;/設置定時器0方式1TH0=(65536-50000)/256;TL0=(65536-50000)%256;/裝初值TR0=1;/啟動計數IE=0x82;/開總中斷,開定時器0中斷timeflag=0;timecount=20;/-/清零時間函數/-void clear() /ASK碼48對應

41、數字0lcdtimer15 = lcdtimer13 = lcdtimer12 = 48; lcdtimer8 = lcdtimer7 = lcdtimer3 = lcdtimer2 = 48;/-void main_1()/lcd_ini();/初始化/lcd_reset();/復位disp_lcd(0x80,wlcome);/第一行顯示WLCOME數組disp_lcd(0xc0,lcdtimer);/第二行顯示時間if(bit_100ms = 1)/秒小數位bit_100ms = 0;if(+lcdtimer15>57)lcdtimer15 = 48;if(timeflag=1) /

42、判斷1S標志位timeflag=0; /清零秒標志位if(+lcdtimer13>57) /秒個位+1,是否大于9?(ASK碼48-57)對應數字0-9)lcdtimer13 = 48; /清零秒個位if(+lcdtimer12>53) /秒十位+1,大于6?(48+6=53)lcdtimer12 = 48;/清零秒十位if(+lcdtimer8>57) /分個位+1,個位>9?lcdtimer8 = 48;/分個位清零if(+lcdtimer7>53)/分十位+1,大于6?lcdtimer7 = 48; /分十位清零if(+lcdtimer3>57)/小時

43、個位+1,大于9?lcdtimer3 = 48; /清零時個位if(+lcdtimer2>53)/小時十位+1,大于6?lcdtimer2 = 48; /小時十位清零disp_lcd(0xc0,lcdtimer);/第二行顯示更新/-/定時器0中斷服務函數/-文件4:/#include <at89x51.h>/用AT89C51時就用這個頭文件#include <reg52.h>/用華邦W78E58B時必須用這個頭文件#include <intrins.h>#include <time.h>/注意那個LCD_Wait()函數,它是判"忙"標志的,在實際硬件要把注掉的那種打開/Port Definitions*sbit LcdRs= P20;sbit LcdRw= P21;sbit LcdEn = P22;sfr DBPort = 0x90;/P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.數據端口/部等待函數*unsigned char LCD_Wait(void)LcdRs=0;LcdRw=1;_nop_();LcdEn=1;_nop_();/while(DBP

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論