單片機課程設(shè)計電子時鐘_第1頁
單片機課程設(shè)計電子時鐘_第2頁
單片機課程設(shè)計電子時鐘_第3頁
單片機課程設(shè)計電子時鐘_第4頁
單片機課程設(shè)計電子時鐘_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、實驗報告實驗名稱:電子時鐘學(xué)院:電子信息工程學(xué)院班級:通信1103班學(xué)號:11211054姓名:陳勝彪指導(dǎo)老師:付文秀2013 12 15設(shè)計題目電子時鐘一、 實驗?zāi)康?掌握單片機編程的流程,Keil軟件的使用方法,以及程序的調(diào)試方式。2了解LED動態(tài)顯示原理及動態(tài)顯示程序設(shè)計方法。3學(xué)習(xí)8051定時器時間計時處理、按鍵掃描的設(shè)計方法。二、設(shè)計任務(wù)和要求 利用實驗平臺上4個LED數(shù)碼管, 設(shè)計帶有鬧鈴功能的數(shù)字時鐘,要求:1 在4位數(shù)碼管上顯示當(dāng)前時間。顯示格式“時時分分”。2 由LED閃動做秒顯示。3 利用按鍵可對時間及鬧玲進行設(shè)置,并可顯示鬧玲時間。 4 當(dāng)鬧玲時間到由P1.7控制蜂鳴器發(fā)

2、出聲響,并可通過按鍵使它停止。三、設(shè)計原理與分析步驟數(shù)碼管的顯示:在ZKS-03實驗儀上共有4位共陽LED數(shù)碼管,其標(biāo)號分別為LED1LED4。為了節(jié)省MCU的I/O口,采用串行接口方式,它僅占用系統(tǒng)2個I/O口,一個用作數(shù)據(jù)線SDA,另一個用作時鐘信號線CLK。4位共陽LED數(shù)碼管與P87C52X2的連接如下圖所示,其中,KD_Q0KD_Q7為LED顯示器數(shù)據(jù)線即段碼線,EBIT1EBIT4為LED顯示器的位碼掃描線,它們通過跳線選擇器JP1與P1.3P1.6相連。由它們發(fā)送掃描信號,低電平有效,且任何時候僅有1位輸出低電平。由于P1口的驅(qū)動能力有限,在此采用9012三極管來增加其驅(qū)動能力。

3、由于采用共陽LED數(shù)碼管,它的陰極分別通過限流電阻R20R27連接到控制端KD_Q0KD_Q7。這樣控制8個發(fā)光二極管,就需要8個I/O口。但由于單片機的I/O口資源是有限的,因此常采用實驗電路所示的串并轉(zhuǎn)換電路來擴充系統(tǒng)資源。串并轉(zhuǎn)換電路其實質(zhì)是一個串入并出的移位寄存器,串行數(shù)據(jù)在同步移位脈沖CLK的作用下經(jīng)串行數(shù)據(jù)線SDA把數(shù)據(jù)移位輸出到KD_Q0KD_Q7端,這樣僅需2根線就可以分別控制8個發(fā)光二極管的亮滅。LED動態(tài)顯示的原理:數(shù)碼管的動態(tài)顯示利用視覺暫留作用,使人眼看到的是靜態(tài)的顯示,視覺暫留時間約為0.01秒,因而每次顯示的時間間距要比較短。本實驗選擇的是每5毫秒顯示一個比特。定時

4、時間為t=(216 - EC78H)×1us = 5000 * 1us = 5 ms(其中機器周期為1us)即延時5ms。T(213計數(shù)初值x)´機器周期首先以串行方式由SDA口向LED顯示器數(shù)據(jù)端口發(fā)送第一個8位數(shù)據(jù),這時發(fā)送位碼數(shù)據(jù)0BFH到P1口,此時由于P1.6位低電平而其他口都為高電平,因此只有LED1數(shù)碼管顯示該數(shù)碼。這樣就可以發(fā)送第二個數(shù)據(jù),同時應(yīng)使其對應(yīng)的位碼為低電平且保證其他位為高電平。依次類推,對各顯示器進行掃描,顯示器分時輪流工作。雖然每次只有一個顯示器顯示,但由于人的視覺暫留現(xiàn)象我們?nèi)詴杏X所有的顯示器都在同時顯示。它的優(yōu)點是硬件電路簡單,占用的I/

5、O口較少,但其傳送速度相對較慢。由數(shù)碼管顯示原理,數(shù)碼管上顯示的數(shù)字對應(yīng)一個八位的二進制數(shù),09一共十個,把這些數(shù)存到程序存儲器TABLE表中,DPTR作為指針,用R1R4分別存儲實際的時和分的數(shù)字,寄存器存儲的數(shù)字作為偏移量,這樣就把實際的數(shù)字和數(shù)碼管中顯示的數(shù)字對應(yīng)起來了。軟件設(shè)計部分:1.鬧鈴設(shè)置:通過P3.2,P3.4和3.5分別控制鬧鈴,分和時的設(shè)置,與邏輯開關(guān)連接,低電平有效,當(dāng)P3.2口變成低電平時,進入鬧鈴設(shè)置,當(dāng)P3.2變成高電平時回到主程序。2.時間設(shè)定:通過P3.3,P3.4和3.5分別控制時間,分和時的設(shè)置,與邏輯開關(guān)連接,低電平有效,當(dāng)P3.3口變成低電平時,進入時間

6、設(shè)置,當(dāng)P3.3口變成高電平時回到主程序。3.蜂鳴:用四個地址50H-53H存儲鬧鈴時間的偏移量,判斷當(dāng)前的時間R1-R4與鬧鈴時間50H-53H是否完全一樣,相同時驅(qū)動鬧鈴,實驗板上的蜂鳴器是交流驅(qū)動的,因此當(dāng)?shù)竭_鬧鈴時刻時,給P1.7口幾個脈沖,頻率控制在人耳可以聽到的范圍內(nèi)。I/O口的說明:1)P1口用來控制數(shù)碼管的顯示,其中未用到的P1.2作為秒脈沖輸出口,P1.7控制蜂鳴器。2)P3口中的P3.2控制鬧鈴設(shè)定,與邏輯開關(guān)相連,低電平有效;3)P3.3控制時間設(shè)定,與邏輯開關(guān)相連,低電平有效;4)P3.4控制設(shè)定中的分鐘的設(shè)定,與邏輯開關(guān)相連,低電平有效;5)P3.5控制設(shè)定中的小時的

7、設(shè)定,與邏輯開關(guān)設(shè)定,低電平有效寄存器說明:R0作為秒計數(shù)寄存器;R1作為分的低位的偏移量存儲的寄存器;R2作為分的高位的偏移量存儲的寄存器;R3作為時的低位的偏移量存儲的寄存器;R4作為時的高位的偏移量存儲的寄存器。R5,R6,R7用來設(shè)定循環(huán)的次數(shù);DPTR用來作為TABLE表地址的指針.硬件設(shè)計部分:數(shù)碼管顯示的電路實驗儀上已連接好,我們只需通過跳線選擇器JP1將單片機的P1口的控制線與數(shù)碼管顯示電路相連,即將JP1中的P10、P11、P13、P14、P15、P16接至A位;P1.7控制蜂鳴器并且連接至C位。P1.2口作為秒脈沖輸出端,不接入跳線,將P1.2口連到LED數(shù)碼管,P3.2,

8、P3.3,P3.4,P.5都與邏輯開關(guān)相接。四、實驗電路圖五、實驗程序延時子程序 DELAY: MOV TH1,#0ECH MOV TL1,#78H CLR TF1 SETB TR1 WAIT: JNB TF1,WAIT RETR0=60R0清零R1=9實驗程序:ORG 4000HMAIN: CLR EA ;程序初始化CLR PSW.3 ;選擇寄存器組0CLR PSW.4 ;PSW.4和PSW.3同時為零,則為寄存器0組MOV TMOD,#10H ;定時器1,方式1,定時方式 MOV 50H,#00H ;鬧鈴初始時間 08:00 MOV 51H,#00H ;分別對應(yīng)分的低、高位,時的低、高位M

9、OV 52H,#08H ;時的低位MOV 53H,#00H ;時的高位MOV R0,#00H ;設(shè)置時間初值 07:59MOV R1,#09H ;分別對應(yīng)分的低、高位,時的低、高位MOV R2,#05H ;分的高位 MOV R3,#07H ;時的低位MOV R4,#00H ;時的高位 CLR TF1 ;清標(biāo)志START:ACALL ALARM ;判斷是否鬧鈴 MOV R5,#02H ;兩層外循環(huán),每層循環(huán)500msSTART1: MOV R7,#20 ;20次內(nèi)循環(huán),20*25ms=500msSTART2: ACALL DELAY ;調(diào)用延時 5ms ACALL DISPLAY ;調(diào)用延時 2

10、0ms M0: JB P3.2,M1 ;是否設(shè)鬧鈴,查詢3.2口,為一轉(zhuǎn)到M1,為0設(shè)置鬧鈴 ACALL SETALARM ;調(diào)用設(shè)置鬧鈴子程序 M1: JB P3.3,M2 ;是否設(shè)時間 ACALL SETCLOCK ;調(diào)用設(shè)置時間子程序 M2: DJNZ R7,START2 ;R7=20減1循環(huán) CPL P1.2 ;每500ms給P1.2一個正負(fù)交替的電平信號 DJNZ R5,START1 ;R5為2,循環(huán)兩次后為1s INC R0 ;R0加1 CJNE R0,#60,START ;判斷R0為60,跳轉(zhuǎn) MOV R0,#00H ;R0清零 M3: CJNE R1,#09H,L1 ;時間邏輯

11、,如果為23:59分,則全部清零 CJNE R2,#05H,L2 ;分的十位為5 CJNE R4,#02H,L3 ;時的十位為5 CJNE R3,#03H,L4 ;時的個位為9 MOV R1,#00H ;將分的個位清零 MOV R2,#00H ;將分的十位清零 MOV R3,#00H ;將時的個位清零 MOV R4,#00H ;將時的十位清零 AJMP START ;絕對轉(zhuǎn)移到START L1: INC R1 ;上面的幾個分支,分的個位加一 AJMP START ;絕對轉(zhuǎn)移到START L2: INC R2;分的十位加一 MOV R1,#00H;分的個位置0 AJMP START ;絕對轉(zhuǎn)移到

12、START L3: CJNE R3,#09H,L4 ;時的個位為9跳轉(zhuǎn) INC R4 ;時的十位加一 MOV R3,#00H ;將時的個位清零 MOV R2,#00H ;將分的十位清零 MOV R1,#00H ;將分的個位清零 AJMP START ;絕對轉(zhuǎn)移到START L4: INC R3;時的個位加一 MOV R2,#00H ;將分的十位清零 MOV R1,#00H ;將分的個位清零 AJMP START ;絕對轉(zhuǎn)移到STARTDISPLAY: MOV DPTR,#TABLE ;顯示子程序,把TABLE的首地址送給DPTR MOV A,R1 ;將偏移量給A MOVC A,A+DPTR ;

13、將對應(yīng)地址中的量給A ACALL BIT1 ;顯示第一個字節(jié),也就是分的低位 MOV A,R2 ;顯示第二個字節(jié),分的高位 MOVC A,A+DPTR ;將對應(yīng)地址中的量給A ACALL BIT2 ;顯示第二個字節(jié),分的高位 MOV A,R3 ;顯示第三個字節(jié),時的低位 MOVC A,A+DPTR;將對應(yīng)地址中的量給A ACALL BIT3;顯示第三個字節(jié),時的低位 MOV A,R4 ;顯示第四個字節(jié),時的高位 MOVC A,A+DPTR;將對應(yīng)地址中的量給A ACALL BIT4;顯示第四個字節(jié),時的高位 RET BIT1: MOV R6,#08H ;顯示第一個字節(jié)(分的低位)的子程序 LO

14、OP1: RLC A ;A帶進位左移,移出的最高位存到C中 MOV P1.0,C ;把C的值給P1.0口 CLR P1.1 ;在P1.1產(chǎn)生一個上升沿,將P1.0的值輸入 SETB P1.1 ;置位 DJNZ R6,LOOP1 ;8次循環(huán),輸入第一個字節(jié)8段的值 CLR P1.3 ;給P1.3一個低電平,點亮對應(yīng)的數(shù)碼管 ACALL DELAY ;延時 5ms SETB P1.3 ;置位 RET BIT2: MOV R6,#08H ;顯示第二個字節(jié)(分的高位)的子程序 LOOP2: RLC A ;A帶進位左移,移出的最高位存到C中 MOV P1.0,C ;把C的值給P1.0口 CLR P1.1

15、 ;在P1.1產(chǎn)生一個上升沿,將P1.0的值輸入 SETB P1.1 ;置位 DJNZ R6,LOOP2 ;8次循環(huán),輸入第一個字節(jié)8段的值 CLR P1.4 ;給P1.4一個低電平,點亮對應(yīng)的數(shù)碼管 ACALL DELAY ;延時 5ms SETB P1.4 ;置位 RET BIT3: MOV R6,#08H ;顯示第三個字節(jié)(時的低位)的子程序 LOOP3: RLC A ;A帶進位左移,移出的最高位存到C中 MOV P1.0,C ;把C的值給P1.0口 CLR P1.1 ;在P1.1產(chǎn)生一個上升沿,將P1.0的值輸入 SETB P1.1 ;置位 DJNZ R6,LOOP3 ;8次循環(huán),輸入

16、第一個字節(jié)8段的值 CLR P1.5 ;給P1.5一個低電平,點亮對應(yīng)的數(shù)碼管 ACALL DELAY ;延時 5ms SETB P1.5 ;置位 RET BIT4: MOV R6,#08H ;顯示第四個字節(jié)(時的高位)的子程序 LOOP4: RLC A ;A帶進位左移,移出的最高位存到C中 MOV P1.0,C ;把C的值給P1.0口 CLR P1.1 ;在P1.1產(chǎn)生一個上升沿,將P1.0的值輸入 SETB P1.1 ;置位 DJNZ R6,LOOP4 ;8次循環(huán),輸入第一個字節(jié)8段的值 CLR P1.6 ;給P1.6一個低電平,點亮對應(yīng)的數(shù)碼管 ACALL DELAY ;延時 5ms S

17、ETB P1.6 ;置位 RET ALARM: MOV A,R1 ;鬧鈴判斷子程序,判斷鬧鈴是否與時間各位相等 CJNE A,50H,RETURN ;分別判斷,若不等則跳出 MOV A,R2;把分的十位給A CJNE A,51H,RETURN ;判斷分的十位是否相等,若不等則跳出 MOV A,R3;把時的個位給A CJNE A,52H,RETURN ;判斷時的個位是否相等,若不等則跳出 MOV A,R4 ;把時的時位給A CJNE A,53H,RETURN ;判斷時的十位是否相等,若不等則跳出 MOV R6,#03H ;預(yù)置循環(huán)次數(shù)三次 MING: ;若各位都相等,則驅(qū)動鬧鈴,激活蜂鳴器 SE

18、TB P1.7 ;P1.7控制蜂鳴器,置位 ACALL DELAY ;延時 5ms CLR P1.7 ;P1.7清零 ACALL DELAY ;再延時5ms,使頻率為100赫茲,可調(diào) DJNZ R6,MING ;循環(huán)三次 RETURN:RET TABLE:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H RET ;將數(shù)碼管中顯示的09分別對應(yīng)的數(shù)存入TABLE開始的一段程序存儲器中SETALARM:MOV 40H,R1 ;鬧鈴設(shè)定子程序,保存當(dāng)前時間 MOV 41H,R2 ;把分的十位保存在41H MOV 42H,R3 ;把時的個位保存在42H M

19、OV 43H,R4 ;把時的十位保存在43H MOV R1,50H ;將初始設(shè)定的鬧鈴時間賦給偏移量R1R4 MOV R2,51H ;將分的十位的鬧鈴時間給偏移量R1 MOV R3,52H ;將時的個位的鬧鈴時間給偏移量R2 MOV R4,53H ;將時的十位的鬧鈴時間給偏移量R3 ACALL DISPLAY ;顯示鬧鈴時間 KS: JB P3.4,LK0 ;鬧鈴設(shè)置邏輯,當(dāng)P3.4口為低電平時,設(shè)定分(LK0為DISPLAY子程序) CJNE R1,#09H,LL0 ;當(dāng)分的個位不為9時,跳轉(zhuǎn)到子程序LL0MOV R1,#00H ;清零分的個位 CJNE R2,#05H,LL1 ;當(dāng)分的十位

20、不為5時,跳轉(zhuǎn)到子程序LL1 MOV R2,#00H ;當(dāng)為59分時,清零 AJMP LK0 ;絕對轉(zhuǎn)移到LK0 LL1: INC R2 ;分的十位加一 AJMP LK0 ;絕對轉(zhuǎn)移到LK0 LL0: INC R1 ;分的個位加一 LK0: ACALL DISPLAY ;設(shè)定一次顯示一次時間 JB P3.5,LK1 ;P3.5口為低電平時,設(shè)定時(LK1為子程序) CJNE R4,#02H,KK0 ;當(dāng)時的十位不為2時,跳轉(zhuǎn)到子程序KK0 CJNE R3,#03H,KK1 ;當(dāng)時的個位不為3時,跳轉(zhuǎn)到子程序KK1 MOV R3,#00H ;當(dāng)時為23時,清零 MOV R4,#00H ;清零時的

21、十位 AJMP LK1 ;絕對轉(zhuǎn)移到LK1 KK1: INC R3 ;時的個位加一 AJMP LK1 ;絕對轉(zhuǎn)移到LK1 KK0: CJNE R3,#09H,KK1 ;當(dāng)時的個位不為9時,跳轉(zhuǎn)到子程序KK1 MOV R3,#00H ;將時的個位清零 INC R4 ;時的十位加一AJMP LK1 ;絕對轉(zhuǎn)移到LK1 LK1: ACALL DISPLAY ;設(shè)定結(jié)束,顯示設(shè)定時間 JNB P3.2,KS ;當(dāng)控制鬧鈴設(shè)置的P3.2口變?yōu)楦唠娖綍r,退出設(shè)定 MOV 50H,R1 ;保存鬧鈴時間 MOV 51H,R2 ;將分的十位保存到51H MOV 52H,R3 ;將時的個位保存到52H MOV 5

22、3H,R4 ;將時的十位保存到53H MOV R1,40H ;恢復(fù)時間 MOV R2,41H ;將分的十位還回給R2 MOV R3,42H ;將時的個位還回給R3 MOV R4,43H ;將時的十位還回給R4 ACALL DISPLAY ;顯示時間 RET SETCLOCK:JB P3.4,MN0 ;用P3.4口設(shè)定分,原理同鬧鈴設(shè)定,低電平有效 CJNE R1,#09H,MM0 ;當(dāng)分的個位不為9時,跳轉(zhuǎn)到子程序MM0 MOV R1,#00H ;將分的個位清零 CJNE R2,#05H,MM1 ;當(dāng)分的十位不為5時,跳轉(zhuǎn)到子程序MM1 MOV R2,#00H ;將分的十位清零 AJMP MN

23、0 ;絕對轉(zhuǎn)移到MN0 MM1: INC R2 ;分的十位加一 AJMP MN0 ;絕對轉(zhuǎn)移到MN0 MM0: INC R1 ;分的個位加一 MN0: ACALL DISPLAY ;調(diào)用顯示子程序 JB P3.5,MN1 ;用P3.5口設(shè)定時,低電平有效 CJNE R4,#02H,NN0 ;當(dāng)時的十位不為2時,跳轉(zhuǎn)到子程序MN0 CJNE R3,#03H,NN1 ;當(dāng)時的個位不為3時,跳轉(zhuǎn)到子程序MN1 MOV R3,#00H ;將時的個位清零MOV R4,#00H ;將時的十位清零 AJMP MN1 ;絕對轉(zhuǎn)移到MN1 NN1: INC R3 ;時的個位加一 AJMP MN1 ;絕對轉(zhuǎn)移到M

24、N1 NN0: CJNE R3,#09H,NN1 ;當(dāng)時的個位不為9時,跳轉(zhuǎn)到子程序MN1 MOV R3,#00H ;將時的個位清零 INC R4 ;時的十位加一 AJMP MN1 ;絕對轉(zhuǎn)移到MN1 MN1: ACALL DISPLAY ;調(diào)用顯示子程序 JNB P3.3,SETCLOCK ;若P3.3口仍處于低電平,繼續(xù)處于時間設(shè)定狀態(tài) RET DELAY: MOV TH1,#0ECH ;5ms延時子程序 MOV TL1,#78H ;賦初值60536,實現(xiàn)5000次計數(shù),歷時5ms CLR TF1 SETB TR1 WAIT: JNB TF1,WAIT RET END六、實驗連接圖七、實驗

25、調(diào)試八、實驗程序?qū)懭刖?、實驗誤差分析由于實驗程序中過多地使用軟件定時,使用查詢方式定時,而不是采用中斷方式,所以在實驗程序執(zhí)行過程中,語句執(zhí)行占用了一些時間,所以導(dǎo)致時間計算上存在誤差,在數(shù)碼顯示時也存在一些不理想的因素。以下為各程序段的誤差分析。1, 程序開始就判斷鬧鈴時間是否到,子程序中判斷時間大約為3us到12us,若響鈴,就還會有每秒30ms的延時,即30ms加12us.2, 判斷P3.2和P3.3口需要4us,但如果進入設(shè)置時間,則時間計時停止,不計入誤差。而每個1s里面的兩次循環(huán)里有3us*2=6us的誤差。1秒結(jié)束到判斷秒數(shù)是否為60中還有3us,所以共13us.3, 顯示子程序延時,因為有四個字節(jié)的顯示,除去4個5ms的延遲,誤差粗略估計為:2us + 6us * 4 = 26us.4, 如果秒數(shù)等于60,則進入時間邏輯,根據(jù)各位數(shù)字的不同情況,產(chǎn)生5us33us的誤差。綜上所述: 若不響鬧鈴且秒不到60

溫馨提示

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

評論

0/150

提交評論