电子秒表课程设计
1. 设计要求 用AT89C52设计一个用液晶显示作为“秒表”:显示时间为时,分,秒,每秒自动加1,另设计四个按键,按下按键1后,可发现led停止闪烁,即时钟停止走时,时钟停在当前时刻,按下按键2和按键3后,可改变时间,按下按键4后,时钟复位到修改后的时间,时钟重新开始运转。 2. 实验原理 题目难点在于通过对键盘的扫描对时钟的走时/停止进行控制,项目采用定时器T0作为计时器,每10ms发生一次中断,每100次中断加1s。在此期间,如“开始”按键按下,程序方将TR0置为1,从而开启中断,时钟开始走时。 系统总体方案 本系统采用AT89C52单片机为中心器件,利用其定时器/计数器定时和记数的原理,结合硬件电路如电源电路,复位电路,显示电路,以及一些按键电路等来设计计时器,将软、硬件有机地结合起来。其中软件系统采用汇编语言编写程序,包括显示程序,计数程序,中断,硬件系统利用PROTEUS强大的功能来实现,简单切易于观察,在仿真中就可以观察到实际的工作状态。 仿真图
设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程,在此次的设计中我学会很多,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说不懂一些元器件的使用方法,对单片机汇编语言掌握得不好……通过这次课程设计之后,一定把以前所学过的知识重新温故。 在做设计的日子里老师和同学给了我们很大的帮助,再次对你们表示衷心的感谢!
秒表汇编程序:
- 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();
- }
- }
复制代码
|