⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pid子程序未完.txt

📁 单片机浮点数运算子程序
💻 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 + -