题目:制作LED数码管显示的秒表,计时范围0.1~9.9s.

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
	ORG   0000H
LJMP MAIN
ORG 000BH ;T0中断入口
LJMP T0_INT

MAIN: ;初始化
MOV DPTR, #TAB ;将TAB所代表的地址送入DPTR
MOV TMOD, #01H ;设置T0为方式1计时
MOV IE, #82H ;打开EA和ET0(外部中断0)
MOV R2, #1

LP1:
MOV R3, #2
MOV R4, #10
MOV R5, #10

LP2:CLR TR0 ;计数运行控制位

M_LOOP:
CALL DISP ;调用显示
JNB P3.1, KK ;检测到按键则转移
SJMP M_LOOP ;循环


KK: CALL DISP ;延时
JB P3.1, M_LOOP ;消抖(为1则转移)

K1: CALL DISP
JNB P3.1, K1 ;等待释放
DJNZ R2, K2 ;按键次数(不为0则转移K2)
MOV R2, #3
SETB TR0 ;启动
SJMP M_LOOP
K2: CJNE R2, #1, LP2 ;暂停(R2与1不等则转LP2)
SJMP LP1 ;清零

DISP: ;显示
MOV P2, #07H ;000 001 11(毫秒位)
MOV A, R4
MOVC A, @A + DPTR ;查表指令
MOV P0, A
CALL DELAY
MOV P2, #0BH ;000 010 11(秒位)
MOV A, R5
MOVC A, @A + DPTR
SETB ACC.7 ;小数点
MOV P0, A
CALL DELAY

CJNE R5,#1,LAST_ST ;不相等则转移
CJNE R4,#1,LAST_ST
CLR TR0
MOV R2, #2
RET

TAB:
DB 0, 6FH, 7FH, 07H, 7DH, 6DH, 66H, 4FH, 5BH, 06H, 3FH ;定义变量,每读完一个,偏移量+1

DELAY:
DJNZ R7, $
DJNZ R7, $
RET

T0_INT: ;50ms中断一次
MOV TH0, #(65536 - 50000) / 256 ;晶振为12MHz的50ms定时器初值
MOV TL0, #(65536 - 50000) MOD 256
DJNZ R3, EE
MOV R3, #2
DJNZ R4, EE ;修改各个时间变量
MOV R4, #10
DJNZ R5, EE
MOV R5, #10
EE:
RETI ;尽快退出中断程序

LAST_ST:
RET
END

参考文献

51 汇编语言编程:0.00~99.9 秒表_做而论道的博客-CSDN博客

利用 51 单片机实现 0.0 ~ 10 秒表_做而论道的博客-CSDN博客