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

📄 jrdmdysf.asm

📁 用增强型单片机51RD2做的控制器
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;
; ************  9、浮点数除法子程序FDIV ************
;
FDIV:           LCALL	FMLD
		MOV	A,R6
		XRL	A,R7
		MOV	A,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	PSW.5				; 被除数尾数太大,则右移一位
		CLR	39H
		LCALL	FSDT
		MOV	A,R7
		RRC	A
		MOV	R7,A
		CLR	C
		SJMP	FD1
FD2:		CLR	A
		XCH	A,R6
		PUSH	ACC				; 保存被除数移位次数
		LCALL	DDIV				; 调用定点双字节小数除法
		POP	ACC				; 计算商的阶码
		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	ACC				; 保护R1
		MOV	B,#10H
DV1:		CLR	C
		MOV	A,R6
		RLC	A
		MOV	R6,A
		MOV	A,R7
		RLC	A
		MOV	R7,A
		MOV	A,R3
		RLC	A
		MOV	R3,A
		XCH	A,R2
		RLC	A
		XCH	A,R2
		MOV	PSW.5,C
		CLR	C
		SUBB	A,R5
		MOV	R1,A
		MOV	A,R2
		SUBB	A,R4
;		JB	PSW.5,DV2
;		JC	DV3
;DV2:		MOV	R2,A
		MOV	A,R1
		MOV	R3,A
		INC	R6
;DV3:		DJNZ	B,DV1
		POP	ACC				; 恢复R1
		MOV	R1,A
		MOV	A,R7
		MOV	R2,A
		MOV	A,R6
		MOV	R3,A
		RET
;功能:将Bit 3CH(数符)R2R3中的整数转换成三字节浮点数,送(R1)指向的内部RAM单元中。
;
; ************  10、双字节整数转换成三字节浮点数INTF ************
;
INTF:		MOV	R6,#10H
		SETB	C
		CLR	PSW.5
		LCALL	FSDT
		MOV	A,R6
		MOV	C,3CH
		MOV	ACC.7,C
		MOV	R4,A
		LCALL	FSTR
		RET
;功能:将(R0)指向的内部RAM中的三字节浮点数取整,16位的
;整数绝对值值送R2R3,符号存于位单元3CH。
;
; ************  11、三字节浮点数转换为双字节整数子程序FINT ************
;
FINT:		CLR	PSW.5
		INC	R0
		MOV	A,@R0
		MOV	R2,A
		INC	R0
		MOV 	A,@R0
		MOV	R3,A
		DEC	R0
		DEC	R0
		MOV	A,@R0
		MOV	C,ACC.7
		MOV	3CH,C				; 取出符号位
		CLR	ACC.7
		JNB	ACC.6,FIN1
		MOV	R2,#0				; 阶码小于0
		MOV	R3,#0
		RET
FIN1:		CJNE	A,#17,$+3
		JC	FIN3
		SETB	PSW.5				; 溢出
		MOV	R2,#0FFH
                MOV     R3,#0FFH
		RET
FIN3:		CJNE	A,#16,FIN4
		RET
FIN4:		CLR	C				; 阶码小于0,小于16
		XCH	A,R2				; 尾数右移一位
		RRC	A
		XCH	A,R2
		XCH	A,R3
		RRC	A
		XCH	A,R3
		INC	A				; 阶码加1
		SJMP	FIN3
;功能:计算Y=an+……+a1x+a00入口时,X在内部RAM中,(R0)指向X的阶码。
;计算后,Y也放于内部RAM中,R1指向Y的阶码单元,ai放于调用指令后。
;
; ************  12、三字节浮点数多项式计算子程序FPLN ************
;
FPLN:		POP	DPH				; 从栈中得到an的指针
		POP	DPL
		CLR	A
		MOVC	A,@A+DPTR			; 取出anp
		MOV	R6,A
		INC	DPTR
		CLR	A
		MOVC	A,@A+DPTR			; 取出anp
		MOV	R2,A
		INC	DPTR
		CLR	A
		MOVC	A,@A+DPTR			; 取出ani
		MOV	R3,A
		INC	DPTR
FP1:		MOV	A,@R0
		XRL	A,R6
		MOV	C,ACC.7
		MOV	38H,C				; 暂存乘积符号
		INC	R0
		MOV	A,@R0				; 取出X的尾数
		MOV	R4,A
		INC	R0
		MOV	A,@R0
		MOV	R5,A
		DEC	R0
		DEC	R0
		LCALL	DMUL				; 调用定点双字节小数乘法DMUL见FMUL子程序
		MOV	A,R2
		JB	ACC.7,FP2
		MOV	A,R7				; 左规格化一位
		RLC	A
		MOV	A,R3
		RLC	A
		MOV	R3,A
		MOV	A,R2
		RLC	A
		MOV	R2,A
		DEC	R6
FP2:		MOV	A,R6				; 计算乘积的阶码
		ADD	A,@R0
		MOV	C,38H
		MOV	ACC.7,C
		MOV	R6,A
		CLR	A
		MOVC	A,@A+DPTR			; 取出aip
		MOV	R7,A
		INC	DPTR
		CLR	A
		MOVC	A,@A+DPTR			; 取出aip
		MOV	R4,A
		INC	DPTR
		CLR	A
		MOVC	A,@A+DPTR			; 取出ail
		MOV	R5,A
		INC	DPTR
		CLR	3AH
		LCALL	FABP
		MOV	A,R4
		MOV	R6,A
		CLR	A
		MOVC	A,@A+DPTR			; 取出下一个字节
		CJNE	A,#40H,FP1
		LCALL	FSTR				; 结束,回送计算结果
		INC	DPTR
		CLR	A
		JMP	@A+DPTR				; 转回后继指令
;功能:把由(R0)指示的三字节二进制浮点数转换成十进制浮点数,放在由(R1)指示
;的6个内存单元中。其中,第一个单元为十进制浮点数阶码(8位二进制补码形式),后
;5个单元为十进制尾数(5位十进制数字,每个字节为一个BCD码)。数符在Bit 3CH中,
;Bit 3CH=0为正数;Bit 3CH=1为负数。
;
; ************  13、三字节浮点二进制到十进制转换子程序FBTD ************
;
FBTD:		MOV	A,@R0
		MOV	C,ACC.7
		MOV	3CH,C				; 存放浮点数的符号
		MOV	C,ACC.6				; 把阶码扩展为双符号位
		MOV	ACC.7,C
		MOV	R6,A
		INC	R0
		MOV	A,@R0
		MOV	R2,A
		INC	R0
		MOV	A,@R0
		MOV	R3,A
		DEC	R0
		DEC	R0
		CJNE	R2,#0,FB3
		CJNE	R3,#0,FB3
		CLR	A				; 二进制浮点数为0
		MOV	@R1,A
		INC	R1
		MOV	@R1,A
		INC	R1
		MOV	@R1,A
		INC	R1
		MOV	@R1,A
		INC	R1
		MOV	@R1,A
		INC	R1
		MOV	@R1,A
FB1:		DEC	R1
		DEC	R1
		DEC	R1
		DEC	R1
		DEC	R1
		RET
FB3:		MOV	@R1,#0				; 十进制浮点数阶码初值
		JB	3EH,FB4
		DEC	@R1
FB4:		INC	R1
		MOV	@R1,#1				; 比较值1、2、4的阶码
		JNB	3EH,FB5
		INC	@R1
		JNB	3FH,FB5
		INC	@R1
FB5:		MOV	A,R6
		CLR	C
		SUBB	A,@R1
		JZ	FB13
		JNB	ACC.6,FB14
FB6:		DEC	@R1				; 二进制数阶码小于比较值取新的比较值
		DEC	@R1
		DEC	@R1
		DEC	@R1
FB7:		MOV	A,R6
		CLR	C
		SUBB	A,@R1
		JZ	FB16
		JB	ACC.6,FB17
FB8:		JNB	3EH,FB9				; 二进制数阶码大于比较值
		DEC	R6
		JNB	3FH,FB9
		DEC	R6
FB9:		CJNE	R6,#0,FB19
		MOV	R6,#5
		JNB	3EH,FB12
		MOV	R7,#1
		JNB	3FH,FB10
		INC	R7
FB10:		CLR	A
		CLR	C
FB11:		XCH	A,R3				; 把二进制尾数转换成定点数
		RLC	A
		XCH	A,R3
		XCH	A,R2
		RLC	A
                XCH     A,R2
                RLC     A
		DJNZ	R7,FB11
		DEC	R6
		MOV	@R1,A				; 十进制尾数高位(整数)
		INC	R1
FB12:		MOV	A,R3				; 把定点小数转成十进制小数
		MOV	B,#1O
		MUL	AB
		MOV	R3,A
		MOV	R7,B
		MOV	A,R2
		MOV	B,#10
		MUL	AB
		ADD	A,R7
		MOV	R2,A
		CLR	A
		ADDC	A,B
		MOV	@R1,A
		INC	R1
		DJNZ	R6,FB12
		SJMP	FB1				; 结束
FB13:		MOV	A,R2
		SUBB	A,#80H
		JC	FB6
FB14:		MOV	R5,#0CDH			; (R6R2R3)*0.1
		MOV	R4,#0CCH
		LCALL	DMUL
		MOV	A,R2
		JB	ACC.7,FB20
		MOV	A,R7
		MOV	C,ACC.7				; 四舍五入
		ORL	C,ACC.6
		MOV	A,R3				; 左规格化一位
		RLC	A
		MOV	R3,A
                MOV     A,R2
                RLC     A
                MOV     R2,A
		DEC	R6
FB15:		MOV	A,R6				; 加0.1的阶码
		ADD	A,#0FDH
		MOV	R6,A
		DEC	R1
		INC	@R1				; 十进制数阶码加1
                INC     R1
		SJMP	FB5
FBX:		SJMP	FB7
FB19:		MOV	A,R2				; 右移R2R3,使(R0=0)
		RRC	A
		MOV	R2,A
		MOV	A,R3
		RRC	A
		MOV	R3,A
		INC	R6
		SJMP	FB9
FB16:		MOV	A,#0CBH
		CLR	C
		SUBB	A,R3
		MOV	A,#0CCH
		SUBB	A,R2
		JC	FB8
FB17:		MOV	R4,#0A0H			; (R6R2R3)*10
		MOV	R5,#0
		LCALL	DMUL
		MOV	A,R2
		JB	ACC.7,FB21
		MOV	A,R7
		MOV	C,ACC.7				; 四舍五入
		ORL	C,ACC.6
		MOV	A,R3				; 左规格化一位
		RLC	A
		MOV	R3,A
                MOV     A,R2
                RLC     A
                MOV     R2,A
		DEC	R6
FB18:		MOV	A,R6				; 加10的阶码
		ADD	A,#4
		MOV	R6,A
		DEC	R1
		DEC	@R1				; 十进制数阶码减1
		INC	R1
		SJMP	FBX
FB20:		MOV	A,R7
		JNB	ACC.7,FB15
		MOV	A,R3				; 四舍五入
		ORL	A,#1
		MOV	R3,A
		SJMP	FB15
FB21:		MOV	A,R7
		JNB	ACC.7,FB18
		MOV	A,R3				; 四舍五入
		ORL	A,#1
		MOV	R3,A
		SJMP	FB18
;功能:把放在由(DPTR)指示的外部RAM缓冲区中的一个十进制数(以回车符0DH结尾)
;转换成三字节浮点二进制数,放在(R1)指示的三字节内部RAM中。
; ************  14、三字节浮点数十进制到二进制转换子程序FDTB ************
;
FDTB:		MOV	@R1,#41H			; y-0
		INC	R1
		MOV	@R1,#0
		INC	R1
		MOV	@R1,#0
		DEC	R1
		DEC	R1
		CLR	3BH
		MOV	7CH,#0				; 小数点位置计数器清零
		CLR	3CH				; 符号
		MOVX	A,@DPTR
		CJNE	A,#2BH,FDTB1
		SJMP	FDTB2				; 正号“+”
FDTB1:		CJNE	A,#2DH,FDTB3
		SETB	3CH				; 负号“-”
FDTB2:		INC	DPTR
		MOVX	A,@DPTR
FDTB3:		CJNE	A,#30H,$+3
		JC	FDTB8
		CJNE	A,#3AH,$+3
		JNC	FDTBE
FDTB4:		CLR	C				;“0”=<(A)< “9”
		SUBB	A,#30H				; ASCII码转换成BCD码
		PUSH	ACC
		INC	DPTR
		MOV	7DH,#4				; 10
		MOV	7EH,#0A0H
		MOV	7EH,#0
		MOV	R0,#7DH
		LCALL	FMUL
		LCALL	FSTR				; y*10-y
		POP	ACC
		MOV	R3,A
		MOV	R2,#0
		MOV	R6,#16
		SETB	C
		CLR	F0
		LCALL	FSDT				; 输入数字转换成浮点数
		MOV	A,R6
		MOV	@R0,A
		INC	R0
		MOV	A,R2
		MOV	@R0,A
		INC	R0
		MOV	A,R3
		MOV	@R0,A
		MOV	R0,#7DH
		LCALL	FADD
		LCALL	FSTR				; 小数点位置计数器加1
FDTB5:		MOVX	A,@DPTR
		CJNE	A,#30H,$+3
		JC	FDTB6
		CJNE	A,#3AH,$+3
		JC	FDTB4
FDTB6:		CJNE	A,#2EH,FDTB9
FDTB7:		INC	DPTR				;(A)中为小数点“.”
		SETB	3BH				; 置位遇小数点标志
		SJMP	FDTB5
FDTB8:		CJNE	A,#2EH,FDTBE
		SJMP	FDTB7
FDTBE:		SETB	PSW.5				; 出错
                RET
FDTB9:		CJNE	A,#0DH,FDTBE
		JNB	3BH,FDTBB
		MOV	A,7CH				; 遇到过小数点
		JZ	FDTBB
FDTBA:		MOV	7DH,#7DH			; 0.1
		MOV	7EH,#0CCH
		MOV	7FH,0CDH
		MOV	R0,#7DH
		LCALL	FMUL
		LCALL	FSTR				; y*0.1-y
		DJNZ	7CH,FDTBA			; 循环
FDTBB:		MOV	A,@R1
		MOV	C,3CH				; 回送符号
		MOV	ACC.7,C
		MOV	@R1,A
		CLR	PSW.5
		RET
;功能:把(R0)指向的内部RAM中三字节浮点数开平方,结果Z送到(R1)指向的内部RAM单元中。
;
; ************  15、浮点数开平方子程序FSQR  *****************
;
FSQR:		MOV	A,@R0
		JB	ACC.7,FR3			; X为负数转出错处理
		MOV	@R1,A				; 取X为迭代初值Z。
		INC	R0
		INC	R1
		MOV	A,R0
		MOV	@R1,A
		INC	R0
		INC	R1
		MOV	A,@R0
		MOV	@R1,A
		DEC	R0
		DEC	R0				;(R0)指向X的阶码存储单元
		DEC	R1
		DEC	R1				;(R1)指向Zi的阶码存储单元
FR1:		LCALL	FDIV				; 计算X/Zi-R6R2R3
		MOV	R6,A
		MOV	A,@R1				; Zi取到R7R4R5
		MOV	R7,A
		INC	R1
		MOV	A,@R1
		MOV	R4,A
		INC	R1
		MOV	A,@R1
		MOV	R5,A
		DEC	R1
		DEC	R1
		CLR	3AH
		LCALL	FABP				; 计算(Zi+X/Zi)-R4R2R3
		CLR	PSW.5
		MOV	A,R4				; 计算1/2(Zi+X/Zi)得Zi+1
		DEC	A
		CLR	ACC.7
		MOV	R4,A
		MOV	B,R7
		CLR	B.7
		CJNE	A,B,FR2				; 比较Zi+1和Zi的阶码相等否?
		MOV	A,R5
		SUBB	A,R3
		ANL	A,#0FCH
		MOV	R7,A
		MOV	A,R6
		SUBB	A,R2				; Zi+1和Zi尾数高位不相等转FR2
		JNZ	FR2
		CJNE	R7,#0,FR2			; Zi+1和Zi尾数低位差大于03,转FR2
		SETB	PSW.5				; 置结束标志
FR2:		LCALL	FSTR				; 存Zi+1
		JNB	PSW.5,FR1
		RET
FR3:		CLR	PSW.5
		RET					; 负数开平方出错处理





                END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -