51单片机的内部定时器定时中断,用汇编程序编写一段电子秒表程序。
如何使用中断
ORG 0000H
AJMP MAIN;
ORG 001BH
AJMP NEXT;
ORG 0100H
MAIN:
MOV TMOD, #10H;
MOV TH1, #3CH;
MOV TL1, #0B0H;设置定时时长
SETB EA;
SETB ET1;
SETB TR1;
使用定时器比较重要的一点就是要为中断程序腾出一段位置,防止中断程序位置被其他程序(主程序挤占),没办法正常执行,定时器单次定时时间最长为216乘以机器周期,假设单片机频率为12MHz,那么机器周期为
1
12
×
1
0
6
×
12
=
1
u
s
\frac{1}{12×10^{6}}×12=1us
12×1061×12=1us
那么定时器单次定时时间最长为65536us,约为65ms,这是我们使用定时器时需要注意的。
如何管理秒分时进位和清零
每秒后取秒出来进行判断,若到了60,就执行进位操作,若不到60,则继续定时
主程序不断给P1,P2赋值,以稳定显示时间,中断移除,则优先执行中断服务,即判断是否需要更新时间。程序如下
ORG 0000H
AJMP MAIN;
ORG 001BH
AJMP NEXT;
ORG 0100H
MAIN: MOV 20H, #2;
MOV 21H, #3;
MOV 22H, #10;
MOV 23H, #5;
MOV 24H, #9;
MOV 25H, #10;
MOV 26H, #1;
MOV 27H, #0;
MOV R3, #0;
MOV TMOD, #10H;
MOV TH1, #3CH;
MOV TL1, #0B0H;
SETB EA;
SETB ET1;
SETB TR1;
PRE:
MOV R0, #20H;
MOV R7, #8;
MOV DPTR, #TAB;
MOV R1, #11111110B;
DIR:
MOV A, @R0;
MOVC A, @A+DPTR;
MOV R2, A;
MOV P2, R1;
MOV P1, R2;
INC R0
MOV A, R1;
RL A;
MOV R1, A;
DJNZ R7, DIR;
SJMP PRE;
NEXT:
MOV TH1, #3CH;
MOV TL1, #0B0H;
INC R3;
CJNE R3,#20,EXIT;
MOV R3,#0;
MOV A,26H;
MOV B,#10;
MUL AB;
ADD A,27H;
INC A;
MOV R4,A;
MOV B,#10;
DIV AB;
MOV 26H,A;
MOV 27H,B;
CJNE R4,#60,EXIT
MOV R4,#0;
MOV 26H,#0;
MOV 27H,#0;
MOV A,23H;
MOV B,#10;
MUL AB;
ADD A,24H;
INC A;
MOV R5,A;
MOV B,#10;
DIV AB;
MOV 23H,A;
MOV 24H,B;
CJNE R5,#60,EXIT;
MOV 23H,#0;
MOV 24H,#0;
MOV A,20H;
MOV B,#10;
MUL AB;
ADD A,21H;
INC A;
MOV R6,A;
MOV B,#10;
DIV AB;
MOV 20H,A;
MOV 21H,B;
CJNE R6,#24,EXIT;
MOV 20H,#0;
MOV 21H,#0;
EXIT:
RETI
TAB:
DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH
DB 00H