📄 pid子程序未完.txt
字号:
ORG 00H
SJMP PID
;/////////////////// PID开始//////////////////
PID: MOV R0,#52H ;给定值r的地址
MOV R1,#49H ;测量值y的地址
LCALL FSUB ;计算ek值
MOV R1,#46H ;结果存入46h~48h
LCALL FSTR ;调用存数子程序
MOV R0,#58H ;取A的地址
MOV R1,#4CH ;ek的dizhi
LCALL FMUL ;调用乘法子程序,计算Aek值
MOV R1,#4CH ;结果存入4CH~4EH
LCALL FSTR ;调用存数子程序
MOV R0,#5BH ;取B的地址
MOV R1,#4FH ;将B的值放入4Fh~51H
LCALL FMLD
MOV R0,#43H
MOV R1,#4FH
LCALL FMUL ;计算Bek-1的值
MOV R1,#4FH ;结果放入4FH--51H
LCALL FSTR
MOV R0,#4CH ;指向Aek的地址
MOV R1,#4FH ;指向Bek-1的地址
LCALL FADD ;计算Aek+Bek-1
MOV R1,#4CH ;结果存入4CH--4EH
LCALL FSTR
MOV R0,#5EH ;指向Kd的地址
MOV R1,#4FH
LCALL FMLD ; 取Kd值存入4FH--51H
MOV R1,#4FH
MOV R0,#40H
LCALL FMUL ;计算Cek-2
MOV R1,#4FH ;存入4FH--51H
LCALL FSTR
MOV R1,#4FH ;Cek-2的地址
MOV R0,#4CH ;Aek+Bek-1的地址
LCALL FADD ;计算^u
MOV R1,#55H ;存入55H--57H
LCALL FSTR
MOV 40H,43H ;更新ek-2
MOV 41H,44H
MOV 42H,45H
MOV 43H,46H ;更新ek-1
MOV 44H,47H
MOV 45H,48H
;///////////////// PID结束//////////
;////////////////浮点取数子程序///////////
FMLD: MOV A, @R0
MOV R6,A
INC R0
MOV A,@R0
MOV R2,A
INC R0
MOV A,@R0
MOV R3,A
DEC R0 ;恢复R0
DEC R0
MOV A, @R1
MOV R7,A
INC R1
MOV A,@R1
MOV R4,A
INC R1
MOV A,@R1
MOV R5,A
DEC R1 ;恢复R1
DEC R1
RET
;//////////////浮点取数子程序////////
;/////////////浮点存数子程序/////////
FSTR: MOV A,R4
MOV @R1,A
INC R1
MOV A,R2
MOV @R1,A
INC R1
MOV A,R3
MOV @R1,A
DEC R1
DEC R1
RET
;//////////浮点存数子程序//////////
;/////////浮点加减法子程序////////
FABP: MOV A,R6
MOV C,ACC.7
MOV 38H,C ;保存被加数符号
XRL A,R7
JNB ACC.7,FA1
CPL 3AH ;俩数异号,取反运算标志
FA1: MOV A,R6
MOV C,ACC.6 ;扩展阶码为双符号位
MOV ACC.7,C
MOV R6,A
MOV A,R7
MOV C,ACC.6
MOV ACC.7,C
MOV R7,A
CLR C
MOV A,R6
SUBB A,R7
JZ FA2
CLR F0
CLR 39H
JB ACC.7,FA5
CJNE R4,#0,FA6
CJNE R5,#0,FA6
FA2: JB 3AH,FA8
MOV A,R3
ADD A,R5
MOV R3,A
MOV A,R2
ADDC A,R4
MOV R2,A
JNC FA4
SETB 39H ;溢出,把尾数右移一位
CLR C
FA3: CLR F0
LCALL FSDT
FA4: CJNE R2,#0,FAA
CJNE R3,#0,FAA
MOV R4,#41H ;结果为0
RET
FAA: MOV A,R6 ;送结果符号
MOV C,38H
MOV ACC.7,C
XCH A,R4
MOV R6,A
RET
FA5: CJNE R2,#0,FA7
CJNE R3,#0,FA7
MOV A,R7
MOV R6,A
SJMP FA2
FA6: CPL F0
FA7: CLR C
LCALL FSDT
SJMP FA1
FA8: MOV A,R3 ;执行尾数减法
CLR C
SUBB A,R5
MOV R3,A
MOV A,R2
SUBB A,R4
MOV R2,A
JNC FA9
CLR A
CLR C
SUBB A,R3
MOV R3,A
CLR A ;结果符号取反
SUBB A,R2
MOV R2,A
CPL 38H
FA9: SETB C
SJMP FA3
;//////////浮点加减法子程序//////////
;//////////浮点法减子程序///////////
FADD: CLR 3AH ;加法运算标志
LCALL FMLD
LCALL FABP
RET
;/////////浮点减法子程序//////////
;/////////浮点加法子程序/////////
FSUB : SETB 3AH ;加法运算标志
LCALL FMLD
LCALL FABP
RET
;///////浮点加法子程序//////////
;///////浮点乘法子程序/////////
FMUL: LCALL FMLD
MOV A,R6
MOV A,R7
XRL A,R7
MOV C,ACC.7
MOV 38H,C ;计算并暂存积的符号
LCALL DUML ;调用定点无符号双字节乘法子程序
MOV A,R7
MOV C,ACC.7
MOV F0,C ;f0为规格化时第一次左移输入值
MOV A,@R1 ;????????计算阶码
ADD A,@R1
MOV R6,A
SETB C
LCALL FSDT
MOV A,R6
MOV C,38H ;回送积的符号
MOV ACC.7,C
DUML: MOV A,R3
MOV B,R5
MUL AB
MOV R7,B
MOV A,R3
MOV B,R4
MUL AB
ADD A,R7
MOV R7,A
CLR A
ADDC A,B
MOV R3,A
MOV A,R2
MOV B,R5
MUL AB
ADD A,R7
MOV R7,A
MOV A,R3
ADDC A,B
MOV R3,A
MOV F0,C
MOV A,R2
MOV B,R4
MUL AB
ADD A,R3
MOV R3,A
CLR A
ADDC A,B
MOV C,F0
ADDC A,#0
RET
;/////////浮点乘法子程序///////////
;/////////浮点除法子程序//////////
FDIV: LCALL FMLD
MOV A,R6
XRL A,R7
MOV C,ACC.7
MOV 38H,C
CLR A
MOV R6,A
MOV R7,A
CJNE R4,#0,FD1
CJNE R5,#0,FD1
SETB C
RET
FD1: MOV A,R3
SUBB A,R5
MOV A,R2
SUBB A,R4
JC FD2
CLR F0
CLR 39H
LCALL FSDT
MOV A,R7
RRC A
MOV R7,A
CLR C
SJMP FD1
FD2: CLR A
XCH A,R6
PUSH A
LCALL DDIV
POP A
ADD A,@R0
CLR C
SUBB A,@R1
MOV C,38H
MOV ACC.7,C
MOV R4,A
CLR C
RET
DDIV: MOV A,R1
PUSH A
MOV B,#10H
DV1: CLR C
MOV A,R6
CLR A
MOV R6,A
MOV A,R7
RLC A
MOV R7,A
MOV R3,A
XCH A,R2
RLC A
XCH A,R2
MOV F0,C
CLR C
SUBB A,R5
MOV R1,A
MOV A,R2
SUBB A,R4
JB F0,DV2
JC DV3
DV2: MOV R2,A
MOV A,R1
MOV R3,A
INC R6
DV3: DJNZ B,DV1
POP A
MOV R1,A
MOV A,R7
MOV R2,A
MOV A,R6
MOV R3,A
RET
;////////通用规格化子程序////////
FSDT: JC FS2
MOV C,39H ;右规格化
JB F0,FS1
MOV A,R2
RRC A
MOV R2,A
MOV A,R3
RRC A
MOV R3,A
INC R6
RET
FS1: MOV A,R4
RRC A
MOV R4,A
MOV A,R5
RRC A
MOV R5,A
INC R7
RET
FS2: MOV A,R2 ;左规格化
JNZ FS4
CJNE R3,#0,FS5
MOV R6,#41H ;尾数等于0,41h送阶码
FS3: RET
FS4: JB ACC.7 ,FS3
FS5: MOV C,F0 ;左移输入为f0
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
CLR F0
DEC R6
SJMP FS2
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -