子項(xiàng)目五數(shù)字鐘_第1頁(yè)
子項(xiàng)目五數(shù)字鐘_第2頁(yè)
子項(xiàng)目五數(shù)字鐘_第3頁(yè)
子項(xiàng)目五數(shù)字鐘_第4頁(yè)
子項(xiàng)目五數(shù)字鐘_第5頁(yè)
已閱讀5頁(yè),還剩19頁(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、子項(xiàng)目五:數(shù)字鐘目標(biāo):通過(guò)完成數(shù)字鐘綜合設(shè)計(jì), 使學(xué)生進(jìn)一步掌握keilC編譯器的使用和proteus仿真軟件進(jìn)行仿真的基本過(guò)程。進(jìn)一步了解單片機(jī)C51程序設(shè)計(jì)基礎(chǔ),了解單片機(jī)鍵盤(pán)掃描技術(shù)、及動(dòng)態(tài)顯示技術(shù)。任務(wù):由易到難設(shè)計(jì)計(jì)數(shù)器、計(jì)時(shí)器、秒表、鍵盤(pán)、動(dòng)態(tài)顯示和數(shù)字鐘。 一、原理1、0099計(jì)數(shù)器利用 AT89S51 單片機(jī)來(lái)制作一個(gè)手動(dòng)計(jì)數(shù)器, 在 AT89S51 單片機(jī)的 P3.7 管腳接一個(gè)輕觸開(kāi)關(guān),作為手動(dòng)計(jì)數(shù)的按鈕,用單片機(jī)的 P2.0P2.7 接一個(gè)共陰數(shù)碼管,作為 0099 計(jì)數(shù)的個(gè)位數(shù)顯示,用單片機(jī)的 P0.0P0.7 接一個(gè)共陰數(shù)碼管, 作為 0099計(jì)數(shù)的十位數(shù)顯示。2、0

2、059秒計(jì)時(shí)器在 AT89S51 單片機(jī)的 P0 和 P2 端口分別接有兩個(gè)共陰數(shù)碼管,P0 口驅(qū)動(dòng)顯示秒時(shí)間的十位,而 P2 口驅(qū)動(dòng)顯示秒時(shí)間的個(gè)位。3、99秒表設(shè)計(jì)開(kāi)始時(shí),顯示“00” ,第 1 次按下 SP1 后就開(kāi)始計(jì)時(shí)。 第 2 次按 SP1 后,計(jì)時(shí)停止。第 3 次按 SP1 后,計(jì)時(shí)歸零。4、4×4 矩陣式鍵盤(pán)識(shí)別技術(shù)用 AT89S51 的并行口 P1 接 4×4 矩陣鍵盤(pán),以 P1.0P1.3 作輸入線,以 P1.4P1.7 作輸出線;在數(shù)碼管上顯示每個(gè)按鍵的“0F”序號(hào)。對(duì)應(yīng)的按鍵的序號(hào)排列如圖所示:5、動(dòng)態(tài)數(shù)碼顯示技術(shù)P0 端口接動(dòng)態(tài)數(shù)碼管的字形碼筆段,

3、P2 端口接動(dòng)態(tài)數(shù)碼管的數(shù)位選擇端,P1.7 接一個(gè)開(kāi)關(guān),當(dāng)開(kāi)關(guān)接高電平時(shí),顯示“12345678”字樣;當(dāng)開(kāi)關(guān)接低電平時(shí),顯示“HELLOHEL”字樣。6、數(shù)字鐘P3.0控制位選,P3.1控制增加,沒(méi)按一下加一,P3.2控制設(shè)定結(jié)束,P3.3顯示日期。二、原理圖繪制1、0099計(jì)數(shù)器2、0059秒計(jì)時(shí)器3、99秒表設(shè)計(jì)4、4×4 矩陣式鍵盤(pán)識(shí)別技術(shù)5、動(dòng)態(tài)數(shù)碼顯示技術(shù)6、數(shù)字鐘三、程序設(shè)計(jì)(1)0099計(jì)數(shù)器1、單片機(jī)對(duì)按鍵的識(shí)別的過(guò)程處理,單片機(jī)對(duì)正確識(shí)別的按鍵進(jìn)行計(jì)數(shù),計(jì)數(shù)滿時(shí),又從零開(kāi)始計(jì)數(shù);單片機(jī)對(duì)計(jì)的數(shù)值要進(jìn)行數(shù)碼顯示,計(jì)得的數(shù)是十進(jìn)數(shù),含有十位和個(gè)位,我們要把十位和個(gè)位

4、拆開(kāi)分別送出這樣的十位和個(gè)位數(shù)值到對(duì)應(yīng)的數(shù)碼管上顯示。如何拆開(kāi)十位和個(gè)位我們可以把所計(jì)得的數(shù)值對(duì) 10 求余,即可個(gè)位數(shù)字,對(duì) 10 整除,即可得到十位數(shù)字了。通過(guò)查表方式,分別顯示出個(gè)位和十位數(shù)字。2、程序框圖3、匯編源程序 Count EQU 30H SP1 BIT P3.7 ORG 0 START: MOV Count,#00H NEXT: MOV A,Count MOV B,#10 DIV AB MOVDPTR,#TABLE MOVC A,A+DPTR MOV P0,A MOV A,B MOVC A,A+DPTRMOV P2,A WT: JNB SP1,WT WAIT: JB SP1,

5、WAIT LCALL DELY10MS JB SP1,WAIT INC Count MOV A,Count CJNE A,#100,NEXT LJMP START DELY10MS: MOV R6,#20 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 RET TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END4、 C 語(yǔ)言源程序 #include <AT89X51.H> unsigned char code table=0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07

6、,0x7f,0x6f; unsigned char Count; void delay10ms(void) unsigned char i,j; for(i=20;i>0;i-) for(j=248;j>0;j-); void main(void) Count=0; P0=tableCount/10; P2=tableCount%10; while(1) if(P3_7=0) delay10ms(); if(P3_7=0) Count+; if(Count=100) Count=0; P0=tableCount/10; P2=tableCount%10; while(P3_7=0)

7、; (2)0059秒計(jì)時(shí)器1、在設(shè)計(jì)過(guò)程中我們用一個(gè)存儲(chǔ)單元作為秒計(jì)數(shù)單元,當(dāng)一秒鐘到來(lái)時(shí),就讓秒計(jì)數(shù)單元加 1,當(dāng)秒計(jì)數(shù)達(dá)到 60時(shí),就自動(dòng)返回到 0,從新秒計(jì)數(shù)。對(duì)于秒計(jì)數(shù)單元中的數(shù)據(jù)要把它十位數(shù)和個(gè)數(shù)分開(kāi), 方法仍采用對(duì) 10 整除和對(duì) 10求余。在數(shù)碼上顯示,仍通過(guò)查表的方式完成。一秒時(shí)間的產(chǎn)生在這里我們采用軟件精確延時(shí)的方法來(lái)完成, 經(jīng)過(guò)精確計(jì)算得到 1秒時(shí)間為 1.002 秒。 DELY1S: MOV R5,#100 D2: MOV R6,#20 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 DJNZ R5,D2 RET2、程序框圖3、匯編源程序 Sec

8、ond EQU 30H ORG 0 START: MOV Second,#00H NEXT: MOV A,SecondMOV B,#10 DIV AB MOV DPTR,#TABLE MOVC A,A+DPTR MOV P0,A MOV A,B MOVC A,A+DPTR MOV P2,A LCALL DELY1S INC Second MOV A,Second CJNE A,#60,NEXT LJMP START DELY1S: MOV R5,#100 D2: MOV R6,#20 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 DJNZ R5,D2 RET TAB

9、LE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END4、 C 語(yǔ)言源程序#include <AT89X51.H> unsigned char code table=0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f; unsigned char Second; void delay1s(void) unsigned char i,j,k; for(k=100;k>0;k-) for(i=20;i>0;i-) for(j=248;j>0;j-); void main(v

10、oid) Second=0; P0=tableSecond/10; P2=tableSecond%10; while(1) delay1s(); Second+;if(Second=60) Second=0; P0=tableSecond/10; P2=tableSecond%10; (3)99秒表設(shè)計(jì)1、程序框圖主程序框圖中斷服務(wù)程序框圖3、匯編源程序 TCNTA EQU 30H TCNTB EQU 31H SEC EQU 32H KEYCNT EQU 33H SP1 BIT P3.5 ORG 00HLJMP START ORG 0BH LJMP INT_T0 START: MOV KEYC

11、NT,#00H MOV SEC,#00H MOV A,SEC MOV B,#10 DIV AB MOV DPTR,#TABLE MOVC A,A+DPTR MOV P0,A MOV A,B MOV DPTR,#TABLE MOVC A,A+DPTR MOV P2,A MOV TMOD,#02H SETB ET0 SETB EA WT: JB SP1,WT LCALL DELY10MS JB SP1,WT INC KEYCNT MOV A,KEYCNT CJNE A,#01H,KN1 SETB TR0 MOV TH0,#06H MOV TL0,#06H MOV TCNTA,#00H MOV TC

12、NTB,#00H LJMP DKN KN1: CJNE A,#02H,KN2 CLR TR0 LJMP DKN KN2: CJNE A,#03H,DKN MOV SEC,#00H MOV A,SEC MOV B,#10 DIV AB MOV DPTR,#TABLE MOVC A,A+DPTR MOV P0,A MOV A,B MOV DPTR,#TABLE MOVC A,A+DPTR MOVP2,A MOV KEYCNT,#00H DKN: JNB SP1,$ LJMP WT DELY10MS: MOV R6,#20 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 R

13、ET INT_T0: INC TCNTAMOV A,TCNTA CJNE A,#100,NEXT MOV TCNTA,#00H INC TCNTB MOV A,TCNTB CJNE A,#4,NEXT MOV TCNTB,#00H INC SEC MOV A,SEC CJNE A,#100,DONE MOV SEC,#00H DONE: MOV A,SEC MOV B,#10 DIV AB MOV DPTR,#TABLE MOVC A,A+DPTR MOV P0,A MOV A,B MOV DPTR,#TABLE MOVC A,A+DPTR MOV P2,A NEXT: RETI TABLE:

14、 DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END4、 C 語(yǔ)言源程序 #include <AT89X51.H> unsigned char code dispcode=0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x00; unsigned charsecond; unsigned char keycnt; unsigned int tcnt; void main(void) unsigned char i,j; T

15、MOD=0x02; ET0=1; EA=1; second=0; P0=dispcodesecond/10; P2=dispcodesecond%10; while(1) if(P3_5=0) for(i=20;i>0;i-) for(j=248;j>0;j-);if(P3_5=0) keycnt+; switch(keycnt) case 1: TH0=0x06; TL0=0x06; TR0=1; break; case 2: TR0=0; break; case 3: keycnt=0; second=0; P0=dispcodesecond/10; P2=dispcodese

16、cond%10; break; while(P3_5=0); void t0(void) interrupt 1 using 0 tcnt+; if(tcnt=400) tcnt=0; second+; if(second=100) second=0; P0=dispcodesecond/10; P2=dispcodesecond%10; (4) 4×4 矩陣式鍵盤(pán)識(shí)別技術(shù)1、4×4 矩陣鍵盤(pán)識(shí)別處理每個(gè)按鍵有它的行值和列值 ,行值和列值的組合就是識(shí)別這個(gè)按鍵的編碼。矩陣的行線和列線分別通過(guò)兩并行接口和 CPU 通信。每個(gè)按鍵的狀態(tài)同樣需變成數(shù)字量“0”和“1” ,開(kāi)關(guān)的一

17、端(列線)通過(guò)電阻接 VCC,而接地是通過(guò)程序輸出數(shù)字“0”實(shí)現(xiàn)的。鍵盤(pán)處理程序的任務(wù)是:確定有無(wú)鍵按下,判斷哪一個(gè)鍵按下,鍵的功能是什么;還要消除按鍵在閉合或斷開(kāi)時(shí)的抖動(dòng)。兩個(gè)并行口中,一個(gè)輸出掃描碼,使按鍵逐行動(dòng)態(tài)接地,另一個(gè)并行口輸入按鍵狀態(tài),由行掃描值和回饋信號(hào)共同形成鍵編碼而識(shí)別按鍵,通過(guò)軟件查表,查出該鍵的功能。2、程序框圖3、匯編程序KEYBUF EQU 30H ORG 00H START: MOV KEYBUF,#2 WAIT: MOV P3,#0FFH CLR P3.4 MOV A,P3 ANL A,#0FHXRL A,#0FH JZ NOKEY1 LCALL DELY10M

18、S MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY1 MOV A,P3 ANL A,#0FH CJNE A,#0EH,NK1 MOV KEYBUF,#0 LJMP DK1 NK1: CJNE A,#0DH,NK2 MOV KEYBUF,#1 LJMP DK1 NK2: CJNE A,#0BH,NK3 MOV KEYBUF,#2 LJMP DK1 NK3: CJNE A,#07H,NK4 MOV KEYBUF,#3 LJMP DK1 NK4: NOP DK1: MOV A,KEYBUF MOV DPTR,#TABLE MOVC A,A+DPTR MOV P0,A

19、DK1A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ DK1A NOKEY1: MOV P3,#0FFH CLR P3.5 MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY2 LCALL DELY10MS MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY2 MOV A,P3 ANL A,#0FH CJNE A,#0EH,NK5 MOV KEYBUF,#4 LJMP DK2 NK5: CJNE A,#0DH,NK6 MOV KEYBUF,#5 LJMP DK2 NK6: CJNE A,#0BH,NK7 MOV

20、 KEYBUF,#6 LJMP DK2 NK7: CJNE A,#07H,NK8MOV KEYBUF,#7 LJMP DK2 NK8: NOP DK2: MOV A,KEYBUF MOV DPTR,#TABLE MOVC A,A+DPTR MOV P0,A DK2A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ DK2A NOKEY2: MOV P3,#0FFH CLR P3.6 MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY3 LCALL DELY10MS MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY

21、3 MOV A,P3 ANL A,#0FH CJNE A,#0EH,NK9 MOV KEYBUF,#8 LJMP DK3 NK9: CJNE A,#0DH,NK10 MOV KEYBUF,#9 LJMP DK3 NK10: CJNE A,#0BH,NK11 MOV KEYBUF,#10 LJMP DK3 NK11: CJNE A,#07H,NK12 MOV KEYBUF,#11 LJMP DK3 NK12: NOP DK3: MOV A,KEYBUF MOV DPTR,#TABLE MOVC A,A+DPTR MOV P0,A DK3A: MOV A,P3 ANL A,#0FH XRL A,#

22、0FH JNZ DK3A NOKEY3: MOV P3,#0FFH CLR P3.7 MOV A,P3 ANL A,#0FH XRL A,#0FHJZ NOKEY4 LCALL DELY10MS MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY4 MOV A,P3 ANL A,#0FH CJNE A,#0EH,NK13 MOV KEYBUF,#12 LJMP DK4 NK13: CJNE A,#0DH,NK14 MOV KEYBUF,#13 LJMP DK4 NK14: CJNE A,#0BH,NK15 MOV KEYBUF,#14 LJMP DK4 NK15:

23、CJNE A,#07H,NK16 MOV KEYBUF,#15 LJMP DK4 NK16: NOP DK4: MOV A,KEYBUF MOV DPTR,#TABLE MOVC A,A+DPTR MOV P0,A DK4A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ DK4A NOKEY4: LJMP WAIT DELY10MS: MOV R6,#10 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 RET TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH,39H,5

24、EH,79H,71H END4、C語(yǔ)言程序#include <AT89X51.H> unsigned char code table=0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71; unsigned char temp; unsigned char key; unsigned char i,j; void main(void) while(1) P3=0xff; P3_4=0; temp=P3; temp=temp & 0x0f; if (temp!=0x

25、0f) for(i=50;i>0;i-) for(j=200;j>0;j-); temp=P3; temp=temp & 0x0f; if (temp!=0x0f) temp=P3; temp=temp & 0x0f; switch(temp) case 0x0e: key=7; break; case 0x0d: key=8; break; case 0x0b: key=9; break; case 0x07: key=10; break; temp=P3; P1_0=P1_0; P0=tablekey; temp=temp & 0x0f; while(t

26、emp!=0x0f) temp=P3; temp=temp & 0x0f; P3=0xff; P3_5=0; temp=P3; temp=temp & 0x0f; if (temp!=0x0f) for(i=50;i>0;i-)for(j=200;j>0;j-); temp=P3; temp=temp & 0x0f; if (temp!=0x0f) temp=P3; temp=temp & 0x0f; switch(temp) case 0x0e: key=4; break; case 0x0d: key=5; break; case 0x0b: k

27、ey=6; break; case 0x07: key=11; break; temp=P3; P1_0=P1_0; P0=tablekey; temp=temp & 0x0f; while(temp!=0x0f) temp=P3; temp=temp & 0x0f; P3=0xff; P3_6=0; temp=P3; temp=temp & 0x0f; if (temp!=0x0f) for(i=50;i>0;i-) for(j=200;j>0;j-); temp=P3; temp=temp & 0x0f; if (temp!=0x0f) temp

28、=P3; temp=temp & 0x0f; switch(temp) case 0x0e:key=1; break; case 0x0d: key=2; break; case 0x0b: key=3; break; case 0x07: key=12; break; temp=P3; P1_0=P1_0; P0=tablekey; temp=temp & 0x0f; while(temp!=0x0f) temp=P3; temp=temp & 0x0f; P3=0xff; P3_7=0; temp=P3; temp=temp & 0x0f; if (temp

29、!=0x0f) for(i=50;i>0;i-) for(j=200;j>0;j-); temp=P3; temp=temp & 0x0f; if (temp!=0x0f) temp=P3; temp=temp & 0x0f; switch(temp) case 0x0e: key=0; break; case 0x0d: key=13; break; case 0x0b: key=14; break; case 0x07: key=15;break; temp=P3; P1_0=P1_0; P0=tablekey; temp=temp & 0x0f; while(temp!=0x0f) temp=P3; temp=temp & 0x0f; (5) 動(dòng)態(tài)數(shù)碼顯示技術(shù)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)論