📄 battery.lst
字号:
A51 MACRO ASSEMBLER BATTERY 06/23/2007 10:32:08 PAGE 1
MACRO ASSEMBLER A51 V7.10
OBJECT MODULE PLACED IN battery.OBJ
ASSEMBLER INVOKED BY: C:\Keil\C51\BIN\A51.EXE battery.asm SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1 ;----------------------------------
2 ; 智能充电器实例
3 ;功能:通过定时器定时从AD上读取数据,根据不同的电压选择不同的控制
4 ; 充电方案,使用PWM控制输出脉宽来控制电流
5 ;-----------------------------------
6
0000 7 ORG 0000H
0000 02000E 8 LJMP START
0003 9 ORG 0003H
0003 0200FC 10 LJMP EXTERN_INT ; 外中断入口
000B 11 ORG 000BH
000B 0200D6 12 LJMP TIMER0_INT ; 定时器中断入口
13 ;-----------------------
14 ; 程序开始,初始化各个寄存器以及标志位
15 ;-----------------------
000E 16 START:
000E 758150 17 MOV SP,#050H ; 设置堆栈
0011 7830 18 MOV R0,#030H ; 设置AD存储单元初始地址
0013 75A8FF 19 MOV IE,#0FFH ; 打开所有中断
0016 9078FF 20 MOV DPTR,#78FFH ; 采集通道首地址,只使用一路AD就可以
0019 7840 21 MOV R0,#40H
001B 7600 22 MOV @R0,#00H ; 清除方案选择位
001D 7840 23 MOV R0,#40H
001F 7600 24 MOV @R0,#00H ; 清除方案选择触发位
0021 7942 25 MOV R1,#042H
0023 7600 26 MOV @R0,#00H ; 清除定时器计数器
0025 1200B3 27 LCALL TIMER1_INIT
28 ;-----------------------
29 ; 进入循环,查询标志位,采取不同的方案
30 ;-----------------------
31
0028 32 LOOP:
0028 7830 33 MOV R0,#30H ; 30H是AD转换的地址,将数据和几个值进行比较,确定方案
002A E6 34 MOV A,@R0
002B 9430 35 SUBB A,#30H ; 当电压很小的时候,采用第一种方案,向引脚PWM发送占空比为10%的信号
002D 401A 36 JC PROCESS_01
002F E6 37 MOV A,@R0
0030 9490 38 SUBB A,#90H
0032 4034 39 JC PROCESS_02 ; 当电压较小的时候,采用第二种方案,向引脚PWM发送占空比为20%的信号
0034 E6 40 MOV A,@R0
0035 9490 41 SUBB A,#90H
0037 604E 42 JZ PROCESS_03 ; 当电压正好的时候,采用第三种方案,向引脚PWM发送占空比为50%的信号
0039 7404 43 MOV A,#04H ; 当电压超出的时候,采用第四种方案,向引脚PWM发送占空比为0%的信号
003B 0200A6 44 LJMP PROCESS_04
45
003E 46 CLEAR_FLAG:
003E 7840 47 MOV R0,#40H ; 清除方案选择位
0040 7600 48 MOV @R0,#00H
0042 7841 49 MOV R0,#41H ; 清除触发位
0044 7600 50 MOV @R0,#00H
0046 020028 51 LJMP LOOP
0049 52 PROCESS_01:
0049 7940 53 MOV R1,#040H
004B 7701 54 MOV @R1,#01H ; 选择方案1
004D 55 PROCESS_01_NEXT:
004D D2A0 56 SETB P2.0 ; 将和PWM连接的管脚置高
004F 79F0 57 MOV R1,#0F0H
0051 7800 58 MOV R0,#00H
A51 MACRO ASSEMBLER BATTERY 06/23/2007 10:32:08 PAGE 2
0053 59 PROCESS_01_01:
0053 D9FE 60 DJNZ R1,PROCESS_01_01
0055 D8FC 61 DJNZ R0,PROCESS_01_01 ; 空跑16*256*2个周期
0057 C2A0 62 CLR P2.0 ; 将和PWM连接的管脚置低
0059 7970 63 MOV R1,#070H
005B 7800 64 MOV R0,#00H
005D 65 PROCESS_01_02:
005D D9FE 66 DJNZ R1,PROCESS_01_02
005F D8FC 67 DJNZ R0,PROCESS_01_02 ; 空跑16*256*2*9个周期
0061 7941 68 MOV R1,#041H ; 当方案改变标志位到来的时候,清除标志并且重新进行判断
0063 B700D8 69 CJNE @R1,#00H,CLEAR_FLAG
0066 80E5 70 SJMP PROCESS_01_NEXT
0068 71 PROCESS_02:
0068 7940 72 MOV R1,#040H
006A 7702 73 MOV @R1,#02H ; 选择方案2
006C 74 PROCESS_02_NEXT:
006C D2A0 75 SETB P2.0 ; 将和PWM连接的管脚置高
006E 79E0 76 MOV R1,#0E0H
0070 7800 77 MOV R0,#00H
0072 78 PROCESS_02_01:
0072 D9FE 79 DJNZ R1,PROCESS_02_01
0074 D8FC 80 DJNZ R0,PROCESS_02_01 ; 空跑16*256*2个周期
0076 C2A0 81 CLR P2.0 ; 将和PWM连接的管脚置低
0078 7980 82 MOV R1,#080H
007A 7800 83 MOV R0,#00H
007C 84 PROCESS_02_02:
007C D9FE 85 DJNZ R1,PROCESS_02_02
007E D8FC 86 DJNZ R0,PROCESS_02_02 ; 空跑16*256*2*8个周期
0080 7941 87 MOV R1,#041H ; 当方案改变标志位到来的时候,清除标志并且重新进行判断
0082 B700B9 88 CJNE @R1,#00H,CLEAR_FLAG
0085 80E5 89 SJMP PROCESS_02_NEXT
0087 90 PROCESS_03:
0087 7940 91 MOV R1,#040H
0089 7703 92 MOV @R1,#03H ; 选择方案3
008B 93 PROCESS_03_NEXT:
008B D2A0 94 SETB P2.0 ; 将和PWM连接的管脚置高
008D 79B0 95 MOV R1,#0B0H
008F 7800 96 MOV R0,#00H
0091 97 PROCESS_03_01:
0091 D9FE 98 DJNZ R1,PROCESS_03_01
0093 D8FC 99 DJNZ R0,PROCESS_03_01 ; 空跑16*256*2*2个周期
0095 C2A0 100 CLR P2.0 ; 将和PWM连接的管脚置低
0097 79B0 101 MOV R1,#0B0H
0099 7800 102 MOV R0,#00H
009B 103 PROCESS_03_02:
009B D9FE 104 DJNZ R1,PROCESS_03_02
009D D8FC 105 DJNZ R0,PROCESS_03_02 ; 空跑16*256*2*7个周期
009F 7941 106 MOV R1,#041H ; 当方案改变标志位到来的时候,清除标志并且重新进行判断
00A1 B7009A 107 CJNE @R1,#00H,CLEAR_FLAG
00A4 80E5 108 SJMP PROCESS_03_NEXT
00A6 109 PROCESS_04:
00A6 C2A0 110 CLR P2.0
00A8 7940 111 MOV R1,#040H
00AA 7704 112 MOV @R1,#04H ; 选择方案4
00AC 7941 113 MOV R1,#041H
00AE B7008D 114 CJNE @R1,#00H,CLEAR_FLAG
00B1 80F3 115 SJMP PROCESS_04
00B3 116 TIMER1_INIT:
00B3 53890F 117 ANL TMOD,#0FH ; 设置定时器1为方式2
00B6 438910 118 ORL TMOD,#10H
00B9 758921 119 MOV TMOD,#21H ; 定时器0工作在方式1
00BC 758780 120 MOV PCON,#080H
00BF C28E 121 CLR TR1 ; 禁止定时器1
00C1 D2AF 122 SETB EA
00C3 D2AB 123 SETB ET1
00C5 D2A9 124 SETB ET0
A51 MACRO ASSEMBLER BATTERY 06/23/2007 10:32:08 PAGE 3
00C7 D2B9 125 SETB PT0 ; 定时器0中断优于串口中断
00C9 C28F 126 CLR TF1
00CB 758A00 127 MOV TL0,#00H
00CE 758C1F 128 MOV TH0,#01FH ; 定时器0中断发生时间为62.5毫秒
00D1 D28C 129 SETB TR0 ; 使能定时器0
00D3 C28D 130 CLR TF0
00D5 22 131 RET;
132 ;-----------------------
133 ; 进入定时器中断,每500毫秒设置一次标志位
134 ;-----------------------
00D6 135 TIMER0_INT:
00D6 C0E0 136 PUSH ACC ; 累加器入栈
00D8 C0D0 137 PUSH PSW ; 程序状态字入栈
00DA 75D018 138 MOV PSW,#18H ; 切换寄存器区域
00DD C28D 139 CLR TF0 ; 清除定时器中断TF0
00DF C28C 140 CLR TR0 ; 禁止定时器0
00E1 758A00 141 MOV TL0,#00H
00E4 758C1F 142 MOV TH0,#01FH ; 定时器0中断发生时间为6
00E7 C28D 143 CLR TF0 ; 清除溢出中断位
00E9 7942 144 MOV R1,#042H
00EB 07 145 INC @R1 ; 增加计数器的值,到8为止,这样达到500毫秒
00EC B70806 146 CJNE @R1,#08H,TIMER0_READY
00EF 7700 147 MOV @R1,#00H ; 清除计数器的值
00F1 7941 148 MOV R1,#041H ; 设置标志位,每500毫秒重新选择方案
00F3 7701 149 MOV @R1,#01H
00F5 150 TIMER0_READY:
00F5 D28C 151 SETB TR0 ; 使能定时器0
00F7 D0D0 152 POP PSW ; 程序状态字出栈
00F9 D0E0 153 POP ACC ; 累加器出栈
00FB 32 154 RETI
155 ;-----------------------
156 ; 进入外部中断,每进入一次读取ADC的值
157 ;-----------------------
158
00FC 159 EXTERN_INT:
00FC C0E0 160 PUSH ACC ; 累加器压栈
00FE C0D0 161 PUSH PSW ; 程序状态字压栈
0100 75D010 162 MOV PSW,#010H ; 切换寄存器区域
0103 9078FF 163 MOV DPTR,#78FFH ; AD转换器首地址
0106 E0 164 MOVX A,@DPTR ; 读入AD的值
0107 7930 165 MOV R1,#030H ; 存储AD转换器的数据的地址
0109 F7 166 MOV @R1,A ; 将AD的值读入该地址
010A D0D0 167 POP PSW ; 程序状态字出栈
010C D0E0 168 POP ACC ; 累加器出栈
010E 32 169 RETI
170 END
A51 MACRO ASSEMBLER BATTERY 06/23/2007 10:32:08 PAGE 4
SYMBOL TABLE LISTING
------ ----- -------
N A M E T Y P E V A L U E ATTRIBUTES
ACC. . . . . . . . D ADDR 00E0H A
CLEAR_FLAG . . . . C ADDR 003EH A
EA . . . . . . . . B ADDR 00A8H.7 A
ET0. . . . . . . . B ADDR 00A8H.1 A
ET1. . . . . . . . B ADDR 00A8H.3 A
EXTERN_INT . . . . C ADDR 00FCH A
IE . . . . . . . . D ADDR 00A8H A
LOOP . . . . . . . C ADDR 0028H A
P2 . . . . . . . . D ADDR 00A0H A
PCON . . . . . . . D ADDR 0087H A
PROCESS_01 . . . . C ADDR 0049H A
PROCESS_01_01. . . C ADDR 0053H A
PROCESS_01_02. . . C ADDR 005DH A
PROCESS_01_NEXT. . C ADDR 004DH A
PROCESS_02 . . . . C ADDR 0068H A
PROCESS_02_01. . . C ADDR 0072H A
PROCESS_02_02. . . C ADDR 007CH A
PROCESS_02_NEXT. . C ADDR 006CH A
PROCESS_03 . . . . C ADDR 0087H A
PROCESS_03_01. . . C ADDR 0091H A
PROCESS_03_02. . . C ADDR 009BH A
PROCESS_03_NEXT. . C ADDR 008BH A
PROCESS_04 . . . . C ADDR 00A6H 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
TIMER0_INT . . . . C ADDR 00D6H A
TIMER0_READY . . . C ADDR 00F5H A
TIMER1_INIT. . . . C ADDR 00B3H 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 + -