⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 battery.lst

📁 《51单片机应用开发案例精选配套源代码
💻 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 + -