📄 amperage.lst
字号:
A51 MACRO ASSEMBLER AMPERAGE 06/23/2007 10:30:38 PAGE 1
MACRO ASSEMBLER A51 V7.10
OBJECT MODULE PLACED IN amperage.OBJ
ASSEMBLER INVOKED BY: C:\Keil\C51\BIN\A51.EXE amperage.asm SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1 ;---------------------------
2 ; 电流检测实例
3 ;功能:通过定时器定时从AD上读取电压数据,将电压数据通过
4 ; 数码管显示出来
5 ;---------------------------
6
0000 7 ORG 0000H
0000 02000E 8 LJMP START
0003 9 ORG 0003H
0003 0200C7 10 LJMP EXTERN_INT ; 外中断入口
000B 11 ORG 000BH
000B 0200A1 12 LJMP TIMER0_INT
0020 13 A_BIT EQU 20h ; 数码管个位数存放内存位置
0021 14 B_BIT EQU 21h ; 数码管十位数存放内存位置
15
16 ;-----------------------
17 ;进入初始化程序,初始化各个标志位,定时器
18 ;-----------------------
19
000E 20 START:
21 ;-----------------------
22 ;分配内存单元
23 ;-----------------------
24
000E 758150 25 MOV SP,#050H ; 设置堆栈
0011 7830 26 MOV R0,#030H ; 设置AD存储单元初始地址
0013 75A8FF 27 MOV IE,#0FFH ; 打开所有中断
0016 9078FF 28 MOV DPTR,#78FFH ; 采集通道首地址,只使用一路AD就可以
0019 7830 29 MOV R0,#30H
001B 7600 30 MOV @R0,#00H ; 清除AD采集来的电流
001D 7831 31 MOV R0,#31H
001F 7600 32 MOV @R0,#00H ; 清除发送缓存中的数据
0021 7841 33 MOV R0,#41H
0023 7600 34 MOV @R0,#00H ; 清除定时器每500毫秒的选择触发位
0025 7942 35 MOV R1,#042H
0027 7600 36 MOV @R0,#00H ; 清除定时器计数器
0029 120079 37 LCALL TIMER1_INIT ; 初始化定时器0和定时器1
38 ;---------------------------
39 ;进入主循环,如果查询到发送标志位就把采集的数据发送出去
40 ;---------------------------
41
42
002C 43 LOOP:
002C 7830 44 MOV R0,#30H ; 30H是AD转换的地址,把数据采集后存进30H中
002E E6 45 MOV A,@R0
002F 7831 46 MOV R0,#31H ; 将30H中的数据存放到发送缓存中去
0031 F6 47 MOV @R0,A ; 将AD转换后的数据存储进发送缓存中去
0032 7841 48 MOV R0,#41H ; 判断定时器是否来索要数据,
0034 E7 49 MOV A,@R1
0035 7006 50 JNZ DISPLAY
0037 7841 51 MOV R0,#41H ; 清除定时器触发标志位
0039 7700 52 MOV @R1,#00H
003B 80EF 53 SJMP LOOP ; 如果没有,返回循环继续查询标志位
54 ;----------------------------------
55 ;显示子程序
56 ;----------------------------------
003D 57 DISPLAY:
003D E531 58 MOV A,31H ; 将29H中的十六进制数转换成10进制
A51 MACRO ASSEMBLER AMPERAGE 06/23/2007 10:30:38 PAGE 2
003F 75F00A 59 MOV B,#10 ; 10进制/10=10进制
0042 84 60 DIV AB
0043 F521 61 MOV B_BIT,A ;十位在A
0045 85F020 62 MOV A_BIT,B ;个位在B
0048 90006F 63 MOV DPTR,#NUMTAB ; 指定查表启始地址
004B 7804 64 MOV R0,#4
004D 65 DPL1:
004D 79FA 66 MOV R1,#250 ; 显示1000次
004F 67 DPLOP:
004F E520 68 MOV A,A_BIT ; 取个位数
0051 93 69 MOVC A,@A+DPTR ; 查个位数的7段代码
0052 F580 70 MOV P0,A ; 送出个位的7段代码
0054 C2A0 71 CLR P2.0 ; 开个位显示
0056 116A 72 ACALL D1MS ; 显示1ms
0058 D2A0 73 SETB P2.0
005A E521 74 MOV A,B_BIT ; 取十位数
005C 93 75 MOVC A,@A+DPTR ; 查十位数的7段代码
005D F580 76 MOV P0,A ; 送出十位的7段代码
005F C2A1 77 CLR P2.1 ; 开十位显示
0061 116A 78 ACALL D1MS ;显示1ms
0063 D2A1 79 SETB P2.1
0065 D9E8 80 DJNZ R1,DPLOP ;100次没完循环
0067 D8E4 81 DJNZ R0,DPL1 ;4个100次没完循环
0069 22 82 RET
83 ;1MS延时
006A 84 D1MS:
006A 7F50 85 MOV R7,#80
006C DFFE 86 DJNZ R7,$
006E 22 87 RET
88 ;实验板上的7段数码管0~9数字的共阴显示代码
006F 3F065B4F 89 NUMTAB: DB 03FH,06H,5BH,4FH,66H,06DH,07DH,07H,07FH,06FH
0073 666D7D07
0077 7F6F
90
91 ;-----------------------
92 ; 初始化定时器,定时器0作为定时的触发
93 ;-----------------------
94
95
0079 96 TIMER1_INIT:
0079 53890F 97 ANL TMOD,#0FH ; 设置定时器1为方式2
007C 438910 98 ORL TMOD,#10H
007F 758921 99 MOV TMOD,#21H ; 定时器0工作在方式1
0082 758780 100 MOV PCON,#080H
0085 C28E 101 CLR TR1 ; 禁止定时器1
0087 D2AF 102 SETB EA ; 使能全部定时器
0089 D2AB 103 SETB ET1 ; 允许定时器1中断
008B D2A9 104 SETB ET0 ; 允许定时器0中断
008D D2B9 105 SETB PT0 ; 定时器0中断优于其余中断
008F C28F 106 CLR TF1 ; 清除定时器1中断标志位
0091 758A00 107 MOV TL0,#00H
0094 758C1F 108 MOV TH0,#01FH ; 定时器0中断发生时间为62.5毫秒
0097 758DFF 109 MOV TH1,#0FFH ; 定时器1波特率的设定为57600bps
009A D28C 110 SETB TR0 ; 使能定时器0
009C C28D 111 CLR TF0 ; 清除中断标志位
009E D28E 112 SETB TR1 ; 使能定时器1
00A0 22 113 RET
114
115
116 ;-----------------------
117 ; 进入定时器中断,每500毫秒设置一次标志位
118 ;-----------------------
00A1 119 TIMER0_INT:
00A1 C0E0 120 PUSH ACC ; 累加器入栈
00A3 C0D0 121 PUSH PSW ; 程序状态字入栈
00A5 75D010 122 MOV PSW,#10H ; 更换寄存器区域
A51 MACRO ASSEMBLER AMPERAGE 06/23/2007 10:30:38 PAGE 3
00A8 C28D 123 CLR TF0
00AA C28C 124 CLR TR0
00AC 758A00 125 MOV TL0,#00H
00AF 758C1F 126 MOV TH0,#01FH ; 定时器0中断发生时间为6
00B2 C28D 127 CLR TF0 ; 清除溢出中断位
00B4 7942 128 MOV R1,#042H
00B6 07 129 INC @R1 ; 增加计数器的值,到8为止,这样达到500毫秒
00B7 B70806 130 CJNE @R1,#08H,TIMER0_READY
00BA 7700 131 MOV @R1,#00H ; 清除计数器的值
00BC 7941 132 MOV R1,#041H ; 设置标志位,每500毫秒采集一次数据
00BE 7701 133 MOV @R1,#01H
00C0 134 TIMER0_READY:
00C0 D28C 135 SETB TR0 ; 使能定时器0
00C2 D0D0 136 POP PSW ; 程序状态字出栈
00C4 D0E0 137 POP ACC ; 累加器出栈
00C6 32 138 RETI
139 ;-----------------------
140 ; 进入外部中断,每进入一次读取ADC的值
141 ;-----------------------
00C7 142 EXTERN_INT:
00C7 C0E0 143 PUSH ACC ; 累加器入栈
00C9 C0D0 144 PUSH PSW ; 程序状态字入栈
00CB 75D018 145 MOV PSW,#018H ; 更换寄存器区域
00CE 9078FF 146 MOV DPTR,#78FFH ; AD转换器首地址
00D1 E0 147 MOVX A,@DPTR
00D2 7930 148 MOV R1,#030H ; 存储AD转换器的数据的地址
00D4 F7 149 MOV @R1,A
00D5 D0D0 150 POP PSW ; 程序状态字出栈
00D7 D0E0 151 POP ACC ; 累加器出栈
00D9 32 152 RETI
153 END
A51 MACRO ASSEMBLER AMPERAGE 06/23/2007 10:30:38 PAGE 4
SYMBOL TABLE LISTING
------ ----- -------
N A M E T Y P E V A L U E ATTRIBUTES
ACC. . . . . . . . D ADDR 00E0H A
A_BIT. . . . . . . N NUMB 0020H A
B. . . . . . . . . D ADDR 00F0H A
B_BIT. . . . . . . N NUMB 0021H A
D1MS . . . . . . . C ADDR 006AH A
DISPLAY. . . . . . C ADDR 003DH A
DPL1 . . . . . . . C ADDR 004DH A
DPLOP. . . . . . . C ADDR 004FH A
EA . . . . . . . . B ADDR 00A8H.7 A
ET0. . . . . . . . B ADDR 00A8H.1 A
ET1. . . . . . . . B ADDR 00A8H.3 A
EXTERN_INT . . . . C ADDR 00C7H A
IE . . . . . . . . D ADDR 00A8H A
LOOP . . . . . . . C ADDR 002CH A
NUMTAB . . . . . . C ADDR 006FH A
P0 . . . . . . . . D ADDR 0080H A
P2 . . . . . . . . D ADDR 00A0H A
PCON . . . . . . . D ADDR 0087H A
PSW. . . . . . . . D ADDR 00D0H A
PT0. . . . . . . . B ADDR 00B8H.1 A
SP . . . . . . . . D ADDR 0081H A
START. . . . . . . C ADDR 000EH A
TF0. . . . . . . . B ADDR 0088H.5 A
TF1. . . . . . . . B ADDR 0088H.7 A
TH0. . . . . . . . D ADDR 008CH A
TH1. . . . . . . . D ADDR 008DH A
TIMER0_INT . . . . C ADDR 00A1H A
TIMER0_READY . . . C ADDR 00C0H A
TIMER1_INIT. . . . C ADDR 0079H A
TL0. . . . . . . . D ADDR 008AH A
TMOD . . . . . . . D ADDR 0089H A
TR0. . . . . . . . B ADDR 0088H.4 A
TR1. . . . . . . . B ADDR 0088H.6 A
REGISTER BANK(S) USED: 0
ASSEMBLY COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -