📄 ad7711a.dt
字号:
JBC R3,0
INC T10H
MOV A,T_HH
ADD T10H,A
RRC T10H
RRC T10L
JMP NCY_V
D_POS:
;T10-->TH, T10=(TL+T10)/2
MOV A,T10H
MOV T_HH,A
MOV A,T10L
MOV T_HL,A
MOV A,T_LL
ADD T10L,A
JBC R3,0
INC T10H
MOV A,T_LH
ADD T10H,A
RRC T10H
RRC T10L
NCY_V:
DJZ DAY
JMP NXTIM
JMP INTOV
KMULC:
;对于铂热电阻,原始公式:Rt=Ro*[1+A*t+B*(t**2)]
;其中,Rt=温度为t摄氏度时的铂热电阻的阻值
; Ro=温度为0摄氏度时的铂热电阻的阻值
; A=3.9083*10**(-3)
; B=-5.775*10**(-7)
; C=-4.183*10**(-12)
;整理后通过CPU由下式计算温度值:
;T=842E-(4E91C85F-K*CODE)**0.5 (全是16进制)
;其中,T为10*t,K为系数
; K_PT100=K_PT200=2851
; K_PT500=K_PT10K=4082
;CODE=从AD7711接收到的16进制数据
CLR SQUR0 ;双字节乘法
CLR SQUR1
CLR SQUR2
CLR SQUR3
MOV A,DAT1
MOV BB,A
MOV A,KPTL
BS R3,6
BC R3,5
CALL MUL_AB ;数据低字节X系数低字节
BC R3,6
BS R3,5
MOV SQUR3,A
MOV A,BB
MOV SQUR2,A ;结果存入被开方数的16位
MOV A,KPTL
MOV BB,A
MOV A,DAT0
BS R3,6
BC R3,5
CALL MUL_AB ;数据高字节X系数低字节
BC R3,6
BS R3,5
ADD SQUR2,A
JBS R3,0
JMP NC0
INC SQUR1
MOV SQUR1,SQUR1
JBC R3,2
INC SQUR0
NC0:
MOV A,BB
ADD SQUR1,A
JBC R3,0
INC SQUR0
MOV A,KPTH
MOV BB,A
MOV A,DAT1
BS R3,6
BC R3,5
CALL MUL_AB ;数据低字节X系高数字节
BC R3,6
BS R3,5
ADD SQUR2,A
JBS R3,0
JMP NC1
INC SQUR1
MOV SQUR1,SQUR1
JBC R3,2
INC SQUR0
NC1:
MOV A,BB
ADD SQUR1,A
JBC R3,0
INC SQUR0
MOV A,KPTH
MOV BB,A
MOV A,DAT0
BS R3,6
BC R3,5
CALL MUL_AB ;数据高字节X系高数字节
BC R3,6
BS R3,5
ADD SQUR1,A
JBC R3,0
INC SQUR0
MOV A,BB
ADD SQUR0,A
;***************
; MOV A,SQUR0
; SUB A,@0X4E
; JBS R3,0
; JMP SQURER
; JBS R3,2
; JMP SQRNER
; MOV A,SQUR1
; SUB A,@0X91
; JBS R3,0
; JMP SQURER
; JBS R3,2
; JMP SQRNER
; MOV A,SQUR2
; SUB A,@0X0C8
; JBS R3,0
; JMP SQURER
; JBS R3,2
; JMP SQRNER
; MOV A,SQUR3
; SUB A,@0X5F
; JBS R3,0
; JMP SQURER
;SQRNER:
CLR DK_0
CLR DK_1
CLR DK_2
CLR DK_3
COM SQUR0
COM SQUR1
COM SQUR2
COM SQUR3
INC SQUR3
MOV SQUR3,SQUR3
JBS R3,2
JMP ADDSQR
INC SQUR2
MOV SQUR2,SQUR2
JBS R3,2
JMP ADDSQR
INC SQUR1
MOV SQUR1,SQUR1
JBS R3,2
JMP ADDSQR
INC SQUR0
ADDSQR:
MOV A,SQUR3
ADD A,@0X5F
JBC R3,0
INC DK_2
MOV DK_3,A
MOV A,SQUR2
ADD A,@0X0C8
JBC R3,0
INC DK_1
ADD DK_2,A
JBC R3,0
INC DK_1
MOV A,SQUR1
ADD A,@0X91
JBC R3,0
INC DK_0
ADD DK_1,A
JBC R3,0
INC DK_0
MOV A,SQUR0
ADD A,@0X4E
ADD DK_0,A
BS R3,6
BC R3,5
CALL SQUARE
BC R3,6
BS R3,5
CLR T10H
CLR T10L
COM DK_0
COM DK_1
INC DK_1
MOV DK_1,DK_1
JBC R3,2
INC DK_0
MOV A,DK_1
ADD A,@0X2E
JBC R3,0
INC T10H
MOV T10L,A
MOV A,DK_0
ADD A,@0X84
ADD T10H,A
JMP INTOV
;SQURER:
OPENER:
MOV A,@0X0FF
MOV T10H,A
MOV T10L,A
INTOV:
RET
EOP
;*************************************************
;****************page2*********************************
;*****************************
;* 控制寄存器更新 *
;*****************************
ORG 0X0810
DCR_UP:
MOV A,@0B10000000
IOW P6
MOV A,@0X18
MOV D_NUM,A
BS P6,3 ;/RFS=1('读'无效)
BC P6,4 ;A0=0(访问控制寄存器)
BC P6,2 ;/TFS=0('写'有效)
NXT_BT:
JBS DCR0,7
JMP KKK0
JMP KKK1
KKK0:
BC P6,0
JMP CR72
KKK1:
BS P6,0
CR72:
NOP
NOP
BS P6,1
RLC DCR2
RLC DCR1
RLC DCR0
CALL DLY0
BC P6,1
DJZ D_NUM
JMP NXT_BT
BC P6,1
BS P6,2
RET
;*****************************
;* 数据传输子程序 *
;*****************************
D_TRANS:
; JBS P6,7
; JMP D_TRANS
; CALL DLY8
; JBS P6,7
; JMP D_TRANS
; CALL DLY8
; JBS P6,7
; JMP D_TRANS
MOV A,P6
AND A,@0X60
MOV BB,A
RRC BB
RRC BB
RRC BB
RRC BB
RRC BB
MOV A,@0X03
AND BB,A
MOV A,@0X18
MOV D_NUM,A
BS P5,7
CALL DLY30
NBID:
JBS BB,7
JMP KK0
JMP KK1
KK0:
BC P5,7
JMP NDOV
KK1:
BS P5,7
JMP NDOV
NDOV:
CALL DLY_30
RLC T10L
RLC T10H
RLC BB
DJZ D_NUM
JMP NBID
CLR FLAG
BC P5,7
RET
;*****************************
;* 延时子程序 *
;*****************************
DLY0:
MOV A,@0X02
MOV DAX,A
LP0:
DJZ DAX
JMP LP0
RET
;**********************************
DLY8:
MOV A,@0X0B
MOV DAX,A
LP8:
DJZ DAX
JMP LP8
RET
;**********************************
DLY30:
MOV A,@0X34
NOP
MOV DAX,A
LP30:
DJZ DAX
JMP LP30
RET
;**********************************
DLY_30:
MOV A,@0X31
MOV DAX,A
LP_30:
DJZ DAX
JMP LP_30
RET
;**********************************
DLY10:
MOV A,@0X20
MOV DAX,A
LP10:
DJZ DAX
JMP LP10
RET
;**********************************
DLY100:
MOV A,@0X0FF
MOV DAX,A
LP100:
DJZ DAX
JMP LP100
RET
;*****************************
;* 开方子程序 *
;*****************************
;*************************************************
;四字节的无符号数开方运算小程序 *
;功能:四字节二进制无符号数开平方(快速) *
;入口条件:被开方数在R2--DK_0(高),R3--DK_1, *
;R4--DK_2,R5--DK_3(低)中 *
;R2(DK_0)为高字节,R5(DK_3)为低字节 *
;出口信息:平方根在 R2--DK_0(高), R3--DK_1(低)中 *
;R7--LF_N,R6--LF_B,B--BB *
;占用寄存器:2FH,34H--3FH,共8个寄存器 *
;整数部分的位数为原数的一半,其余为小数。 *
;*************************************************
SQUARE:
MOV A,@00H
SH4:
MOV A,DK_0
OR A,DK_1
OR A,DK_2
OR A,DK_3
JBS R3,2
JMP SH40
RET ;被开方数为零,不必运算
SH40:
CLR LF_N ;左规次数初始化
MOV A,DK_0
SH41:
AND A,@0C0H ;被开方数高字节小于40H否?
JBS R3,2
JMP SQRH ;不小于40H,左规格化完成
MOV A,@02H ;每左规一次,被开方数左移两位
MOV LF_B,A
SH42:
BC R3,0 ;被开方数左移一位
RLC DK_3
RLC DK_2
RLC DK_1
RLC DK_0
DJZ LF_B
JMP SH42
INC LF_N ;被开方数左移完两位,左规次数加1
MOV A,DK_0
JMP SH41 ;继续左规
SQRH:
MOV A,DK_0 ;规格化后高字节按折线法分为三个区间
ADD A,@57H
JBC R3,0
JMP SQR2
ADD A,@45H
JBC R3,0
JMP SQR1
ADD A,@24H
MOV DAX,A
MOV A,@0E3H ;第一区间的斜率
MOV BB,A
MOV A,@80H ;第一区间的平方根基数
MOV DK_2,A
MOV A,DAX
JMP SQR3
SQR1:
MOV A,@0X0B2
MOV BB,A ;第二区间的斜率
MOV A,@0A0H ;第二区间的平方根基数
MOV DK_2,A
JMP SQR3
SQR2:
MOV A,@8DH ;第三区间的斜率
MOV BB,A
MOV A,@0X0D0
MOV DK_2,A ;第三区间的平方根基数
SQR3:
CALL MUL_AB ;与区间基点的偏移量乘区间斜率
MOV A,BB
ADD DK_2,A ;累加到平方根的基数上
MOV A,DK_2
MOV BB,A
CALL MUL_AB ;求当前平方根的幂
MOV ML_A0,A
MOV A,DK_1
MOV DAX,A
MOV A,ML_A0
MOV DK_1,A
MOV A,DAX ;A与DK_1互换,求偏移量(存放在 R2R3 中)
BC R3,0
SUB A,DK_1
JBC R3,2
BC R3,0
MOV DAX,A
COM DAX
INC DAX
MOV A,DAX
MOV DK_1,A
MOV A,DK_0
;***************
JBS R3,0
JMP SUBC10
JMP SUBC11
SUBC10:
SUB A,BB
JBC R3,2
BC R3,0
MOV DAX,A
COM DAX
INC DAX
JMP SUBOV1
SUBC11:
SUB A,BB
JBC R3,2
BC R3,0
MOV DAX,A
COM DAX
SUBOV1:
MOV A,DAX
;***************
MOV DK_0,A
SQR4:
BS R3,0 ;用减奇数法校正一个字节的平方根
MOV A,DK_2 ;当前平方根的两倍加一存入 R5R6 中
MOV DAX,A
RLC DAX
MOV A,DAX
MOV LF_B,A
CLR DK_3
RLC DK_3
MOV A,DK_1 ;偏移量小于该奇数否?
;***************
JBS R3,0
JMP SUBC20
JMP SUBC21
SUBC20:
SUB A,LF_B
JBC R3,2
BC R3,0
MOV DAX,A
COM DAX
INC DAX
JMP SUBOV2
SUBC21:
SUB A,LF_B
JBC R3,2
BC R3,0
MOV DAX,A
COM DAX
SUBOV2:
MOV A,DAX
;***************
MOV BB,A
MOV A,DK_0
;***************
JBS R3,0
JMP SUBC30
JMP SUBC31
SUBC30:
SUB A,DK_3
JBC R3,2
BC R3,0
MOV DAX,A
COM DAX
INC DAX
JMP SUBOV3
SUBC31:
SUB A,DK_3
JBC R3,2
BC R3,0
MOV DAX,A
COM DAX
SUBOV3:
MOV A,DAX
;***************
JBC R3,0
JMP SQR5 ;小于,校正结束,已达到一个字节的精度
INC DK_2 ;不小于,平方根加一
MOV DK_0,A ;保存新的偏移量
MOV A,BB
MOV DK_1,A
MOV A,DK_0
JMP SQR4 ;继续校正
SQR5:
;将一个字节精度的根存入 R2
RRC DK_0
MOV A,DK_0
MOV A,DK_2
MOV DK_0,A
MOV A,R3
MOV PSWB,A ;保存最终偏移量的最高位
MOV A,DK_1
MOV DK_3,A ;将最终偏移量的低八位存入 R5 中
MOV A,@08H
MOV DK_2,A ;通过( R5R6 / R2 )求根的低字节
SQR6:
BC R3,0
RLC DK_1
BC R3,0
MOV A,DK_3
;***************
SUB A,DK_0
JBC R3,2
BC R3,0
MOV DAX,A
COM DAX
INC DAX
MOV A,DAX
;***************
JBC PSWB,0
JMP SQR7
JBC R3,0
JMP SQR8
SQR7:
MOV DK_3,A
INC DK_1
SQR8:
BC R3,0
RLC DK_3
MOV A,R3
MOV PSWB,A
DJZ DK_2
JMP SQR6 ;根的第二字节计算完,在 R3 中
MOV A,LF_N ;取原被开方数的左规次数
JBC R3,2
JMP SQRE ;未左规,开方结束
SQR9:
BC R3,0 ;按左规次数右移平方根,得到实际根
RRC DK_0
RRC DK_1
DJZ LF_N
JMP SQR9
SQRE:
RET
;*************************************************
;*****************************
;* 单字节乘法子程序 *
;*****************************
;BB--高字节
;A--低字节
MUL_AB:
MOV ML_A1,A
CLR ML_A0
CLR MUL_A
CLR MUL_B
MOV A,@08H
MOV DAX,A
NXT_AB:
JBS BB,0
JMP BB0
JMP BB1
BB0:
JMP MULOV
BB1:
MOV A,ML_A1
ADD MUL_A,A
JBC R3,0
INC MUL_B
MOV A,ML_A0
ADD MUL_B,A
MULOV:
RRC BB
BC R3,0
RLC ML_A1
RLC ML_A0
DJZ DAX
JMP NXT_AB
MOV A,MUL_B
MOV BB,A
MOV A,MUL_A
RET
;*************************************************
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -