基于51單片機(jī)和時(shí)鐘芯片DS1302的數(shù)字時(shí)鐘設(shè)計(jì)說(shuō)明_第1頁(yè)
基于51單片機(jī)和時(shí)鐘芯片DS1302的數(shù)字時(shí)鐘設(shè)計(jì)說(shuō)明_第2頁(yè)
基于51單片機(jī)和時(shí)鐘芯片DS1302的數(shù)字時(shí)鐘設(shè)計(jì)說(shuō)明_第3頁(yè)
基于51單片機(jī)和時(shí)鐘芯片DS1302的數(shù)字時(shí)鐘設(shè)計(jì)說(shuō)明_第4頁(yè)
基于51單片機(jī)和時(shí)鐘芯片DS1302的數(shù)字時(shí)鐘設(shè)計(jì)說(shuō)明_第5頁(yè)
已閱讀5頁(yè),還剩23頁(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、. . . . 單片機(jī)原理與應(yīng)用課程設(shè)計(jì)報(bào)告題目: 基于單片機(jī)的數(shù)字時(shí)鐘設(shè)計(jì) 學(xué)年: 2013 學(xué)期:專業(yè): 電氣工程與其自動(dòng)化 班級(jí): 電氣106 : 鵬飛 學(xué)號(hào): 2010013973 指導(dǎo)教師: 子含 目錄一、引言-11.1編寫(xiě)目的-11.2背景-11.3參考資料-1二、總體設(shè)計(jì)-32.1設(shè)計(jì)與運(yùn)行環(huán)境-32.2硬件功能描述-3三、數(shù)字鐘軟件和硬件設(shè)計(jì)-3 3.1 硬件電路設(shè)計(jì)-33.1.1電源-33.1.2獨(dú)立按鍵模塊-33.1.3顯示模塊-43.1.4復(fù)位電路模塊-43.1.5時(shí)鐘芯片模塊-53.1.6主控模塊-53.1.7鬧鈴模塊-63.2軟件設(shè)計(jì)-63.2.1程序設(shè)計(jì)流程圖-63

2、.2.2 源程序-8四、數(shù)字鐘制作過(guò)程中遇到的問(wèn)題-19五、總結(jié)-20附錄:DS1302時(shí)鐘芯片的工作原理和使用方法-22附錄:如何利用軟件減小的計(jì)時(shí)誤差-25一、引言1.1編寫(xiě)目的為了進(jìn)一步熟悉51單片機(jī)的編程以與學(xué)習(xí)數(shù)字鐘的相關(guān)設(shè)計(jì)方法,在老師的指導(dǎo)下我們進(jìn)行了本次數(shù)字鐘的設(shè)計(jì)。 基于51單片機(jī)STC89C52單片機(jī)和時(shí)鐘芯片DS1302設(shè)計(jì)并實(shí)現(xiàn)了數(shù)字時(shí)鐘。在PCB板制作完成并且調(diào)試成功之際,為了進(jìn)一步提高自己和動(dòng)手能力和編程能力,對(duì)這次數(shù)字鐘的設(shè)計(jì)和制作的過(guò)程中遇到的問(wèn)題與設(shè)計(jì)思路做一總結(jié)。1.2背景隨著人們生活水平的提高和生活節(jié)奏的加快,對(duì)時(shí)間的要求越來(lái)越高,精準(zhǔn)數(shù)字計(jì)時(shí)的消費(fèi)需求也

3、是越來(lái)越多。二十一世紀(jì)的今天,最具代表性的計(jì)時(shí)產(chǎn)品就是電子萬(wàn)年歷,它是近代世界鐘表業(yè)界的第三次革命。第一次是擺和擺輪游絲的發(fā)明,相對(duì)穩(wěn)定的機(jī)械振蕩頻率源使鐘表的走時(shí)差從分級(jí)縮小到秒級(jí),代表性的產(chǎn)品就是帶有擺或擺輪游絲的機(jī)械鐘或表。第二次革命是石英晶體振蕩器的應(yīng)用,發(fā)明了走時(shí)精度更高的石英電子鐘表,使鐘表的走時(shí)月差從分級(jí)縮小到秒級(jí)。第三次革命就是單片機(jī)數(shù)碼計(jì)時(shí)技術(shù)的應(yīng)用(電子萬(wàn)年歷),使計(jì)時(shí)產(chǎn)品的走時(shí)日差從分級(jí)縮小到1/600萬(wàn)秒,從原有傳統(tǒng)指針計(jì)時(shí)的方式發(fā)展為人們?nèi)粘8鼮槭煜さ囊构鈹?shù)字顯示方式,直觀明了,并增加了全自動(dòng)日期、星期、溫度以與其他日常附屬信息的顯示功能,它更符合消費(fèi)者的生活需求!因

4、此,電子萬(wàn)年歷的出現(xiàn)帶來(lái)了鐘表計(jì)時(shí)業(yè)界跨躍性的進(jìn)步我國(guó)生產(chǎn)的電子萬(wàn)年歷有很多種,總體上來(lái)說(shuō)以研究多功能電子萬(wàn)年歷為主,使萬(wàn)年歷除了原有的顯示時(shí)間,日期等基本功能外,還具有鬧鈴,報(bào)警等功能。商家生產(chǎn)的電子萬(wàn)年歷更從質(zhì)量,價(jià)格,實(shí)用上考慮,不斷的改進(jìn)電子萬(wàn)年歷的設(shè)計(jì),使其更加的具有市場(chǎng)。除了采用集成化的時(shí)鐘芯片外,還有采用MCU的方案,利用STC89系列單片微機(jī)制成萬(wàn)年歷電路,采用軟件和硬件結(jié)合的方法,控制LED數(shù)碼管輸出,分別用來(lái)顯示年、月、日、時(shí)、分、秒,其最大特點(diǎn)是:硬件電路簡(jiǎn)單,安裝方便易于實(shí)現(xiàn),軟件設(shè)計(jì)獨(dú)特,可靠。 在21世紀(jì)的今天,單片機(jī)仍然有著它不可替代的地位和獨(dú)特的作用在學(xué)完單片機(jī)

5、后,為了進(jìn)一步學(xué)習(xí)51單片機(jī)的控制和編程,我們利用51單片機(jī)自己設(shè)計(jì)并制作數(shù)字鐘。1.3參考資料18051系列單片機(jī)C程序設(shè)計(jì)完全手冊(cè) 科技 編著 人民郵電 2006251單片機(jī)應(yīng)用從零開(kāi)始 欣 編著 清華大學(xué) 20083單片機(jī)原理與接口技術(shù)(第三版) 朝青 編著 航空航天大學(xué) 2008451單片機(jī)C語(yǔ)言教程 郭天祥 編著 電子工業(yè) 2009二、總體設(shè)計(jì) 此數(shù)字鐘利用單片機(jī)STC89C52和時(shí)鐘芯片DS1302設(shè)計(jì)完成。2.1設(shè)計(jì)與運(yùn)行環(huán)境數(shù)字鐘的程序設(shè)計(jì)和調(diào)試均在Keil uVision2環(huán)境下完成的。設(shè)計(jì)并完成的程序下載至STC89C52單片機(jī)后,即可初始化時(shí)鐘芯片DS1302從而開(kāi)始計(jì)時(shí)

6、,系統(tǒng)開(kāi)始正常運(yùn)行。2.2硬件功能描述數(shù)字鐘能夠完成24小時(shí)制計(jì)時(shí),計(jì)時(shí)初始化值為00:00:00,用戶可以通過(guò)按鍵調(diào)整時(shí)鐘的初值實(shí)現(xiàn)校時(shí)功能,并且可以通過(guò)按鍵設(shè)定一個(gè)24小時(shí)以任意時(shí)刻的鬧鈴,用戶可以手動(dòng)選擇鬧鈴的開(kāi)或者關(guān)兩種狀態(tài)。三、數(shù)字鐘軟件和硬件設(shè)計(jì) 3.1 硬件電路設(shè)計(jì)數(shù)字鐘的電路主要有電源模塊、顯示模塊、按鍵模塊、復(fù)位電路模塊、時(shí)鐘芯片模塊、主控芯片STC89C52模塊和鬧鈴模塊等7大模塊組成。3.1.1電源電源模塊采用7805進(jìn)行穩(wěn)壓,保證+5V電壓的穩(wěn)定輸出,進(jìn)一步提高系統(tǒng)的抗干擾能力和穩(wěn)定性。3.1.2獨(dú)立按鍵模塊 系統(tǒng)有三個(gè)獨(dú)立按鍵,獨(dú)立按鍵S1、S2、S3分別接至單片機(jī)P

7、3.2、P3.3、P3.4口。S1用來(lái)功能選擇,其功能可以用按鍵次數(shù)N來(lái)表示:N=1:校準(zhǔn)計(jì)時(shí)的小時(shí)位 N=2:校準(zhǔn)計(jì)時(shí)的分鐘位N=3:校準(zhǔn)鬧鈴的小時(shí)位 N=1:校準(zhǔn)鬧鈴的分鐘位 N=5:退出 S2主要功能用來(lái)進(jìn)行加一操作。在有功能選擇的情況下,無(wú)論選中那一種功能操作,按下S2即進(jìn)行一次加一操作,在沒(méi)有功能選擇的情況下,系統(tǒng)不響應(yīng)此按鍵的任何操作。 S3用來(lái)控制鬧鈴的開(kāi)或者關(guān),在任意時(shí)間只要按下此鍵即可打開(kāi)(或關(guān)閉)鬧鈴,在按鍵一次就可以關(guān)閉(或打開(kāi))鬧鈴。3.1.3顯示模塊 一個(gè)良好的顯示模塊對(duì)一個(gè)系統(tǒng)非常重要,所有操作結(jié)果和計(jì)時(shí)結(jié)果,都要通過(guò)顯示模塊來(lái)顯示出來(lái)。同時(shí)顯示模塊提供了良好的人機(jī)

8、交互平臺(tái)。常用的顯示模式有LED 7段數(shù)碼管顯示、點(diǎn)陣顯示和液晶顯示。液晶顯示屏(LCD)具有輕薄短小、低耗電量、無(wú)輻射危險(xiǎn),平面直角顯示以與影象穩(wěn)定不閃爍等優(yōu)勢(shì),可視面積大,畫(huà)面效果好,分辨率高,抗干擾能力強(qiáng)等特點(diǎn)。但由于液晶其成本也偏高。在使用時(shí),不能有靜電干擾,否則易燒壞液晶的顯示芯片。鑒于LED 7段數(shù)碼管成本低,也比較容易實(shí)現(xiàn)的特點(diǎn),最終確定使用共陰極數(shù)碼管來(lái)顯示。 本系統(tǒng)顯示模塊電路由一塊74HC573、一塊74HC138芯片和兩個(gè)四位一體7段數(shù)碼管組成。74HC573用來(lái)驅(qū)動(dòng)數(shù)碼管,74HC573的Q0Q7分別接四位一體數(shù)碼管的Adp。74HC138控制位選。3.1.4復(fù)位電路模

9、塊復(fù)位電路主要的功能是是整個(gè)系統(tǒng)初始化,在每次上電時(shí)系統(tǒng)自動(dòng)初始化,如果在程序運(yùn)行的過(guò)程中程序沒(méi)有響應(yīng)或者需要進(jìn)行一次初始化,這是可以通過(guò)按復(fù)位開(kāi)關(guān)來(lái)實(shí)現(xiàn)需要的有效操作。3.1.5時(shí)鐘芯片模塊DS1302時(shí)鐘芯片是本系統(tǒng)實(shí)現(xiàn)高精度計(jì)時(shí)的關(guān)鍵。利用DS1302時(shí)鐘芯片獨(dú)立于單片機(jī)來(lái)計(jì)時(shí),在提高計(jì)時(shí)進(jìn)度的同時(shí)也提高了整個(gè)系統(tǒng)的抗干擾能力。DS1302通過(guò)SCLK、I/O、RES端口和單片機(jī)STC90C52進(jìn)行通信。SCLK接至單片機(jī)P1.7口,在讀寫(xiě)操作時(shí)給DS1302提供相應(yīng)的時(shí)鐘脈沖;I/O接至P3.5用來(lái)傳送所有的數(shù)據(jù);RES接至單片機(jī)P1.6上用來(lái)控制單片機(jī)與時(shí)鐘芯片間的數(shù)據(jù)傳送的開(kāi)始于結(jié)

10、束。DS1302的工作原理與使用方法見(jiàn)附錄。3.1.6主控模塊主控模塊的核心組成部分是單片機(jī)STC89C52,承擔(dān)著所有操作任務(wù)的調(diào)控與分派工作。3.1.7鬧鈴模塊 鬧鈴模塊由蜂鳴器和蜂鳴器的驅(qū)動(dòng)組成。在有鬧鈴發(fā)生的時(shí)候,蜂鳴器的驅(qū)動(dòng)電路驅(qū)動(dòng)蜂鳴器發(fā)聲,產(chǎn)生鬧鈴的效果。3.2軟件設(shè)計(jì)3.2.1程序設(shè)計(jì)流程圖1、主程序流圖2、讀DS1302中斷與鬧鈴檢測(cè)流程圖3、功能選擇中斷操作的程序流程圖4、加一中斷操作的程序流程圖3.2.2 源程序/* 本程序主要實(shí)現(xiàn)的功能:利用時(shí)鐘芯片DS1302和STC89C52進(jìn)行高精度計(jì)時(shí),能夠?qū)崿F(xiàn)時(shí)、分、秒的顯示,具有校時(shí),調(diào)整鬧鈴的功能。設(shè)計(jì)者:* 2011/1

11、/24*/ ORG 0000H SJMP MAIN ;主程序入口地址 ORG 0003H AJMP ANJIAN_FUNCTION ;功能選擇操作入口 ORG 000BH AJMP DELAY_10MS ;防抖延時(shí)以與鬧鈴 ORG 0013H AJMP COUNT_UP ;按鍵加1操作入口 ORG 001BH AJMP DU_1302 ;每300ms讀ds1302中斷入口MAIN: T_CLK BIT P1.7;實(shí)時(shí)時(shí)鐘 T_IO BIT P3.5 ;數(shù)據(jù)線 T_RST BIT P1.6 ;復(fù)位線MOV TMOD,#11H MOV TH1,#15H ;設(shè)置掃描ds1302的計(jì)數(shù)初值 MOV T

12、L1,#0A0H MOV TH0,#0C5H ;設(shè)置按鍵防抖延時(shí) MOV TL0,#68H SEC0 DATA 40H ;定義秒顯示的個(gè)位 SEC1 DATA 41H ;定義秒顯示的十位 LINE0 DATA 42H ;定義秒-時(shí)分隔符 MIN0 DATA 43H ;定義分顯示個(gè)位 MIN1 DATA 44H ;定義分顯示十位 LINE1 DATA 45H ;定義時(shí)-分分隔符 HOUR0 DATA 46H ;定義時(shí)顯示個(gè)位 HOUR1 DATA 47H ;定義時(shí)顯示十位 ;-預(yù)讀計(jì)數(shù)位寄存器-SECOND DATA 52H ;秒寄存器,用于暫存當(dāng)前由DS1302讀的的秒的數(shù)據(jù)MINUTE DA

13、TA 53H ;分-用于暫存當(dāng)前由DS1302讀的的分的數(shù)據(jù) HOUR DATA 54H ;時(shí)-用于暫存當(dāng)前由DS1302讀的的時(shí)的數(shù)據(jù)SMJS DATA 55H ;設(shè)置ds1302 掃描定時(shí)控制位(掃描計(jì)數(shù))FUNC DATA 56H ;定義按鍵功能選擇控制位ZANCUN0 DATA 57H ;定義按鍵操作時(shí)存儲(chǔ)校準(zhǔn)值的個(gè)位ZANCUN1 DATA 58H ;定義按鍵操作時(shí)存儲(chǔ)校準(zhǔn)值的十位ZANCUN_SECOND DATA 59H ;用于校時(shí)和對(duì)鬧鈴時(shí)對(duì)秒的顯示值清零 NLHOUR_0 DATA 60H ;鬧鈴小時(shí)值存儲(chǔ)單元 NLMINUTE_0 DATA 61H ;鬧鈴分值存儲(chǔ)單元 ;N

14、LHOUR_1 DATA 62H ;NLMINUTE_1 DATA 63H TEMP DATA 64H ;鬧鈴發(fā)生標(biāo)志位 NLJS DATA 65H ;鬧鈴計(jì)時(shí)標(biāo)志MOV TEMP,#00H ;鬧鈴發(fā)生標(biāo)志位初始化為0,表示沒(méi)有鬧鈴的發(fā)生 MOV NLJS,#00H ;鬧鈴鈴聲長(zhǎng)短控制單元 MOV NLHOUR_0,#08H ;鬧鈴符初值 MOV NLMINUTE_0,#30H MOV LINE0,#40H ;顯示分和秒的間隔符 MOV LINE1,#40H ;顯示小時(shí)和分的間隔符 MOV SMJS,#00H MOV SECOND,#00H ;時(shí)鐘計(jì)時(shí)初始化值 MOV MINUTE,#25H

15、MOV HOUR,#08H MOV ZANCUN_SECOND,#00H MOV R1,#40H ;-R1 MOV R3,#07H ;確定當(dāng)前選通的顯示位 -R3 SETB EX0 SETB IT0 ;外部中斷葿邊沿觸發(fā) SETB IT1 SETB ET0 SETB ET1 SETB PT0 ;設(shè)置定時(shí)器T0中斷位高優(yōu)先級(jí) SETB PX1 ;外部中斷1中斷為高優(yōu)先級(jí),用來(lái)在有功能操作;時(shí)來(lái)中斷功能選擇的中斷 SETB EA ;開(kāi)總中斷 SETB TR1 ;T1主要進(jìn)行顯示掃描中斷 LCALL SET1302 ;DS1302初始化;-數(shù)碼管顯示程序-XIANSHI: ;-檢測(cè)鬧鈴是否發(fā)生- M

16、OV ZANCUN0,R6 PUSH ZANCUN0 ;R6壓棧 MOV R6,TEMP CJNE R6,#01H,XIANSHI_1 ;檢測(cè)鬧零定時(shí)是否到時(shí) SETB TR0 ; XIANSHI_1:MOV A,R1 ;讀計(jì)數(shù)位的計(jì)數(shù)值-R1 CJNE R3,#05H,NEXTWEI ;判斷當(dāng)前為是否需要顯示分隔符"-" MOV P2,R3 MOV P0,LINE0NEXTWEI:CJNE R3,#02H,SEL_0 MOV P2,R3 MOV P0,LINE1 SEL_0:MOV P2,R3 ;送位選信號(hào)/*-對(duì)計(jì)數(shù)位的計(jì)數(shù)值譯碼輸出-開(kāi)始-*/ CJNE A,#00H

17、,SEL_1 MOV P0,#3FH ;0,如果當(dāng)前計(jì)數(shù)位的計(jì)數(shù)值位0,則將0的共陰極七段數(shù)碼管編碼3FH送出顯示 SJMP SEL_10SEL_1: CJNE A,#01H,SEL_2 MOV P0,#06H ;1 SJMP SEL_10SEL_2: CJNE A,#02H,SEL_3 MOV P0,#5BH ;2 SJMP SEL_10SEL_3: CJNE A,#03H,SEL_4 MOV P0,#4FH ;3 SJMP SEL_10SEL_4: CJNE A,#04H,SEL_5 MOV P0,#66H ;4 SJMP SEL_10 SEL_5: CJNE A,#05H,SEL_6 M

18、OV P0,#6DH ;5 SJMP SEL_10SEL_6: CJNE A,#06H,SEL_7 MOV P0,#7DH ;6 SJMP SEL_10 SEL_7:CJNE A,#07H,SEL_8 MOV P0,#07H ;7 SJMP SEL_10 SEL_8:CJNE A,#08H,SEL_9 MOV P0,#7FH ;8 SJMP SEL_10 SEL_9:CJNE A,#09H,SEL_10 MOV P0,#6FH ;9 SJMP SEL_10 /*-對(duì)計(jì)數(shù)位的計(jì)數(shù)值譯碼輸出-結(jié)束-*/ SEL_10: INC R1 ;R1加一,使當(dāng)前計(jì)數(shù)位后移一位 DEC R3 ;位掃描控制位減

19、一,因?yàn)槌跏嘉粧呙枋菑?11開(kāi)始的 ACALL DELAY CJNE R3,#0FFH,SEL_11 MOV R3,#07HSEL_11:CJNE R1,#48H,SEL_12 MOV R1,#40H SEL_12: POP ZANCUN0 MOV R6,ZANCUN0 AJMP XIANSHI ;-掃描延時(shí)程序-DELAY: MOV R5,#4 ;-R5 D1: MOV 48H,#120 DJNZ 48H,$ DJNZ R5,D1 RET ;-功能:對(duì)當(dāng)前由ds1302讀得的計(jì)數(shù)值進(jìn)行轉(zhuǎn)換- (寄存器均已壓棧)- JSZH: ;功能:計(jì)數(shù)轉(zhuǎn)換子程序,用于對(duì)當(dāng)前讀得的ds1302的計(jì)數(shù)值轉(zhuǎn)換成

20、sec0-houro的格式,便于顯示 PUSH ACC MOV A,R0 PUSH ACC ;R0壓棧 MOV A,R1 PUSH ACC ;R1壓棧 PUSH PSW MOV R1,#40H ;計(jì)數(shù)數(shù)據(jù)sec0-hour0的存儲(chǔ)首地址 MOV R0,#52H ;由ds1302讀得的數(shù)據(jù)存放首地址LOOP_1:MOV A,R0 ANL A,#0FH MOV R1,A INC R1 MOV A,R0 ANL A,#0F0H SWAP A MOV R1,A INC R1 INC R1 ;地址加一跳過(guò)分隔符"_"的存儲(chǔ)單元 INC R0 CJNE R1,#49H,LOOP_1 P

21、OP PSW POP ACC ;R1彈棧 MOV R1,A POP ACC ;R0彈棧 MOV R0,A POP ACC ;A彈棧 RET ;-讀取DS1302計(jì)數(shù)程序(T1中斷)- -(寄存器均已壓棧)DU_1302: PUSH ACC MOV A,R1 PUSH ACC ;R1壓棧 DU_1302_1: INC SMJS MOV R1,SMJS CJNE R1,#03H,BELL ;每300ms讀一次ds1302的計(jì)數(shù)值,避免在ds1302定時(shí)一秒;計(jì)數(shù)值改變時(shí)發(fā)生錯(cuò)讀 MOV SMJS,#00H LCALL GET1302 LCALL JSZH ;調(diào)計(jì)數(shù)轉(zhuǎn)換子程序 MOV TH1,#15

22、H ;設(shè)置掃描ds1302的計(jì)數(shù)60MS初值 MOV TL1,#0A0H BELL: ;-鬧鈴- MOV A,NLHOUR_0 CJNE A,HOUR,DU_1302_RET MOV A,NLMINUTE_0 CJNE A,MINUTE,DU_1302_RET MOV TEMP,#01H ;定義TEMP為鬧鈴發(fā)生的標(biāo)志MOV NLMINUTE_0,#00HMOV NLHOUR_0,#00H DU_1302_RET: POP ACC MOV R1,A ;R1彈棧POP ACC RETI;* DS1302初始化子程序 *SET1302: ;設(shè)置ds1302初始時(shí)間,并啟動(dòng)計(jì)時(shí) PUSH ACC ;

23、A斷點(diǎn)保護(hù) MOV A,R1 PUSH ACC CLR T_RST CLR T_CLK SETB T_RST MOV B,#8EH ;控制寄存器 LCALL WRITEBYTE MOV B,#00H ;寫(xiě)操作前WP=0 LCALL WRITEBYTE SETB T_CLK CLR T_RST mov R0,#SECOND MOV R7,#3 ;秒/時(shí)/分 ;-R7 MOV R1,#80H ;秒寫(xiě)地址 ;-R1S1302: CLR T_RST CLR T_CLK SETB T_RST MOV B,R1 ;寫(xiě)秒/時(shí)/分地址 ;-R1 LCALL WRITEBYTE MOV A,R0 ;寫(xiě)秒數(shù)據(jù) ;

24、-R0 MOV B,A LCALL WRITEBYTE INC R0 INC R1 INC R1 SETB T_CLK CLR T_RST DJNZ R7,S1302 CLR T_RST CLR T_CLK SETB T_RST MOV B,#8EH ;控制寄存器 LCALL WRITEBYTE MOV B,#80H;控制,wp=1,寫(xiě)保護(hù) LCALL WRITEBYTE SETB T_CLK CLR T_RST POP ACC MOV R1,A POP ACC ;A恢復(fù)數(shù)據(jù) RET ;-GET1302: ;從ds1302讀時(shí)間秒/時(shí)/分 MOV R0,#SECOND ;-R0 MOV R7,

25、#03H ;-R7 MOV R2,#81H ;-R2 G13021:CLR T_RST CLR T_CLK SETB T_RST MOV B,R2 LCALL WRITEBYTE ;寫(xiě)操作時(shí),將一字節(jié)的容由B寫(xiě)至DS1302中 LCALL READBYTE ;讀操作時(shí),將一字節(jié)的容讀至A中 MOV R0,A INC R0 INC R2 INC R2 SETB T_CLK CLR T_RST DJNZ R7,G13021 RET;-WRITEBYTE: ;寫(xiě)B(tài)寄存器中的容至1302一字節(jié) MOV R4,#08H ;-R4INBIT1:MOV A,B RRC A MOV B,A SETB T_IO

26、 ;T_IO口做輸入口 MOV T_IO,C SETB T_CLK CLR T_CLK DJNZ R4,INBIT1 RET;-READBYTE: ;讀1302一字節(jié)至 A 寄存器 MOV R4,#8 ;-R4OUTBIT1:MOV C,T_IO RRC A SETB T_CLK CLR T_CLK DJNZ R4,OUTBIT1 RET;- -END DS0302-;* *按鍵操作*ANJIAN_FUNCTION: ;功能選擇鍵中斷 接至P3.2WAIT: P3.2,WAIT SETB TR0 ;啟動(dòng)定時(shí)器0,延時(shí)10ms JNB TF0,$ JNB P3.2,$ ;檢測(cè)按鍵是否彈起 SET

27、B EX1 ;在有功能選擇的時(shí)候開(kāi)中斷1 INC FUNC PUSH ACC ;保存A中的數(shù)值 MOV A,FUNC CJNE A,#03H,FUN_1 MOV LINE0,#80H ; 分隔符下移,以便區(qū)分于校時(shí)操作 MOV LINE1,#80H FUN_1:CJNE A,#04H,FUN_2 MOV LINE0,#80H ; 分隔符下移,以便區(qū)分于校時(shí)操作 MOV LINE1,#80HFUN_2:CJNE A,#05H,ANJIAN_FUNCTION_RET ;控制所要置數(shù)的計(jì)數(shù)位閃動(dòng) SETB ET1 CLR EX1 ;在功能選擇的時(shí)退出開(kāi)中斷1 MOV FUNC,#00H MOV LI

28、NE0,#40H ;顯示分和秒的間隔符 MOV LINE1,#40H ;顯示小時(shí)和分的間隔符ANJIAN_FUNCTION_RET: POP ACC ;恢復(fù)A中的值 RETI;-校時(shí)加-中斷-COUNT_UP: PUSH ACC MOV A,FUNC CLR C SUBB A,#00H ;檢測(cè)當(dāng)前有無(wú)校時(shí)或者對(duì)鬧鈴的操作 CJNE A,#00H,COUNT_UP_NEXT AJMP COUNT_UP_RET ;*時(shí)* COUNT_UP_NEXT: CJNE A,#01H,COUNT_UP_1 ;檢測(cè)當(dāng)前操作是否為時(shí)鐘校時(shí)-時(shí)鐘位 INC HOUR0 MOV R6,HOUR1 ;校時(shí)-R6 CJ

29、NE R6,#02H,COUNT_UP_0_1 ;先判斷小時(shí)高位是否已計(jì)數(shù)值2 MOV R6,HOUR0 CJNE R6,#04H,COUNT_UP_RET MOV HOUR1,#00H MOV HOUR0,#00H AJMP COUNT_UP_RET ;返回 COUNT_UP_0_1: MOV R6,HOUR0 CJNE R6,#0AH,COUNT_UP_RET MOV HOUR0,#00H INC HOUR1 AJMP COUNT_UP_RET;*分*COUNT_UP_1: CJNE A,#02H,COUNT_UP_2 ;校時(shí)-分 INC MIN0 MOV R6,MIN0 CJNE R6,

30、#0AH,COUNT_UP_1_1 ;先判斷分的低位 INC MIN1 MOV MIN0,#00H COUNT_UP_1_1: MOV R6,MIN1 CJNE R6,#06H,COUNT_UP_RET MOV MIN1,#00H ;SJMP COUNT_UP_RET COUNT_UP_RET: LCALL HECHENG MOV SECOND,ZANCUN_SECOND ;每次校時(shí)秒都?xì)w零 LCALL SET1302 ;每加一次對(duì)當(dāng)前計(jì)數(shù)值進(jìn)行一次重置 POP ACC RETICOUNT_UP_2: CJNE A,#03H,COUNT_UP_3 ;鬧鈴-時(shí) CLR ET1 ;暫停對(duì)DS130

31、2的讀操作 MOV R6,HOUR1 ;時(shí)-R6 CJNE R6,#02H,COUNT_UP_2_1 ;先判斷小時(shí)高位是否已計(jì)數(shù)值2 INC HOUR0 MOV R6,HOUR0 CJNE R6,#04H,COUNT_UP_NLRET MOV HOUR1,#00H MOV HOUR0,#00H AJMP COUNT_UP_NLRET ;返回 COUNT_UP_2_1: INC HOUR0 MOV R6,HOUR0 CJNE R6,#0AH,COUNT_UP_NLRET MOV HOUR0,#00H INC HOUR1 SJMP COUNT_UP_NLRETCOUNT_UP_3:CJNE A,#

32、04H,COUNT_UP_RET ;鬧鈴-分 CLR ET1 ;暫停對(duì)DS1302的讀操作 INC MIN0 MOV R6,MIN0 CJNE R6,#0AH,COUNT_UP_3_1 ;先判斷分的低位 INC MIN1 MOV MIN0,#00HCOUNT_UP_3_1:MOV R6,MIN1 CJNE R6,#06H,COUNT_UP_NLRET MOV MIN1,#00H COUNT_UP_NLRET: LCALL HECHENG POP ACC RETI;* 有按鍵時(shí)重置ds1302當(dāng)前位計(jì)數(shù)值(R5) * ;功能:將當(dāng)前時(shí),分的高低顯示計(jì)數(shù)值分別合成為HOUR,MINUTE,對(duì)校時(shí)時(shí)

33、ds1302重新寫(xiě)入數(shù)據(jù)做準(zhǔn)備HECHENG: ;-R0,A PUSH ACC ;對(duì)R0的值壓棧 MOV A,FUNC CLR C SUBB A,#00H ;檢測(cè)當(dāng)前有無(wú)校時(shí)或者對(duì)鬧鈴的操作 CJNE A,#01H,HECHENG_1 MOV ZANCUN0,HOUR0 MOV ZANCUN1,HOUR1 ANL ZANCUN0,#0FH ANL ZANCUN1,#0FH MOV R5,A ;保存A中的值 MOV A,ZANCUN1 SWAP A ADD A,ZANCUN0 MOV HOUR,A MOV A,R5 ;恢復(fù)A的計(jì)數(shù)值 SJMP HECHENG_RETHECHENG_1: CJNE

34、 A,#02H,HECHENG_2 MOV ZANCUN0,MIN0 MOV ZANCUN1,MIN1 ANL ZANCUN0,#0FH ANL ZANCUN1,#0FH MOV R5,A ;保存A中的值 MOV A,ZANCUN1 SWAP A ADD A,ZANCUN0 MOV MINUTE,A MOV A,R5 ;恢復(fù)A的計(jì)數(shù)值 SJMP HECHENG_RET HECHENG_2: CJNE A,#03H,HECHENG_3 ;鬧-時(shí) MOV ZANCUN0,HOUR0 MOV ZANCUN1,HOUR1 ANL ZANCUN0,#0FH ANL ZANCUN1,#0FH MOV R5

35、,A ;保存A中的值 MOV A,ZANCUN1 SWAP A ADD A,ZANCUN0 MOV NLHOUR_0,A MOV A,R5 ;恢復(fù)A的計(jì)數(shù)值 SJMP HECHENG_RETHECHENG_3: CJNE A,#04H,HECHENG_RET ;鬧-分 MOV ZANCUN0,MIN0 MOV ZANCUN1,MIN1 ANL ZANCUN0,#0FH ANL ZANCUN1,#0FH MOV R5,A ;保存A中的值 MOV A,ZANCUN1 SWAP A ADD A,ZANCUN0 MOV NLMINUTE_0,A MOV A,R5 ;恢復(fù)A的計(jì)數(shù)值 HECHENG_RE

36、T:POP ACC RET ;-T0防抖延時(shí)10ms- DELAY_10MS: PUSH ACC MOV A,R6 PUSH ACC MOV R6,TEMP CJNE R6,#01H,DELAY_FD ;如果沒(méi)有鬧鈴事件發(fā)生轉(zhuǎn)防抖延時(shí)DELAY_FD INC NLJS MOV TH0,#0ECH MOV TL0,#78H CPL P1.0 MOV R6,NLJS CJNE R6,#0FFH,DELAY_RET ; MOV TEMP,#00H MOV NLJS,#00H MOV TH0,#0D1H ;恢復(fù)T0的初值 MOV TL0,#20H CLR P1.0 CLR TR0 ;T0復(fù)用結(jié)束后關(guān)定

37、時(shí)器 SJMP DELAY_RETDELAY_FD: MOV TH0,#0C5H MOV TL0,#68H CLR TR0DELAY_RET: POP ACC MOV R6,A POP ACC RETIEND四、數(shù)字鐘制作過(guò)程中遇到的問(wèn)題問(wèn)題一:對(duì)于時(shí)鐘的各個(gè)計(jì)時(shí)單元:時(shí)、分、秒,由于單片機(jī)部的寄存器資源有限,在程序設(shè)計(jì)的開(kāi)始首先必須得解決由時(shí)鐘芯片DS1302讀得的數(shù)據(jù)如何保存的問(wèn)題。解決辦法:由于我使用的編程語(yǔ)言是匯編語(yǔ)言,不能像C語(yǔ)言那樣使用一個(gè)數(shù)組來(lái)保存數(shù)據(jù)。為了能夠與時(shí)的保存數(shù)據(jù),在程序設(shè)計(jì)的過(guò)程中使用DATA指令在單片機(jī)的存空間中開(kāi)辟出了一些具有固定地址的存單元來(lái)存儲(chǔ)相應(yīng)的數(shù)據(jù)。在

38、程序中定義的用于保存當(dāng)前由DS1302讀得的數(shù)據(jù)單元如下:SEC1 DATA 41H ;定義秒顯示的十位SEC0 DATA 40H ;定義秒顯示的個(gè)位 LINE0 DATA 42H ;定義秒-時(shí)分隔符“-” MIN0 DATA 43H ;定義分顯示個(gè)位 MIN1 DATA 44H ;定義分顯示十位 LINE1 DATA 45H ;定義時(shí)-分分隔符“-” HOUR0 DATA 46H ;定義時(shí)顯示個(gè)位 HOUR1 DATA 47H ;定義時(shí)顯示十位通過(guò)以上的方法,在單片機(jī)的RAM中開(kāi)辟了一片用戶可直接操作的存單元,解決例如數(shù)據(jù)的保存問(wèn)題。問(wèn)題二:焊接好自己刻的板子后,數(shù)碼管顯示跳動(dòng)不穩(wěn)定,但時(shí)鐘

39、沒(méi)停,但有時(shí)走一分鐘后就停掉了。解決方法:將寫(xiě)好的程序下在51開(kāi)發(fā)板上,發(fā)現(xiàn)程序運(yùn)行穩(wěn)定,沒(méi)有上述現(xiàn)象的發(fā)生。由此首先說(shuō)明程序沒(méi)有問(wèn)題,可能是做的電路板有問(wèn)題,為了找到問(wèn)題的根源所在,從開(kāi)發(fā)板上引出了時(shí)鐘芯片的輸出信號(hào)接至自己做的電路板,發(fā)現(xiàn)電路板能正常工作。由此推斷問(wèn)題的根源出在電路板的時(shí)鐘芯片模塊,經(jīng)過(guò)進(jìn)一步的排查,發(fā)現(xiàn)在時(shí)鐘芯片在沒(méi)有接地的情況下竟然能夠正常工作。由此進(jìn)一步說(shuō)明問(wèn)題是出在時(shí)鐘芯片的接地上。為了能夠進(jìn)一步尋找問(wèn)題根源,我們將自己刻的電路板的地線接至示波器上觀察。結(jié)果證明了我們的推斷完全正確,為了最大程度的降低干擾,我們直接對(duì)DS1302單獨(dú)接地,并且對(duì)數(shù)碼管驅(qū)動(dòng)芯片74HC

40、573等需較大電流的芯片單獨(dú)接電源,同時(shí)劃斷電路板中對(duì)74HC573等供電的電源線路以進(jìn)一步降低電源帶來(lái)的干擾。問(wèn)題總結(jié):由于我們是第一次做PCB板,在布局的時(shí)候根本沒(méi)有考慮到布線的不合理會(huì)帶來(lái)的眾多干擾的問(wèn)題,而且布線也全部由電腦自動(dòng)布線完成,這樣使得電路滋生出大量的寄生電容以與其他的干擾。同樣的程序在開(kāi)發(fā)板上運(yùn)行很穩(wěn)定,在我們自己刻的PCB板上剛開(kāi)始很不穩(wěn)定進(jìn)一步告訴我們,在以后繪制PCB板的過(guò)程中需要周密的考慮到布局的合理性以與電路的干擾問(wèn)題。問(wèn)題三:在程序設(shè)計(jì)完成后,在開(kāi)發(fā)板和自己刻的PCB板上時(shí)發(fā)現(xiàn)再有按鍵按下的情況下,數(shù)碼管所顯示時(shí)間有閃動(dòng)。解決方法:因?yàn)閱纹瑱C(jī)是一個(gè)順序執(zhí)行程序微

41、機(jī),不像CPLD或FPGA等具有并行處理數(shù)據(jù)的特點(diǎn),CPU在當(dāng)前時(shí)間只能處理一件事。在開(kāi)始我以為產(chǎn)生這個(gè)問(wèn)題的原因是我設(shè)的防抖延時(shí)間太長(zhǎng)了(我的防抖延時(shí)設(shè)置為10ms)。當(dāng)我進(jìn)一步減小防抖延時(shí)的時(shí)間時(shí)情況還是沒(méi)有好轉(zhuǎn),由于單片機(jī)的軟件防抖延時(shí)最佳時(shí)間段在5ms10ms,太大或者太小都不利于軟件防抖。 通過(guò)對(duì)電平觸發(fā)和邊沿觸發(fā)兩種中斷觸發(fā)方式的比較,發(fā)現(xiàn)在按鍵時(shí)數(shù)碼管顯示閃動(dòng)的原因是:起初時(shí),中斷觸發(fā)方式我選的是電平觸發(fā)方式。在按鍵按下時(shí)可能由于按鍵性能不太好,按鍵稍稍的抖動(dòng)使得在軟件防抖后依然不太穩(wěn)定,單片機(jī)在此檢測(cè)到中斷發(fā)生的有效電平,從而再次發(fā)生中斷,導(dǎo)致在有按鍵按下時(shí)單片連續(xù)處理按鍵中斷

42、,從而產(chǎn)生數(shù)碼管在有按鍵按下的情況下出現(xiàn)閃動(dòng)的問(wèn)題。在將按鍵的中斷方式由電平觸發(fā)模式改為邊沿觸發(fā)后,數(shù)碼管再有按鍵按下的情況下閃動(dòng)的問(wèn)題得到了解決。問(wèn)題四:蜂鳴器在沒(méi)有鬧鈴發(fā)生時(shí)沒(méi)有聲音,在鬧鈴響完以后還回有比較小的嘟嘟聲??赡茉颍豪硐霠顟B(tài)下在鬧鈴響完后驅(qū)動(dòng)蜂鳴器的三極管截止,蜂鳴器上沒(méi)有電流流過(guò),蜂鳴器出在不發(fā)聲狀態(tài)。鬧鈴響完后蜂鳴器蜂鳴器仍然有很小的嘟嘟聲,說(shuō)明此時(shí)有干擾脈沖通過(guò)蜂鳴器。為了進(jìn)一步減小蜂鳴器的嘟嘟聲。在蜂鳴器兩端接入300PF的電容后聲音有所減小但沒(méi)有消除。但干擾的來(lái)源尚不清楚,可能是來(lái)自電源地的干擾。問(wèn)題五:T2定時(shí)器在匯編編程的情況下如何使用??赡茉颍涸贑語(yǔ)言編程時(shí)

43、,只需要包含頭文件 #include<reg.52h>,所有的52單片機(jī)所用到的端口,寄存器,定時(shí)器等資源均已事先定義好了。在匯編編程的過(guò)程中我模仿C語(yǔ)言的模式首先定義在使用T2定時(shí)器,但一直出現(xiàn)錯(cuò)誤。如何在匯編編程的情況下如何使用還未解決。五、總結(jié) 經(jīng)過(guò)10天的工作,我的數(shù)字鐘從只能計(jì)時(shí)功能改進(jìn)到具有鬧鈴功能、校時(shí)功能、鬧鈴調(diào)整功能。剛剛開(kāi)始時(shí),我采用的定時(shí)器方法進(jìn)行計(jì)時(shí)。在編寫(xiě)完計(jì)時(shí)程序加鬧鈴功能和按鍵操作的時(shí)候,考慮到數(shù)字鐘計(jì)時(shí)的準(zhǔn)確性,我改變了程序設(shè)計(jì)方案,采用時(shí)鐘芯片DS1302配合單片機(jī)STC89C52的設(shè)計(jì)方案。 在程序設(shè)計(jì)的過(guò)程中總體方案很簡(jiǎn)單,我只需在一定時(shí)間讀取DS1302的計(jì)時(shí)值,省去了一大堆的計(jì)時(shí)程序。但是在開(kāi)始程序設(shè)計(jì)的時(shí)候才發(fā)現(xiàn)并沒(méi)想的那么簡(jiǎn)單。我花了兩天時(shí)間才把時(shí)鐘芯片的操作完全的掌握,并且用匯編完成了對(duì)DS1302的讀寫(xiě)等操作的程序設(shè)計(jì)。通過(guò)修正后走時(shí)一天的誤差在10s

溫馨提示

  • 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)論