📄 luchag11.asm
字号:
; I8051数据校正转换模块, Y:= Yn + K*(X-Xn)
; 输入:(R0)==> 转换结果存储地址首址(两字节), (R1):= A/D转换值高字节,
; (R2):= A/D转换值低字节,, (A):= 当前处理的模拟量的序号{0,1,2,3}
; 电压数据表定义:共分为10段11个点{-36V,-38V,... ...,-56V}
; 电流数据表定义:共分为10段11个点{0A,100A,... ...,2000A}
; 每个点三字节,按{ADC值高字节,ADC值低字节,斜率}
; 顺序存放,计算结果按一字节两位BCD码格式,高字节在前存放
; 即:[电压的十位数--个位数],[电压的十分位数--百分位]
; [电流的千位数--百位数],[电流的十位数--个位数]
POINTNUM EQU 11
DATA_NUM EQU POINTNUM*3
MAX_CUR EQU 20H
MAX_VAL EQU 56H
MINI_VAL EQU 36H
V_SEGVAL EQU 200 ; 每段的压差2V,以0.01V为单位
I_SEGVAL EQU 100 ; 电流分段的差值100A,以1A为单位
REGIST55 EQU 5
CHANGADC: PUSH B
PUSH DPL
PUSH DPH
XCH A,R3
PUSH ACC
MOV A,R4
PUSH ACC
MOV A,R5
PUSH ACC
CLR A
MOV R5,A
MOV R4,A
MOV A,R3
RRC A
JNC $+4
MOV R5,#DATA_NUM ; 11点*3字节
CHGADC00: MOV A,#1
ACALL GET_PARA
CLR C
SUBB A,R1 ; (R1):= A/D转换值高字节
JZ CHGADC22 ; Xn:= X
JNC CHGADC33 ; X < Xn
CHGADC11: INC R4
CJNE R4,#POINTNUM,CHGADC00
MOV A,#MAX_VAL ; X >= ADC(56V)
CJNE R5,#0,CHGADCOV
MOV A,#MAX_CUR ; X >= ADC(2000A)
CHGADCOV: MOV @R0,A
INC R0
CLR A
MOV @R0,A
DEC R0
SJMP CHGADCEND
CHGADC22: MOV A,#2
ACALL GET_PARA
SUBB A,R2 ; (R2):= A/D转换值低字节
JC CHGADC33 ; Xn < X
JNZ CHGADC11 ; Xn > X
ACALL CHGADCYN ; Yn ==> (R4):(R5)
SJMP CHGADC44
CHGADC33: MOV A,R4
JZ CHGADCOV ; X =< ADC(36V)
DEC R4
MOV A,#1
ACALL GET_PARA
MOV DPH,A ; Xn高字节 ==>(DPH)
MOV A,#2
ACALL GET_PARA
MOV DPL,A ; Xn低字节==>(DPL)
CLR C
MOV A,R2
SUBB A,DPL
MOV DPL,A ; Lo(X - Xn) ==> DPL
MOV A,R1
SUBB A,DPH
MOV DPH,A ; Hi(X - Xn) ==> DPH
MOV A,#3
ACALL GET_PARA
MOV R1,A ; (R1):= 斜率K
ACALL CHGADCYN ; Yn ==> (R4):(R5)
MOV A,DPH
MOV B,R1
MUL AB ; H*K
ADD A,R5
MOV R5,A
MOV A,B
ADDC A,R4
MOV R4,A
MOV A,DPL
MOV B,R1
MUL AB ; L*K
RLC A ; bit7 ==> C
MOV A,B
ADDC A,R5
MOV R5,A
JNC CHGADC44
INC R4
CHGADC44: ACALL BINTOBCD
MOV A,R3
JNB ACC.0,CHGADCEND
MOV A,@R0
ADD A,#MINI_VAL
DA A
MOV @R0,A
CHGADCEND: POP ACC
MOV R5,A
POP ACC
MOV R4,A
POP ACC
MOV R3,A
POP DPH
POP DPL
POP B
RET
; 根据(R4):=n 计算 Yn ==> (R4):(R5)
CHGADCYN: MOV A,R3
RRC A
MOV A,#I_SEGVAL
JNC $+4
MOV A,#V_SEGVAL ; 1 or 3
MOV B,R4
MUL AB
MOV R5,A
MOV R4,B
RET
; 两字节BIN数据(R4):(R5)转换成两字节四位BCD码数据 ==>((R0))
BINTOBCD: CLR A
MOV @R0,A
INC R0
MOV @R0,A
MOV A,R4
ACALL BINBCD00
MOV A,R5
INC R0
BINBCD00: MOV R2,#8
RLC A
MOV R1,A
MOV A,@R0
ADDC A,@R0
DA A
MOV @R0,A
DEC R0
MOV A,@R0
ADDC A,@R0
DA A
MOV @R0,A
INC R0
MOV A,R1
DJNZ R2,BINBCD00+2
DEC R0
RET
;
GET_PARA: ADD A,R5
ADD A,R4
ADD A,R4
ADD A,R4 ; (A)+3*(R4) ==> A
MOVC A,@A+PC
RET
ADC_DBAS: DB 000H,0C3H,0C5H
DB 001H,045H,04FH
DB 002H,08AH,062H
DB 003H,08EH,062H
DB 004H,092H,04FH
DB 005H,0D7H,062H
DB 006H,0DBH,04FH
DB 008H,020H,062H
DB 009H,024H,062H
DB 00AH,028H,04FH
DB 00BH,06DH,04FH
DB 006H,0FDH,034H
DB 007H,05EH,035H
DB 007H,0BEH,033H
DB 008H,022H,033H
DB 008H,086H,036H
DB 008H,0E5H,036H
DB 009H,045H,033H
DB 009H,0AAH,031H
DB 00AH,013H,036H
DB 00AH,071H,037H
DB 00AH,0CEH,04FH
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -