📄 voltage.lst
字号:
A51 MACRO ASSEMBLER VOLTAGE 06/23/2007 10:19:55 PAGE 1
MACRO ASSEMBLER A51 V7.10
OBJECT MODULE PLACED IN voltage.OBJ
ASSEMBLER INVOKED BY: C:\Keil\C51\BIN\A51.EXE voltage.asm SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1 ;----------------------------------
2 ; 数字电压表实例
3 ; 功能:单片机通过ADC0804实现简单的数字电压表
4 ;-----------------------------------
5
6 ;//定义ADC的连接端口
00B6 7 ad_wr equ P3.6 ;芯片选择
00A0 8 ad_cs equ P2.0 ;转换开始
00B7 9 ad_rd equ P3.7 ;RD=LOW,数字信号输出
0090 10 ad_input_port equ p1 ;定义数据位
0059 11 Counter EQU 59H ;计数器,显示程序通过它得知现正显示哪个数码管
00A4 12 FIRST EQU P2.4 ;第一位数码管的位控制
00A5 13 SECOND EQU P2.5 ;第二位数码管的位控制
00A6 14 THEER EQU P2.6 ; 第三位数码管的位控制
005A 15 DISPBUF EQU 5AH ;显示缓冲区为5AH和5BH
16
0000 17 ORG 0000h
0000 0130 18 AJMP main
000B 19 ORG 000BH ;定时器T0的入口
000B 018E 20 AJMP DISP ;显示程序
0030 21 ORG 0030h
0030 22 MAIN:
0030 75815F 23 MOV SP,#5FH ;设置堆栈
0033 7590FF 24 MOV P1,#0FFH
0036 7580FF 25 MOV P0,#0FFH
0039 75A0FF 26 MOV P2,#0FFH ;初始化,所显示器,LED灭
003C 758901 27 MOV TMOD,#00000001B ;定时器T0工作于模式1(16位定时/计数模式)
003F 758CF8 28 MOV TH0,#HIGH(65536-2000)
0042 758A30 29 MOV TL0,#LOW(65536-2000)
0045 D28C 30 SETB TR0 ;开定时器0
0047 D2AF 31 SETB EA ;开总中断
0049 D2A9 32 SETB ET0 ;开定时器0中断
004B 755900 33 MOV Counter,#0 ;计数器初始化
004E 34 LOOP:
004E 120073 35 LCALL adc_demo ;调用AD子程序
0051 014E 36 AJMP LOOP
37
38 ;―――――――――――――――――――――――――
39 ; 启动AD转换
40 ;―――――――――――――――――――――――――
0053 41 Adc_Start:
0053 C2A0 42 CLR ad_cs
0055 00 43 NOP
0056 C2B6 44 CLR ad_wr
0058 00 45 NOP
0059 D2B6 46 SETB ad_wr
005B 00 47 NOP
005C D2A0 48 SETB ad_cs
005E 00 49 NOP
005F 22 50 RET
51 ;―――――――――――――――――――――――――
52 ; 读AD转换
53 ;―――――――――――――――――――――――――
0060 54 Adc_Read:
0060 7590FF 55 MOV AD_INPUT_PORT,#0FFH
0063 C2A0 56 CLR ad_cs
0065 00 57 NOP
0066 C2B7 58 CLR ad_rd
A51 MACRO ASSEMBLER VOLTAGE 06/23/2007 10:19:55 PAGE 2
0068 00 59 NOP
0069 00 60 NOP
006A E590 61 MOV A,AD_INPUT_PORT
006C 00 62 NOP
006D D2B7 63 SETB ad_rd
006F 00 64 NOP
0070 D2A0 65 SETB ad_cs
0072 22 66 RET
67 ;―――――――――――――――――――――――
68 ; AD转换读取延时程序,显示读到的数值
69 ;―――――――――――――――――――――――
0073 70 Adc_Demo:
0073 120053 71 LCALL Adc_Start
0076 1200D8 72 LCALL delay1ms
0079 120060 73 LCALL adc_read
007C 75F064 74 MOV B,#100 ; AD转换出的值除100商为百位数
007F 84 75 DIV AB ; 取百位数 余数在B寄存器
0080 F55A 76 MOV DISPBUF,A ; 把百位存入百位寄存器DISPBUF
0082 E5F0 77 MOV A,B ; 余数再送A
0084 75F00A 78 MOV B,#10 ; 余数除10商为十位数
0087 84 79 DIV AB ; 除法,余数在寄存器B
0088 F55B 80 MOV DISPBUF+1,A ; A是十位数存第二位显示寄存器
008A 85F05C 81 MOV DISPBUF+2,B ; B是个位数存第三位显示寄存器
008D 22 82 RET
83
84 ;――――――――――――――――――――――――――――
85 ; ; 定时器T0的中断响应,通过中断服务程序动态扫描
86 ;――――――――――――――――――――――――――――――
008E 87 DISP:
008E C0E0 88 PUSH ACC ; ACC入栈
0090 C0D0 89 PUSH PSW ; PSW入栈
0092 758CF8 90 MOV TH0,#HIGH(65536-2000); 定时时间为2000个周期,约2170微秒
0095 758A30 91 MOV TL0,#LOW(65536-2000)
0098 D2A4 92 SETB FIRST
009A D2A5 93 SETB SECOND ; 关显示
009C D2A6 94 SETB THEER
009E 745A 95 MOV A,#DISPBUF ; 显示缓冲区首地址
00A0 2559 96 ADD A,Counter
00A2 F8 97 MOV R0,A
00A3 E6 98 MOV A,@R0 ; 根据计数器的值取相应的显示缓冲区的值
00A4 9000CE 99 MOV DPTR,#DISPTAB ; 字形表首地址
00A7 93 100 MOVC A,@A+DPTR ; 取字形码
00A8 F580 101 MOV P0,A ; 将字形码送P0位(段口)
00AA E559 102 MOV A,Counter ; 取计数器的值
00AC 6007 103 JZ DISPFIRST ; 如果是0则显示第一位
00AE 14 104 DEC A
00AF 6008 105 JZ DISPSECOND ; 如果是1显示第二位
00B1 C2A6 106 CLR THEER ; 否则显示第3位
00B3 01BB 107 AJMP DISPNEXT
00B5 108 DISPFIRST:
00B5 C2A4 109 CLR FIRST ; 显示第一位
00B7 01BB 110 AJMP DISPNEXT
00B9 111 DISPSECOND:
00B9 C2A5 112 CLR SECOND
00BB 113 DISPNEXT:
00BB 0559 114 INC Counter ; 计数器加1
00BD E559 115 MOV A,Counter
00BF 14 116 DEC A ; 如果计数器计到3,则让它回0
00C0 14 117 DEC A
00C1 14 118 DEC A
00C2 6002 119 JZ RSTCOUNT
00C4 01C9 120 AJMP DISPEXIT
00C6 121 RSTCOUNT:
00C6 755900 122 MOV Counter,#0 ; 计数器的值回0
00C9 123 DISPEXIT:
00C9 D0D0 124 POP PSW
A51 MACRO ASSEMBLER VOLTAGE 06/23/2007 10:19:55 PAGE 3
00CB D0E0 125 POP ACC
00CD 32 126 RETI
00CE 287EA262 127 DISPTAB:DB 28h,7eh,0a2h,62h,74h,61h,21h,7ah,20h,60h ; 字形代码表
00D2 7461217A
00D6 2060
128 ;0 1 2 3 4 5 6 7 8 9
00D8 129 DELAY1ms: ; 延时子程序
00D8 7F0A 130 MOV R7,#10
00DA 131 MM:
00DA 7E32 132 MOV R6,#50
00DC DEFE 133 DJNZ R6,$ ;2us
00DE DFFA 134 DJNZ R7,MM
00E0 22 135 RET
136 END
A51 MACRO ASSEMBLER VOLTAGE 06/23/2007 10:19:55 PAGE 4
SYMBOL TABLE LISTING
------ ----- -------
N A M E T Y P E V A L U E ATTRIBUTES
ACC. . . . . . . . D ADDR 00E0H A
ADC_DEMO . . . . . C ADDR 0073H A
ADC_READ . . . . . C ADDR 0060H A
ADC_START. . . . . C ADDR 0053H A
AD_CS. . . . . . . B ADDR 00A0H.0 A
AD_INPUT_PORT. . . D ADDR 0090H A
AD_RD. . . . . . . B ADDR 00B0H.7 A
AD_WR. . . . . . . B ADDR 00B0H.6 A
B. . . . . . . . . D ADDR 00F0H A
COUNTER. . . . . . N NUMB 0059H A
DELAY1MS . . . . . C ADDR 00D8H A
DISP . . . . . . . C ADDR 008EH A
DISPBUF. . . . . . N NUMB 005AH A
DISPEXIT . . . . . C ADDR 00C9H A
DISPFIRST. . . . . C ADDR 00B5H A
DISPNEXT . . . . . C ADDR 00BBH A
DISPSECOND . . . . C ADDR 00B9H A
DISPTAB. . . . . . C ADDR 00CEH A
EA . . . . . . . . B ADDR 00A8H.7 A
ET0. . . . . . . . B ADDR 00A8H.1 A
FIRST. . . . . . . B ADDR 00A0H.4 A
LOOP . . . . . . . C ADDR 004EH A
MAIN . . . . . . . C ADDR 0030H A
MM . . . . . . . . C ADDR 00DAH A
P0 . . . . . . . . D ADDR 0080H A
P1 . . . . . . . . D ADDR 0090H A
P2 . . . . . . . . D ADDR 00A0H A
P3 . . . . . . . . D ADDR 00B0H A
PSW. . . . . . . . D ADDR 00D0H A
RSTCOUNT . . . . . C ADDR 00C6H A
SECOND . . . . . . B ADDR 00A0H.5 A
SP . . . . . . . . D ADDR 0081H A
TH0. . . . . . . . D ADDR 008CH A
THEER. . . . . . . B ADDR 00A0H.6 A
TL0. . . . . . . . D ADDR 008AH A
TMOD . . . . . . . D ADDR 0089H A
TR0. . . . . . . . B ADDR 0088H.4 A
REGISTER BANK(S) USED: 0
ASSEMBLY COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -