📄 sz03.lst
字号:
A51 MACRO ASSEMBLER SZ03 01/04/2007 21:53:58 PAGE 1
MACRO ASSEMBLER A51 V7.07
OBJECT MODULE PLACED IN SZ03.OBJ
ASSEMBLER INVOKED BY: C:\Keil 7.06\C51\BIN\A51.EXE SZ03.ASM SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1 ;----------------------------------------------------------
2 ;文件名称:SZ03.ASM
3 ;程序功能:带定时闹铃及倒计时时钟
4 ;----------------------------------------------------------
5 ;--------――― 时钟程序部分 ---――――――――
6 ;----- ――― 程序初始化 ――――――――――
7 ; 定义存放计时单元地址
8 ;....................
0000 9 ALB EQU 20H.0 ;闹铃设置标志
10 ;....................
0030 11 BUF EQU 30H ;30~33H 连续4字节存放显示器数据
0034 12 HOUR EQU 34H ;存放小时变量
0035 13 MIN EQU 35H ;存放分钟变量
0036 14 SEC EQU 36H ;存放秒钟变量
0037 15 DEDA EQU 37H ;存放5 ms 计数值
16 ;....................
0038 17 HH EQU 38H ;闹铃设置小时变量
0039 18 MM EQU 39H ;闹铃设置分钟变量
19 ;....................
20 ;--------------------------------
003A 21 SEC0 EQU 3AH ;存放旧的秒数
003B 22 MM_D EQU 3BH ;倒数时间分钟数
003C 23 SS_D EQU 3CH ;倒数时间秒钟数
24 ;--------------------------------
25 ;按键输入引脚定义
00A4 26 K1 EQU P2.4 ;按键1引脚定义
00A5 27 K2 EQU P2.5 ;按键2引脚定义
00A6 28 K3 EQU P2.6 ;按键3引脚定义
00A7 29 K4 EQU P2.7 ;按键4引脚定义
30
31 ;压电喇叭和指示灯引脚定义
00B4 32 SPK EQU P3.4 ;压电喇叭控制信号
0090 33 WLED EQU P1.0 ;工作指示灯引脚定义
34
35 ;程序开始执行地址
0000 36 ORG 0H ;程序代码由地址0开始执行
0000 800B 37 JMP MAIN
000B 38 ORG 0BH ;定时器 0 中断地址设置
000B 8056 39 JMP TO_SRV
40
41 ;--------- 主 程 序 --------――
42
000D 43 MAIN: ;开始
44 ;...................
000D C200 45 CLR ALB ;清除闹铃标志
46 ;...................
000F 3138 47 ACALL BZ ;压电喇叭连续两次鸣响一声
0011 3138 48 ACALL BZ
0013 3145 49 ACALL LED_BL ;LED 闪动,表示程序开始执行
0015 312B 50 ACALL INIT ;初始变化量
0017 1154 51 ACALL INIT_TIMER ;设置定时器
52
53 ;加载显示器初值数据
0019 74C0 54 MOV A, #0C0H
001B F580 55 MOV P0, A
56
57 ;无穷循环
001D 58 LOOP: ;无穷循环
A51 MACRO ASSEMBLER SZ03 01/04/2007 21:53:58 PAGE 2
001D 119E 59 ACALL CONV ;转换 时时 分分 数据
60 ;....................
001F 31BF 61 ACALL TIME_PRO ;检查闹铃时间
62 ;....................
0021 11D1 63 ACALL DISP ;扫描显示
64
0023 20A406 65 JB K1, M1 ;未按下K1键则继续扫描
0026 3145 66 ACALL LED_BL ;LED闪动
0028 11EB 67 ACALL SET_TIME ;设置目前时间
002A 80F1 68 JMP LOOP ;继续循环执行
69
70 ;设置闹铃时间
002C 20A506 71 M1:JB K2,M2 ;未按下K2键则继续扫描
72 ;.....................
002F 3145 73 ACALL LED_BL
0031 3161 74 ACALL SET_ATIME ;设置闹铃时间
75 ;.....................
0033 80E8 76 JMP LOOP ;继续循环执行
77
78 ;设置倒计时间
0035 20A606 79 M2:JB K3, M3 ;未按下K3键则继续扫描
80 ;---------------------------------
0038 3145 81 ACALL LED_BL
003A 31E5 82 ACALL DOWN_ATIME ;设置倒计时间
83 ;--------------------------------
003C 80DF 84 JMP LOOP ;继续循环执行
85
003E 20A711 86 M3:JB K4,M4 ;未按下K4键则继续扫描
87 ;...................
0041 B200 88 CPL ALB
0043 300008 89 JNB ALB,M31
90
91 ;闹铃启动连续3次发出响声
0046 3138 92 ACALL BZ
0048 3138 93 ACALL BZ
004A 3138 94 ACALL BZ
95 ;...................
004C 80CF 96 JMP LOOP ;继续循环执行
97 ;....................
004E 98 M31:
004E 3138 99 ACALL BZ ;闹铃停止,发出一声响
0050 80CB 100 JMP LOOP ;继续循环执行
101 ;...................
0052 102 M4:
0052 80C9 103 JMP LOOP ;继续循环执行
104
105 ;----- 实现走时功能的子程序 ------――
106
107 ;使用定时器0模式0计时
0054 108 INIT_TIMER: ;初始化定时器,使用定时器0模式1计时
0054 758900 109 MOV TMOD,#00000000B ;设置定时器0工作模式为0
0057 75A882 110 MOV IE, #10000010B ;启用定时器0中断产生
005A 758A1C 111 MOV TL0, #(8192-4900)MOD 32 ;加载低字节
005D 758C66 112 MOV TH0, #(8192-4900)/32 ;加载高字节
0060 D28C 113 SETB TR0 ;启动定时器0开始计时
0062 22 114 RET
115 ;-----------―――
116 ;中断服务程序
0063 117 TO_SRV: ;定时器0计时中断程序每隔5ms中断一次
0063 C0E0 118 PUSH ACC ;将累加器放入堆栈
0065 758A1C 119 MOV TL0, #(8192-4900)MOD 32 ;加载低字节
0068 758C66 120 MOV TH0, #(8192-4900)/32 ;加载高字节
006B 0537 121 INC DEDA ;5ms计数值加1
122 ;秒输出
006D E537 123 MOV A, DEDA
006F B4C829 124 CJNE A,#200,TT1 ;是否1s到了
A51 MACRO ASSEMBLER SZ03 01/04/2007 21:53:58 PAGE 3
0072 753700 125 MOV DEDA, #0 ;计数值清除为0
0075 B290 126 CPL WLED ;LED灯亮灭变换
0077 0536 127 INC SEC ;秒计数加1
0079 E536 128 MOV A, SEC
007B B43C1D 129 CJNE A, #60, TT1;是否1min到了
130 ;分输出
007E 0535 131 INC MIN ;分计数加1
0080 753600 132 MOV SEC, #0 ;秒计数清除为0
0083 E535 133 MOV A, MIN
0085 B43C13 134 CJNE A, #60, TT1 ;是否1h到了
135 ;时输出
0088 0534 136 INC HOUR ;小时计数加1
008A 753500 137 MOV MIN, #0 ;分计数清除为0
008D E534 138 MOV A, HOUR
008F B41809 139 CJNE A,#24, TT1 ;是否24h到了
0092 753600 140 MOV SEC, #0 ;秒钟变量清除为0
0095 753500 141 MOV MIN, #0 ;分钟变量清除为0
0098 753400 142 MOV HOUR, #0 ;小时变量清除为0
009B 143 TT1:
009B D0E0 144 POP ACC ;将累加器由堆栈取出
009D 32 145 RETI
146
147 ;----―― 实现显示功能的子程序 ---――――
148
149 ;转换 时时:分分 数据
009E 150 CONV:
151 ;转换小时数据
009E E534 152 MOV A, HOUR
00A0 75F00A 153 MOV B, #10
00A3 84 154 DIV AB
00A4 9000C1 155 MOV DPTR,#TABLE ;查表转换
00A7 93 156 MOVC A, @A+DPTR
00A8 F530 157 MOV BUF, A
00AA E5F0 158 MOV A, B
00AC 93 159 MOVC A, @A+DPTR
00AD F531 160 MOV BUF+1, A
161 ;转换分钟数据
00AF E535 162 MOV A, MIN
00B1 75F00A 163 MOV B, #10
00B4 84 164 DIV AB
00B5 9000C1 165 MOV DPTR,#TABLE ;查表转换
00B8 93 166 MOVC A, @A+DPTR
00B9 F532 167 MOV BUF+2, A
00BB E5F0 168 MOV A, B
00BD 93 169 MOVC A, @A+DPTR
00BE F533 170 MOV BUF+3, A
00C0 22 171 RET
172
173 ;字型数据编码表
00C1 174 TABLE:
00C1 C0F9A4B0 175 DB 0C0H,0F9H,0A4H,0B0H
00C5 999282F8 176 DB 99H,92H,82H,0F8H
00C9 80908883 177 DB 80H,90H,88H,83H
00CD C6A1868E 178 DB 0C6H,0A1H,86H,8EH
179
180 ;---------――――
181 ;扫描显示
00D1 182 DISP:
00D1 7830 183 MOV R0, #BUF ;指向显示器显示缓冲区起始地址
00D3 7A04 184 MOV R2, #4 ;循环执行4次
00D5 75E0F7 185 MOV ACC, #11110111b;加载扫描信号初值11110111B
00D8 186 S1:
00D8 C0E0 187 PUSH ACC
00DA E6 188 MOV A, @R0 ;取出显示器数据
00DB F580 189 MOV P0, A ;由P0送出一位显示器数据
00DD D0E0 190 POP ACC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -