📄 2052ad转换.asm
字号:
;本程序与学习板的接线
;学习板侧----------12c2052AD侧
;P0.0-------接----- (2脚)P3.0
;P0.1-------接------(3脚))P3.1
;P0.2--------接-----(6脚)P3.2
;P0.3--------接------(7脚)P3.3
;P0.4--------接------(8脚)P3.4
;P0.5--------接------(9脚)P3.5
;P0.6--------接------(11脚)P3.7
;模以量输入引脚为12c2052AD倒数第4脚标号为P1.5的引脚
;12c2052AD的20脚接电源 10脚接地
;试验时,可调电阻的接地端要接10K电阻.
ISP_DATA EQU 0E2H
ISP_ADDRH EQU 0E3H
ISP_ADDRL EQU 0E4H
ISP_CMD EQU 0E5H
ISP_TRIG EQU 0E6H
ISP_CONTR EQU 0E7H
;定义ISP/IAP 命令
ISP_IAP_BYTE_READ EQU 1H
ISP_IAP_BYTE_PROGRAM EQU 2H
ISP_IAP_BYTE_SECTOR EQU 3H
;定义FLASH操作等待的时间常数
ENABLE_ISP EQU 84H
DATA_FLASH_START_ADDRESS EQU 1000H
ADC_CONTR EQU 0C5H
ADC_DATA EQU 0C6H
P1M0 EQU 91H
P1M1 EQU 92H
ADC_POWER_ON_SPEED_CHANNEL_5 EQU 11100101B
SET_VOLTAGE EQU 60H
ORG 0000H
MAIN:
MOV SP,#5FH
MOV 30H,#00H
MOV 31H,#00H
MOV 32H,#00H
MOV 33H,#00H
ORL P1M0,#00100000B;高置ad io口为开路
ORL P1M1,#00100000B
MOV ADC_CONTR,#ADC_POWER_ON_SPEED_CHANNEL_5;设置AD通道
CALL DELAY
MOV DPTR,#TAB
li:
CALL AD_VOLTAGE
CALL H16_D10
CALL DISPLAY
ajmp li
update: ;刷新显示子程序
inc 30h
mov a,30h
cjne a,#10,exit ;还没加到十,退出
mov 30h,#00h ;加到十了,个位清零
inc 31h ;十位显示缓冲单元加一
mov a,31h
cjne a,#10,exit ;还没加到十,退出
mov 31h,#00h ;加到十了,十位清零
inc 32h ;百位显示缓冲单元加一
mov a,32h
cjne a,#10,exit ;还没加到十,退出
mov 32h,#00h ;加到十了,百位清零
inc 33h ;千位显示缓冲单元加一
mov a,33h
cjne a,#10,exit ;还没加到十,退出
mov 33h,#00h ;加到十了,千位清零
exit:
ret
AD_Voltage: ;40H;41H,保存所测电压的高低位
ACALL GET_AD_RESULT
MOV A,ADC_DATA
MOV B,#100
MUL AB
MOV 40H,A
MOV 41H,B
MOV 44H,#51
MOV 45H,#00H
CALL DIV16
MOV A,42H
CJNE A,#25,NEXT_B
AJMP INC_DIV
NEXT_B:
JC NEXT22
INC_DIV:
INC 40H
NEXT22:
RET
H16_D10:
;输入:被除数放在40H,41H,除数放在内44H,45H,商放在40H,41H,余数放在42H,43H,
MOV 44H,#100
MOV 45H,#0
CALL DIV16
MOV 31H,40H
MOV A,42H
MOV B,#10
DIV AB
MOV 30H,A
;MOV 30H,B
RET
GET_AD_RESULT:
MOV ADC_DATA,#0
ORL ADC_CONTR,#00001000B;开ADC
CALL DELAY
WAIT_AD_FINISHED:
MOV A,#00010000B
ANL A,ADC_CONTR
JZ WAIT_AD_FINISHED
ANL ADC_CONTR,#11100111B
RET
DELAY:
MOV R7,#25
D: MOV R6,#5
DJNZ R6,$
DJNZ R7,D
RET
display:mov p2,#0ffh ;将P2口置高电平
mov r7,#250 ;软件计数器赋值
dd1:
mov a,30h ;将显示缓冲区30H中的值送入ACC
movc a,@a+dptr ;查表取要显示的数并把查表的结果送入ACC
MOV C,ACC.6
ORL A,#11000000B
mov p3,a ;将要显示的数送入P0口
MOV P3.7,C
clr p1.0 ;开个位显示单元
lcall delay100us ;延时100US
setb p1.0 ;关个位显示单
mov a,31h ;将显示缓冲区别31H中的值送入A
movc a,@a+dptr ;查表取要显示的数并把查表的结果送入ACC
MOV C,ACC.6
ORL A,#11000000B
mov p3,a ;将要显示的数送入P0口
MOV P3.7,C
clr p1.1 ;开十位显示单元
lcall delay100us ;延时100US
setb p1.1 ;关十位显示单元
mov a,32h ;将显示缓冲区32H中的值送入ACC
movc a,@a+dptr ;查表取要显示的数并把查表的结果送入ACC
MOV C,ACC.6
ORL A,#11000000B
mov p3,a ;将要显示的数送入P0口
MOV P3.7,C
clr p1.2 ;开百位显示单元
lcall delay100us ;延时100US
setb p1.2 ;关百位显示单元
mov a,33h ;将显示缓冲区33H中的值送入ACC
movc a,@a+dptr ;查表取要显示的数并把查表的结果送入ACC
MOV C,ACC.6
ORL A,#11000000B
mov p3,a ;将要显示的数送入P0口
MOV P3.7,C
clr p1.3 ;开千位显示单元
lcall delay100us ;延时100US
setb p1.3 ;关千位显示单元
djnz r7,dd1 ;R7不等于0返回至DD1处
ret ;R7等于0子程序返回
delay100us:
mov r5,#50
djnz r5,$
ret
;十六进制除法运算
;输入:被除数放在40H,41H,除数放在内44H,45H,商放在40H,41H,余数放在42H,43H,
DIV16:
MOV R0,#40H
MOV A,@R0
JNZ LOP0
INC R0
MOV A,@R0
JNZ LOP0
CLR A
MOV 42H,A
MOV 43H,A
RET
LOP0:MOV R0,#44H
MOV A,@R0
JNZ LOP1
INC R0
MOV A,@R0
JNZ LOP1
RET
LOP1:CLR A
MOV 42H,A
MOV 43H,A
MOV R2,#10H
LOP2:CLR C
MOV R3,#04H
MOV R0,#40H
LOP3:MOV A,@R0
RLC A
MOV @R0,A
INC R0
DJNZ R3,LOP3
MOV R0,#42H
MOV R1,#44H
MOV A,@R0
CLR C
SUBB A,@R1
MOV 48H,A
INC R0
INC R1
MOV A,@R0
SUBB A,@R1
MOV 49H,A
JC LOP4
MOV R0,#42H
MOV R1,#48H
MOV A,@R1
MOV @R0,A
INC R0
INC R1
MOV A,@R1
MOV @R0,A
MOV A,40H
INC A
MOV 40H,A
LOP4:DJNZ R2,LOP2
RET
DELAY5MS:
MOV R6,#250
DL1:
MOV R5,#10
DJNZ R5,$
DJNZ R6,DL1
RET
delay_10ms:
MOV R6,#70
D3: MOV R7,#25
DJNZ R7,$
DJNZ R6,D3
RET
DELAY_1S:
MOV 53H,#100
DELAY_1S_LOOP:
CALL DELAY_10MS
DJNZ 53H,DELAY_1S_LOOP
RET
tab: db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h,88h,83h,0c6h,0a1h,86h,8eh
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -