基于AT89S51單片機(jī)的電子時(shí)鐘帶溫度顯示_第1頁(yè)
基于AT89S51單片機(jī)的電子時(shí)鐘帶溫度顯示_第2頁(yè)
基于AT89S51單片機(jī)的電子時(shí)鐘帶溫度顯示_第3頁(yè)
基于AT89S51單片機(jī)的電子時(shí)鐘帶溫度顯示_第4頁(yè)
基于AT89S51單片機(jī)的電子時(shí)鐘帶溫度顯示_第5頁(yè)
已閱讀5頁(yè),還剩23頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

.z...基于AT89S51單片機(jī)的電子時(shí)鐘〔帶溫度顯示〕設(shè)計(jì)摘要:本設(shè)計(jì)以數(shù)字集成電路技術(shù)為根底,單片機(jī)技術(shù)為核心。軟件設(shè)計(jì)采用模塊化構(gòu)造,C語(yǔ)言編程。系統(tǒng)通過LCD顯示數(shù)據(jù),可以顯示日期〔年、月、日、時(shí)、分、秒〕以及溫度。在內(nèi)容安排上首先描述系統(tǒng)硬件工作原理,著重介紹了各硬件接口技術(shù)和各個(gè)接口模塊的功能;其次,詳細(xì)的闡述了程序的各個(gè)模塊和實(shí)現(xiàn)過程。關(guān)鍵詞:?jiǎn)纹瑱C(jī);電子時(shí)鐘;溫度傳感器;DS1302;DS18B20;LCD1602基于AT89S51單片機(jī)的電子時(shí)鐘〔帶溫度顯示〕設(shè)計(jì)2.3.1晶體振蕩器電路………………..32.3.2分頻器電路 ………………..32.3.3時(shí)間計(jì)數(shù)器電路 …………..32.3.4時(shí)鐘電路 ……………………..42.3.5復(fù)位電路…………………….42.3.6復(fù)位電路的可靠性設(shè)計(jì)………………………...42.3.7按鍵局部………………………..53.3.9根據(jù)各模塊的功能互相連接成電子時(shí)鐘的控制電路……5\l"_Toc230446205*_Toc230446205"3各硬件介紹6\l"_Toc230446206*_Toc230446206"3.1AT89S51的引腳說明73.2發(fā)光二極管指示電路設(shè)計(jì)……………83.3LCM1602簡(jiǎn)介…………9\l"_Toc230446209*_Toc230446209"3.5DS1302簡(jiǎn)介104系統(tǒng)硬件設(shè)計(jì)所需的器材……………….11\l"_Toc230446211*_Toc230446211"5系統(tǒng)軟件總體設(shè)計(jì)11\l"_Toc230446215*_Toc230446215"6主程序流程圖147安裝制作……………….148調(diào)試與檢測(cè)平安……………………….14\l"_Toc230446216*_Toc230446216"9完畢語(yǔ)15前言電子時(shí)鐘是實(shí)現(xiàn)對(duì)年,月,日,時(shí),分,秒數(shù)字顯示的計(jì)時(shí)裝置,廣泛用于個(gè)人家庭,車站,碼頭,辦公室,銀行大廳等場(chǎng)所,成為人們?nèi)粘I钪械谋匦杵贰?shù)字集成電路的開展和石英晶體振蕩器的廣泛應(yīng)用,使得數(shù)字鐘的精度遠(yuǎn)遠(yuǎn)超過老式鐘表。鐘表的數(shù)字化給人們生產(chǎn)生活帶來(lái)了極大的方便,在此根底上完成的電子時(shí)鐘精度高,功能易于擴(kuò)展。可擴(kuò)展成為諸如定時(shí)自動(dòng)報(bào)警、按時(shí)自動(dòng)打鈴、時(shí)間程序自動(dòng)控制、定時(shí)播送、自動(dòng)起閉路燈、定時(shí)開關(guān)烘箱、通斷動(dòng)力設(shè)備、甚至各種定時(shí)電氣的自動(dòng)啟用等電路。所有這些,都是以鐘表數(shù)字化為根底的。因此,研究數(shù)字時(shí)鐘及擴(kuò)大其應(yīng)用有著非常現(xiàn)實(shí)的意義。本設(shè)計(jì)就是數(shù)字時(shí)鐘簡(jiǎn)單的擴(kuò)展應(yīng)用。1設(shè)計(jì)要求本設(shè)計(jì)準(zhǔn)備實(shí)現(xiàn)的功能:(1)顯示日期功能〔年、月、日、時(shí)、分、秒以及〕(2)可通過按鍵切換年、月、日及時(shí)、分、秒的顯示狀態(tài)(3)可隨時(shí)調(diào)校年、月、日或時(shí)、分、秒(4)可每次增減一進(jìn)展時(shí)間調(diào)節(jié)(5)可動(dòng)態(tài)完整顯示年份,實(shí)現(xiàn)真正的萬(wàn)年歷顯示(6)可顯示溫度2方案論證與設(shè)計(jì)2.1控制器局部方案論證方案一:可采用ALTERA公司的FLE*10K系列PLD器件。設(shè)計(jì)起來(lái)構(gòu)造清晰,各個(gè)模塊,從硬件上設(shè)計(jì)起來(lái)相對(duì)簡(jiǎn)單,控制與顯示的模塊間的連接也會(huì)比擬方便。但是考慮到本設(shè)計(jì)的特點(diǎn),EDA在功能擴(kuò)展上比擬受局限,而且EDA占用的資源也相對(duì)多一些。從本錢上來(lái)講,用可編程邏輯器件來(lái)設(shè)計(jì)也沒有什么優(yōu)勢(shì)。方案二:凌陽(yáng)16位單片機(jī)有豐富的中斷源和時(shí)基。它的準(zhǔn)確度相當(dāng)高,并且C語(yǔ)言和匯編兼容的編程環(huán)境也很方便來(lái)實(shí)現(xiàn)一些遞歸調(diào)用。I/O口功能也比擬強(qiáng)大,方便使用。用凌陽(yáng)16位單片機(jī)做控制器最有特色的就是它的可編程音頻處理,可完成語(yǔ)音的錄制播放和識(shí)別。這些都方便對(duì)設(shè)計(jì)進(jìn)展擴(kuò)展,使設(shè)計(jì)更加完善。本錢也相對(duì)低一些。但是,在控制與顯示的結(jié)合上有些復(fù)雜,顯示模組資源相對(duì)有限,而且單片機(jī)的穩(wěn)定性不是很高,而且就需要完成萬(wàn)年歷這個(gè)不太復(fù)雜的設(shè)計(jì)可以不必用凌陽(yáng)16位單片機(jī)來(lái)完成,采用51單片機(jī)既能夠?qū)崿F(xiàn)既定功能,本錢也不高。綜合考慮最后選擇用51單片機(jī)來(lái)作為中心控制器件。硬件控制電路主要用了AT89S51芯片處理器、LCD顯示器等。根據(jù)各自芯片的功能互相連接成電子萬(wàn)年歷的控制電路。軟件控制程序主要有主控程序、電子萬(wàn)年歷的時(shí)間控制程序、時(shí)間顯示及星期顯示程序等組成。主控程序中對(duì)整個(gè)程序進(jìn)展控制,進(jìn)展了初始化程序及計(jì)數(shù)器、還有鍵盤功能程序、以及顯示程序等工作,時(shí)間控制程序是電子萬(wàn)年歷中比擬重要的局部。時(shí)間控制程序表達(dá)了年、月、日、時(shí)、分、秒及星期的計(jì)算方法。時(shí)間控制程序主要是定時(shí)器0計(jì)時(shí)中斷程序每隔10ms中斷一次當(dāng)作一個(gè)計(jì)數(shù),每中斷一次則計(jì)數(shù)加1,當(dāng)計(jì)數(shù)100次時(shí),則表示1秒到了,秒變量加1,同理再判斷是否1分鐘到了,再判斷是否1小時(shí)到了,再判斷是否1天到了,再判斷是否1月到了,再判斷是否1年到了,假設(shè)計(jì)數(shù)到了則相關(guān)變量去除0。先給出一般年份的每月天數(shù)。如果是閏年,第二個(gè)月天數(shù)不為28天,而是29天。再用公式s=v-1+〔(y-1/4〕-〔(y-1/100〕+〔(y-1/400〕+d計(jì)算當(dāng)前顯示日期是星期幾,當(dāng)調(diào)節(jié)日期時(shí),星期自動(dòng)的調(diào)整過來(lái)。閏年的判斷規(guī)則為,如果該年份是4或100的整數(shù)倍或者是400的整數(shù)倍,則為閏年;否則為非閏年。在我們的這個(gè)設(shè)計(jì)中由于只涉及100年*圍內(nèi),所以判斷是否閏年就只需要用該年份除4來(lái)判斷就行了。溫度的顯示主要是靠ds18b20采集現(xiàn)在的溫度數(shù)據(jù),CPU讀取數(shù)據(jù)進(jìn)展顯示,當(dāng)各自的條件得不到滿足時(shí),對(duì)應(yīng)的顯示器狀態(tài)就不發(fā)生改變,只是在滿足條件的情況下,顯示器的狀態(tài)才變化。圖1單片機(jī)控制電路Fig.1SCMControlcircuit2.2顯示局部的方案論證方案一:采用8段數(shù)碼管雖經(jīng)濟(jì)實(shí)惠,但操作比液晶顯示來(lái)說略顯繁瑣。方案二:液晶顯示方式。液晶顯示效果出眾,可以運(yùn)用菜單項(xiàng)來(lái)方便操作,比擬簡(jiǎn)單,所以,最后選擇液晶顯示方案。圖2液晶顯示電路Fig.2lcm1602circuit2.3數(shù)字溫度計(jì)設(shè)計(jì)方案論證方案一由于本設(shè)計(jì)是測(cè)溫電路,可以使用熱敏電阻之類的器件利用其感溫效應(yīng),在將隨被測(cè)溫度變化的電壓或電流采集過來(lái),進(jìn)展A/D轉(zhuǎn)換后,就可以用單片機(jī)進(jìn)展數(shù)據(jù)的處理,在顯示電路上,就可以將被測(cè)溫度顯示出來(lái),這種設(shè)計(jì)需要用到A/D轉(zhuǎn)換電路,感溫電路比擬麻煩。方案二(1).進(jìn)而考慮到用溫度傳感器,在單片機(jī)電路設(shè)計(jì)中,大多都是使用傳感器,所以這是非常容易想到的,所以可以采用一只溫度傳感器DS18B20,此傳感器,可以很容易直接讀取被測(cè)溫度值,進(jìn)展轉(zhuǎn)換,就可以滿足設(shè)計(jì)要求。從以上兩種方案,很容易看出,采用方案二,電路比擬簡(jiǎn)單,軟件設(shè)計(jì)也比擬簡(jiǎn)單,故采用了方案二。(2).方案二的總體設(shè)計(jì)框圖溫度計(jì)電路設(shè)計(jì)總體設(shè)計(jì)方框圖如圖1所示,控制器采用單片機(jī)AT89S51,溫度傳感器采用DS18B20,用LCD1602顯示溫度2.4系統(tǒng)設(shè)計(jì)晶體振蕩器電路晶體振蕩器電路給數(shù)字鐘提供一個(gè)頻率穩(wěn)定準(zhǔn)確的32768Hz的方波信號(hào),可保證數(shù)字鐘的走時(shí)準(zhǔn)確及穩(wěn)定。不管是指針式的電子鐘還是數(shù)字顯示的電子鐘都使用了晶體蕩器電路。圖3DS1302電路Fig.3ds1302circuit分頻器電路分頻器電路將高頻方波信號(hào)經(jīng)分頻后得到1Hz的方波信號(hào)供秒計(jì)數(shù)器進(jìn)展計(jì)數(shù),分頻器實(shí)際上也就是計(jì)數(shù)器。時(shí)間計(jì)數(shù)器電路時(shí)間計(jì)數(shù)電路由秒個(gè)位和秒十位計(jì)數(shù)器,分個(gè)位和分十位計(jì)數(shù)器及時(shí)個(gè)位和時(shí)十位計(jì)數(shù)器電路構(gòu)成,其中秒個(gè)位和秒十位計(jì)數(shù)器,分個(gè)位和分十位計(jì)數(shù)器為60進(jìn)制計(jì)數(shù)器而根據(jù)設(shè)計(jì)要求,時(shí)個(gè)位和時(shí)十位計(jì)數(shù)器為12進(jìn)制計(jì)數(shù)器。時(shí)鐘電路內(nèi)部時(shí)鐘電路如下圖,在*TAL1和*TAL2引腳上外接定時(shí)元件,內(nèi)部振蕩電路就產(chǎn)生自激振蕩。定時(shí)元件通常石英晶體和電容組成的并聯(lián)諧振回路,晶體振蕩器選擇12MHZ,電容采用30PF。圖4時(shí)鐘電路Fig.4Clockcircuit復(fù)位電路

影響單片機(jī)系統(tǒng)運(yùn)行穩(wěn)定性的因素可大體分為外因和內(nèi)因兩局部:

〔1〕外因

射頻干擾,它是以空間電磁場(chǎng)的形式傳遞在機(jī)器內(nèi)部的導(dǎo)體〔引線或零件引腳〕感生出相應(yīng)的干擾,可通過電磁屏蔽和合理的布線/器件布局衰減該類干擾;

電源線或電源內(nèi)部產(chǎn)生的干擾,它是通過電源線或電源內(nèi)的部件耦合或直接傳導(dǎo),可通過電源濾波、隔離等措施來(lái)衰減該類干擾?!?〕內(nèi)因

振蕩源的穩(wěn)定性,主要由起振時(shí)間頻率穩(wěn)定度和占空比穩(wěn)定度決定起振時(shí)間可由電路參數(shù)整定穩(wěn)定度受振蕩器類型溫度和電壓等參數(shù)影響復(fù)位電路的可靠性。

復(fù)位電路的可靠性設(shè)計(jì)復(fù)位是單片機(jī)的初始化操作。單片機(jī)啟運(yùn)運(yùn)行時(shí),都需要先復(fù)位,其作用是使CPU和系統(tǒng)中其他部件處于一個(gè)確定的初始狀態(tài),并從這個(gè)狀態(tài)開場(chǎng)工作。因而,復(fù)位是一個(gè)很重要的操作方式。但單片機(jī)本身是不能自動(dòng)進(jìn)展復(fù)位的,必須配合相應(yīng)的外部電路才能實(shí)現(xiàn)。

復(fù)位電路的根本功能是:系統(tǒng)上電時(shí)提供復(fù)位信號(hào),直至系統(tǒng)電源穩(wěn)定后,撤銷復(fù)位信號(hào)。為可靠起見,電源穩(wěn)定后還要經(jīng)一定的延時(shí)才撤銷復(fù)位信號(hào),以防電源開關(guān)或電源插頭分-合過程中引起的抖動(dòng)而影響復(fù)位。圖5RC復(fù)位電路Fig.5RCResetCircuit按鍵局部本設(shè)計(jì)總的用了四個(gè)按扭開關(guān)作為鍵盤,其中一個(gè)是復(fù)位鍵,另三個(gè)中的其中兩個(gè)是調(diào)整時(shí)間增加、減少的鍵,第三個(gè)是切換年、月、日及時(shí)、分、秒的顯示狀態(tài)并在所切換的顯示狀態(tài)下配合加減兩個(gè)鍵調(diào)整時(shí)間。圖6按鍵電路Fig.6Keycircuit3各硬件介紹3.1AT89S51的引腳說明AT89S51系列單片機(jī)中有PDIP,PLCC,TQFP多種封裝形式。本設(shè)計(jì)采用的是PDIP封裝40管腳的單片機(jī),各引腳如圖2-2所示。圖9AT89S51的PDIP封裝引腳圖Fig.9AT89S5140個(gè)引腳中,4組8位共32個(gè)I/O口,正電源和地線兩根,外置石英振蕩器的時(shí)鐘線兩根,現(xiàn)在對(duì)這些引腳的功能加以說明:〔1〕Pin9:RESET/Vpd復(fù)位信號(hào)復(fù)用腳,當(dāng)AT89S51通電,時(shí)鐘電路開場(chǎng)工作,在RESET引腳上出現(xiàn)24個(gè)時(shí)鐘周期以上的高電平,系統(tǒng)開場(chǎng)復(fù)位。而RESET由高電平下降為低電平后,系統(tǒng)即從0000H地址單元開場(chǎng)執(zhí)行程序?!?〕Pin29:PESN當(dāng)外部程序存儲(chǔ)器時(shí),此腳輸出負(fù)脈沖選通信號(hào),外部程序存儲(chǔ)器則把指令數(shù)據(jù)放到P0口上,由CPU讀入并執(zhí)行。〔3〕Pin30:ALE/PROG地址鎖存允許信號(hào)端。單片機(jī)上電后,ALE引腳不斷向外輸出正脈沖信號(hào),ALE信號(hào)可以用作對(duì)外輸出時(shí)鐘或定時(shí)信號(hào)?!?〕Pin31:EA/Vpp程序存儲(chǔ)器的內(nèi)外部選通線,89S51單片機(jī),內(nèi)置有4kB的程序存儲(chǔ)器,當(dāng)EA為高電平并且程序地址小于4kB時(shí),讀取內(nèi)部程序存儲(chǔ)器指令數(shù)據(jù),而超過4kB地址則讀取外部指令數(shù)據(jù)。如EA為低電平,則不管地址大小,一律讀取外部程序存儲(chǔ)器指令。3.2發(fā)光二極管指示電路設(shè)計(jì)發(fā)光二極管簡(jiǎn)稱為L(zhǎng)ED。由鎵〔Ga〕與砷〔AS〕、磷〔P〕的化合物制成的二極管,當(dāng)電子與空穴復(fù)合時(shí)能輻射出可見光,因而可以用來(lái)制成發(fā)光二極管,在電路及儀器中作為指示燈,或者組成文字或數(shù)字顯示。磷砷化鎵二極管發(fā)紅光,磷化鎵二極管發(fā)綠光,碳化硅二極管發(fā)黃光。

它是半導(dǎo)體二極管的一種,可以把電能轉(zhuǎn)化成光能;常簡(jiǎn)寫為L(zhǎng)ED。發(fā)光二極管與普通二極管一樣是由一個(gè)PN結(jié)組成,也具有單向?qū)щ娦?。?dāng)給發(fā)光二極管加上正向電壓后,從P區(qū)注入到N區(qū)的空穴和由N區(qū)注入到P區(qū)的電子,在PN結(jié)附近數(shù)微米內(nèi)分別與N區(qū)的電子和P區(qū)的空穴復(fù)合,產(chǎn)生自發(fā)輻射的熒光。不同的半導(dǎo)體材料中電子和空穴所處的能量狀態(tài)不同。當(dāng)電子和空穴復(fù)合時(shí)釋放出的能量多少不同,釋放出的能量越多,則發(fā)出的光的波長(zhǎng)越短。常用的是發(fā)紅光、綠光或黃光的二極管。 設(shè)計(jì)中,我使用了1個(gè)發(fā)光二極管作為電源的指示。為了防止供應(yīng)發(fā)光二極管的電流過大,使用1K的電阻進(jìn)展限流。3.3LCD1602簡(jiǎn)介圖11LCM1602Fig.11LCM1602LCM1602采用標(biāo)準(zhǔn)的16腳接口,其中:第1腳:VSS為地電源第2腳:VDD接5V正電源第3腳:V0為液晶顯示器比照度調(diào)整端,接正電源時(shí)比照度最弱,接地電源時(shí)比照最高,比照度過高時(shí)會(huì)產(chǎn)生“鬼影〞,使用時(shí)可以通過一個(gè)10K的電位器調(diào)整比照度第4腳:RS為存放器選擇,高電平時(shí)選擇數(shù)據(jù)存放器、低電平時(shí)選擇指令存放器。第5腳:RW為讀寫信號(hào)線,高電平時(shí)進(jìn)展讀操作,低電平時(shí)進(jìn)展寫操作。當(dāng)RSRW共同為低電平時(shí)可以寫入指令或者顯示地址,當(dāng)RS為低電平RW為高電平時(shí)可讀忙信號(hào),當(dāng)RS為高電平RW為低電平時(shí)可以寫入數(shù)據(jù).第6腳:E端為使能端,當(dāng)E端由高電平跳變成低電平時(shí),液晶模塊執(zhí)行命令。第7~14腳:D0~D7為8位雙向數(shù)據(jù)線。第15~16腳:空腳3.4DS1302簡(jiǎn)介1DS1302的構(gòu)造及工作原理DS1302[1]是美國(guó)DALLAS公司推出的一種高性能、低功耗、帶RAM的實(shí)時(shí)時(shí)鐘芯片,它可以對(duì)年、月、日、周日、時(shí)、分、秒進(jìn)展計(jì)時(shí),且具有閏年補(bǔ)償功能,工作電壓寬達(dá)2.5~5.5V。采用三線接口與CPU進(jìn)展同步通信,并可采用突發(fā)方式一次傳送多個(gè)字節(jié)的時(shí)鐘信號(hào)或RAM數(shù)據(jù)。DS1302內(nèi)部有一個(gè)31×8的用于臨時(shí)性存放數(shù)據(jù)的RAM存放器。DS1302是DS1202的升級(jí)產(chǎn)品,與DS1202兼容,但增加了主電源/后背電源雙電源引腳,同時(shí)提供了對(duì)后背電源進(jìn)展涓細(xì)電流充電的能力。1.1引腳功能表及內(nèi)部構(gòu)造圖DS1302的引腳及內(nèi)部構(gòu)造如圖1所示,引腳功能如表1所示。1.2DS1302的控制字節(jié)說明DS1302的控制字如圖2所示??刂谱止?jié)的最高有效位〔位7〕必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫入到DS1302中位6如果為0,則表示存取日歷時(shí)鐘數(shù)據(jù),為1表示存取RAM數(shù)據(jù);位5至位1指示操作單元的地址;最低有效位〔位0〕如為0表示要進(jìn)展寫操作,為1表示進(jìn)展讀操作,控制字節(jié)總是從最低位開場(chǎng)輸出。1.3復(fù)位通過把輸入驅(qū)動(dòng)置高電平來(lái)啟動(dòng)所有的數(shù)據(jù)傳送。輸入有兩種功能:首先,接通控制邏輯,允許地址/命令序列送入移位存放器;其次,提供了終止單字節(jié)或多字節(jié)數(shù)據(jù)的傳送手段。當(dāng)為高電平時(shí),所有的數(shù)據(jù)傳送被初始化,允許對(duì)DS1302進(jìn)展操作。如果在傳送過程中置為低電平,則會(huì)終止此次數(shù)據(jù)傳送,并且I/O引腳變?yōu)楦咦钁B(tài)。上電運(yùn)行時(shí),在Vcc≥2.5V之前,必須保持低電平。只有在SCLK為低電平時(shí),才能將RST置為高電平。1.4數(shù)據(jù)輸入輸出在控制指令字輸入后的下一個(gè)SCLK時(shí)鐘的上升沿時(shí)數(shù)據(jù)被寫入DS1302,數(shù)據(jù)輸入從低位即位0開場(chǎng)。同樣,在緊跟8位的控制指令字后的下一個(gè)SCLK脈沖的下降沿讀出DS1302的數(shù)據(jù),讀出數(shù)據(jù)時(shí)從低位0位至高位7,數(shù)據(jù)讀寫時(shí)序見圖3。1.5DS1302的存放器DS1302共有12個(gè)存放器,其中有7個(gè)存放器與日歷、時(shí)鐘相關(guān),存放的數(shù)據(jù)位為BCD碼形式。其日歷、時(shí)間存放器及其控制字見表2。此外,DS1302還有年份存放器、控制存放器、充電存放器、時(shí)鐘突發(fā)存放器及與RAM相關(guān)的存放器等。時(shí)鐘突發(fā)存放器可一次性順序讀寫除充電存放器外的所有存放器內(nèi)容。DS1302與RAM相關(guān)的存放器分為兩類,一類是單個(gè)RAM單元,共31個(gè),每個(gè)單元組態(tài)為一個(gè)8位的字節(jié),其命令控制字為COH~FDH,其中奇數(shù)為讀操作,偶數(shù)為寫操作;再一類為突發(fā)方式下的RAM存放器,此方式下可一次性讀寫所有的RAM的31個(gè)字節(jié),命令控制字為FEH〔寫〕、FFH〔讀〕。3.5DS1302簡(jiǎn)介.溫度傳感器DS18B20DS18B20溫度傳感器是美國(guó)DALLAS半導(dǎo)體公司最新推出的一種改良型智能溫度傳感器,與傳統(tǒng)的熱敏電阻等測(cè)溫元件相比,它能直接讀出被測(cè)溫度,并且可根據(jù)實(shí)際要求通過簡(jiǎn)單的編程實(shí)現(xiàn)9~12位的數(shù)字值讀數(shù)方式。TO-92封裝的DS18B20的引腳排列見下列圖,其引腳功能描述見表1?!驳滓晥D〕DS18B20表1DS18B20詳細(xì)引腳功能描述序號(hào)名稱引腳功能描述1GND地信號(hào)2DQ數(shù)據(jù)輸入/輸出引腳。開漏單總線接口引腳。當(dāng)被用著在寄生電源下,也可以向器件提供電源。3VDD可選擇的VDD引腳。當(dāng)工作于寄生電源時(shí),此引腳必須接地。DS18B20的性能特點(diǎn)如下:●獨(dú)特的單線接口僅需要一個(gè)端口引腳進(jìn)展通信;●多個(gè)DS18B20可以并聯(lián)在惟一的三線上,實(shí)現(xiàn)多點(diǎn)組網(wǎng)功能;●無(wú)須外部器件;●可通過數(shù)據(jù)線供電,電壓*圍為3.0~5.5V;●零待機(jī)功耗;●溫度以9或12位數(shù)字;●用戶可定義報(bào)警設(shè)置;●報(bào)警搜索命令識(shí)別并標(biāo)志超過程序限定溫度〔溫度報(bào)警條件〕的器件;●負(fù)電壓特性,電源極性接反時(shí),溫度計(jì)不會(huì)因發(fā)熱而燒毀,但不能正常工作;DS18B20采用3腳PR-35封裝或8腳SOIC封裝,其內(nèi)部構(gòu)造框圖如圖2所示。CC64位ROM和單線接口高速緩存存儲(chǔ)器與控制邏輯溫度傳感器高溫觸發(fā)器TH低溫觸發(fā)器TL配置存放器8位CRC發(fā)生器VddI/OI/O圖2DS18B20內(nèi)部構(gòu)造64位ROM的構(gòu)造開場(chǎng)8位是產(chǎn)品類型的編號(hào),接著是每個(gè)器件的惟一的序號(hào),共有48位,最后8位是前面56位的CRC檢驗(yàn)碼,這也是多個(gè)DS18B20可以采用一線進(jìn)展通信的原因。溫度報(bào)警觸發(fā)器TH和TL,可通過軟件寫入戶報(bào)警上下限。DS18B20溫度傳感器的內(nèi)部存儲(chǔ)器還包括一個(gè)高速暫存RAM和一個(gè)非易失性的可電擦除的EERAM。高速暫存RAM的構(gòu)造為8字節(jié)的存儲(chǔ)器,構(gòu)造如圖3所示。頭2個(gè)字節(jié)包含測(cè)得的溫度信息,第3和第4字節(jié)TH和TL的拷貝,是易失的,每次上電復(fù)位時(shí)被刷新。第5個(gè)字節(jié),為配置存放器,它的內(nèi)容用于確定溫度值的數(shù)字轉(zhuǎn)換分辨率。DS18B20工作時(shí)存放器中的分辨率轉(zhuǎn)換為相應(yīng)精度的溫度數(shù)值。該字節(jié)各位的定義如圖3所示。低5位一直為1,TM是工作模式位,用于設(shè)置DS18B20在工作模式還是在測(cè)試模式,DS18B20出廠時(shí)該位被設(shè)置為0,用戶要去改動(dòng),R1和R0決定溫度轉(zhuǎn)換的精度位數(shù),來(lái)設(shè)置分辨率。溫度LSB溫度MSBTH用戶字節(jié)1TL用戶字節(jié)2配置存放器保存保存保存CRC圖3DS18B20字節(jié)定義由表1可見,DS18B20溫度轉(zhuǎn)換的時(shí)間比擬長(zhǎng),而且分辨率越高,所需要的溫度數(shù)據(jù)轉(zhuǎn)換時(shí)間越長(zhǎng)。因此,在實(shí)際應(yīng)用中要將分辨率和轉(zhuǎn)換時(shí)間權(quán)衡考慮。高速暫存RAM的第6、7、8字節(jié)保存未用,表現(xiàn)為全邏輯1。第9字節(jié)讀出前面所有8字節(jié)的CRC碼,可用來(lái)檢驗(yàn)數(shù)據(jù),從而保證通信數(shù)據(jù)的正確性。當(dāng)DS18B20接收到溫度轉(zhuǎn)換命令后,開場(chǎng)啟動(dòng)轉(zhuǎn)換。轉(zhuǎn)換完成后的溫度值就以16位帶符號(hào)擴(kuò)展的二進(jìn)制補(bǔ)碼形式存儲(chǔ)在高速暫存存儲(chǔ)器的第1、2字節(jié)。單片機(jī)可以通過單線接口讀出該數(shù)據(jù),讀數(shù)據(jù)時(shí)低位在先,高位在后,數(shù)據(jù)格式以0.0625℃當(dāng)符號(hào)位S=0時(shí),表示測(cè)得的溫度值為正值,可以直接將二進(jìn)制位轉(zhuǎn)換為十進(jìn)制;當(dāng)符號(hào)位S=1時(shí),表示測(cè)得的溫度值為負(fù)值,要先將補(bǔ)碼變成原碼,再計(jì)算十進(jìn)制數(shù)值。表2是一局部溫度值對(duì)應(yīng)的二進(jìn)制溫度數(shù)據(jù)。表1DS18B20溫度轉(zhuǎn)換時(shí)間表DS18B20完成溫度轉(zhuǎn)換后,就把測(cè)得的溫度值與RAM中的TH、TL字節(jié)內(nèi)容作比擬。假設(shè)T>TH或T<TL,則將該器件內(nèi)的報(bào)警標(biāo)志位置位,并對(duì)主機(jī)發(fā)出的報(bào)警搜索命令作出響應(yīng)。因此,可用多只DS18B20同時(shí)測(cè)量溫度并進(jìn)展報(bào)警搜索。在64位ROM的最高有效字節(jié)中存儲(chǔ)有循環(huán)冗余檢驗(yàn)碼〔CRC〕。主機(jī)ROM的前56位來(lái)計(jì)算CRC值,并和存入DS18B20的CRC值作比擬,以判斷主機(jī)收到的ROM數(shù)據(jù)是否正確。DS18B20的測(cè)溫原理是這這樣的,器件中低溫度系數(shù)晶振的振蕩頻率受溫度的影響很小,用于產(chǎn)生固定頻率的脈沖信號(hào)送給減法計(jì)數(shù)器1;高溫度系數(shù)晶振隨溫度變化其振蕩頻率明顯改變,所產(chǎn)生的信號(hào)作為減法計(jì)數(shù)器2的脈沖輸入。器件中還有一個(gè)計(jì)數(shù)門,當(dāng)計(jì)數(shù)門翻開時(shí),DS18B20就對(duì)低溫度系數(shù)振蕩器產(chǎn)生的時(shí)鐘脈沖進(jìn)展計(jì)數(shù)進(jìn)而完成溫度測(cè)量。計(jì)數(shù)門的開啟時(shí)間由高溫度系數(shù)振蕩器來(lái)決定,每次測(cè)量前,首先將-55℃所對(duì)應(yīng)的一個(gè)基數(shù)分別置入減法計(jì)數(shù)器1、溫度存放器中,計(jì)數(shù)器1和溫度存放器被預(yù)置在-55減法計(jì)數(shù)器1對(duì)低溫度系數(shù)晶振產(chǎn)生的脈沖信號(hào)進(jìn)展減法計(jì)數(shù),當(dāng)減法計(jì)數(shù)器1的預(yù)置值減到0時(shí),溫度存放器的值將加1,減法計(jì)數(shù)器1的預(yù)置將重新被裝入,減法計(jì)數(shù)器1重新開場(chǎng)對(duì)低溫度系數(shù)晶振產(chǎn)生的脈沖信號(hào)進(jìn)展計(jì)數(shù),如此循環(huán)直到減法計(jì)數(shù)器計(jì)數(shù)到0時(shí),停頓溫度存放器的累加,此時(shí)溫度存放器中的數(shù)值就是所測(cè)溫度值。其輸出用于修正減法計(jì)數(shù)器的預(yù)置值,只要計(jì)數(shù)器門仍未關(guān)閉就重復(fù)上述過程,直到溫度存放器值大致被測(cè)溫度值。表2一局部溫度對(duì)應(yīng)值表溫度/℃二進(jìn)制表示十六進(jìn)制表示+125000001111101000007D0H+8500000101010100000550H+25.062500000001100100000191H+10.125000000001010000100A2H+0.500000000000000100008H000000000000010000000H-0.51111111111110000FFF8H-10.1251111111101011110FF5EH-25.06251111111001101111FE6FH-551111110010010000FC90H另外,由于DS18B20單線通信功能是分時(shí)完成的,它有嚴(yán)格的時(shí)隙概念,因此讀寫時(shí)序很重要。系統(tǒng)對(duì)DS18B20的各種操作按協(xié)議進(jìn)展。操作協(xié)議為:初使化DS18B20〔發(fā)復(fù)位脈沖〕→發(fā)ROM功能命令→發(fā)存儲(chǔ)器操作命令→處理數(shù)據(jù)。

圖4DS18B20與單片機(jī)的接口電路3.5.2 DS18B20時(shí)序DS18B20的復(fù)位時(shí)序DS18B20的讀時(shí)序?qū)τ贒S18B20的讀時(shí)序分為讀0時(shí)序和讀1時(shí)序兩個(gè)過程。對(duì)于DS18B20的讀時(shí)隙是從主機(jī)把單總線拉低之后,在15秒之內(nèi)就得釋放單總線,以讓DS18B20把數(shù)據(jù)傳輸?shù)絾慰偩€上。DS18B20在完成一個(gè)讀時(shí)序過程,至少需要60us才能完成。DS18B20的寫時(shí)序?qū)τ贒S18B20的寫時(shí)序仍然分為寫0時(shí)序和寫1時(shí)序兩個(gè)過程。對(duì)于DS18B20寫0時(shí)序和寫1時(shí)序的要求不同,當(dāng)要寫0時(shí)序時(shí),單總線要被拉低至少60us,保證DS18B20能夠在15us到45us之間能夠正確地采樣IO總線上的“0〞電平,當(dāng)要寫1時(shí)序時(shí),單總線被拉低之后,在15us之內(nèi)就得釋放單總線。4系統(tǒng)硬件設(shè)計(jì)所需的器材5V電源3V電源AT89S51單片機(jī)1個(gè)液晶顯示器1個(gè)DS13021個(gè)DS18B20一個(gè)電阻1K的2個(gè)、4.7K的2個(gè)4.7歐排阻8550三極管晶振12M的一個(gè)32768K的一個(gè)電容〔30P的兩個(gè)〕LED二極管1個(gè)22μf電容1個(gè)輕觸開關(guān)5個(gè)5系統(tǒng)軟件總體設(shè)計(jì)系統(tǒng)的軟件設(shè)計(jì)采用匯編語(yǔ)言,對(duì)單片機(jī)進(jìn)展編程實(shí)現(xiàn)各項(xiàng)功能。程序在Windows*P環(huán)境下采用Keil軟件編寫。軟件控制程序主要有主控程序、電子時(shí)鐘的時(shí)間控制程序h和溫度顯示程序組成。主控程序中對(duì)整個(gè)程序進(jìn)展控制,進(jìn)展了初始化程序還有鍵盤功能程序、以及顯示程序和時(shí)間控制程序是電子時(shí)鐘中比擬重要的局部。時(shí)間控制程序表達(dá)了年、月、日、時(shí)、分、秒的計(jì)算方法。6主程序流程圖開場(chǎng)開場(chǎng)單片機(jī)讀DS1302數(shù)據(jù)單片機(jī)送數(shù)據(jù)到LCD1602單片機(jī)判斷按鍵單片機(jī)處理按鍵調(diào)顯示數(shù)據(jù)完畢圖16主流程框圖Fig.16Theprocessflowchart源程序////////////////////////////////////////////////////////////////////////////////////////////////// 使用說明:按s1進(jìn)入日期設(shè)置;進(jìn)入設(shè)置后進(jìn)展光標(biāo)左移;/// 按s2進(jìn)入時(shí)間設(shè)置;設(shè)置完成后進(jìn)展確認(rèn);/// 按s3進(jìn)展減;/// 按s4進(jìn)展加;/// ///////////////////////////////////////////////////////////////////////////////////////////////*include<reg52.h>*defineuintunsignedint*defineucharunsignedchar/////////////////sbitrw=P2^6;//sbitrs=P2^5;// 1602IO口位定義sbiten=P2^7;//////////////////////////////////////sbitrst=P3^5;//sbitsclk=P3^6;// 1302IO口位定義sbitio=P3^4; ////////////////////////////////////////sbitkey1=P1^0;//sbitkey2=P1^1;// 獨(dú)立按鍵位定義sbitkey3=P1^2;//sbitkey4=P1^3;// //////////////////////////////////////sbitDQ=P2^2;///////////////////////uchartempL=0;//臨時(shí)變量低位uchartempH=0;//臨時(shí)變量高位uinttemperature;uinthour,minute,second,year,month,day;uintkey=0;uchartab_num[]={0*30,0*31,0*32,0*33,0*34,0*35,0*36,0*37,0*38,0*39,0*3a,0*2d};//對(duì)應(yīng)字符為: { 0123456789:- }uchartab_time[]={1,2,10,3,4,10,5,6};uchartab_date[]={2,0,1,0,11,0,9,11,2,7};//延時(shí)函數(shù),延時(shí)z毫秒******voiddelay(uintz) { uint*,y; for(*=0;*<z;*++) for(y=0;y<110;y++);}//***************************/****************************************************************************函數(shù)功能:延時(shí)子程序入口參數(shù):k出口參數(shù):****************************************************************************/voiddelay18b20(unsignedintk){ unsignedintn; n=0; while(n<k) {n++;} return;}/****************************************************************************函數(shù)功能:DS18B20初始化子程序入口參數(shù):出口參數(shù):****************************************************************************/Init_DS18B20(void){ unsignedchar*=0; DQ=1;//DQ先置高 delay18b20(8);//延時(shí) DQ=0;//發(fā)送復(fù)位脈沖 delay18b20(85);//延時(shí)〔>480ms) DQ=1;//拉高數(shù)據(jù)線 delay18b20(14);//等待〔15~60ms)}/****************************************************************************函數(shù)功能:向DS18B20讀一字節(jié)數(shù)據(jù)入口參數(shù):出口參數(shù):dat****************************************************************************/ReadOneChar(void){ unsignedchari=0; unsignedchardat=0; for(i=8;i>0;i--) { DQ=1; delay18b20(1); DQ=0; dat>>=1; DQ=1; if(DQ) dat|=0*80; delay18b20(4); } return(dat);}/****************************************************************************函數(shù)功能:向DS18B20寫一字節(jié)數(shù)據(jù)入口參數(shù):dat出口參數(shù):****************************************************************************/WriteOneChar(unsignedchardat){ unsignedchari=0; for(i=8;i>0;i--) { DQ=0; DQ=dat&0*01; delay18b20(5); DQ=1; dat>>=1; } delay18b20(4);}/****************************************************************************函數(shù)功能:向DS18B20讀溫度值入口參數(shù):出口參數(shù):temperature****************************************************************************/uintReadTemperature(void){ Init_DS18B20();//初始化 WriteOneChar(0*cc);//跳過讀序列號(hào)的操作 WriteOneChar(0*44);//啟動(dòng)溫度轉(zhuǎn)換 delay18b20(125);//轉(zhuǎn)換需要一點(diǎn)時(shí)間,延時(shí) Init_DS18B20();//初始化 WriteOneChar(0*cc);//跳過讀序列號(hào)的操作 WriteOneChar(0*be);//讀溫度存放器〔頭兩個(gè)值分別為溫度的低位和高位〕 tempL=ReadOneChar();//讀出溫度的低位LSB tempH=ReadOneChar();//讀出溫度的高位MSB //溫度轉(zhuǎn)換,把上下位做相應(yīng)的運(yùn)算轉(zhuǎn)化為實(shí)際溫度 temperature=((tempH*256)+tempL)*5/8; delay18b20(200); return(temperature);}//========1302寫一個(gè)字節(jié)=========voidwrite_byte(uchardat){ uchari,dat_w; dat_w=dat; for(i=0;i<8;i++) { io=0; if(dat_w&0*01) io=1; else io=0; dat_w=dat_w>>1; sclk=0; sclk=1; } sclk=0;}//===============================//========1302讀一個(gè)字節(jié)=========ucharread_byte(){ uchari,k; k=0; for(i=0;i<8;i++) { k=k>>1; if(io) k=k|0*80; sclk=1; sclk=0; } sclk=0; return(k);}//===============================//========1302把數(shù)據(jù)寫入地址=====voidwrite_add(ucharadd,uchardat){ rst=0; sclk=0; rst=1; write_byte(add); write_byte((dat/10<<4)|(dat%10)); sclk=0; rst=0;}//===============================//========1302從地址讀出數(shù)據(jù)=====ucharread_add(ucharadd){ uchartemp,dat1,dat2; rst=0; sclk=0; rst=1; write_byte(add); temp=read_byte(); sclk=0; rst=0; dat1=temp/16; dat2=temp%16; temp=dat1*10+dat2; return(temp);}//===============================//=========1302時(shí)間初始化========voidds1302_init(){ write_add(0*8e,0*00); //翻開寫保護(hù),寫入時(shí)間; write_add(0*80,50); //初始化--秒50; write_add(0*82,59); //初始化--分59; write_add(0*84,23); //初始化--時(shí)23; write_add(0*86,31); //初始化--日31; write_add(0*88,12); //初始化--月12; write_add(0*8c,10); //初始化--年2010; write_add(0*8e,0*80); //關(guān)閉寫保護(hù),制止寫入。}//===============================//=========1302讀出時(shí)間==========voidds1302(){ write_add(0*8e,0*00); //翻開寫保護(hù),讀出時(shí)間; second=read_add(0*81); //從1302讀出時(shí)間--秒; minute=read_add(0*83); //從1302讀出時(shí)間--分; hour=read_add(0*85); //從1302讀出時(shí)間--時(shí); day=read_add(0*87); //從1302讀出時(shí)間--日; month=read_add(0*89); //從1302讀出時(shí)間--月; year=read_add(0*8d); //從1302讀出時(shí)間--年; write_add(0*8e,0*80); //關(guān)閉寫保護(hù),制止讀出;}//===============================//寫命令函數(shù)****************voidwrite_(uchar){ rs=0; rw=0; en=0; delay(5); P0=; delay(5); en=1; delay(5); en=0;}//***************************//寫數(shù)據(jù)函數(shù)*****************voidwrite_data(uchardate){ rs=1; rw=0; en=0; delay(5); P0=date; delay(5); en=1; delay(5); en=0;}//***************************//1602顯示一個(gè)字符===========voidDisplayOne(uchar*p){ write_data(*p);}//===========================//======時(shí)間重新賦值=========voidtime(){ tab_time[0]=hour/10; tab_time[1]=hour%10; tab_time[3]=minute/10; tab_time[4]=minute%10; tab_time[6]=second/10; tab_time[7]=second%10; tab_date[2]=year/10; tab_date[3]=year%10; tab_date[5]=month/10; tab_date[6]=month%10; tab_date[8]=day/10; tab_date[9]=day%10;}//===========================//======1602初始化===========voidinit(){ write_(0*38); write_(0*0c); write_(0*06); write_(0*01); }//===========================//=====時(shí)間顯示函數(shù)==========voidDisplayTime(){ uintn; ds1302(); time(); write_(0*80+6); for(n=0;n<10;n++) { DisplayOne(tab_num+tab_date[n]); //顯示日期 } write_(0*80+0*40+6); for(n=0;n<8;n++) { DisplayOne(tab_num+tab_time[n]); //顯示時(shí)間 }}//===========================//=========時(shí)鐘停頓==========voidstop(){ write_add(0*8e,00); //翻開寫保護(hù) write_add(0*80,80); //時(shí)鐘停頓 write_add(0*8e,80); //制止寫保護(hù) write_(0*80+0*40+12); //=================== write_data(tab_num[second/10]); // 顯示秒 write_data(tab_num[second%10]); //===================}//===========================//==========時(shí)鐘開場(chǎng)=========voidstart(){ write_add(0*8e,00); //翻開寫保護(hù) write_add(0*80,second); //讀入秒 write_add(0*8e,80); //制止寫保護(hù)}//=====矩陣鍵盤掃描函數(shù)======voidKeyScan() { P1=0*ff; if(key1==0) //即獨(dú)立鍵盤中的k1 { delay(10); if(key1==0) { key=1; while(!key1); } } if(key2==0) //即獨(dú)立鍵盤中的k2 { delay(10); if(key2==0) { key=2; while(!key2); } } if(key3==0) //即獨(dú)立鍵盤中的k3 { delay(10); if(key3==0) { key=3; while(!key3); } } if(key4==0) //即獨(dú)立鍵盤中的k6 { delay(10); if(key4==0) { key=4; while(!key4); } }}//============================//======按鍵操作函數(shù)==========voidKeyDo(){ uintm=15; //用以修改日期〔第一行〕時(shí),移動(dòng)閃爍光標(biāo)。 uintn=13; //用以修改時(shí)間〔第二行〕時(shí),移動(dòng)閃爍光標(biāo)。 if(key==1) { key=0; stop(); write_(0*80+0*40+n); write_(0*0f); while(1) { KeyScan(); if(key==3) { n=n+3; if(n>13) n=7; write_(0*80+0*40+n); write_(0*0f); key=0; } switch(n) { case13: if(key==2) { second++; if(second==60) second=0; time(); write_add(0*8e,0*00); write_add(0*80,second); write_add(0*8e,0*80); write_(0*80+0*40+12); DisplayOne(tab_num+tab_time[6]); DisplayOne(tab_num+tab_time[7]); write_(0*80+0*40+13); write_(0*0f); key=0; } if(key==4) { second--; if(second==-1) second=59; time(); write_add(0*8e,0*00); write_add(0*80,second); write_add(0*8e,0*80); write_(0*80+0*40+12); DisplayOne(tab_num+tab_time[6]); DisplayOne(tab_num+tab_time[7]); write_(0*80+0*40+13); write_(0*0f); key=0; } case10: if(key==2) { minute++; if(minute==60) minute=0; time(); write_add(0*8e,0*00); write_add(0*82,minute); write_add(0*8e,0*80); write_(0*80+0*40+9); DisplayOne(tab_num+tab_time[3]); DisplayOne(tab_num+tab_time[4]); write_(0*80+0*40+10); write_(0*0f); key=0; } if(key==4) { minute--; if(minute==-1) minute=59; time(); write_add(0*8e,0*00); write_add(0*82,minute); write_add(0*8e,0*80); write_(0*80+0*40+9); DisplayOne(tab_num+tab_time[3]); DisplayOne(tab_num+tab_time[4]); write_(0*80+0*40+10); write_(0*0f); key=0; } case7: if(key==2) { hour++; if(hour==24) hour=0; time(); write_add(0*8e,0*00); write_add(0*84,hour); write_add(0*8e,0*80); write_(0*80+0*40+6); DisplayOne(tab_num+tab_time[0]); DisplayOne(tab_num+tab_time[1]); write_(0*80+0*40+7); write_(0*0f); key=0; } if(key==4) { hour--; if(hour==-1) hour=23; time(); write_add(0*8e,0*00); write_add(0*84,hour); write_add(0*8e,0*80); write_(0*80+0*40+6); DisplayOne(tab_num+tab_time[0]); DisplayOne(tab_num+tab_time[1]); write_(0*80+0*40+7); write_(0*0f); key=0; } } if(key==1) { start(); key=0; write_(0*0c); break; } } } if(key==3) { stop(); write_(0*80+m); write_(0*0f); while(1) { KeyScan(); if(key==3) { m=m+3; if(m>15) m=9; write_(0*80+m); write_(0*0f); key=0; } switch(m) { case15: if(key==2) { day++; if(day==32) day=1; time(); write_add(0*8e,0*00); write_add(0*86,day); write_add(0*8e,0*80); write_(0*80+14); DisplayOne(tab_num+tab_date[8]); DisplayOne(tab_num+tab_date[9]); write_(0*80+15); write_(0*0f); key=0; } if(key==4) { day--; if(day==0) day=31; time(); write_add(0*8e,0*00); write_add(0*86,day); write_add(0*8e,0*80); write_(0*80+14); DisplayOne(tab_num+tab_date[8]); DisplayOne(tab_num+tab_date[9]); write_(0*80+15); write_(0*0f); key=0; } case12: if(key==2) { month++; if(month==13) month=1; time(); write_add(0*8e,0*00); write_add(0*88,month); write_add(0*8e,0*80); write_(0*80+11); DisplayOne(tab_num+tab_date[5]); DisplayOne(tab_num+tab_date[6]); write_(0*80+12); write_(0*0f); key=0; } if(key==4) { month--; if(month==-1) month=12; time(); write_add(0*8e,0*00); write_add(0*88,month); write_add(0*8e,0*80); write_(0*80+11); DisplayOne(tab_num+tab_date[5]); DisplayOne(tab_num+tab_date[6]); write_(0*80+12); write_(0*0f); key=0; } case9: if(key==2) { year++; if(year==100) year=0; time(); write_add(0*8e,0*00); write_add(0*8c,year); write_add(0*8e,0*80); write_(0*80+8); DisplayOne(tab_num+tab_date[2]); DisplayOne(tab_num+tab_date[3]); write_(0*80+9); write_(0*0f); key=0; } if(key==4) { year--; if(year==-1) year=23; time(); write_add(0*8e,0*00); write_add(0*8c,year); write_add(0*8e,0*80); write_(0*80+8); DisplayOne(tab_num+tab_date[2]); DisplayOne(tab_num+tab_date[3]); write_(0*80+9); write_(0*0f); key=0; } } if(key==1) { key=0; start(); write_(0*0c); break; } } }}voidDisplay_18b20(){ uintt1,t2,t3; t1=ReadTemperature()/100%10; t2=ReadTemperature()/10%10; t3=

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論