電子秒表課程設計
1. 設計要求 用AT89C52設計一個用液晶顯示作為“秒表”:顯示時間為時,分,秒,每秒自動加1,另設計四個按鍵,按下按鍵1后,可發現led停止閃爍,即時鐘停止走時,時鐘停在當前時刻,按下按鍵2和按鍵3后,可改變時間,按下按鍵4后,時鐘復位到修改后的時間,時鐘重新開始運轉。 2. 實驗原理 題目難點在于通過對鍵盤的掃描對時鐘的走時/停止進行控制,項目采用定時器T0作為計時器,每10ms發生一次中斷,每100次中斷加1s。在此期間,如“開始”按鍵按下,程序方將TR0置為1,從而開啟中斷,時鐘開始走時。 系統總體方案 本系統采用AT89C52單片機為中心器件,利用其定時器/計數器定時和記數的原理,結合硬件電路如電源電路,復位電路,顯示電路,以及一些按鍵電路等來設計計時器,將軟、硬件有機地結合起來。其中軟件系統采用匯編語言編寫程序,包括顯示程序,計數程序,中斷,硬件系統利用PROTEUS強大的功能來實現,簡單切易于觀察,在仿真中就可以觀察到實際的工作狀態。 仿真圖
0.png (121.9 KB, 下載次數: 68)
下載附件
2016-6-21 13:15 上傳
設計是培養學生綜合運用所學知識,發現,提出,分析和解決實際問題,鍛煉實踐能力的重要環節,是對學生實際工作能力的具體訓練和考察過程,在此次的設計中我學會很多,同時在設計的過程中發現了自己的不足之處,對以前所學過的知識理解得不夠深刻,掌握得不夠牢固,比如說不懂一些元器件的使用方法,對單片機匯編語言掌握得不好……通過這次課程設計之后,一定把以前所學過的知識重新溫故。 在做設計的日子里老師和同學給了我們很大的幫助,再次對你們表示衷心的感謝!
0.png (13.63 KB, 下載次數: 57)
下載附件
2016-6-21 13:13 上傳
0.png (26.94 KB, 下載次數: 91)
下載附件
2016-6-21 13:14 上傳
0.png (341.94 KB, 下載次數: 61)
下載附件
2016-6-21 13:16 上傳
秒表匯編程序:
- LCDRS BIT P2.0
- lCDEN BIT P2.2
- LCD EQU P3
-
- LED BIT P2.4
-
- NUM EQU 20H
- MIAO EQU 21H
- FEN EQU 22H
- SHI EQU 23H
- SITE EQU 24H
- MIAO_L EQU 25H
- FEN_L EQU 26H
- SHI_L EQU 26H
- KNUM EQU 27H
- ORG 0000H
- LJMP MAIN
- ORG 000BH
- LJMP IT0P
-
- MAIN: LCALL INITL
- LCALL INITT
- MOV SP, #60H
- MOV MIAO, #00H
- MOV FEN, #00H
- MOV SHI, #00H
- MOV KNUM, #00H
- SETB LED
-
- HERE: LCALL SM
- LCALL SF
- LCALL SS
- LCALL KEY4
- LCALL KEY1
- LCALL JIA
- LCALL JIAN
- LJMP HERE
-
- INITL: CLR LCDEN
- MOV R1, #38H
- LCALL LCDWC
- MOV R1, #0CH
- LCALL LCDWC
- MOV R1, #06H
- LCALL LCDWC
- MOV R1, #01H
- LCALL LCDWC
- MOV R1, #80H
- LCALL LCDWC
- LCALL LCDT1
- LCALL LCDT3
- MOV R1, #0C9H
- LCALL LCDWC
- MOV R1, #3AH
- LCALL LCDWD
- MOV R1, #0CCH
- LCALL LCDWC
- MOV R1, #3AH
- LCALL LCDWD
- RET
- INITT: CLR A
- MOV B, #10
- MOV R4, #0FH
- MOV NUM, #0AH
- MOV TMOD, #01H
- MOV TH0, #4CH
- MOV TL0, #0D0H
- SETB EA
- SETB ET0
- SETB TR0
- RET
- LCDWC: CLR LCDRS
- MOV LCD, R1
- LCALL DELYMS
- SETB LCDEN
- LCALL DELYMS
- CLR LCDEN
- RET
- LCDWD: SETB LCDRS
- MOV LCD, R1
- LCALL DELYMS
- SETB LCDEN
- LCALL DELYMS
- CLR LCDEN
- RET
- DELYMS: MOV R7, #5
- MOV R6, #110
- DEL: DJNZ R7, DEL1
- DEL1: DJNZ R6, DEL
- RET
- DELY: MOV R7, #40
- DEL12: MOV R6, #123
- DEL11: DJNZ R6, DEL11
- NOP
- DJNZ R7, DEL12
- RET
- LCDT1: MOV DPTR, #0000H
- MOV R2, #12
- MOV B, #80H
- MOV DPTR,#TAB1
- MOVC A, @A + DPTR
- MOV R1, B
- LCALL LCDWC
- MOV R1, A
- LCALL LCDWD
- LCDT2: CLR A
- INC DPTR
- INC B
- MOVC A, @A + DPTR
- MOV R1, B
- LCALL LCDWC
- MOV R1, A
- LCALL LCDWD
- DJNZ R2, LCDT2
- RET
- LCDT3: MOV R2, #4
- MOV B, #0BFH
- LCDT4: CLR A
- INC DPTR
- INC B
- MOVC A, @A + DPTR
- MOV R1, B
- LCALL LCDWC
- MOV R1, A
- LCALL LCDWD
- DJNZ R2, LCDT4
- RET
- IT0P: PUSH PSW
- PUSH Acc
- MOV TH0, #4CH
- MOV TL0, #0D0H
- DJNZ NUM, LOOPT
- MOV NUM, #14H
- INC MIAO
- MOV A, MIAO
- CJNE A, #60, LOOPT
- MOV MIAO, #00
- INC FEN
- MOV A, FEN
- CJNE A, #60, LOOPT
- MOV FEN, #00
- MOV A, SHI
- CJNE A, #24, LOOPT
- MOV SHI, #00
-
- LOOPT: POP Acc
- POP PSW
- RETI
- SM: MOV A, MIAO
- DIV AB
- MOV MIAO_L,B
- MOV SITE, #0CDH
- LCALL SHOW
- MOV SITE, #0CEH
- MOV A, MIAO_L
- LCALL SHOW
- MOV B, #10
- RET
-
- SF: MOV A, FEN
- DIV AB
- MOV FEN_L, B
- MOV SITE, #0CAH
- LCALL SHOW
- MOV SITE, #0CBH
- MOV A, FEN_L
- LCALL SHOW
- MOV B, #10
- RET
- SS: MOV A, SHI
- DIV AB
- MOV SHI_L, B
- MOV SITE, #0C7H
- LCALL SHOW
- MOV SITE, #0C8H
- MOV A, SHI_L
- LCALL SHOW
- MOV B, #10
- RET
- SHOW: MOV DPTR, #0000H
- MOV DPTR, #TAB2
- MOVC A, @A + DPTR
- MOV R1, SITE
- LCALL LCDWC
- MOV R1, A
- LCALL LCDWD
- RET
-
- KEY1: MOV A, P1
- CJNE A, #0FEH, LOOPK2
- LCALL DELY
- CJNE A, #0FEH, LOOPK2
- WAIT1: JNB P1.0, WAIT1
- CPL TR0
- CPL LED
- RET
- LOOPK2: RET
- KEY4: MOV A, P1
- CJNE A, #0F7H, LOOPK2
- LCALL DELY
- CJNE A, #0F7H, LOOPK
- WAIT4: JNB P1.3, WAIT4
- INC KNUM
- MOV R4, KNUM
- K1: CJNE R4, #01, k2
- CPL TR0
- MOV DPTR, #TABM
- LCALL TISHI
- K2: CJNE R4, #02, K3
- MOV DPTR, #TABF
- LCALL TISHI
- K3: CJNE R4, #03, K4
- MOV DPTR, #TABS
- LCALL TISHI
- k4: CJNE R4, #04, LOOPK
- MOV KNUM, #00H
- MOV R4, #00H
- SETB TR0
- MOV DPTR, #TABI
- LCALL TISHI
- RET
- TISHI:
- MOV R2, #7
- MOV B, #86H
- MOVC A, @A + DPTR
- MOV R1, B
- LCALL LCDWC
- MOV R1, A
- LCALL LCDWD
- LCDT5: CLR A
- INC DPTR
- INC B
- MOVC A, @A + DPTR
- MOV R1, B
- LCALL LCDWC
- MOV R1, A
- LCALL LCDWD
- DJNZ R2, LCDT5
- RET
- TABM: DB " SECOND "
- TABF: DB " MINUTE "
- TABS: DB " HOUR "
- TABI: DB " CHINA "
-
- LOOPK: RET
- JIA: MOV A, KNUM
- CJNE A, #00H, KEY2
- RET
- KEY2: MOV A, P1
- CJNE A, #0FDH, LOOPK
- LCALL DELY
- CJNE A, #0FDH, LOOPK
- WAIT2: JNB P1.1, WAIT2
- MOV A, KNUM
- MJIA: CJNE A, #01, FJIA
- INC MIAO
- LCALL LOOPKM
- MOV A, MIAO
- CJNE A, #60, LOOPK
- MOV MIAO, #00H
- LCALL LOOPKM
- FJIA: CJNE A, #02, SJIA
- INC FEN
- LCALL LOOPKF
- MOV A, FEN
- CJNE A, #60, LOOPK
- MOV FEN, #00H
- LCALL LOOPKF
- SJIA: CJNE A, #03, LOOPK
- INC SHI
- LCALL LOOPKS
- MOV A, SHI
- CJNE A, #24, LOOPK
- MOV SHI, #00H
- LCALL LOOPKS
- RET
- JIAN: MOV A, KNUM
- CJNE A, #00H, KEY3
- RET
- KEY3: MOV A, P1
- CJNE A, #0FBH, LOOPK
- LCALL DELY
- CJNE A, #0FBH, LOOPK
- WAIT3: JNB P1.2, WAIT3
- MOV A, KNUM
- MJIAN: CJNE A, #01, FJIAN
- MOV A, MIAO
- CJNE A, #00, MJIAN0
- MOV MIAO, #59
- LCALL LOOPKM
- RET
- MJIAN0: DEC MIAO
- LCALL LOOPKM
- FJIAN: CJNE A, #02, SJIAN
- MOV A, FEN
- CJNE A, #00, FJIAN0
- MOV FEN, #59
- LCALL LOOPKF
- RET
- FJIAN0: DEC FEN
- LCALL LOOPKF
- SJIAN: CJNE A, #03, LOOPK1
- MOV A, SHI
- CJNE A, #00, SJIAN0
- MOV SHI, #23
- LCALL LOOPKS
- RET
- SJIAN0: DEC SHI
- LCALL LOOPKS
- RET
- LOOPK1: RET
- LOOPKM: LCALL SM
- RET
- LOOPKF: LCALL SF
- RET
- LOOPKS: LCALL SS
- RET
-
-
- TAB1: DB "H.I.T. CHINA", "TIME"
- TAB2: DB 30H, 31H, 32H, 33H, 34H, 35H, 36H, 37H, 38H,39H
- END
復制代碼
單片機秒表c語言程序
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code china[] = " H.I.T CHINA";
- uchar code time[] = " TIME ";
- void delayms(uchar xms);
- void key_scan();
- void write_sfm(uchar add, uchar date);
- sbit lcdrs = P2^0;
- sbit write = P2^1;
- sbit lcden = P2^2;
- sbit led = P2^4;
- sbit key1 = P1^0;
- sbit key2 = P1^1;
- sbit key3 = P1^2;
- sbit key4 = P1^3;
- uchar num, miao, shi, fen, knum;
- void delayms(uchar xms){
- uchar i,j;
- for(i = xms; i > 0; i --)
- for(j = 110;j>0;j--);
- }
- void write_com(uchar com){
- lcdrs = 0;
- P3 = com;
- delayms(5);
- lcden = 1;
- delayms(5);
- lcden = 0;
- }
- void write_date(uchar date){
- lcdrs = 1;
- P3 = date;
- delayms(5);
- lcden = 1;
- delayms(5);
- lcden = 0;
- }
- void write_sfm(uchar add, uchar date){
- uchar shi,ge;
- shi = date/10;
- ge = date%10;
- write_com(0x80 + 0x40 + add);
- write_date(0x30 + shi);
- write_date(0x30 + ge);
- }
- void init(){
- lcden = 0;
- write_com(0x38);
- write_com(0x0c);
- write_com(0x06);
- write_com(0x01);
- write_com(0x80);
- write = 0;
- for(num = 0;num < 13;num++){
- write_date(china[num]);
- delayms(5);
- }
- write_com(0x80 + 0x40);
- for(num = 0;num < 6;num++){
- write_date(time[num]);
- delayms(5);
- }
- write_com(0x80 + 0x40 + 8);
- write_date(':');
- write_com(0x80 + 0x40 + 11);
- write_date(':');
- write_sfm(6, 0);
- write_sfm(9, 0);
- write_sfm(12, 0);
- TMOD = 0x01;
- TH0 = (65536 - 45872)/256;
- TL0 = (65536 - 45872)%256;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- }
- void key_scan(){
- if(key1 == 0) {
- delayms(5);
- if(key1 == 0) {
- while(!key1);
- TR0 = ~TR0;
- led = ~led;
- }
- }
-
- if(key4 == 0) {
- delayms(5);
- if(key4 == 0) {
- knum++;
- while(!key4);
- if(knum == 1){
- TR0 = ~TR0;
- write_com(0x80 + 0x40 + 12);
- write_com(0x0f);
- }
- if(knum == 2){
- write_com(0x80 + 0x40 + 9);
- }
- if(knum == 3){
- write_com(0x80 + 0x40 + 6);
- }
- if(knum == 4){
- knum = 0;
- write_com(0x0c);
- TR0 = 1;
- }
- }
- }
- if(knum != 0){
- if(key2 == 0){
- delayms(5);
- if(key2 == 0){
- while(!key2);
- if(knum == 1){
- miao++;
- if(miao == 60)
- miao = 0;
- write_sfm(12, miao);
- write_com(0x80 + 0x40 + 12);
- }
- if(knum == 2){
- fen++;
- if(fen == 60)
- fen = 0;
- write_sfm(9, fen);
- write_com(0x80 + 0x40 + 9);
- }
- if(knum == 3){
- shi++;
- if(shi == 24)
- shi = 0;
- write_sfm(6, shi);
- write_com(0x80 + 0x40 + 6);
- }
- }
- }
- if(key3 == 0){
- delayms(5);
- if(key3 == 0){
- while(!key3);
- if(knum == 1){
- miao--;
- if(miao == -1)
- miao = 59;
- write_sfm(12, miao);
- write_com(0x80 + 0x40 + 12);
- }
- if(knum == 2){
- fen--;
- if(fen == -1)
- fen = 59;
- write_sfm(9, fen);
- write_com(0x80 + 0x40 + 9);
- }
- if(knum == 3){
- shi--;
- if(shi == -1)
- shi = 23;
- write_sfm(6, shi);
- write_com(0x80 + 0x40 + 6);
- }
- }
- }
- }
- }
- void T0_time() interrupt 1{
- TH1 = (65536 - 45872)/256;
- TL1 = (65536 - 45872)%256;
- num++;
- if(num == 20){
- num = 0;
- miao++;
- if(miao== 60){
- miao = 0;
- fen++;
- if(fen == 60){
- fen = 0;
- shi++;
- if(shi == 24){
- shi = 0;
- }
- write_sfm(6, shi);
- }
- write_sfm(9, fen);
- }
- write_sfm(12, miao);
- }
- }
- void main(){
- init();
-
- while(1){
- //write_sfm(10, 10);
- key_scan();
- }
- }
復制代碼
0.png (68.18 KB, 下載次數: 54)
下載附件
2016-6-21 13:17 上傳
0.png (44.2 KB, 下載次數: 73)
下載附件
2016-6-21 13:17 上傳
|