數(shù)字溫傳感器應用_第1頁
數(shù)字溫傳感器應用_第2頁
數(shù)字溫傳感器應用_第3頁
數(shù)字溫傳感器應用_第4頁
數(shù)字溫傳感器應用_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、傳感器課程設計報告溫度傳感器專業(yè)班級應用電子2班姓名方暢、曹文榮、梁銳權時間15周 至18周指導老師馮偉2007年6月23日1. 設計要求n 基本范圍 -55 120n 精度誤差小于 1n LED數(shù)碼直讀顯示2. 擴展功能n 可以任意設定溫度的上限報警功能n 有鳴蜂器報警n 溫度狀態(tài)設置指示燈,溫度報警指示燈,傳感器檢測指示燈n 有溫度自保功能(在一分鐘內(nèi)降不了溫,自動關閉系統(tǒng))n 傳感器檢測功能(如果系統(tǒng)檢測沒有傳感器存在,四次提示內(nèi)沒有插入傳感器則關閉系統(tǒng))溫度控制器摘要:隨著時代的進步和發(fā)展,單片機技術已經(jīng)普及到我們生活,工作,科研,各個領域,一種數(shù)字式溫度計以數(shù)字溫度傳感器作感溫元件,

2、它以單總線的連接方式,使電路大大的簡化;傳統(tǒng)的溫度檢測大多以熱敏電阻為傳感器,這類傳感器可靠性差,測量溫度準確率低且電路復雜。因此,本溫度計擺脫了傳統(tǒng)的溫度測量方法,利用單片機對傳感器進行控制。這樣易于智能化控制。2.1. 總體設計方案2.1.0數(shù)字溫度計設計方案論證2.1.1方案一由于本設計是測溫電路,可以使用熱敏電阻之類的器件利用其感溫效應,在將隨被測溫度變化的電壓或電流采集過來,進行A/D轉(zhuǎn)換后,就可以用單片機進行數(shù)據(jù)的處理,在顯示電路上,就可以將被測溫度顯示出來,這種設計需要用到A/D轉(zhuǎn)換電路,感溫電路比較麻煩。2.1.2 方案二 進而考慮到用溫度傳感器,在單片機電路設計中,大多都是使

3、用傳感器,所以這是非常容易想到的,所以可以采用一只溫度傳感器DS18B20,此傳感器,可以很容易直接讀取被測溫度值,進行轉(zhuǎn)換,就可以滿足設計要求。從以上兩種方案,很容易看出,采用方案二,電路比較簡單,軟件設計也比較簡單,故采用了方案二。方案二的總體設計框圖溫度計電路設計總體設計方框圖如圖1所示,控制器采用單片機AT89S52,溫度傳感器采用DS18B20,用4位LED數(shù)碼管以P0和P2控制LED實現(xiàn)溫度顯示。2.1.3 主控制器單片機AT89S52具有低電壓供電和體積小等特點,四個端口就足夠能滿足電路系統(tǒng)的設計需要,很適合便攜手持式產(chǎn)品的設計使用系統(tǒng)可用二節(jié)電池供電。2.1.4 顯示電路顯示電

4、路采用4位共陽LED數(shù)碼管,從P0口輸出顯示數(shù)據(jù),用P2口來控制位選。2.1.5溫度傳感器DS18B20溫度傳感器是美國DALLAS半導體公司最新推出的一種改進型智能溫度傳感器,與傳統(tǒng)的熱敏電阻等測溫元件相比,它能直接讀出被測溫度,并且可根據(jù)實際要求通過簡單的編程實現(xiàn)位的數(shù)字值讀數(shù)方式。DS18B20的性能特點如下:獨特的單線接口僅需要一個端口引腳進行通信;多個DS18B20可以并聯(lián)在惟一的三線上,實現(xiàn)多點組網(wǎng)功能;無須外部器件;可通過數(shù)據(jù)線供電,電壓范圍為3.05.5;零待機功耗;溫度以或位數(shù)字;用戶可定義報警設置;報警搜索命令識別并標志超過程序限定溫度(溫度報警條件)的器件;負電壓特性,電

5、源極性接反時,溫度計不會因發(fā)熱而燒毀,但不能正常工作; DS18B20采用腳PR35封裝或腳SOIC封裝,其內(nèi)部結(jié)構框圖如圖2所示。64位ROM的結(jié)構開始位是產(chǎn)品類型的編號,接著是每個器件的惟一的序號,共有48位,最后位是前面56位的CRC檢驗碼,這也是多個DS18B20可以采用一線進行通信的原因。溫度報警觸發(fā)器和,可通過軟件寫入戶報警上下限。DS18B20溫度傳感器的內(nèi)部存儲器還包括一個高速暫存和一個非易失性的可電擦除的EERAM。高速暫存RAM的結(jié)構為字節(jié)的存儲器,結(jié)構如圖3所示。頭個字節(jié)包含測得的溫度信息,第和第字節(jié)和的拷貝,是易失的,每次上電復位時被刷新。第個字節(jié),為配置寄存器,它的內(nèi)

6、容用于確定溫度值的數(shù)字轉(zhuǎn)換分辨率。DS18B20工作時寄存器中的分辨率轉(zhuǎn)換為相應精度的溫度數(shù)值。該字節(jié)各位的定義如圖3所示。低位一直為,是工作模式位,用于設置DS18B20在工作模式還是在測試模式,DS18B20出廠時該位被設置為,用戶要去改動,R1和0決定溫度轉(zhuǎn)換的精度位數(shù),來設置分率。由表1可見,DS18B20溫度轉(zhuǎn)換的時間比較長,而且分辨率越高,所需要的溫度數(shù)據(jù)轉(zhuǎn)換時間越長。因此,在實際應用中要將分辨率和轉(zhuǎn)換時間權衡考慮。高速暫存的第、字節(jié)保留未用,表現(xiàn)為全邏輯。第字節(jié)讀出前面所有字節(jié)的CRC碼,可用來檢驗數(shù)據(jù),從而保證通信數(shù)據(jù)的正確性。當DS18B20接收到溫度轉(zhuǎn)換命令后,開始啟動轉(zhuǎn)換

7、。轉(zhuǎn)換完成后的溫度值就以16位帶符號擴展的二進制補碼形式存儲在高速暫存存儲器的第、字節(jié)。單片機可以通過單線接口讀出該數(shù)據(jù),讀數(shù)據(jù)時低位在先,高位在后,數(shù)據(jù)格式以0.0625LSB形式表示。當符號位時,表示測得的溫度值為正值,可以直接將二進制位轉(zhuǎn)換為十進制;當符號位時,表示測得的溫度值為負值,要先將補碼變成原碼,再計算十進制數(shù)值。表2是一部分溫度值對應的二進制溫度數(shù)據(jù)。DS18B20完成溫度轉(zhuǎn)換后,就把測得的溫度值與RAM中的TH、T字節(jié)內(nèi)容作比較。若TH或TTL,則將該器件內(nèi)的報警標志位置位,并對主機發(fā)出的報警搜索命令作出響應。因此,可用多只DS18B20同時測量溫度并進行報警搜索。在64位R

8、OM的最高有效字節(jié)中存儲有循環(huán)冗余檢驗碼(CRC)。主機ROM的前56位來計算CRC值,并和存入DS18B20的CRC值作比較,以判斷主機收到的ROM數(shù)據(jù)是否正確。DS18B20的測溫原理是這這樣的,器件中低溫度系數(shù)晶振的振蕩頻率受溫度的影響很小,用于產(chǎn)生固定頻率的脈沖信號送給減法計數(shù)器;高溫度系數(shù)晶振隨溫度變化其振蕩頻率明顯改變,所產(chǎn)生的信號作為減法計數(shù)器的脈沖輸入。器件中還有一個計數(shù)門,當計數(shù)門打開時,DS18B20就對低溫度系數(shù)振蕩器產(chǎn)生的時鐘脈沖進行計數(shù)進而完成溫度測量。計數(shù)門的開啟時間由高溫度系數(shù)振蕩器來決定,每次測量前,首先將55所對應的一個基數(shù)分別置入減法計數(shù)器、溫度寄存器中,計

9、數(shù)器和溫度寄存器被預置在-55所對應的一個基數(shù)值。減法計數(shù)器對低溫度系數(shù)晶振產(chǎn)生的脈沖信號進行減法計數(shù),當減法計數(shù)器的預置值減到時,溫度寄存器的值將加,減法計數(shù)器的預置將重新被裝入,減法計數(shù)器重新開始對低溫度系數(shù)晶振產(chǎn)生的脈沖信號進行計數(shù),如此循環(huán)直到減法計數(shù)器計數(shù)到時,停止溫度寄存器的累加,此時溫度寄存器中的數(shù)值就是所測溫度值。其輸出用于修正減法計數(shù)器的預置值,只要計數(shù)器門仍關閉就重復上述過程,直到溫度寄存器值大致被測溫度值。2.3DS18B20溫度傳感器與單片機的接口電路1.DS18B20可以采用兩種方式供電,一種是采用電源供電方式,此時DS18B20的1腳接地,2腳作為信號線,3腳接電源

10、。另一種是寄生電源供電方式,如圖4 所示單片機端口接單線總線,為保證在有DS18B20時鐘周期內(nèi)提供足夠的電流,可用一個MOSFET管來完成對總線的上拉。當DS18B20處于寫存儲器操作和溫度A/D轉(zhuǎn)換操作時,總線上必須有強的上拉,上拉開啟時間最大為10us。采用寄生電源供電方式時VDD端接地。由于單線制只有一根線,因此發(fā)送接口必須是三態(tài)的。2.4 系統(tǒng)整體硬件電路 主板電路系統(tǒng)整體硬件電路包括,電源電路,傳感器電路,溫度顯示電路,上限報警調(diào)整按鍵電路,單片機主板電路等,如圖5 所示。圖5中有三個獨立式按鍵可以分別調(diào)整溫度計的上限報警設置,圖中蜂鳴器可以在被測溫度不在上下限范圍內(nèi)時,發(fā)出報警鳴

11、叫聲音,同時LED數(shù)碼管將被測溫度值顯示,這時可以調(diào)整報警上下限,從而測出被測的溫度值,有三個LED二極管它們分別是:黃色的是傳感器存在指示燈;紅色的是設置狀態(tài)指示燈;綠色的是報警指示燈。圖5 中的按健復位電路是上電復位加手動復位,使用比較方便,在程序跑飛時,可以手動復位,這樣就不用在重起單片機電源,就可以實現(xiàn)復位。 電源電路圖.3上限報警調(diào)整按鍵電路2.4.4 顯示電路顯示電路是使用的P0口和P2做LED數(shù)據(jù)顯示,這種動態(tài)顯示最大的優(yōu)點就是顯示內(nèi)容豐富,但占用口資源比較多,單片機主板電路3系統(tǒng)軟件算法分析系統(tǒng)程序主要包括主程序,讀出溫度子程序,溫度轉(zhuǎn)換命令子程序,計算溫度子程序,顯示數(shù)據(jù)刷新

12、子程序等。3.1主程序主程序的主要功能是負責溫度的實時顯示、讀出并處理DS18B20的測量的當前溫度值,溫度測量每1s進行一次。這樣可以在一秒之內(nèi)測量一次被測溫度,其程序流程見圖7所示。3.2讀出溫度子程序讀出溫度子程序的主要功能是讀出RAM中的9字節(jié),在讀出時需進行CRC校驗,校驗有錯時不進溫度數(shù)據(jù)的改寫。其程序流程圖如圖8示3.3溫度轉(zhuǎn)換命令子程序溫度轉(zhuǎn)換命令子程序主要是發(fā)溫度轉(zhuǎn)換開始命令,當采用12位分辨率時轉(zhuǎn)換時間約為750ms,在本程序設計中采用1s顯示程序延時法等待轉(zhuǎn)換的完成。溫度轉(zhuǎn)換命令子程序流程圖如上圖,圖9所示3.4 計算溫度子程序計算溫度子程序?qū)AM中讀取值進行BCD碼的

13、轉(zhuǎn)換運算,并進行溫度值正負的判定,其程序流程圖如圖10所示。3.5 顯示數(shù)據(jù)刷新子程序顯示數(shù)據(jù)刷新子程序主要是對顯示緩沖器中的顯示數(shù)據(jù)進行刷新操作,當最高顯示位為0時將符號顯示位移入下一位。程序流程圖如圖11。3.6 溫度傳感器的使用本傳感器有三個按鍵(RST,SET,UP,DOWN),三個LED二極管(黃色,紅色,綠色),一個鳴蜂器。RST(單片機復位)但單片機里面的程序出現(xiàn)死循環(huán)時,按這個按鍵使單片機重新工作。SET(溫度傳感器開關機和溫度狀態(tài)設置)但第一次短下鍵時溫度傳感器開始開機工作,其次短按下鍵時進行溫度狀態(tài)設置,但進入狀態(tài)設置時,紅色LED二極管和數(shù)碼關會閃爍,表示已經(jīng)進入溫度上限

14、值設置。但長按鍵維持3秒是系統(tǒng)就會關閉。UP(溫度上限值加)在進入溫度設置狀態(tài)時,對溫度上限值加一。如果長按時,會快速加。DOWN(溫度上限值減)在進入溫度設置狀態(tài)時,對溫度上限值減一。如果長按時,會快速減。黃色LED(傳感器檢測指示燈)如果這燈亮,表示但前系統(tǒng)檢測到?jīng)]有傳感器。在開機時也會提示NO-SENSOR(沒有傳感器),在開機后系統(tǒng)還檢測不到傳感器就會每15秒提示一次NO-SENSOR(沒 有傳感器),提示四次時系統(tǒng)將自動關閉。這樣就防止傳感器損壞或松動甚至沒有接上使系統(tǒng)誤測而導致的一些不好后果。綠色LED(溫度報警指示燈)但實際溫度超過設置溫度值時這燈和鳴蜂器就會發(fā)出報警信號,如果這

15、信號維持超過1分鐘,則認為外部降溫設備有故障,系統(tǒng)將自動關閉。這樣的好處就是但降溫外設備出現(xiàn)故障或發(fā)熱設備功耗過大發(fā)熱嚴重時對這些故障進行有效的控制。紅色LED(溫度設置狀態(tài)指示燈)但溫度傳感器在溫度設置狀態(tài)時該燈會閃爍。8段數(shù)碼管電源接口(912V) 電源指示燈RST鍵UP鍵溫度報警指示燈傳感器檢測指示燈設置狀態(tài)指示燈DOWN鍵 溫度傳感器SET鍵鳴蜂器 傳感器實物圖4總結(jié)與體會     經(jīng)過將近三周的傳感器課程設計,終于完成了我的數(shù)字溫度計的設計,雖然沒有完全達到設計要求,但從心底里說,還是高興的,畢竟這是第一次搞這樣的設計還把實物都做了出來,高興之

16、余不得不總結(jié)經(jīng)驗此次呀!在本次設計的過程中,我發(fā)現(xiàn)了自己的很多的問題,以前還沒有做過這樣的設計。在這次設計真的讓我們長進了很多,明白了傳感器課程設計重點就在于對傳感器元件的應用和對傳感器用途的理解,可以說這次設計是為我們的畢業(yè)設計提前的一次練習。以前我們做的很多,都不象這次做的那樣系統(tǒng)化的設計,都是一些硬件的搭建就行。而這次并不單單是搭建硬件,還要有軟件的支持才能使設計的東西工作。這就體現(xiàn)本次課程設計的難度和對各門知識的應用程度。真的有好多的東西,只有我們?nèi)ピ囍隽?,才能真正的掌握,只學習理論有些東西是很難理解的,更談不上掌握。從這次的課程設計中,我真真正正的意識到,在以后的學習中,要理論聯(lián)系

17、實際,把我們所學的理論知識用到實際當中,學習傳感器這門課更是如此,所以理論的穩(wěn)固在實際過程中才能提高,這就是我在這次課程設計中的最大收獲。本課程設計資料由以下提供: 書籍:8051系列單片機C語言設計完全手冊單片機原理及應用 第2版 網(wǎng)頁: http:/ http:/5 程序代碼本程序采用C語言用KeilC51軟件進行編譯。用一個接口函數(shù)LED_Display.h將主函數(shù)Trime+key.c 與LED顯示函數(shù)LED_Display.c和ASCII轉(zhuǎn)成LED顯示的數(shù)據(jù)函數(shù)BCD_ASCII.C同延時程序Delay.c 所構成。這樣使的程序模塊化使每段都體現(xiàn)自己的功能,直觀易懂再加上注釋更便于閱

18、讀和理解程序。本程序利用定時中斷對按鍵進行查詢,然后再跳到相應的處理程序去執(zhí)行。在按鍵功能中用了尋址的狀態(tài)寄存器做為按鍵功能的分配,這樣就使的按鍵功能多樣化,使用靈活。/*= 溫度控制器 廣州工程職業(yè)技術學院 傳感器課程設計指導老師: 馮偉 作者: GIT-3408-YOUJJYY (方暢,曹文榮,梁銳權) 時間: 2007-4-25溫度傳感器使用單總線DS18B20接口模式CPU為AT89S52,三個按鍵(RST,UP,DOWN,SET),晶振為11.0592MHz直流912V供電,四個LED數(shù)碼管顯示溫度調(diào)節(jié)上限為125度,下限為-55度(本程序只能用于單只18B20)=*/#includ

19、e <at89x52.h>#include <intrins.h>#include <main_led_display.h>/*-用于按鍵可位尋址的狀態(tài)寄存器-*/static unsigned char bdata StateREG; sbit DS1820ON=StateREG0; /DS18B20是否存在sbit SetTF=StateREG1; /是否是在溫度設置狀態(tài)sbit KeySETDown=StateREG2; /"1"為已按過SET鍵,"0"為沒按過SET按sbit PowTF=StateREG3;

20、/電源標識("0"為開電源,"1"為關電源)sbit KeyTF=StateREG4; /"0"為按鍵允許,"1"為不允許sbit KeySETDowning=StateREG5; /SET是否正在按下sbit LEDTF=StateREG6; /開機LOG標志位static unsigned char bdata TLV _at_ 0x0029; /溫度變量高低位static unsigned char bdata THV _at_ 0x0028;static signed char TMV; /轉(zhuǎn)換后的溫度值s

21、tatic unsigned char KeyV,TempKeyV; /鍵值static signed char TMRomV _at_ 0x0027; /高溫度限制static signed char TMSetV _at_ 0x0026; /溫度設定值static unsigned char KSDNum; /SET鍵連按時的采集次數(shù)static unsigned char IntNum,IntNum2,IntNum3;/中斷發(fā)生次數(shù)(IntNum用于SET長按檢測,IntNum2用于設定狀態(tài)時LED閃爍,IntNum用于連按其他鍵)static unsigned int IntNum4,

22、IntNum5;static signed char Sign; /負號標識static unsigned char LED_One,LED_Two,LED_Three;/*- 數(shù)值轉(zhuǎn)換-*/void V2ToV(void) TLV>>=4; THV<<=4; /讀出的高低位數(shù)值移位 TMV=TLV|THV; /合并高低位放入TM為實際溫度值 Sign=0; if(SetTF|!Key_SET)Sign=TMSetV>>7; /取符號 else Sign=TMV>>7; if(Sign) if(SetTF|!Key_SET) LED_One=(T

23、MSetV-1)/100; /SET狀態(tài)下顯示設定值 LED_Two=(TMSetV-1)-LED_One*100)/10; LED_Three=(TMSetV-1)-LED_One*100-LED_Two*10; else LED_One=(TMV-1)/100; /轉(zhuǎn)換百位數(shù)值 LED_Two=(TMV-1)-LED_One*100)/10; LED_Three=(TMV-1)-LED_One*100-LED_Two*10; else if(SetTF|!Key_SET) LED_One=TMSetV/100; /SET狀態(tài)下顯示設定值 LED_Two=(TMSetV-LED_One*10

24、0)/10; LED_Three=TMSetV-LED_One*100-LED_Two*10; else LED_One=TMV/100; /轉(zhuǎn)換百位數(shù)值 LED_Two=(TMV-LED_One*100)/10; LED_Three=TMV-LED_One*100-LED_Two*10; /=轉(zhuǎn)換LED字段=/ if(LED_One)LED_Two=BCD_ASCIILED_Two+1; /超過百時十位的處理 else if(LED_Two=0)LED_Two=BCD_ASCII0; else LED_Two=BCD_ASCIILED_Two+1; if(Sign)LED_One=0xf7;

25、 else if(LED_One=0)LED_One=BCD_ASCII0; else LED_One=BCD_ASCIILED_One+1; LED_Three=BCD_ASCIILED_Three+1; /*-初始化DS1820 -*/ void InitDS1820(void) TMPort=1; _nop_(); TMPort=0; Delay_6n5_8us(77); /延時 DS1820復位時間要500US的抵電平 TMPort=1; Delay_6n5_8us(16); /延時112US 等待DS1820的回應 if(!TMPort)DS1820ON=1;ON_DS1820=1;

26、 /檢測是否有DS1820 else DS1820ON=0;ON_DS1820=0; Delay_6n5_8us(55); TMPort=1; /*-寫數(shù)據(jù)-*/void Write_Data(uchar T_DATA) uchar i,DATA_T; DATA_T=T_DATA; for(i=0;i<=7;i+) TMPort=0; Delay_6n5_8us(1); /延時15微秒 if(DATA_T&0x01)TMPort=1;else TMPort=0;DATA_T>>=1; Delay_6n5_8us(7); /延時54微秒TMPort=1;_nop_();

27、TMPort=1; /*-寫入溫度限制值發(fā)出4EH寫ROM指令后連發(fā)兩個字節(jié)-*/void WriteDS1820(void) uchar TM_H,TM_L; TM_H>>=4; TM_L<<=4; Write_Data(TM_H); Write_Data(TM_L);/*-讀數(shù)據(jù)-*/uchar ReadTM(void) uchar i,TM_DATA; for(i=0;i<=7;i+) TM_DATA>>=1; TMPort=1; _nop_();_nop_(); TMPort=0; _nop_();_nop_();_nop_(); TMPort

28、=1; Delay_6n5_8us(1); if(TMPort)TM_DATA|=0x80; Delay_6n5_8us(6); return (TM_DATA); /*-讀出溫度值將溫度高位和低位,高溫度限制位從DS1820中讀出 低位存入29H(TEMPER_L), 高位存入28H(TEMPER_H), 高溫度限制位存入27H(TMRomV) -*/void ReadDS1820(void) TLV=ReadTM(); THV=ReadTM(); TMRomV=ReadTM(); /*=主程序=*/void main(void) StateREG=0; /初始化變量 SetTF=1; /在

29、設置溫度狀態(tài) PowTF=1; /關電源 THV=0; /溫度數(shù)據(jù)存儲(高地址:0x0028,低地址:0x0029) TLV=0; TMV=0;/轉(zhuǎn)換后的溫度值 KeyV=0; KSDNum=0;/SET鍵連按時的采集次數(shù) IntNum=0; /用于SET長按檢測 IntNum2=0;/用于設定狀態(tài)時LED閃爍 IntNum3=0; LED_One=0; LED_Two=0; Beep=1; LEDTF=0; InitDS1820();/初始化 Write_Data(0xcc);/跳過ROM Write_Data(0xb8);/E2RAM中的溫度上限值調(diào)入RAM InitDS1820(); W

30、rite_Data(0xcc);/跳過ROM Write_Data(0xbe);/讀出溫度指令 ReadDS1820();/讀出溫度值和上限值 TMSetV=TMRomV;/拷貝保存在DS1820ROM里的上限值到TMSet EA=1; /允許CPU中斷 ET0=1; /定時器0中斷開 TMOD=0x01; /設定時器0為模式1,16位模式 TH0=0XB1; TL0=0XDF; /設定時值為20MS TR0=1; /開定時 while(1); /*- 定時器0中斷處理中鍵掃描和顯示 -*/ void KeyAndDis_Time0(void) interrupt 1 using 2 TH0=

31、0XB1; TL0=0XDF; /設定時值為20MS LEDPort=0xff; /關閉LED/*-對按下的鍵值附值-*/ if(!Key_UP)KeyV=1; /檢測Key_UP是否按下 if(!Key_DOWN)KeyV=2; /檢測Key_DOWN是否按下 if(!Key_SET)KeyV=3; /檢測Key_SET是否按下 KeySETDowning=0; /清除/*-檢測是否有鍵按下-*/ if(KeyV!=0) /KeyV不等于零表示有鍵按下 Delay_1ms(10); /延時防抖 按下10MS再測if(!Key_UP)TempKeyV=1; if(!Key_DOWN)TempK

32、eyV=2;if(!Key_SET)TempKeyV=3;if(KeyV=TempKeyV) /兩次值相等為確定接下了鍵 /*-判斷是否是Key_SET按下-*/ if(KeyV=3) /按下SET鍵,如在SET狀態(tài)就退出,否則進入 KeySETDowning=1; /表明SET正在按下 PowTF=0; /電源標識開 if(!KeyTF) /KeyTF為1不允許執(zhí)行下程序 if(SetTF) SetTF=0; /是否是在溫度設置狀態(tài)標識位標識退出設定 InitDS1820(); Write_Data(0xcc); /跳過ROM Write_Data(0x4e); /寫溫度上限指令 Write

33、DS1820(); /寫溫度上限到DS1820ROM InitDS1820(); Write_Data(0xcc);/跳過ROM匹配 Write_Data(0x48); /溫度上限值COPY回E2PRAM else SetTF=1; /為下一次沒按SET時,按其他鍵作準備 if(!KeySETDown)KeySETDown=1;OPen=1; /是否已按過SET鍵標識 else KSDNum+=1; /前一秒內(nèi)有按SET則開始計數(shù) /*-Key_UP和Key_DOWN的檢測-*/ if(SetTF) /在SET狀態(tài)下 if(KeyV=1)&&(!KeyTF)TMSetV+=1,

34、OPen=0; /上調(diào)溫度 if(KeyV=2)&&(!KeyTF)TMSetV-=1,OPen=0; /下調(diào)溫度 if(TMSetV<=-55)TMSetV=-55; if(TMSetV>=125)TMSetV=125; if(!KeyTF)&&(IntNum3=0)KeyTF=1; /判斷鍵盤是否處于可用時 /*-按鍵長按的處理-*/ if(KeySETDown)IntNum+=1; /在2秒內(nèi)按下了SET則計中斷發(fā)生次數(shù)用于長按SET時計時用 if(IntNum>60) IntNum=0; KeySETDown=0;/*-按長SET的處理

35、-*/ if(KSDNum>=60) /如一直長按了SET 3秒左右 RelayOutPort=1; /關閉控制對象 PowTF=1; /電源標識關 LED_Display(0,21,2,"-_OFF_-2007_6_23_-"); LEDPort=0xbf; /顯示"-" LEDOneC=0; LEDTwoC=0; LEDThreeC=0; LED_C=0; Delay_100ms(40);/延時4S LEDOneC=1; /關顯示 LEDTwoC=1; LEDThreeC=1; IntNum=0; IntNum2=0; IntNum3=0; I

36、ntNum4=0; Beep=1; OPen=1; LEDTF=0; KSDNum=0; KeyV=0; /清空變量準備下次鍵掃描 TempKeyV=0; OPen=1;/*-開電源程序-*/ if(!PowTF) if(LEDTF=0) LED_Display(0,26,2,"-_OPEN_-_3408_YOUJJYY_-"); if(DS1820ON=0)LED_Display(0,14,2,"-_NO-SENSOR_-"); LEDTF=1; InitDS1820(); if(DS1820ON=0)IntNum5+=1; if(DS1820ON=0

37、)&&(IntNum5>400) LED_Display(0,14,2,"-_ON-SENSOR_-");IntNum5=0;IntNum4+=500; Write_Data(0xcc); Write_Data(0x44); Delay_6n5_8us(152); /延時1000uS 等轉(zhuǎn)換完成 InitDS1820(); Write_Data(0xcc); Write_Data(0xbe); /讀出溫度指令 ReadDS1820(); /讀出溫度值 V2ToV(); /轉(zhuǎn)換顯示值 if(TMV>TMSetV)RelayOutPort=0,Bee

38、p=0,IntNum4+=1; /根據(jù)采集的溫度值控制對象 else if(DS1820ON=1) RelayOutPort=1,Beep=1,IntNum4=0; if(IntNum4>=2000)KSDNum=60,IntNum=60,KeySETDown=1,KeyV=4; if(SetTF)IntNum2+=1,OPen=1; /用于閃爍計數(shù) if(IntNum2>50)IntNum2=0,OPen=0;/*-連按Key_UP或Key_DOWN鍵時的采集次數(shù)-*/ if(KeyTF)IntNum3+=1; /用于防止按鍵連按 if(IntNum3>15) /檢測按鍵是

39、否超過 IntNum3=0; KeyTF=0; if(SetTF)&&(IntNum2<20)goto InitEnd; /使LED閃爍 LEDPort=LED_One; LEDOneC=0; Delay_1ms(1); LEDOneC=1; /顯示百位數(shù) LEDPort=LED_Two; LEDTwoC=0; Delay_1ms(1); LEDTwoC=1; /顯示十位數(shù) LEDPort=LED_Three; LEDThreeC=0; Delay_1ms(1); LEDThreeC=1; /顯示個位數(shù) InitEnd: if(!PowTF)LEDPort=0x34; L

40、ED_C=0; Delay_1ms(1); LED_C=1; /*= LED顯示驅(qū)動程序文件名:LED_Display.c作者 YOUJJYY 時間:2007.4.6 =*/#include <at89x52.h>#include <main_led_display.h>#define uchar unsigned char/*顯示數(shù)據(jù)的轉(zhuǎn)換*/uchar TO_DATA(bit n_s,uchar I,uchar led_data) uchar x3,y; if(n_s=1) switch(I) case 0:if(led_data!=y)P0=P00x20;y=le

41、d_data; break; case 1: x2=(led_data>>4)+1;x3=(led_data&0x0f)+1; break; case 2: x0=(led_data>>4)+1;x1=(led_data&0x0f)+1; break; default:break; return xI;else if(led_data<46)led_data=0; else led_data-=47; return led_data; /*LED顯示程序*/N_S是數(shù)字和字符串顯示選擇,/data_size顯示多少位/S_D是顯示方式(0x00:靜

42、態(tài),0x01:半動態(tài),0x02:全動態(tài))/LED_data是要顯示的數(shù)據(jù)/*=*/void LED_Display(bit N_S,uchar data_size,uchar S_D,uchar *LED_data) uchar t,y,i,x,z,a,k=20,size=0;/*顯示方式S_D*/ switch(S_D) case 0:a=0; break; case 1:a=4,k=80,size/=4; break; case 2:a=1;/size-=4; break; default:break;/*顯示個數(shù)data_size*/ for(i=0;i<data_size;i+)

43、 /BCD碼轉(zhuǎn)換成LED碼 if(N_S=1)size=0; else size+=1; /*顯示程序*/ for(t=0;t<=size;t+) /要顯示的位數(shù) for(y=0;y<=k;y+) /循環(huán)20顯示 z=0x7f; for(i=0;i<=3;i+) /一次顯示 P2=z; z>>=1; z+=0x80; x=TO_DATA(N_S,i,LED_datai+t*a); P0=BCD_ASCIIx; Delay_1ms(3);/延時時間 /*= 延時程序函數(shù) 晶振:11.0592 文件名:Delay_1mS(uint x).c=*/#include <reg52.h>#define uchar unsigned char#define uint unsigned int/*- 延時1mS*n-*/void Delay_1ms(uchar timer) uchar j; uint i; for(j=timer;j>0;j-) for(i=0;i<329;i+); /*- 延時(100ms*n=T)秒-*/void Del

溫馨提示

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

評論

0/150

提交評論