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

📄 amperage.lst

📁 电流检测实例 功能:通过定时器定时从AD上读取电压数据
💻 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 + -