实验具体内容

在 Proteus 环境下搭建如下图所示的电路图:

img

控制要求

图 3.9 中 7SEG2 为十位显示数码管,7SEG1 为个位显示数码管,KEY_LOAD 为倒计时初值按钮,KEY_START 为倒计时启动按钮。要求实现的功能是:当 KEY_LOAD 按钮按下时加载倒计时初值(如:10s),当按下 KEY_START 按钮时,开始倒计时,每过 1s,计时器减 1,直到减到“00”为止。减到“00”时使P3.0 引脚上的 LED 按 10Hz 频率进行闪烁,直到再次 按下 KEY_LOAD 按钮才重新加载初值,并熄灭 LED。再次按下 KEY_START 按钮又一次开始倒 计时,如此反复。

编程思路

分析两个 373 的地址:

假定所有无关地址均定义为 1,那么 U2的锁存地址为:#0FE00H,U3的锁存地址为:#0FD00H。

流程图

image-20220212124332190

实验过程

① 根据上述实验内容,在 Proteus 环境下建立如上图所示原理图,并将其保存为 staticLED_self.DSN 文件。

② 根据编程思路和流程图编写控制源程序,将其保存为 staticLED_self.asm。

③ 将源程序添加到 U1 中,并构造(build)该程序。

④ 执行仿真过程观察秒表程序功能是否正确。

实验截图:

开始自动装载:

img

按下倒计时开始按钮并等待按钮松开,开始计时:

img

倒计时结束LED以10Hz频率闪烁:

img

按下装载按钮并松开,LED灭,并装载倒计时初值(装载按钮按下松开前LED继续闪烁且不装载倒计时初值):

img

实验源程序

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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
    ORG 0000H
   AJMP START

   ORG 0030H
START:
   MOV SP,#60H     ;设置堆栈指针
   MOV R6,#1       ;倒计时器十位初值
   MOV R7,#0       ;倒计时器个位初值
LCALL LOAD      ;调用LOAD子程序
LCALL DISPLAY   ;调用DISPLAY子程序
SETB P3.0       ;P3.0 = 1,使LED灭灯
LOOP:
   SETB P1.1       ;P1.1 = 1
   JB P1.1,GOON    ;若P1.1 =1,则说明未按下装载按钮,跳转到GOON标号;否则进入WAIT0进行装载初值
WAIT0:
   SETB P1.1       ;P1.1 = 1
LCALL DELAY50ms    ;调用DELAY50ms子程序延时50ms
CPL P3.0        ;对P3.0位取反
   JNB P1.1,WAIT0  ;当P1.1 = 0,跳转到WAIT0标号。这里跳转的意义是使得如果LOAD按钮按下未松开,则LED始终以10Hz频率闪烁
MOV R6,#1       ;倒计时器十位初值
   MOV R7,#0       ;倒计时器个位初值
   LCALL LOAD      ;调用LOAD子程序
LCALL DISPLAY   ;调用DISPLAY子程序
SETB P3.0       ;P3^0 = 1,关闭LED
GOON:
   JB P1.0,$       ;若P1.0 = 1,则说明按下开始按钮为按下,等待按下开始计时按钮
WAIT1:
   SETB P1.0       ;P1.0 = 1
   JNB P1.0,WAIT1  ;若P1.0 = 0,说明开始计时按钮按下未松开,等待按钮松开
;以上代码为重载后按下并弹起开关

NEXT1:
MOV R4,#20     ;R4 = 20
DELAY1s:
LCALL DELAY50ms ;调用50ms延时程序
DJNZ R4,DELAY1s
   LCALL ADJUST        ;调用调整数值子程序
   LCALL DISPLAY       ;调用数码管显示数值子程序
   SJMP NEXT1          ;跳转到NEXT1

DELAY50ms:              ;延时50ms子程序
   MOV R7,#5
DL1:
   MOV R6,#100
DL2:
   MOV R5,#48
   DJNZ R5,$
   DJNZ R6,DL2
   DJNZ R7,DL1
   RET

ADJUST:             ;调整数值子程序
   MOV A,30H       ;将30H单元的内容传给A
   JZ BRO          ;如果内容为0则跳转到BRO
   DEC 30H         ;否则让30H单元中的内容减1
   SJMP RET1       ;无条件跳转到RET
BRO:
   MOV A,31H       ;将31H单元的内容传给A
   JZ WAIT2        ;如果内容为0则跳转到WAIT2
   MOV 30H,#9     ;将30H单元的内容更新为9
   DEC 31H         ;31H单元中的内容减1
RET1:
   RET             ;子程序返回
WAIT2:              ;跳转到这里说明倒计时结束,使LED以10Hz频率闪烁并等待装载按钮按下
LCALL DELAY50ms
CPL P3.0
   JB P1.1,WAIT2
   SJMP LOOP       ;无条件跳转到LOOP

LOAD:               ;装载子程序
   MOV 30H,R7      ;将30H作为个位数据存储的地方
   MOV 31H,R6      ;将31H作为十位数据存储的地方
   CLR A           ;A = 0
   MOV DPTR,#TABLE ;使DPTR指向表格入口
   MOVC A,@A+DPTR
   MOV DPTR,#D1sADD
   MOVX @DPTR,A
   MOV DPTR,#D10sADD
   MOVX @DPTR,A
   RET

DISPLAY:            
   MOV A,30H      
   MOV DPTR,#TABLE
   MOVC A,@A+DPTR ;将30H对应数字的7段LED共阳显示码传给A
   MOV DPTR,#D1sADD   ;指向和1s七段LED相连的373
   MOVX @DPTR,A       ;将显示码传给373输出
   MOV A,31H
   MOV DPTR,#TABLE
   MOVC A,@A+DPTR ;将31H对应数字的7段LED共阳显示码传给A
   MOV DPTR,#D10sADD   ;指向和10s七段LED相连的373
   MOVX @DPTR,A       ;将显示码传给373输出
   RET


TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;7 段 LED 共阳显示码
D1sADD EQU 0FE00H
D10sADD EQU 0FD00H

END