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

下載本文檔

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

文檔簡(jiǎn)介

1、摘要本文介紹了一款基于at89s51單片機(jī)控制的帶有溫度顯示的電子鐘的設(shè)計(jì),通過(guò)多功能數(shù)字鐘帶有溫度的設(shè)計(jì)思路,詳細(xì)敘述了系統(tǒng)硬件、軟件的具體實(shí)現(xiàn)過(guò)程。論文重點(diǎn)闡述了數(shù)字鐘硬件中mcu模塊、溫度模塊、時(shí)鐘模塊、顯示模塊和相關(guān)控制模塊等的模塊化設(shè)計(jì)與制作;軟件同樣采用模塊化的設(shè)計(jì),包括中斷模塊、溫度模塊、時(shí)間調(diào)整模塊設(shè)計(jì),并采用簡(jiǎn)單流通性強(qiáng)的c語(yǔ)言編寫實(shí)現(xiàn)。本設(shè)計(jì)實(shí)現(xiàn)了時(shí)間的修改功能和年、月、日和星期的顯示和溫度顯示功能。 關(guān)鍵詞: 單片機(jī); c語(yǔ)言編程; ds1302時(shí)鐘芯片;ds18b20;溫度傳感器前言單片微型計(jì)算機(jī)是隨著超大規(guī)模集成電路技術(shù)的發(fā)展而誕生的,由于它具有體積小、功能強(qiáng)、性價(jià)比

2、高等特點(diǎn),所以廣泛應(yīng)用于電子儀表、家用電器、節(jié)能裝置、軍事裝置、機(jī)器人、工業(yè)控制等諸多領(lǐng)域,使產(chǎn)品小型化、智能化,既提高了產(chǎn)品的功能和質(zhì)量,又降低了成本,簡(jiǎn)化了設(shè)計(jì)。本文主要介紹由單片機(jī)控制的帶有溫度顯示的電子鐘的設(shè)計(jì)。隨著人們生活水平的日益提高,人們對(duì)生活的要求越來(lái)越高,原有的事物已經(jīng)不能滿足人們的生活需求了,一些帶有新功能的事物已經(jīng)在慢慢的取代舊事物。就像電子鐘一樣,人們用電子鐘不僅僅只是看時(shí)間了,人們還需要看溫度了。越來(lái)越多的新功能更貼近人們的生活了,所以也越來(lái)越受人們所喜歡。帶有溫度的的電子鐘可以使人們隨時(shí)都可以了解溫度的變化。1. 系統(tǒng)實(shí)現(xiàn)功能、設(shè)計(jì)方案論證及芯片介紹1.1. 設(shè)計(jì)要

3、求本設(shè)計(jì)準(zhǔn)備實(shí)現(xiàn)的功能: (1) 萬(wàn)年歷 (2) 三鍵調(diào)時(shí)(設(shè)置鍵,鍵,鍵)(3) 可每次增減一進(jìn)行時(shí)間調(diào)節(jié)(4) 按鍵蜂鳴器提示(5) 溫度顯示2. 方案論證與設(shè)計(jì)2.1. 設(shè)計(jì)方案論證 方案一:用主芯片為at89c51的單片機(jī)控制實(shí)現(xiàn),使用單片機(jī)內(nèi)部的定時(shí)計(jì)數(shù)器實(shí)現(xiàn)時(shí)間的設(shè)定,使用按鍵進(jìn)行時(shí)間的調(diào)整和定時(shí),按鍵有蜂鳴器提示,溫度傳感器使用dallas公司生產(chǎn)的單總線式數(shù)字溫度傳感器,它具有微型化、低功耗、高性能、抗干擾能力強(qiáng)、易配處理器等優(yōu)點(diǎn),特別適用于構(gòu)成多點(diǎn)溫度測(cè)控系統(tǒng),可直接將溫度轉(zhuǎn)化成串行數(shù)字信號(hào)(提供9位二進(jìn)制數(shù)字)給單片機(jī)處理,且在同一總線上可以掛接多個(gè)傳感器芯片。顯示時(shí)間和溫

4、度使用數(shù)碼管顯示。方案1系統(tǒng)結(jié)構(gòu)框圖如圖1-1所示。圖1-1 方案1系統(tǒng)結(jié)構(gòu)框圖方案二:用主芯片為stc89c52的單片機(jī)控制實(shí)現(xiàn),為了滿足單片機(jī)系統(tǒng)的實(shí)時(shí)控制的需求,采用實(shí)時(shí)鐘芯片ds1302,使用按鍵進(jìn)行時(shí)間的調(diào)整和定時(shí),溫度傳感器使用ds18b20。顯示時(shí)間和溫度使用lcd1602顯示。方案2系統(tǒng)結(jié)構(gòu)框圖如圖1-2所示。 圖1-2 方案2系統(tǒng)結(jié)構(gòu)框圖2.2. 方案選擇方案一直接使用單片機(jī)內(nèi)集成的定時(shí)器,產(chǎn)生定時(shí)節(jié)拍,編制軟件計(jì)數(shù)器,進(jìn)行節(jié)拍技術(shù),理論上講,不但能夠完成秒表設(shè)計(jì),還能夠?qū)崿F(xiàn)分鐘、刻鐘、小時(shí)的實(shí)時(shí)計(jì)時(shí)功能,在此基礎(chǔ)上,如果加上足夠精確的誤差時(shí)間補(bǔ)償處理,甚至可以實(shí)現(xiàn)日、星期、

5、月、年等日歷功能。但使用片內(nèi)定時(shí)器有以下幾個(gè)問(wèn)題:2.2.1. 時(shí)間補(bǔ)償片內(nèi)定時(shí)器采用中斷方式提供計(jì)時(shí)節(jié)拍,中斷的實(shí)質(zhì)是隨機(jī)程序切換,那么,中斷響應(yīng)時(shí)間是不可精確預(yù)測(cè)的。這樣,必然會(huì)導(dǎo)致計(jì)時(shí)節(jié)拍的時(shí)間誤差,在計(jì)時(shí)時(shí)間較短的情況下,比如199s計(jì)時(shí),可以采用一些軟件措施進(jìn)行誤差補(bǔ)償,但當(dāng)系統(tǒng)所需要的計(jì)時(shí)時(shí)間較長(zhǎng)時(shí),比如進(jìn)行年、月、日的日歷計(jì)時(shí),定時(shí)中斷誤差扥積累就會(huì)很大,無(wú)法滿足時(shí)間精度的要求。因此,在需要日歷、時(shí)鐘的場(chǎng)合,片內(nèi)定時(shí)器的作用有限。片內(nèi)定時(shí)器只適合于單片機(jī)短時(shí)間計(jì)時(shí)的要求。 2.2.2. 時(shí)鐘維持使用片內(nèi)定時(shí)器進(jìn)行計(jì)時(shí)的時(shí)候,單片機(jī)始終要處于工作狀態(tài)。才能維持計(jì)時(shí)時(shí)間,一旦停機(jī)或進(jìn)

6、入待機(jī)狀態(tài),開(kāi)機(jī)后,計(jì)時(shí)時(shí)間就需要重新設(shè)定。在單片機(jī)系統(tǒng)中,有時(shí),需要維持一個(gè)時(shí)鐘,對(duì)控制工作進(jìn)行時(shí)間標(biāo)定。不管單片機(jī)系統(tǒng)開(kāi)機(jī)、關(guān)機(jī)還是待機(jī),系統(tǒng)時(shí)鐘要始終維持。為了滿足單片機(jī)系統(tǒng)的實(shí)時(shí)鐘需求,最可靠的方法是采用實(shí)時(shí)鐘芯片ds1302。溫度的數(shù)據(jù)采集如果是一般的溫度傳感器,需要對(duì)信號(hào)進(jìn)行處理,另外還需要模數(shù)轉(zhuǎn)換裝置,如果采用的是數(shù)字溫度傳感器18b20,可以直接將采集的信號(hào)轉(zhuǎn)化為數(shù)字信息供單片機(jī)控制,這樣不僅節(jié)約了成本,還提高了系統(tǒng)的可靠性和穩(wěn)定性。所以本設(shè)計(jì)采用的是方案三。芯片介紹2.3. ds18b20芯片介紹ds18b20是dallas公司生產(chǎn)的單總線式數(shù)字溫度傳感器,它具有微型化、低功

7、耗、高性能、搞干擾能力強(qiáng)、易配處理器等優(yōu)點(diǎn),特別適用于構(gòu)成多點(diǎn)溫度測(cè)控系統(tǒng),可直接將溫度轉(zhuǎn)化成串行數(shù)字信號(hào)(提供9位二進(jìn)制數(shù)字)給單片機(jī)處理,且在同一總線上可以掛接多個(gè)傳感器芯片。它具有3引腳to92小體積封裝形式,溫度測(cè)量范圍為55125,可編程為9位12位a/d轉(zhuǎn)換精度,測(cè)溫分辨率可達(dá)0.0625,被測(cè)溫度用符號(hào)擴(kuò)展的16位數(shù)字量方式串行輸出,其工作電源既可在遠(yuǎn)端引入,也可采用寄生電源方式產(chǎn)生,多個(gè)ds18b20可以并聯(lián)到3根或2根線上,cpu只需一根端口線就能與多個(gè)ds18b20通信,占用微處理器的端口較少,可節(jié)省大量的引線和邏輯電路。以上特點(diǎn)使ds18b20非常適用于遠(yuǎn)距離多點(diǎn)溫度檢測(cè)

8、系統(tǒng)。1、ds18b20外形及引腳說(shuō)明 圖1-2 ds18b20外形及引腳圖 在to-92和so-8的封裝中引腳有所不同,具體差別請(qǐng)查閱pdf手冊(cè),在to-92封裝中引腳分配如下:(1)gnd:地;(2)dq:?jiǎn)尉€運(yùn)用的數(shù)據(jù)輸入輸出引腳;(3)vdd:可選的電源引腳。2、ds18b20工作過(guò)程及時(shí)序 ds18b20內(nèi)部的低溫度系數(shù)振蕩器是一個(gè)振蕩頻率隨溫度變化很小的振蕩器,為計(jì)數(shù)器1提供一頻率穩(wěn)定的計(jì)數(shù)脈沖。 高溫度系數(shù)振蕩器是一個(gè)振蕩頻率對(duì)溫度很敏感的振蕩器,為計(jì)數(shù)器2提供一個(gè)頻率隨溫度變化的計(jì)數(shù)脈沖。 初始時(shí),溫度寄存器被預(yù)置成-55,每當(dāng)計(jì)數(shù)器1從預(yù)置數(shù)開(kāi)始減計(jì)數(shù)到0時(shí),溫度寄存器中寄存

9、的溫度值就增加1,這個(gè)過(guò)程重復(fù)進(jìn)行,直到計(jì)數(shù)器2計(jì)數(shù)到0時(shí)便停止。初始時(shí),計(jì)數(shù)器1預(yù)置的是與-55相對(duì)應(yīng)的一個(gè)預(yù)置值。以后計(jì)數(shù)器1每一個(gè)循環(huán)的預(yù)置數(shù)都由斜率累加器提供。為了補(bǔ)償振蕩器溫度特性的非線性性,斜率累加器提供的預(yù)置數(shù)也隨溫度相應(yīng)變化。計(jì)數(shù)器1的預(yù)置數(shù)也就是在給定溫度處使溫度寄存器寄存值增加1計(jì)數(shù)器所需要的計(jì)數(shù)個(gè)數(shù)。ds18b20內(nèi)部的比較器以四舍五入的量化方式確定溫度寄存器的最低有效位。在計(jì)數(shù)器2停止計(jì)數(shù)后,比較器將計(jì)數(shù)器1中的計(jì)數(shù)剩余值轉(zhuǎn)換為溫度值后與0.25進(jìn)行比較,若低于0.25,溫度寄存器的最低位就置0;若高于0.25,最低位就置1;若高于0.75時(shí),溫度寄存器的最低位就進(jìn)位然

10、后置0。這樣,經(jīng)過(guò)比較后所得的溫度寄存器的值就是最終讀取的溫度值了,其最后位代表0.5,四舍五入最大量化誤差為1/2lsb,即0.25。溫度寄存器中的溫度值以9位數(shù)據(jù)格式表示,最高位為符號(hào)位,其余8位以二進(jìn)制補(bǔ)碼形式表示溫度值。測(cè)溫結(jié)束時(shí),這9位數(shù)據(jù)轉(zhuǎn)存到暫存存儲(chǔ)器的前兩個(gè)字節(jié)中,符號(hào)位占用第一字節(jié),8位溫度數(shù)據(jù)占據(jù)第二字節(jié)。ds18b20測(cè)量溫度時(shí)使用特有的溫度測(cè)量技術(shù)。ds18b20內(nèi)部的低溫度系數(shù)振蕩器能產(chǎn)生穩(wěn)定的頻率信號(hào);同樣的,高溫度系數(shù)振蕩器則將被測(cè)溫度轉(zhuǎn)換成頻率信號(hào)。當(dāng)計(jì)數(shù)門打開(kāi)時(shí),ds18b20進(jìn)行計(jì)數(shù),計(jì)數(shù)門開(kāi)通時(shí)間由高溫度系數(shù)振蕩器決定。芯片內(nèi)部還有斜率累加器,可對(duì)頻率的非

11、線性度加以補(bǔ)償。測(cè)量結(jié)果存入溫度寄存器中。一般情況下的溫度值應(yīng)該為9位,但因符號(hào)位擴(kuò)展成高8位,所以最后以16位補(bǔ)碼形式讀出。 ds18b20工作過(guò)程一般遵循以下協(xié)議:初始化rom操作命令存儲(chǔ)器操作命令處理數(shù)據(jù)。(1)初始化 單總線上的所有處理均從初始化序列開(kāi)始。初始化序列包括總線主機(jī)發(fā)出一復(fù)位脈沖,接著由從屬器件送出存在脈沖。存在脈沖讓總線控制器知道ds1820 在總線上且已準(zhǔn)備好操作。(2) rom操作命令 一旦總線主機(jī)檢測(cè)到從屬器件的存在,它便可以發(fā)出器件rom操作命令之一。所有rom操作命令均為8位長(zhǎng)。這些命令介紹如下:read rom(讀rom)33h 此命令允許總線主機(jī)讀ds18b

12、20的8位產(chǎn)品系列編碼,唯一的48位序列號(hào),以及8位的crc。此命令只能在總線上僅有一個(gè)ds18b20的情況下可以使用。如果總線上存在多于一個(gè)的從屬器件,那么當(dāng)所有從片企圖同時(shí)發(fā)送時(shí)將發(fā)生數(shù)據(jù)沖突的現(xiàn)象(漏極開(kāi)路會(huì)產(chǎn)生線與的結(jié)果)。 match rom( 符合rom)55h 此命令后繼以64位的rom數(shù)據(jù)序列,允許總線主機(jī)對(duì)多點(diǎn)總線上特定的ds18b20尋址。只有與64位rom序列嚴(yán)格相符的ds18b20才能對(duì)后繼的存貯器操作命令作出響應(yīng)。所有與64位rom序列不符的從片將等待復(fù)位脈沖。此命令在總線上有單個(gè)或多個(gè)器件的情況下均可使用。skip rom( 跳過(guò)rom )cch 在單點(diǎn)總線系統(tǒng)中,

13、此命令通過(guò)允許總線主機(jī)不提供64位rom編碼而訪問(wèn)存儲(chǔ)器操作來(lái)節(jié)省時(shí)間。如果在總線上存在多于一個(gè)的從屬器件而且在skip rom命令之后發(fā)出讀命令,那么由于多個(gè)從片同時(shí)發(fā)送數(shù)據(jù),會(huì)在總線上發(fā)生數(shù)據(jù)沖突(漏極開(kāi)路下拉會(huì)產(chǎn)生線與的效果)。search rom( 搜索rom)f0h 當(dāng)系統(tǒng)開(kāi)始工作時(shí),總線主機(jī)可能不知道單線總線上的器件個(gè)數(shù)或者不知道其64位rom編碼。搜索rom命令允許總線控制器用排除法識(shí)別總線上的所有從機(jī)的64位編碼。alarm search(告警搜索)ech 此命令的流程與搜索rom命令相同。但是,僅在最近一次溫度測(cè)量出現(xiàn)告警的情況下,ds18b20才對(duì)此命令作出響應(yīng)。告警的條件

14、定義為溫度高于th 或低于tl。只要ds18b20一上電,告警條件就保持在設(shè)置狀態(tài),直到另一次溫度測(cè)量顯示出非告警值或者改變th或tl的設(shè)置,使得測(cè)量值再一次位于允許的范圍之內(nèi)。貯存在eeprom內(nèi)的觸發(fā)器值用于告警。(3) 存儲(chǔ)器操作命令write scratchpad(寫暫存存儲(chǔ)器)4eh 這個(gè)命令向ds18b20的暫存器中寫入數(shù)據(jù),開(kāi)始位置在地址2。接下來(lái)寫入的兩個(gè)字節(jié)將被存到暫存器中的地址位置2和3??梢栽谌魏螘r(shí)刻發(fā)出復(fù)位命令來(lái)中止寫入。read scratchpad(讀暫存存儲(chǔ)器)beh 這個(gè)命令讀取暫存器的內(nèi)容。讀取將從字節(jié)0開(kāi)始,一直進(jìn)行下去,直到第9(字節(jié)8,crc)字節(jié)讀完。

15、如果不想讀完所有字節(jié),控制器可以在任何時(shí)間發(fā)出復(fù)位命令來(lái)中止讀取。copy scratchpad(復(fù)制暫存存儲(chǔ)器)48h 這條命令把暫存器的內(nèi)容拷貝到ds18b20的e2存儲(chǔ)器里,即把溫度報(bào)警觸發(fā)字節(jié)存入非易失性存儲(chǔ)器里。如果總線控制器在這條命令之后跟著發(fā)出讀時(shí)間隙,而ds18b20又正在忙于把暫存器拷貝到e2存儲(chǔ)器,ds18b20就會(huì)輸出一個(gè)“0”,如果拷貝結(jié)束的話,ds18b20 則輸出“1”。如果使用寄生電源,總線控制器必須在這條命令發(fā)出后立即起動(dòng)強(qiáng)上拉并最少保持10ms。convert t(溫度變換)44h 這條命令啟動(dòng)一次溫度轉(zhuǎn)換而無(wú)需其他數(shù)據(jù)。溫度轉(zhuǎn)換命令被執(zhí)行,而后ds18b20

16、保持等待狀態(tài)。如果總線控制器在這條命令之后跟著發(fā)出讀時(shí)間隙,而ds18b20又忙于做時(shí)間轉(zhuǎn)換的話,ds18b20將在總線上輸出“0”,若溫度轉(zhuǎn)換完成,則輸出“1”。如果使用寄生電源,總線控制器必須在發(fā)出這條命令后立即起動(dòng)強(qiáng)上拉,并保持500ms。recall e2(重新調(diào)整e2)b8h 這條命令把貯存在e2中溫度觸發(fā)器的值重新調(diào)至?xí)捍娲鎯?chǔ)器。這種重新調(diào)出的操作在對(duì)ds18b20上電時(shí)也自動(dòng)發(fā)生,因此只要器件一上電,暫存存儲(chǔ)器內(nèi)就有了有效的數(shù)據(jù)。在這條命令發(fā)出之后,對(duì)于所發(fā)出的第一個(gè)讀數(shù)據(jù)時(shí)間片,器件會(huì)輸出溫度轉(zhuǎn)換忙的標(biāo)識(shí):“0”=忙,“1”=準(zhǔn)備就緒。read power supply(讀電源

17、)b4h 對(duì)于在此命令發(fā)送至ds18b20之后所發(fā)出的第一讀數(shù)據(jù)的時(shí)間片,器件都會(huì)給出其電源方式的信號(hào):“0”=寄生電源供電,“1”=外部電源供電。(4)處理數(shù)據(jù)ds18b20的高速暫存存儲(chǔ)器由9個(gè)字節(jié)組成,其分配如圖1-3所示。當(dāng)溫度轉(zhuǎn)換命令發(fā)布后,經(jīng)轉(zhuǎn)換所得的溫度值以二字節(jié)補(bǔ)碼形式存放在高速暫存存儲(chǔ)器的第0和第1個(gè)字節(jié)。單片機(jī)可通過(guò)單線接口讀到該數(shù)據(jù),讀取時(shí)低位在前,高位在后。圖1-3 高速暫存存儲(chǔ)器分配圖表1-1是ds18b20溫度采集轉(zhuǎn)化后得到的12位數(shù)據(jù),存儲(chǔ)在ds18b20的兩個(gè)8比特的ram中,二進(jìn)制中的前面5位是符號(hào)位,如果測(cè)得的溫度大于或等于0,這5位為0,只要將測(cè)到的數(shù)值乘

18、于0.0625即可得到實(shí)際溫度;如果溫度小于0,這5位為1,測(cè)到的數(shù)值需要取反加1再乘于0.0625即可得到實(shí)際溫度。溫度轉(zhuǎn)換計(jì)算方法舉例:例如,當(dāng)ds18b20采集到+125的實(shí)際溫度后,輸出為07d0h,則:實(shí)際溫度=07d0h0.0625=20000.0625=1250c。例如當(dāng)ds18b20采集到-55的實(shí)際溫度后,輸出為fc90h,則應(yīng)先將11位據(jù)位取反加1得370h(符號(hào)位不變,也不作為計(jì)算),則:實(shí)際溫度=370h0.0625=8800.0625=550c。表1-1 ds18b20溫度數(shù)據(jù)表 溫度/0c二進(jìn)制表示十六進(jìn)制表示符號(hào)位(5位)數(shù)據(jù)位(11位)+1250 0 0 0 0

19、1111101000007d0h+25.06250 0 0 0 0001100100010191h+10.1250 0 0 0 00001010001000a2h+0.50 0 0 0 0000000010000008h00 0 0 0 0000000000000000h-0.51 1 1 1 111111111000fff8h-10.1251 1 1 1 111101011110ff5eh-25.6251 1 1 1 111001101111fe6fh-551 1 1 1 110010010000fc90h2.4. ds1302芯片介紹ds1302是dallas公司推出的涓流充電時(shí)鐘芯片,內(nèi)

20、含一個(gè)實(shí)時(shí)時(shí)鐘/日歷和31字節(jié)靜態(tài)ram,可以通過(guò)串行接口與單片機(jī)進(jìn)行通信。實(shí)時(shí)時(shí)鐘/日歷電路提供秒、分、時(shí)、日、星期、月、年的信息,每個(gè)月的天數(shù)和閏年的天數(shù)可自動(dòng)調(diào)整,時(shí)鐘操作可通過(guò)am/pm標(biāo)志位決定采用24或12小時(shí)時(shí)間格式。ds1302與單片機(jī)之間能簡(jiǎn)單地采用同步串行的方式進(jìn)行通信,僅需三根i/o線:復(fù)位(rst)、i/o數(shù)據(jù)線、串行時(shí)鐘(sclk)。時(shí)鐘/ram的讀/寫數(shù)據(jù)以一字節(jié)或多達(dá)31字節(jié)的字符組方式通信。ds1302工作時(shí)功耗很低,保持?jǐn)?shù)據(jù)和時(shí)鐘信息時(shí),功耗小于1mw。ds1302的外部引腳功能說(shuō)明如圖1-4所示。 ds1302封裝圖x1,x232.768khz晶振引腳gnd

21、地rst復(fù)位i/o數(shù)據(jù)輸入/輸出sclk串行時(shí)鐘vcc1電池引腳vcc2主電源引腳 圖1-4 ds1302的外部引腳功能說(shuō)明圖ds1302的內(nèi)部結(jié)構(gòu)如圖1-5所示,主要組成部分為:移位寄存器、控制邏輯、振蕩器、實(shí)時(shí)時(shí)鐘以及ram。雖然數(shù)據(jù)分成兩種,但是對(duì)單片機(jī)的程序而言,其實(shí)是一樣的,就是對(duì)特定的地址進(jìn)行讀寫操作。 圖1-5 ds1302的內(nèi)部結(jié)構(gòu)圖 ds1302含充電電路,可以對(duì)作為后備電源的可充電電池充電,并可選擇充電使能和串入的二極管數(shù)目,以調(diào)節(jié)電池充電電壓。不過(guò)對(duì)我們目前而言,最需要熟悉的是和時(shí)鐘相關(guān)部分的功能,對(duì)于其它參數(shù)請(qǐng)參閱數(shù)據(jù)手冊(cè)。2、ds1302的工作原理ds1302工作時(shí)為

22、了對(duì)任何數(shù)據(jù)傳送進(jìn)行初始化,需要將復(fù)位腳(rst)置為高電平且將8位地址和命令信息裝入移位寄存器。數(shù)據(jù)在時(shí)鐘(sclk)的上升沿串行輸入,前8位指定訪問(wèn)地址,命令字裝入移位寄存器后,在之后的時(shí)鐘周期,讀操作時(shí)輸出數(shù)據(jù),寫操作時(shí)輸出數(shù)據(jù)。時(shí)鐘脈沖的個(gè)數(shù)在單字節(jié)方式下為8+8(8位地址+8位數(shù)據(jù)),在多字節(jié)方式下為8加最多可達(dá)248的數(shù)據(jù)。 3、ds1302的寄存器和控制命令對(duì)ds1302的操作就是對(duì)其內(nèi)部寄存器的操作,ds1302內(nèi)部共有12個(gè)寄存器,其中有7個(gè)寄存器與日歷、時(shí)鐘相關(guān),存放的數(shù)據(jù)位為bcd碼形式。此外,ds1302還有年份寄存器、控制寄存器、充電寄存器、時(shí)鐘突發(fā)寄存器及與ram相

23、關(guān)的寄存器等。時(shí)鐘突發(fā)寄存器可一次性順序讀寫除充電寄存器以外的寄存器。日歷、時(shí)間寄存器及控制字如表1-2所示。表1-2 日歷、時(shí)鐘寄存器與控制字對(duì)照表寄存器名稱765432101ram/cka4a3a2a1a0rd/w秒寄存器1000000分寄存器1000001小時(shí)寄存器1000010日寄存器1000011月寄存器1000100星期寄存器1000101年寄存器1000110寫保護(hù)寄存器1000111慢充電寄存器1001000時(shí)鐘突發(fā)寄存器1011111最后一位rd/w為“0”時(shí)表示進(jìn)行寫操作,為“1”時(shí)表示讀操作。ds1302內(nèi)部寄存器列表如表1-3所示。表1-3 ds14302內(nèi)部主要寄存器

24、分布表寄存器名稱命令字取值范圍各位內(nèi)容寫讀76543210秒寄存器80h81h00-59ch10secsec分寄存器82h83h00-59010minmin小時(shí)寄存器84h85h01-12或00-2312/240ahrhr日期寄存器86h87h01-28,29,30,310010datedate月份寄存器88h89h01-1200010mmonth周寄存器8ah8bh01-0700000day年份寄存器8ch8dh00-9910yearyeards1302內(nèi)部的ram分為兩類,一類是單個(gè)ram單元,共31個(gè),每個(gè)單元為一個(gè)8位的字節(jié),其命令控制字為cohfdh,其中奇數(shù)為讀操作,偶數(shù)為寫操作;

25、再一類為突發(fā)方式下的ram,此方式下可一次性讀寫所有的ram的31個(gè)字節(jié),命令控制字為feh(寫)、ffh(讀)。我們現(xiàn)在已經(jīng)知道了控制寄存器和ram的邏輯地址,接著就需要知道如何通過(guò)外部接口來(lái)訪問(wèn)這些資源。單片機(jī)是通過(guò)簡(jiǎn)單的同步串行通訊與ds1302通訊的,每次通訊都必須由單片機(jī)發(fā)起,無(wú)論是讀還是寫操作,單片機(jī)都必須先向ds1302寫入一個(gè)命令幀,這個(gè)幀的格式如表1所示,最高位bit7固定為1,bit6決定操作是針對(duì)ram還是時(shí)鐘寄存器,接著的5個(gè)bit是ram或時(shí)鐘寄存器在ds1302的內(nèi)部地址,最后一個(gè)bit表示這次操作是讀操作抑或是寫操作。物理上,ds1302的通訊接口由3個(gè)口線組成,

26、即rst,sclk,i/o。其中rst從低電平變成高電平啟動(dòng)一次數(shù)據(jù)傳輸過(guò)程,sclk是時(shí)鐘線,i/o是數(shù)據(jù)線。具體的讀寫時(shí)序如圖1-6,但是請(qǐng)注意,無(wú)論是哪種同步通訊類型的串行接口,都是對(duì)時(shí)鐘信號(hào)敏感的,而且一般數(shù)據(jù)寫入有效是在上升沿,讀出有效是在下降沿(ds1302正是如此的,但是在芯片手冊(cè)里沒(méi)有明確說(shuō)明),如果不是特別確定,則把程序設(shè)計(jì)成這樣:平時(shí)sclk保持低電平,在時(shí)鐘變動(dòng)前設(shè)置數(shù)據(jù),在時(shí)鐘變動(dòng)后讀取數(shù)據(jù),即數(shù)據(jù)操作總是在sclk保持為低電平的時(shí)候,相鄰的操作之間間隔有一個(gè)上升沿和一個(gè)下降沿。 圖1-6 ds1302的命令字結(jié)構(gòu)3. 電路硬件設(shè)計(jì)及分析3.1. 時(shí)鐘電路系統(tǒng)的時(shí)鐘電路

27、設(shè)計(jì)是采用的內(nèi)部方式,即利用芯片內(nèi)部的振蕩電路。51單片機(jī)內(nèi)部有一個(gè)用于構(gòu)成振蕩器的高增益反相放大器。引腳xtal1和xtal2分別是此放大器的輸入端和輸出端。這個(gè)放大器與作為反饋元件的片外晶體諧振器一起構(gòu)成一個(gè)自激振蕩器。外接晶體諧振器以及電容c1和c2構(gòu)成并聯(lián)諧振電路,接在放大器的反饋回路中。對(duì)外接電容的值雖然沒(méi)有嚴(yán)格的要求,但電容的大小會(huì)影響震蕩器頻率的高低、震蕩器的穩(wěn)定性、起振的快速性和溫度的穩(wěn)定性。因此,此系統(tǒng)電路的晶體振蕩器的值為12mhz,電容應(yīng)盡可能的選擇陶瓷電容,電容值約為22f。在焊接刷電路板時(shí),晶體振蕩器和電容應(yīng)盡可能安裝得與單片機(jī)芯片靠近,以減少寄生電容,更好地保證震蕩

28、器穩(wěn)定和可靠地工作。時(shí)鐘電路如圖2-1所示。圖2-1 時(shí)鐘電路圖3.2. 復(fù)位電路復(fù)位是由外部的復(fù)位電路來(lái)實(shí)現(xiàn)的。片內(nèi)復(fù)位電路是復(fù)位引腳rst通常采用上電自動(dòng)復(fù)位和按鍵手動(dòng)復(fù)位兩種方式,此電路系統(tǒng)采用的是按鍵手動(dòng)復(fù)位電路,高電平時(shí)復(fù)位,如圖所示。當(dāng)時(shí)鐘頻率選用12mhz時(shí),c取22f,r約為1k。復(fù)位電路如圖2-2所示 圖2-2 復(fù)位電路圖3.3. ds1302時(shí)鐘電路ds1302內(nèi)含一個(gè)實(shí)時(shí)時(shí)鐘/日歷和31字節(jié)靜態(tài)ram,可以通過(guò)串行接口與單片機(jī)進(jìn)行通信。實(shí)時(shí)時(shí)鐘/日歷電路提供秒、分、時(shí)、日、星期、月、年的信息,每個(gè)月的天數(shù)和閏年的天數(shù)可自動(dòng)調(diào)整,時(shí)鐘操作可通過(guò)am/pm標(biāo)志位決定采用24或

29、12小時(shí)時(shí)間格式。ds1302與單片機(jī)之間能簡(jiǎn)單地采用同步串行的方式進(jìn)行通信,僅需三根i/o線:復(fù)位(rst)、i/o數(shù)據(jù)線、串行時(shí)鐘(sclk)。ds1302時(shí)鐘電路如圖2-3所示。 圖2-3 ds1302時(shí)鐘電路圖3.4. ds18b20溫度計(jì)電路ds18b20它具有3引腳to92小體積封裝形式,溫度測(cè)量范圍為55125,可編程為9位12位a/d轉(zhuǎn)換精度,測(cè)溫分辨率可達(dá)0.0625,被測(cè)溫度用符號(hào)擴(kuò)展的16位數(shù)字量方式串行輸出,其工作電源既可在遠(yuǎn)端引入,也可采用寄生電源方式產(chǎn)生,多個(gè)ds18b20可以并聯(lián)到3根或2根線上,cpu只需一根端口線就能與多個(gè)ds18b20通信,占用微處理器的端口

30、較少,可節(jié)省大量的引線和邏輯電路。以上特點(diǎn)使ds18b20非常適用于遠(yuǎn)距離多點(diǎn)溫度檢測(cè)系統(tǒng)。電路圖如圖2-4所示。 圖2-4 ds18b20溫度計(jì)電路3.5. 按鍵電路鍵盤接口是單片機(jī)應(yīng)用系統(tǒng)中最常用的接口之一,鍵盤的類型很多,常用的有獨(dú)立式鍵盤和矩陣式鍵盤,因?yàn)楸驹O(shè)計(jì)需要的鍵盤比較少,所以采用獨(dú)立式的應(yīng)用中,需要解決鍵盤消抖的問(wèn)題,一般使用的是軟件消抖的方法。鍵盤圖2-5所示。 圖2-5 鍵盤電路圖3.6. 顯示電路顯示器是單片機(jī)常用的功能單元之一,顯示器的主要功能是為單片機(jī)系統(tǒng)使用者提供必要的單片機(jī)工作信息,或者提供工作狀態(tài)的提示信息,顯示器的工作是由單片機(jī)通過(guò)顯示接口驅(qū)動(dòng)的。本設(shè)計(jì)采用的

31、是lcd1602顯示電路圖如圖2-6所示。圖2-6 lcd1602顯示電路圖4. 軟件設(shè)計(jì)4.1. 主函數(shù)流程圖主函數(shù)流程圖如圖3-1所示。 圖3-1 主函數(shù)流程圖3.2 18b20溫度計(jì)流程圖ds1820溫度計(jì)程序流程圖如圖3-2所示。 圖3-2 ds1820溫度計(jì)程序流程圖4.2. 按鍵電路流程圖按鍵程序流程圖如圖3-3所示。 圖3-3 按鍵程序流程圖 5. 結(jié)論本次課程設(shè)計(jì)在老師的指導(dǎo)和同學(xué)的幫助下順利完成。本次設(shè)計(jì)的是一個(gè)帶溫度顯示的電子時(shí)鐘。在本次試驗(yàn)中,感覺(jué)到自己?jiǎn)纹瑱C(jī)知識(shí)非常欠缺,編程方面很多知識(shí)不懂,在同學(xué)的幫助下,并借鑒了其他同學(xué)的部分程序,經(jīng)過(guò)調(diào)試后在單片機(jī)上顯示出最終結(jié)果

32、,一個(gè)小型的帶溫度顯示的萬(wàn)年歷就做出來(lái)了。通過(guò)本次設(shè)計(jì),了解了時(shí)鐘芯片、溫度傳感器的一些基本原理及用途,并學(xué)習(xí)了單片機(jī)中一些基本指令的運(yùn)用,明白了寫程序的困難及軟件思維和邏輯思維能力的重要性,提高了自己思考問(wèn)題的嚴(yán)謹(jǐn)性,并且體會(huì)到了團(tuán)隊(duì)合作的重要性,增強(qiáng)了解決困難的能力。在此感謝老師在本次課程設(shè)計(jì)中的指導(dǎo),使得本次設(shè)計(jì)順利的完成。參考文獻(xiàn)1 萬(wàn)光毅. 嚴(yán)義. 單片機(jī)實(shí)驗(yàn)與實(shí)踐教程(一)m, 北京航空航天大學(xué)出版社;2 夏繼強(qiáng). 沈德金. 單片機(jī)實(shí)驗(yàn)與實(shí)踐教程(二)m ,北京航空航天大學(xué)出版社;3 李廣弟. 朱月秀. 王秀山. 單片機(jī)基礎(chǔ)(修訂本)m,北京航空航天大學(xué)出版社;4 徐愛(ài)鈞. 彭秀華

33、. 單片機(jī)高級(jí)語(yǔ)言c51應(yīng)用程序設(shè)計(jì)m,2000年版;5 馬家辰. mcs-51單片機(jī)原理及其接口技術(shù)m,哈爾濱工業(yè)大學(xué)出版社,1997年版;6 甕嘉民. 單片機(jī)應(yīng)用開(kāi)發(fā)技術(shù)基于proteus仿真和c語(yǔ)言編程m,中國(guó)電力出版社,2009年版;7李強(qiáng). 51系列單片機(jī)應(yīng)用軟件編程技術(shù)m,北京航空航天大學(xué)出版社,2009年版。附錄實(shí)物顯示圖附錄主程序清單#include #define uchar unsigned char#define uint unsigned intsbit lcdrs=p16;sbit lcdrw=p17;sbit lcden=p27;void delayms(uint

34、z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);void write_data(uchar date)/寫數(shù)據(jù)lcdrs=1;p0=date;/輸入數(shù)據(jù)delayms(5);lcden=1; delayms(5);lcden=0;void write_com(uchar com)/寫指令lcdrs=0;p0=com;/輸入數(shù)據(jù)指令碼delayms(5);lcden=1; delayms(5);lcden=0; /初始化lcd*void lcd_init()p0=0;lcdrw=0;lcden=0;/使能端初始化write_com(0x38); /顯示模式設(shè)置

35、,設(shè)置16x2顯示,5x7點(diǎn)陣,8位數(shù)據(jù)接口write_com(0x0c);/顯示開(kāi)及光標(biāo)移動(dòng)設(shè)置write_com(0x06); /寫一個(gè)字符后地址加一,且光標(biāo)加一write_com(0x01); /所有顯示清零/*/設(shè)置光標(biāo)void display_xy(uchar x,uchar y) if(y=1) x+=0x40;/其中000f為第一行的顯示區(qū),1027為第一行不顯示存儲(chǔ)區(qū),404f為第二行顯示區(qū),5067為第二行不顯示存儲(chǔ)區(qū) x+=0x80; write_com(x);/顯示單個(gè)字符void display_char(uchar x,uchar y,uchar dat) displ

36、ay_xy(x,y); write_data(dat); /顯示字符串void display_string(unsigned char x,unsigned char y,unsigned char *s) display_xy(x,y); while(*s) write_data(*s); s+; #define uchar unsigned char#define uint unsigned intsbit ds1302_clk = p26; /實(shí)時(shí)時(shí)鐘時(shí)鐘線引腳 sbit ds1302_io = p25; /實(shí)時(shí)時(shí)鐘數(shù)據(jù)線引腳 sbit ds1302_rst = p20; /實(shí)時(shí)時(shí)鐘復(fù)

37、位線引腳sbit acc0 = acc0;sbit acc7 = acc7;uchar second,minute,hour,day,month,year,week;uchar datestring9;uchar timestring9;#define am(x)x#define pm(x)(x+12) / 轉(zhuǎn)成24小時(shí)制#define ds1302_second0x80#define ds1302_minute0x82#define ds1302_hour0x84 #define ds1302_week0x8a#define ds1302_day0x86#define ds1302_mont

38、h0x88#define ds1302_year0x8c#define ds1302_ram(x)(0xc0+(x)*2) /用于計(jì)算 ds1302_ram 地址的宏 bcd_dec(uchar val)uchar i;i = val&0x0f; /按位與,i得到低四位數(shù)。val = 4; /右移四位,將高四位移到低四位的位置,得到高四位碼值。val &= 0x0f; /防止移位時(shí)高位補(bǔ)進(jìn)1,只保留高四位碼值val *= 10; /高位碼值乘以10i += val; /然后與第四位碼值相加。return i; /將得到的十進(jìn)制數(shù)返回void ds1302inputbyte(uchar date

39、) /實(shí)時(shí)時(shí)鐘寫入一字節(jié)(內(nèi)部函數(shù)) uchar i; acc = date; for(i=8; i0; i-) ds1302_io = acc0; /相當(dāng)于匯編中的 rrc ds1302_clk = 1; ds1302_clk = 0; acc = acc 1; uchar ds1302outputbyte(void) /實(shí)時(shí)時(shí)鐘讀取一字節(jié)(內(nèi)部函數(shù)) uchar i; for(i=8; i0; i-) acc = acc 1; /相當(dāng)于匯編中的 rrc acc7 = ds1302_io; ds1302_clk = 1; ds1302_clk = 0; return(acc); void w

40、rite1302(uchar ucaddr, uchar ucda)/ucaddr: ds1302地址, /ucdata: 要寫的數(shù)據(jù) ds1302_rst = 0; ds1302_clk = 0; ds1302_rst = 1; ds1302inputbyte(ucaddr); / 地址,命令 ds1302inputbyte(ucda); / 寫1byte數(shù)據(jù) ds1302_clk = 1; ds1302_rst = 0; uchar read1302(uchar ucaddr)/讀取ds1302某地址的數(shù)據(jù) uchar ucdata; ds1302_rst = 0; ds1302_clk

41、= 0; ds1302_rst = 1; ds1302inputbyte(ucaddr|0x01); / 地址,命令 ucdata = ds1302outputbyte(); / 讀1byte數(shù)據(jù) ds1302_clk = 1; ds1302_rst = 0; return(ucdata);void ds1302_setprotect(bit flag) /是否寫保護(hù)if(flag)write1302(0x8e,0x10); /寫保護(hù)打開(kāi)else /寫保護(hù)關(guān)閉write1302(0x8e,0x00);void ds1302_settime(unsigned char address, unsi

42、gned char value) / 設(shè)置時(shí)間函數(shù)ds1302_setprotect(0);write1302(address, (value/10)4)*10 + (readvalue&0x0f);readvalue = read1302(ds1302_minute);minute = (readvalue&0x70)4)*10 + (readvalue&0x0f);readvalue = read1302(ds1302_hour);hour = (readvalue&0x70)4)*10 + (readvalue&0x0f);readvalue = read1302(ds1302_day)

43、;day = (readvalue&0x70)4)*10 + (readvalue&0x0f);readvalue = read1302(ds1302_week+1);week = (readvalue&0x70)4)*10 + (readvalue&0x0f);readvalue = read1302(ds1302_month);month = (readvalue&0x70)4)*10 + (readvalue&0x0f);readvalue = read1302(ds1302_year);year = (readvalue&0x70)4)*10 + (readvalue&0x0f);vo

44、id datetostr()/處理年月日函數(shù)datestring0 = year/10 + 0;datestring1 = year%10 + 0;datestring2 = -;datestring3 = month/10 + 0;datestring4 = month%10 + 0;datestring5 = -;datestring6 = day/10 + 0;datestring7 = day%10 + 0;/datestring8 = week/10+0;/datestring9 = week%10+0; datestring8 = 0;void timetostr() /處理時(shí)分秒

45、函數(shù)timestring0 = hour/10 + 0;timestring1 = hour%10 + 0;timestring2 = :;timestring3 = minute/10 + 0;timestring4 = minute%10 + 0;timestring5 = :; timestring6 = second/10 + 0;timestring7 = second%10 + 0;datestring8 = 0;void initial_ds1302(void)/初始化ds1302unsigned char second=read1302(ds1302_second);if(se

46、cond&0x80) ds1302_settime(ds1302_second,0);display_string(1,0,20);/*ds1302_settime(ds1302_year,11);ds1302_settime(ds1302_month,11);ds1302_settime(ds1302_day,22);ds1302_settime(ds1302_hour,14);ds1302_settime(ds1302_minute,40);ds1302_settime(ds1302_second,11);*/*void burstwrite1302(unsigned char *pwcl

47、ock)/往ds1302寫入時(shí)鐘數(shù)據(jù)(多字節(jié)方式) unsigned char i; write1302(0x8e,0x00); / 控制命令,wp=0,寫操作? ds1302_rst = 0; ds1302_clk = 0; ds1302_rst = 1; ds1302inputbyte(0xbe); / 0xbe:時(shí)鐘多字節(jié)寫命令 for (i = 8; i0; i-) /8byte = 7byte 時(shí)鐘數(shù)據(jù) + 1byte 控制 ds1302inputbyte(*pwclock); / 寫1byte數(shù)據(jù) pwclock+; ds1302_clk = 1; ds1302_rst = 0; void burstread1302(unsigned char *prclock)/讀取ds1302時(shí)鐘數(shù)據(jù)(時(shí)鐘多字節(jié)方式) unsigned char i; ds1302_rst = 0; ds1302_clk = 0; ds1302_rst = 1; ds1302inputbyte(0xbf); / 0xbf:時(shí)鐘多字節(jié)讀命令 for (i=8; i0; i-) *prclock = ds1302outputbyte(); / 讀1byte數(shù)據(jù) prclock+; ds1302_clk = 1;

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論