計(jì)算機(jī)專業(yè)??飘厴I(yè)論文--單片機(jī)數(shù)字電子鐘的設(shè)計(jì)與實(shí)現(xiàn)_第1頁(yè)
已閱讀1頁(yè),還剩21頁(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、<p><b>  計(jì)算機(jī)專業(yè)畢業(yè)論文</b></p><p>  單片機(jī)數(shù)字電子鐘的設(shè)計(jì)與實(shí)現(xiàn)</p><p><b>  目 錄</b></p><p>  第1章 概 述2</p><p>  1.1 數(shù)字電子鐘的設(shè)計(jì)背景2</p><p>

2、  1.2 DS1302數(shù)字時(shí)鐘設(shè)計(jì)課題意義3</p><p>  第2章 方案論證3</p><p>  第3章 系統(tǒng)設(shè)計(jì)要求4</p><p>  3.1 單片機(jī)選型4</p><p>  3.2 顯示部分要求5</p><p>  3.3 鍵盤工作模塊6</p><p&

3、gt;  第4章 數(shù)字電子鐘軟件設(shè)計(jì)7</p><p>  4.1 主程序流程圖7</p><p>  4.2 中斷服務(wù)子程序流程圖8</p><p>  4.3 顯示部分設(shè)計(jì)9</p><p>  4.4 數(shù)字電子鐘原理圖10</p><p>  4.5 數(shù)字電子鐘源程序10</p>

4、<p>  第5章 實(shí)驗(yàn)裝調(diào)及過(guò)程10</p><p><b>  致 謝11</b></p><p><b>  參考文獻(xiàn)13</b></p><p><b>  附 錄 一14</b></p><p><b>  附 錄 二18&l

5、t;/b></p><p>  摘 要:?jiǎn)纹瑱C(jī)即單片微型計(jì)算機(jī)(Single-Chip Microcomputer)是集 CPU ,RAM ,ROM ,定時(shí),計(jì)數(shù)和多種接口于一體的微控制器。他體積小,成本低,功能強(qiáng),廣泛應(yīng)用于工業(yè)自動(dòng)化上和智能產(chǎn)品。時(shí)鐘,自從它被發(fā)明的那天起,就成為了人類的好朋友,但隨著時(shí)間的推移,科學(xué)技術(shù)的不斷發(fā)展,時(shí)鐘的應(yīng)用越來(lái)越廣范,人們對(duì)時(shí)間計(jì)量的精度要求也越來(lái)越高。怎樣讓時(shí)鐘更

6、好的為人民服務(wù),怎樣讓我們的老朋友再次煥發(fā)青春呢?這就要求我們不斷設(shè)計(jì)出新型的時(shí)鐘,來(lái)不斷滿足人們的日常生活需要。然而市場(chǎng)上的時(shí)鐘便宜的比較笨重,簡(jiǎn)單實(shí)用的又比較昂貴。那么,有沒(méi)有一款既簡(jiǎn)單實(shí)用價(jià)格又便宜的時(shí)鐘呢?</p><p>  我們課題小組設(shè)想:可不可以利用單片機(jī)功能集成化高,價(jià)格又便宜的特點(diǎn)設(shè)計(jì)一款結(jié)構(gòu)既簡(jiǎn)單,價(jià)格又便宜的單片機(jī)電子時(shí)鐘呢? </p><p>  關(guān)鍵詞:?jiǎn)纹瑱C(jī);

7、DS1302數(shù)字時(shí)鐘;計(jì)時(shí)</p><p>  第1章 概 述</p><p>  1.1 數(shù)字電子鐘的設(shè)計(jì)背景</p><p>  單片機(jī)自1976年由Intel公司推出MCS-48開始,迄今已有二十多年了。由于單片機(jī)集成度高、功能強(qiáng)、可靠性高、體積小、功耗地、使用方便、價(jià)格低廉等一系列優(yōu)點(diǎn),目前已經(jīng)滲入到人們工作和生活的方方面面,幾乎“無(wú)處不在,無(wú)所不為

8、”。單片機(jī)的應(yīng)用領(lǐng)域已從面向工業(yè)控制、通訊、交通、智能儀表等迅速發(fā)展到家用消費(fèi)產(chǎn)品、辦公自動(dòng)化、汽車電子、PC機(jī)外圍以及網(wǎng)絡(luò)通訊等廣大領(lǐng)域。</p><p>  本文討論的單片機(jī)多功能定時(shí)器的核心是目前應(yīng)用極為廣泛的51系列單片機(jī),配置了外圍設(shè)備,構(gòu)成了一個(gè)可編程的計(jì)時(shí)定時(shí)系統(tǒng),具有體積小,可靠性高,功能強(qiáng)等特點(diǎn)。不僅能滿足所需要求,而且還有很多功能可供開發(fā),有著有著廣泛的應(yīng)用領(lǐng)域。</p><

9、;p>  1.2 DS1302數(shù)字時(shí)鐘設(shè)計(jì)課題意義</p><p>  隨著電子技術(shù)的飛速發(fā)展,家用電器和辦公電子設(shè)備逐漸增多,不同的設(shè)備都有自己的控制器,使用起來(lái)很不方便。根據(jù)這種實(shí)際情況,設(shè)計(jì)了一個(gè)單片機(jī)多功能定時(shí)系統(tǒng),它可以避免多種控制器的混淆,利用一個(gè)控制器對(duì)多路電器進(jìn)行控制,同時(shí)又可以進(jìn)行時(shí)鐘校準(zhǔn)和定點(diǎn)打鈴。它可以執(zhí)行不同的時(shí)間表(考試時(shí)間和日常作息時(shí)間)的打鈴,可以任意設(shè)置時(shí)間。這種具有人們所

10、需要的智能化特性的產(chǎn)品減輕了人的勞動(dòng),擴(kuò)大了數(shù)字化的范圍,為家庭數(shù)字化提供了可能。</p><p><b>  第2章 方案論證</b></p><p>  要求使用8051單片機(jī)為核心設(shè)計(jì)一個(gè)數(shù)字時(shí)鐘,這個(gè)數(shù)字時(shí)鐘使用2個(gè)彈跳按鈕和8個(gè)共陰七段顯示器,其中2個(gè)彈跳按鈕用來(lái)設(shè)計(jì)時(shí)間,6個(gè)七段顯示器則用來(lái)顯示時(shí)間,該時(shí)鐘的記時(shí)范圍是00時(shí)00分00秒---23時(shí)59分

11、59秒,以下是該數(shù)字時(shí)鐘的基本功能: </p><p>  1.6個(gè)七段顯示器剛好用來(lái)顯示時(shí)和分和秒的部分。</p><p>  2.用戶可以設(shè)置數(shù)字時(shí)鐘的時(shí)間。設(shè)置時(shí)間時(shí)必須先單擊模式選擇按鈕,進(jìn)入調(diào)整時(shí)間模式,然后再單擊調(diào)整時(shí)間的彈跳按鈕輸入正確的時(shí)間。</p><p>  3.我們的數(shù)字時(shí)鐘只有2種模式,分別是顯示時(shí)間的模式和調(diào)整時(shí)間的模式,所以模式選擇按鈕只

12、能在這2種模式之間切換。</p><p>  4.單擊調(diào)整時(shí)間的彈跳按鈕時(shí),數(shù)字時(shí)鐘的分會(huì)一直往上增加,分增加到60就會(huì)進(jìn)位到時(shí),如果數(shù)字時(shí)鐘的進(jìn)位到23,分又增加到59,接下來(lái)就會(huì)回到00時(shí)00分。</p><p>  5.數(shù)字電子時(shí)鐘的另一個(gè)功能就是加入語(yǔ)音芯片ISD1420,開機(jī)復(fù)位時(shí),語(yǔ)音提示“歡迎使用”,當(dāng)按下按鈕調(diào)時(shí)時(shí),語(yǔ)音提示“請(qǐng)?jiān)O(shè)置時(shí)間”。</p><p

13、>  第3章 系統(tǒng)設(shè)計(jì)要求</p><p>  3.1 單片機(jī)選型</p><p>  本文數(shù)字時(shí)鐘設(shè)計(jì)原理主要利用AT89C51單片機(jī),由單片機(jī)的P0口控制數(shù)碼管的位顯示, P2口控制數(shù)碼管的段顯示,P1口與按鍵相接用于時(shí)間的校正。在設(shè)計(jì)中引入兩個(gè)電源電路,一個(gè)是外部電源系統(tǒng)產(chǎn)生+5V電壓,用于給CPU及顯示電路提供工作電壓,這是數(shù)字時(shí)鐘正常工作時(shí)的總電壓。另一個(gè)是備用電源,當(dāng)

14、外部電源關(guān)斷時(shí)由它提供工作電壓使CPU繼續(xù)工作,利用單片機(jī)的空閑方式降低功耗,數(shù)碼管不顯示但能使計(jì)時(shí)保持正常,不會(huì)造成掉電時(shí)計(jì)時(shí)清零的現(xiàn)象。</p><p>  整個(gè)系統(tǒng)工作時(shí),秒信號(hào)產(chǎn)生器是整個(gè)系統(tǒng)的時(shí)基信號(hào),它直接決定計(jì)時(shí)系統(tǒng)的精度,將標(biāo)準(zhǔn)秒信號(hào)送入“秒計(jì)數(shù)器”,“秒計(jì)數(shù)器”采用60進(jìn)制計(jì)數(shù)器,每累計(jì)60秒發(fā)出一個(gè)“分脈沖”信號(hào),該信號(hào)將作為“分計(jì)數(shù)器”的時(shí)鐘脈沖?!胺钟?jì)數(shù)器”也采用60進(jìn)制計(jì)數(shù)器,每累計(jì)60

15、分鐘,發(fā)出一個(gè)“時(shí)脈沖”信號(hào),該信號(hào)將被送到“時(shí)計(jì)數(shù)器”?!皶r(shí)計(jì)數(shù)器”采用24進(jìn)制計(jì)時(shí)器,可實(shí)現(xiàn)對(duì)一天24小時(shí)的累計(jì)。顯示電路將“時(shí)”、“分”、“秒”計(jì)數(shù)器的輸出,通過(guò)六個(gè)七段LED顯示器顯示出來(lái)。校時(shí)電路是直接加一個(gè)脈沖信號(hào)到時(shí)計(jì)數(shù)器或者分計(jì)數(shù)器或者秒計(jì)數(shù)器來(lái)對(duì)“時(shí)”、“分”、“秒”顯示數(shù)字進(jìn)行校對(duì)調(diào)整。</p><p>  AT89S52是一種低功耗、高性能CMOS8位微控制器,具有8K 在系統(tǒng)可編程Flas

16、h 存儲(chǔ)器。使用Atmel 公司高密度非易失性存儲(chǔ)器技術(shù)制造,與工業(yè)80C51 產(chǎn)品指令和引腳完全兼容。片上Flash允許程序存儲(chǔ)器在系統(tǒng)可編程,亦適于常規(guī)編程器。在單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使得AT89S52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、超有效的解決方案。AT89S52具有以下標(biāo)準(zhǔn)功能:8k字節(jié)Flash,256字節(jié)RAM,32 位I/O 口線,看門狗定時(shí)器,2 個(gè)數(shù)據(jù)指針,三個(gè)16 位定時(shí)器/

17、計(jì)數(shù)器,一個(gè)6向量2級(jí)中斷結(jié)構(gòu)</p><p>  ,全雙工串行口,及時(shí)鐘電路。另外,AT89S52 可降至0Hz 靜態(tài)邏輯操作,支持2種軟件可選擇節(jié)電模式??臻e模式下,CPU停止工作,允許RAM、定時(shí)器/計(jì)數(shù)器、串口、中斷繼續(xù)工作。掉電保護(hù)方式下,RAM內(nèi)容被保存,振蕩器被凍結(jié),單片機(jī)一切工作停止,直到下一個(gè)中斷或硬件復(fù)位為止。</p><p>  3.2 顯示部分要求</p&g

18、t;<p>  單片機(jī)應(yīng)用系統(tǒng)中使用的顯示器主要有發(fā)光二極管顯示器,簡(jiǎn)稱LED(Light Emitting Diode);液晶顯示器LCD(Liquid Crystal Display);近幾年也有配置CRT顯示器的。而目前在單片機(jī)系統(tǒng)中,通常用LED數(shù)碼顯示器來(lái)顯示各種數(shù)字或符號(hào)。由于它具有顯示清晰、亮度高、使用電壓低、壽命長(zhǎng)的特點(diǎn),因此使用非常廣泛。</p><p>  單片機(jī)中通常用七段

19、LED構(gòu)成字型“8”,另外,還有一個(gè)小數(shù)點(diǎn)發(fā)光二極管以顯示小數(shù)位!這種顯示器有共陰和共陽(yáng)兩種!發(fā)光二極管的陽(yáng)極連在一起的(公共端)稱為共陽(yáng)極顯示器,陰極連在一起的稱為共陰極顯示器。一位顯示器由8個(gè)發(fā)光二極管組成,其中,7個(gè)發(fā)光二極管構(gòu)成字型“8”的各個(gè)筆劃(段) a_g,另一個(gè)小數(shù)點(diǎn)為dp發(fā)光二極管。當(dāng)某段發(fā)光二極管上施加一定的正向電壓時(shí),該段筆畫即亮;不加電壓則暗。為保護(hù)各段LED不被損壞,需外加限流電阻。</p>&l

20、t;p>  LED數(shù)碼管中各段發(fā)光二極管的伏安特性和普通二極管類似,只是正向壓降較大,正向電阻也較大。在一定范圍內(nèi),其正向電流與發(fā)光亮度成正比。由于常規(guī)的數(shù)碼管起輝電流只有1—2mA,最大極限電流也只有10—30mA(靜態(tài)總電流80mA(每段10mA);動(dòng)態(tài)均電流4—5mA,峰值電流100mA),所以它的輸入端電源或高于TTL高電平(3.5V)的電路信號(hào)相接時(shí),一定要串加限流電阻以免損壞器件。這里采用的是共陰極連接。</p&

21、gt;<p>  LED顯示器有靜態(tài)顯示方式和動(dòng)態(tài)顯示方式兩種。靜態(tài)顯示就是當(dāng)顯示器顯示某個(gè)字符時(shí),相應(yīng)的段恒定的導(dǎo)通或截止,直到顯示另一個(gè)字符為止。LED顯示器工作于靜態(tài)顯示方式時(shí),各位的共陰極接地;若為共陽(yáng)極則接+5V電源。每位的段選線分別與一個(gè)8位鎖存器的輸出口相連,顯示器中的各位相互獨(dú)立,而且各位的顯示字符一經(jīng)確定,相應(yīng)鎖存的輸出將維持不變。正因?yàn)槿绱?,靜態(tài)顯示器的亮度較高。這種顯示方式編程容易,管理也較簡(jiǎn)單,但占

22、用I/O口線資源較多。因此,在顯示位數(shù)較多的情況下,一般都采用動(dòng)態(tài)顯示方式。</p><p>  由于所有6位段皆由一個(gè)I/O口控制,因此,在每一瞬間,6位LED會(huì)顯示相 同的字符。要想每位顯示不同的字符,就必須采用掃描方法流點(diǎn)亮各位LED,即在每一瞬間只使某一位顯示字符。在此瞬間,段選控制I/O口輸出相應(yīng)字符段選碼(字型碼),而位選則控制I/O口在該顯示位送入選通電平(因?yàn)長(zhǎng)ED為共陰,故應(yīng)送低電平),以保證該

23、位顯示相應(yīng)字符。如此輪流,使每位分時(shí)顯示該位應(yīng)顯示字符。</p><p>  3.3 鍵盤工作模塊</p><p>  按鍵按照結(jié)構(gòu)原理可分為兩類,一類是觸點(diǎn)式開關(guān)按鍵,如機(jī)械式開關(guān)、導(dǎo)電橡膠式開關(guān)等;另一類是無(wú)觸點(diǎn)式開關(guān)按鍵,如電氣式按鍵,磁感應(yīng)按鍵等。前者造價(jià)低,后者壽命長(zhǎng)。目前,微機(jī)系統(tǒng)中最常見的是觸點(diǎn)式開關(guān)按鍵。 </p><p>  按鍵按照接口原理可分

24、為編碼鍵盤與非編碼鍵盤兩類,這兩類鍵盤的主要區(qū)別是識(shí)別鍵符及給出相應(yīng)鍵碼的方法。編碼鍵盤主要是用硬件來(lái)實(shí)現(xiàn)對(duì)鍵的識(shí)別,非編碼鍵盤主要是由軟件來(lái)實(shí)現(xiàn)鍵盤的定義與識(shí)別。</p><p>  全編碼鍵盤能夠由硬件邏輯自動(dòng)提供與鍵對(duì)應(yīng)的編碼,此外,一般還具有去抖動(dòng)和多鍵、竄鍵保護(hù)電路。這種鍵盤使用方便,但需要較多的硬件,價(jià)格較貴,一般的單片機(jī)應(yīng)用系統(tǒng)較少采用。非編碼鍵盤只簡(jiǎn)單地提供行和列的矩陣,其它工作均由軟件完成。由于

25、其經(jīng)濟(jì)實(shí)用,較多地應(yīng)用于單片機(jī)系統(tǒng)中。在本套設(shè)計(jì)中由于只需要幾個(gè)功能鍵,此時(shí),可采用獨(dú)立式按鍵結(jié)構(gòu)。獨(dú)立式按鍵是直接用I/O口線構(gòu)成的單個(gè)按鍵電路,其特點(diǎn)是每個(gè)按鍵單獨(dú)占用一根I/O口線,每個(gè)按鍵的工作不會(huì)影響其它I/O口線的狀態(tài)。</p><p>  第4章 數(shù)字電子鐘軟件設(shè)計(jì)</p><p>  4.1 主程序流程圖</p><p>  圖4.1 子程序流程

26、圖</p><p>  4.2 中斷服務(wù)子程序流程圖</p><p>  圖4.2 中斷服務(wù)流程圖</p><p>  4.3 顯示部分設(shè)計(jì)</p><p>  LED數(shù)碼管根據(jù)LED的接法不同分為共陰和共陽(yáng)兩類,了解LED的這些特性,對(duì)編程是很重要的,因?yàn)椴煌愋偷臄?shù)碼管,除了它們的硬件電路有差異外,編程方法也是不同的。圖1是共陰和共陽(yáng)極

27、數(shù)碼管的內(nèi)部電路,它們的發(fā)光原理是一樣的,只是它們的電源極性不同而已。</p><p>  圖4.3 數(shù)碼管內(nèi)部結(jié)構(gòu)圖</p><p>  本課題用的是共陽(yáng)極數(shù)碼管。共陽(yáng)極碼0xc0,0xf9,0xa4,0xb0, 0x99,0x92,0x82,0xf8,0x80,0x90(0,1,2,3,4,5,6,7,8,9)數(shù)碼管是用共陽(yáng)極的,數(shù)碼管的一個(gè)公共端接的是P2口的一個(gè)引腳,并且從P2口

28、輸出的是高電平來(lái)選通數(shù)碼管,P0口就輸出低電平讓數(shù)碼管數(shù)顯示出需要的時(shí)間計(jì)數(shù)。時(shí)鐘顯示通過(guò)單片機(jī)的P0口與數(shù)碼管連接起來(lái)顯示實(shí)時(shí)時(shí)鐘,通過(guò)編程寫入數(shù)據(jù)從P0口輸出,開始兩位顯示小時(shí),中間兩位顯示分,最后兩位顯示秒。</p><p>  4.4 數(shù)字電子鐘原理圖</p><p>  圖4.4 數(shù)字時(shí)鐘原理圖</p><p>  4.5 數(shù)字電子鐘源程序</p

29、><p>  關(guān)于數(shù)字電子鐘源程序清單請(qǐng)參考本文附錄部分。</p><p>  第5章 實(shí)驗(yàn)裝調(diào)及過(guò)程</p><p><b>  5.1 硬件調(diào)試</b></p><p>  用萬(wàn)用表對(duì)元器件進(jìn)行測(cè)試,確定元器件完好。然后測(cè)試面包板,確定面包板的導(dǎo)通狀態(tài)(橫向?qū)ㄟ€是縱向?qū)ǎ?,然后按照所設(shè)計(jì)的電路圖進(jìn)行布線,要求連線

30、盡量整齊、簡(jiǎn)明。連線時(shí)應(yīng)特別注意電解電容的正負(fù)極連接連接問(wèn)題,這問(wèn)題特別重要,它也是我們?nèi)菀壮鲥e(cuò)的地方。</p><p>  電路調(diào)試:調(diào)試時(shí)先斷開各部分連接,一步一步測(cè)量輸出是否與理論值相近??梢苑忠韵聨讉€(gè)步驟:</p><p>  1.檢查電路是否連接正確。</p><p>  2.接通電源,用萬(wàn)用表的正負(fù)電源線之間的電壓是否為+5V。</p>&

31、lt;p><b>  遇到的問(wèn)題:</b></p><p>  1.在檢測(cè)面包板狀況的過(guò)程中,出現(xiàn)本該相通的地方卻未通的狀況,后經(jīng)檢驗(yàn)發(fā)現(xiàn)是由于萬(wàn)用表筆尖未與面包板內(nèi)部垂直接觸所至。</p><p>  2.檢查時(shí)發(fā)現(xiàn)輸出直流電壓的值很小,結(jié)果發(fā)現(xiàn)地線未接通。</p><p>  主要檢查了電路板有無(wú)虛焊、短路、連線是否正常,尤其是單片機(jī)

32、的各使能端的接線,I/O接口連線是否有誤。由于我們采用了六個(gè)數(shù)碼管并聯(lián)接入P2口的段選端,因此接線較多,經(jīng)常容易出現(xiàn)管腳間短路現(xiàn)象。這是硬件設(shè)計(jì)不足之處,今后將注意元件的選配使設(shè)計(jì)更簡(jiǎn)潔實(shí)用。 </p><p>  5.2 軟件部分調(diào)試</p><p>  在仿真軟件上,對(duì)定時(shí)中斷程序、顯示子程序、按鍵中斷子程序進(jìn)行了分段調(diào)試,結(jié)果功能正常。</p><p>  

33、5.3 時(shí)鐘計(jì)時(shí)檢測(cè)</p><p>  通過(guò)與其它計(jì)時(shí)器對(duì)比觀察發(fā)現(xiàn)數(shù)字時(shí)鐘走時(shí)過(guò)快,檢查定時(shí)中斷程序發(fā)現(xiàn)T0的初始值設(shè)定有誤,因此重新設(shè)置:在連接五進(jìn)制的過(guò)程中,發(fā)現(xiàn)電路只能4,5的跳動(dòng),后經(jīng)發(fā)現(xiàn)是由于接到與非門的引腳接錯(cuò)一根所至,經(jīng)糾正正常顯示。</p><p><b>  致 謝</b></p><p>  在論文完成之際,我要

34、特別感謝我的指導(dǎo)老師XX老師的熱情關(guān)懷和悉心指導(dǎo)。在我撰寫論文的過(guò)程中,何老師傾注了大量的心血和汗水,無(wú)論是在論文的選題、構(gòu)思和資料的收集方面,還是在論文的研究方法以及成文定稿方面,我都得到了XX老師悉心細(xì)致的教誨和無(wú)私的幫助,特別是他廣博的學(xué)識(shí)、深厚的學(xué)術(shù)素養(yǎng)、嚴(yán)謹(jǐn)?shù)闹螌W(xué)精神和一絲不茍的工作作風(fēng)使我終生受益,在此表示真誠(chéng)地感謝和深深的謝意。</p><p>  在論文的寫作過(guò)程中,也得到了許多同學(xué)的寶貴建議,,

35、在此一并致以誠(chéng)摯的謝意。感謝所有關(guān)心、支持、幫助過(guò)我的良師益友。最后,向在百忙中抽出時(shí)間對(duì)本文進(jìn)行評(píng)審并提出寶貴意見的各位專家表示衷心地感謝!</p><p><b>  參考文獻(xiàn)</b></p><p>  [1] 江志紅《51單片機(jī)技術(shù)與應(yīng)用系統(tǒng)開發(fā)案例精選》2008年12月版 清華大學(xué)出版社</p><p>  [2] 祁 偉《單片機(jī)C

36、51程序設(shè)計(jì)教程與實(shí)驗(yàn)》2007年8月第2次 北京航空航天大學(xué)出版社</p><p>  [3] 何永艷《單片機(jī)應(yīng)用及控制技術(shù)》2008年8月 第一版 化學(xué)工業(yè)出版社</p><p><b>  附錄一:</b></p><p><b>  實(shí)時(shí)時(shí)鐘芯片源程序</b></p><p>  #ifn

37、def _REAL_TIMER_DS1302_2003_7_21_</p><p>  #define _REAL_TIMER_DS1302_2003_7_21_</p><p>  #include <at89x51.h></p><p>  sbit DS1302_CLK = P3^6; //實(shí)時(shí)時(shí)鐘時(shí)鐘線引腳 <

38、/p><p>  sbit DS1302_IO = P3^7; //實(shí)時(shí)時(shí)鐘數(shù)據(jù)線引腳 </p><p>  sbit DS1302_RST = P3^5; //實(shí)時(shí)時(shí)鐘復(fù)位線引腳</p><p>  sbit ACC0 = ACC^0;</p><p>  sbit ACC7 =

39、 ACC^7;</p><p>  typedef struct __SYSTEMTIME__</p><p><b>  {</b></p><p>  unsigned char Second;</p><p>  unsigned char Minute;</p><p>  unsigne

40、d char Hour;</p><p>  unsigned char Week;</p><p>  unsigned char Day;</p><p>  unsigned char Month;</p><p>  unsigned char Year;</p><p>  unsigned char Dat

41、eString[9];</p><p>  unsigned char TimeString[9];</p><p>  }SYSTEMTIME;//定義的時(shí)間類型</p><p>  #define AM(X)X</p><p>  #define PM(X)(X+12) // 轉(zhuǎn)成24小時(shí)制<

42、/p><p>  #define DS1302_SECOND0x80 //秒寄存器 </p><p>  #define DS1302_MINUTE0x82 //分寄存器</p><p>  #define DS1302_HOUR0x84 </p><p>  #define DS1302

43、_WEEK0x8A </p><p>  #define DS1302_DAY0x86</p><p>  #define DS1302_MONTH0x88</p><p>  #define DS1302_YEAR0x8C</p><p>  #define DS1302_RAM(X)(0xC0+(X)*2)

44、 //用于計(jì)算 DS1302_RAM 地址的宏 </p><p>  void DS1302InputByte(unsigned char d) //實(shí)時(shí)時(shí)鐘寫入一字節(jié)(內(nèi)部函數(shù))</p><p><b>  { </b></p><p>  unsigned char i;</p><p><b>  

45、ACC = d;</b></p><p>  for(i=8; i>0; i--)</p><p><b>  {</b></p><p>  DS1302_IO = ACC0; //相當(dāng)于匯編中的 RRC</p><p>  DS1302_CLK = 1;</p>

46、;<p>  DS1302_CLK = 0; //發(fā)一個(gè)高跳變到低的脈沖</p><p>  ACC = ACC >> 1; </p><p><b>  } </b></p><p><b>  }</b></p><p>  unsi

47、gned char DS1302OutputByte(void) //實(shí)時(shí)時(shí)鐘讀取一字節(jié)(內(nèi)部函數(shù))</p><p><b>  { </b></p><p>  unsigned char i;</p><p>  for(i=8; i>0; i--)</p><p><b>  {</b&g

48、t;</p><p>  ACC = ACC >>1; //相當(dāng)于匯編中的 RRC </p><p>  ACC7 = DS1302_IO;</p><p>  DS1302_CLK = 1;</p><p>  DS1302_CLK = 0; //發(fā)一個(gè)高跳變到低的脈

49、沖</p><p><b>  } </b></p><p>  return(ACC); </p><p><b>  }</b></p><p>  void Write1302(unsigned char ucAddr, unsigned char ucDa)//ucAddr: DS1302

50、地址, ucData: 要寫的數(shù)據(jù)</p><p><b>  {</b></p><p>  DS1302_RST = 0;</p><p>  DS1302_CLK = 0;</p><p>  DS1302_RST = 1; </p><p>  DS1302InputByte(ucAddr

51、); // 地址,命令 </p><p>  DS1302InputByte(ucDa); // 寫1Byte數(shù)據(jù)</p><p>  DS1302_CLK = 1;</p><p>  DS1302_RST = 0; //RST 0->1->0,CLK 0->1&

52、lt;/p><p><b>  } </b></p><p>  unsigned char Read1302(unsigned char ucAddr)//讀取DS1302某地址的數(shù)據(jù)</p><p><b>  {</b></p><p>  unsigned char ucData;</p

53、><p>  DS1302_RST = 0;</p><p>  DS1302_CLK = 0;</p><p>  DS1302_RST = 1; //enable</p><p>  DS1302InputByte(ucAddr|0x01); // 地址,命令 </p><p

54、>  ucData = DS1302OutputByte(); // 讀1Byte數(shù)據(jù)</p><p>  DS1302_CLK = 1; //RST 0->1->0,CLK 0->1</p><p>  DS1302_RST = 0; </p><

55、;p>  return(ucData);</p><p><b>  }</b></p><p>  void DS1302_SetProtect(bit flag) //是否寫保護(hù)</p><p><b>  {</b></p><p><b>  if(flag

56、)</b></p><p>  Write1302(0x8E,0x10); //WP=1,不能寫入</p><p><b>  else</b></p><p>  Write1302(0x8E,0x00);//WP=0,可以寫入 </p><p><b>  }</b>

57、</p><p>  void DS1302_SetTime(unsigned char Address, unsigned char Value)// 設(shè)置時(shí)間函數(shù)</p><p><b>  {</b></p><p>  DS1302_SetProtect(0);</p><p>  Write1302(Addre

58、ss, ((Value/10)<<4 | (Value%10))); //高4位為十位,低4位為個(gè)位</p><p><b>  }</b></p><p>  void DS1302_GetTime(SYSTEMTIME *Time)</p><p><b>  {</b></p><p&

59、gt;  unsigned char ReadValue;</p><p>  ReadValue = Read1302(DS1302_SECOND);</p><p>  Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);//轉(zhuǎn)換成10進(jìn)制的秒</p><p> 

60、 ReadValue = Read1302(DS1302_MINUTE);</p><p>  Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><p>  ReadValue = Read1302(DS1302_HOUR);</p><p>  Time

61、->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><p>  ReadValue = Read1302(DS1302_DAY);</p><p>  Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F

62、);</p><p>  ReadValue = Read1302(DS1302_WEEK);</p><p>  Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><p>  ReadValue = Read1302(DS1302_MONTH);</

63、p><p>  Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><p>  ReadValue = Read1302(DS1302_YEAR);</p><p>  Time->Year = ((ReadValue&0x70)>>4)

64、*10 + (ReadValue&0x0F);</p><p><b>  }</b></p><p>  void DateToStr(SYSTEMTIME *Time)</p><p><b>  {</b></p><p>  Time->DateString[0] = Tim

65、e->Year/10 + '0'; //數(shù)字類型轉(zhuǎn)化為字符類型</p><p>  Time->DateString[1] = Time->Year%10 + '0';</p><p>  Time->DateString[2] = '-';</p><p>  Time->DateStr

66、ing[3] = Time->Month/10 + '0';</p><p>  Time->DateString[4] = Time->Month%10 + '0';</p><p>  Time->DateString[5] = '-';</p><p>  Time->DateStr

67、ing[6] = Time->Day/10 + '0';</p><p>  Time->DateString[7] = Time->Day%10 + '0';</p><p>  Time->DateString[8] = '\0';</p><p><b>  }</b>

68、;</p><p>  void TimeToStr(SYSTEMTIME *Time)</p><p><b>  {</b></p><p>  Time->TimeString[0] = Time->Hour/10 + '0'; //數(shù)字類型轉(zhuǎn)化為字符類型</p><p>  Time-

69、>TimeString[1] = Time->Hour%10 + '0';</p><p>  Time->TimeString[2] = ':';</p><p>  Time->TimeString[3] = Time->Minute/10 + '0';</p><p>  Time-

70、>TimeString[4] = Time->Minute%10 + '0';</p><p>  Time->TimeString[5] = ':';</p><p>  Time->TimeString[6] = Time->Second/10 + '0';</p><p>  Tim

71、e->TimeString[7] = Time->Second%10 + '0';</p><p>  Time->DateString[8] = '\0';</p><p><b>  }</b></p><p>  void Initial_DS1302(void)</p>&

72、lt;p><b>  {</b></p><p>  unsigned char Second=Read1302(DS1302_SECOND);</p><p>  if(Second&0x80) //如果第七為1(表明沒(méi)有啟動(dòng)), 則啟動(dòng)時(shí)鐘 </p><p>  DS1302_SetTime(DS1302_SECO

73、ND,0);</p><p><b>  }</b></p><p><b>  附錄二:</b></p><p>  單片機(jī)數(shù)字電子鐘源程序</p><p>  #include <at89x51.h></p><p>  #include <DS1302

74、.h></p><p>  //定義共陽(yáng)極字型碼0 1 2 3 4 5 6 7 8 9 -</p><p>  Unsigned charcodedispcode[]={0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90,0xbf};</p><p>  unsigned

75、 char buf[]={0,0,0,0,0,0,0,0};</p><p>  SYSTEMTIME time; //在ds1302.h文件中已經(jīng)定義了一個(gè)名字為SYSTEMTIME的結(jié)構(gòu)體,在這里我們定義一個(gè)變量名</p><p>  //為time的SYSTEMTIME結(jié)構(gòu)體 </p><p>  void delay(unsigned c

76、har i) //延時(shí)子程序 </p><p><b>  {</b></p><p>  unsigned char j;</p><p>  while((i--)!=0)</p><p><b>  {</b></p><p>  for(j=123;j>

77、;0;j--);</p><p><b>  }</b></p><p><b>  }</b></p><p>  button(n,x,y) //時(shí)鐘調(diào)整子程序</p><p>  unsigned char n,x,y;</p><p><b>

78、  {</b></p><p>  if(P1_1==0)</p><p><b>  {</b></p><p>  delay(50);</p><p>  if(P1_1==0)</p><p><b>  {</b></p><p>

79、;<b>  n++;</b></p><p><b>  if(n==x)</b></p><p><b>  n=0;</b></p><p>  while(P1_1==0);</p><p><b>  }</b></p><p

80、><b>  }</b></p><p>  if(P1_2==0)</p><p><b>  {</b></p><p>  delay(50);</p><p>  if(P1_2==0)</p><p><b>  {</b></p&

81、gt;<p><b>  if(n==0)</b></p><p><b>  n=y;</b></p><p><b>  else</b></p><p>  n--;</p><p>  while(P1_2==0);</p>&l

82、t;p><b>  }</b></p><p><b>  }</b></p><p><b>  return n;</b></p><p><b>  }</b></p><p>  void display(second10,second1,m

83、inute10,minute1,hour10,hour1)//顯示子程序</p><p>  unsigned char second10,second1,minute10,minute1,hour10,hour1; </p><p><b>  {</b></p><p><b>  P2=0x01;</b><

84、/p><p>  P0=dispcode[second10];//顯示秒的十位</p><p><b>  delay(3);</b></p><p><b>  P2=0x02;</b></p><p>  P0=dispcode[second1];//顯示秒的個(gè)位</p><p

85、><b>  delay(3);</b></p><p><b>  P2=0x04;</b></p><p>  P0=dispcode[10];//顯示"-"</p><p><b>  delay(3);</b></p><p><b&

86、gt;  P2=0x08;</b></p><p>  P0=dispcode[minute10];//顯示分的十位</p><p><b>  delay(3);</b></p><p><b>  P2=0x10;</b></p><p>  P0=dispcode[minute1]

87、;//顯示分的個(gè)位</p><p><b>  delay(3);</b></p><p><b>  P2=0x20;</b></p><p>  P0=dispcode[10];//顯示"-"</p><p><b>  delay(3);</b>

88、</p><p><b>  P2=0x40;</b></p><p>  P0=dispcode[hour10];//顯示時(shí)的十位</p><p><b>  delay(3);</b></p><p><b>  P2=0x80;</b></p><p

89、>  P0=dispcode[hour1];//顯示時(shí)的個(gè)位</p><p><b>  delay(3);</b></p><p><b>  }</b></p><p>  void main()</p><p><b>  { </b></p>&

90、lt;p>  unsigned char flag;</p><p>  Initial_DS1302();//初始化DS1302這個(gè)時(shí)鐘芯片, </p><p>  while(1)//無(wú)限地循環(huán)</p><p><b>  {</b></p><p>  DS1302_GetTime(

91、&time); //讀取時(shí)間參數(shù) </p><p>  buf[5]=(time.Second)%10;//把秒的個(gè)位數(shù)據(jù)存入buf[5]</p><p>  buf[4]=(time.Second)/10;//把秒的十位數(shù)據(jù)存入buf[4]</p><p>  buf[3]=(time.Minute)%10;//把分

92、的個(gè)位數(shù)據(jù)存入buf[3]</p><p>  buf[2]=(time.Minute)/10;//把分的十位數(shù)據(jù)存入buf[2]</p><p>  buf[1]=(time.Hour)%10; //把時(shí)的個(gè)位數(shù)據(jù)存入buf[1]</p><p>  buf[0]=(time.Hour)/10;//把時(shí)的十位數(shù)據(jù)存入buf[0]</p>

93、<p>  if(P1_0==0)</p><p><b>  {</b></p><p>  delay(50);</p><p>  if(P1_0==0)</p><p><b>  {</b></p><p><b>  flag=0;</

94、b></p><p><b>  }</b></p><p>  while(P1_0==0);</p><p><b>  }</b></p><p>  if(P1_3==0)</p><p><b>  {</b></p>&l

95、t;p>  delay(50);</p><p>  if(P1_3==0)</p><p><b>  {</b></p><p><b>  flag++;</b></p><p>  if(flag>3)</p><p><b>  {</b

96、></p><p><b>  flag=1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  while(P1_3==0);</p><p><b>  }</b>

97、</p><p>  switch(flag)</p><p><b>  {</b></p><p>  case 0:display(buf[0],buf[1],buf[2],buf[3],buf[4],buf[5]);//調(diào)用子函數(shù)display,把存入數(shù)組buf的數(shù)據(jù)給顯示出來(lái)</p><p><b&g

98、t;  break;</b></p><p>  case 1:time.Hour=button(time.Hour,24,23);</p><p>  DS1302_SetTime(0x84,time.Hour);</p><p>  display(buf[0],buf[1],10,10,10,10);</p><p><

99、;b>  break;</b></p><p>  case 2:time.Minute=button(time.Minute,60,59);</p><p>  DS1302_SetTime(0x82,time.Minute);</p><p>  display(10,10,buf[2],buf[3],10,10);</p>&l

100、t;p><b>  break;</b></p><p>  case 3:time.Second=button(time.Second,60,59);</p><p>  DS1302_SetTime(0x80,time.Second);</p><p>  display(10,10,10,10,buf[4],buf[5]);<

溫馨提示

  • 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ù)僅提供信息存儲(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)論