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

📄 zz51.a51

📁 基于mcs51单片机的四字节浮点数的库程序
💻 A51
📖 第 1 页 / 共 4 页
字号:
	ORL     09H,#80H
	ORL     0DH,#80H	;恢复尾数最高位
	MOV     1DH,R5
	MOV     1EH,R6
	MOV     1FH,R7  	;乘数之尾数送入第3组寄存器
	MOV     R0,#25  	;右移相加25次
	CLR     A
	MOV     R6,A
	MOV     R7,A    	;ACC,R6,R7为部分积累加器
	CLR     C
LOOP1:  JNC     M2
	ACALL   ADD0
	ADDC    A,R1    	;乘数移出位等于1 ,被乘数往部分积里加1次
M2:     ACALL   SRA1
	XCH     A,R5
	CPL     RS1
	ACALL   SRA
	CPL     RS1     	;部分积带进位位整体右移1位
	DJNZ    R0,LOOP1
	MOV     R5,A
	JB      ACC.7,M3	;查积最高位
	MOV     A,1DH
	RLC     A
	ACALL   H0      	;积最高位为0,积整体算术左移1位
	JNB     ACC.7,M5
	ACALL   INC3    	;尾数截去部分四舍五入
	CJNE    R5,#0,M5
	MOV     R5,#80H 	;调整
	SJMP    COM2
M5:     DJNZ	R4,COM2 	;阶码减1为0,为溢出
OV2:    LJMP    0FFFFH
M3:     MOV     A,1DH
	JNB     ACC.7,COM2
	ACALL   INC3    	;尾数截去部分四舍五入
COM2:   JBC     7EH,DON2	;配置数符
	ANL     0DH,#7FH
DON2:   RET
;------------------------------------------------
;清单5  标号:FPDI 功能:浮点除法子程序
;浮点除法规则为:两数相除,阶码相减,尾数相除,阶码调整.
;入口:被除数R0,R1,R2,R3 ;除数R4,R5,R6,R7
;出口:商在R4,R5,R6,R7
;------------------------------------------------
FPDI:   MOV     A,R4    	;浮点除法子程序
	JZ      OV3     	;除数为0,溢出
	CPL     A
	INC     A
	MOV     R4,A    	;除数阶码求补,为DP子程序准备
	MOV     A,R0
	JNZ     D1
	AJMP    G0      	;被除数为0,商为0
D1:     ACALL   DP      	;商符号,商阶码处理
	JZ      OV3
	JC      OV3     	;商阶码等于0或CY=1为溢出
	ORL     09H,#80H
	ORL     0DH,#80H	;恢复尾数最高位
FPD3:   ACALL   EXT     	;尾数交换
	MOV     R0,#19H 	;左移试商25次,最后1次四舍五入
	ACALL   SUB0
	XCH     A,R5
	SUBB    A,R1    	;试商
	JC      D2
	INC     R4      	;够减,商阶码增1
	CJNE    R4,#0,D3
OV3:    LJMP    0FFFFH  	;商阶码变为0,则为溢出
D2:     ACALL   ADD0
	ADDC    A,R1    	;不够减,恢复被除数
LOOP2:  ACALL   ADD2
	RLC     A       	;被除数算术左移1位
	JC      D4      	;有进位(必定够减),转
	ACALL   SUB0
	SUBB    A,R1
	JNC     D3      	;无进位,试商够减,转
	ACALL   ADD0
	ADDC    A,R1    	;试商不够减,恢复被除数
	SJMP    D3
D4:     ACALL   SUB0
	SUBB    A,R1
	CLR     C
D3:     DJNZ	R0,D5   	;试商25次?
	MOV     R5,1DH
	MOV     R6,1EH
	MOV     R7,1FH  	;回送商
	JC      COM3
	ACALL   INC3    	;第25次够减,商加1
COM3:   JBC     7EH,DON3
	ANL     0DH,#7FH	;配置数符
DON3:   RET
D5:     CPL     C       	;进位位求反为本位商
	CPL     RS1
	ACALL   H0      	;在第3组寄存器中记商
	CPL     RS1
	SJMP    LOOP2
;------------------------------------------------
;清单6  标号:FPSQ 功能:浮点数模拟手算开平方子程序
;规则为:阶码折半,调整阶码、尾数,尾数开平方。
;入/出口:R4...R7
;------------------------------------------------
FPSQ:   MOV     A,R5    	;浮点数开平方子程序
	RLC     A
	MOV     7EH,C   	;如为负数,置虚根标志 (7EH=1为虚根)
FPS0:   MOV     A,R4
	JZ      DON4    	;0的平方根为0
	ORL     0DH,#80H	;尾数恢复为原码
	CLR     C
	RRC     A       	;阶码逻辑右移1位(折半)
	JNC     S2
	INC     A       	;阶码为奇数,折半后增1
	ACALL   INC3
	ACALL   SRA     	;尾数增1后折半
	CJNE    R5,#0,S2
	MOV     R5,#80H 	;调整
S2:     ADD     A,#40H  	;阶码恢复为移码
	MOV     R4,A
	MOV     1DH,R5
	MOV     1EH,R6
	MOV     1FH,R7  	;尾数移入第3组寄存器
	CLR     A
	MOV     R1,A
	MOV     R2,A
	MOV     R3,A    	;根尾数存储区清除
	MOV     R6,A
	MOV     R7,A    	;被开方数尾数扩展区(ACC,R6,R7)清除
	MOV     R0,#19H 	;试根25次,最后1次四舍五入
S3:     CLR     C
	XCH     A,1DH
	SUBB    A,#40H
	XCH     A,1DH
	ACALL   SBC0
	SUBB    A,R1    	;试根
	JNC     S4
	XCH     A,1DH
	ADD     A,#40H
	XCH     A,1DH
	ACALL   ADC0
	ADDC    A,R1    	;不够减,恢复尾数
S4:     DJNZ	R0,S5
	ACALL   SAVT    	;回送平方根尾数
	JC      COM4
FQDON:  ACALL   INC3    	;四舍五入
COM4:   ANL     0DH,#7FH	;置数符
DON4:   RET
S5:     CPL     C       	;进位位求反为本位根
	ACALL   LR0     	;记根
	CPL     RS1
	ACALL   SHIF
	CPL     RS1
	ACALL   ADC2
	RLC     A
	CPL     RS1
	ACALL   SHIF
	CPL     RS1
	ACALL   ADC2
	RLC     A       	;被开平方数的尾数算术左移2位
	JNC     S3
	ACALL   SAVT
	SJMP    FQDON
;------------------------------------------------
;清单7  标号:FSQR 功能:浮点数牛顿迭代开平方子程序
;注:牛顿迭代开平方FSQR慢于模拟手算FPSQ开平方.
;------------------------------------------------
FSQR:   MOV     A,R5    	;浮点数牛顿迭代开平方子程序
	RLC     A
	MOV     7EH,C   	;实根/虚根标志
	MOV     A,R4
	JZ      SQRT    	;0的平方根为0
	ANL     0DH,#7FH	;尾数恢复为正数
	MOV     A,R4
	MOV     R0,A
	CLR     C
	RRC     A
	ADDC    A,#40H
	MOV     1CH,A   	;存根的阶码
	MOV     A,R0
	ANL     A,#1
	SETB    ACC.7
	MOV     R4,A    	;变x为x1(0.5≤x1<2)
	LCALL   LD1     	;存x1
	LCALL   SRA0
	CJNE    R4,#80H,FSQR1
	ORL     0DH,#40H	;得到首次根r0=(1+x1)/2
FSQR1:  MOV     B,#3    	;设迭代次数为3
FSQLP:  LCALL   LD2
	LCALL   GET1
	LCALL   FPDI
	LCALL   GET2
	LCALL   FPAD
	DEC     R4      	;计算ri+1=(xi+x1/ri)/2
	DJNZ    B,FSQLP
	MOV     R4,1CH  	;取回根的阶码
SQRT:   RET
;------------------------------------------------
;清单9  标号:LD0 功能:装、存、取浮点数
;------------------------------------------------
LD0:    MOV	08H,R4  	;装入浮点数
	MOV     09H,R5
	MOV     0AH,R6
	MOV     0BH,R7
	RET
LD1:    MOV	30H,R4  	;存浮点数
	MOV     31H,R5
	MOV     32H,R6
	MOV     33H,R7
	RET
LD2:    MOV	34H,R4  	;存浮点数
	MOV     35H,R5
	MOV     36H,R6
	MOV     37H,R7
	RET
LD3:    MOV	38H,R4  	;存浮点数
	MOV     39H,R5
	MOV     3AH,R6
	MOV     3BH,R7
	RET
LD4:    MOV	18H,R4  	;存浮点数
	MOV     19H,R5
	MOV     1AH,R6
	MOV     1BH,R7
	RET
GET1:   MOV     R0,30H  	;取浮点数
	MOV     R1,31H
	MOV     R2,32H
	MOV     R3,33H
	RET
GET2:   MOV     R0,34H  	;取浮点数
	MOV     R1,35H
	MOV     R2,36H
	MOV     R3,37H
	RET
GET3:   MOV     R0,38H  	;取浮点数
	MOV     R1,39H
	MOV     R2,3AH
	MOV     R3,3BH
	RET
GET4:   MOV     R0,18H  	;取浮点数
	MOV     R1,19H
	MOV     R2,1AH
	MOV     R3,1BH
	RET
INVPI:  MOV     R0,#86H 	;取180/π
	MOV     R1,#65H
	MOV     R2,#2EH
	MOV     R3,#0E0H
	RET
G90:    MOV	R0,#87H 	;取浮点数90
	MOV     R1,#34H
	CLR     A
	MOV     R2,A
	MOV     R3,A
	RET
GTOR:   ACALL   PI18    	;角度化为弧度子程序
	AJMP    FPMU
RTOG:   ACALL   INVPI   	;弧度化为角度子程序
	AJMP    FPMU
GHPI:   MOV     R0,#81H 	;取浮点数 π/2
	MOV     R1,#49H
	MOV     R2,#0FH
	MOV     R3,#0DBH
	RET
G01:    MOV	R0,#7DH 	;取浮点数0.1
	MOV     R1,#4CH
	MOV     R2,#0CCH
	MOV     R3,#0CDH
	RET
G1:     MOV     R0,#81H 	;取浮点数1
	CLR     A
	MOV     R1,A
	MOV     R2,A
	MOV     R3,A
	RET
PI18:   MOV     R0,#7BH 	;取浮点数π/180
	MOV     R1,#0EH
	MOV     R2,#0FAH
	MOV     R3,#35H
	RET
GINT:   CJNE    R4,#81H,$+3	;将浮点数取整子程序
	JNC     GINT1
	ACALL   G0      	;阶码<81H,结果为0
	AJMP    LD0
GINT1:  MOV     A,R5
	RLC     A
	MOV     78H,C   	;记数符
	CJNE    R4,#98H,$+3
	JNC     GOV     	;阶码>97H,溢出
	ACALL   BRK     	;分离出整数部分
	JNB     78H,GEND	;正数结束
	CLR     A       	;负数求其补
	CLR     C
	SUBB    A,R3
	MOV     R3,A
	CLR     A
	SUBB    A,R2
	MOV     R2,A
	CLR     A
	SUBB    A,R1
	MOV     R1,A
GEND:   RET
GOV:    LJMP    0FFFFH
BRK:    ORL	0DH,#80H	;分解浮点数(正数)为整数,小数两部分
	CLR     A
	MOV     R1,A
	MOV     R2,A
	MOV     R3,A
LOOP4:  ACALL   SHIF
	ACALL   LR0
	DEC     R4
	CJNE    R4,#80H,LOOP4	;左移尾数(阶码-80H)位,移出部分为整数,在R1~R3中
	RET
LDD:    CLR	7BH     	;正整数(最多16位)规格化子程序
	MOV     R7,#0
	MOV     R4,#90H
	AJMP    NOM
G10:    MOV	R0,#84H 	;取浮点数10
	MOV     R1,#20H
	CLR     A
	MOV     R2,A
	MOV     R3,A
	RET
GLN2:   MOV     R0,#80H 	;取浮点数ln 2(=0.693 147 18)
	MOV     R1,#31H
	MOV     R2,#72H
	MOV     R3,#18H
	RET
GLN10:  MOV     R0,#82H 	;取浮点数ln 10(=2.302 585 1)
	MOV     R1,#13H
	MOV     R2,#5DH
	MOV     R3,#8EH
	RET
INVX:   CJNE    R4,#0,INV	;计算1/x,x=0为溢出
	LJMP    0FFFFH
INV:    ACALL   G1
	AJMP    FPDI    	;浮点除法子程序
;------------------------------------------------
;清单10  标号:FPLN1 功能:计算奇次多项式值(ln x、sin x、arcsin x 等)子程序
;------------------------------------------------
FPLN1:  SETB    7CH     ;计算奇次多项式值(ln x、sin x、arcsin x 等)子程序
	ACALL   LD4     	;存x
	ACALL   LD0
	ACALL   FPMU    	;计算x·x
	SJMP    FLN0
FPLN2:  CLR     7CH     	;计算ex展开式值/cos x
FLN0:   ACALL   LD1     	;x(或x·x)→t,存t
	POP     DPH
	POP     DPL
	CLR     A
	MOVC    A,@A+DPTR
	MOV     R0,A
	INC     DPTR
	CLR     A 
	MOVC    A,@A+DPTR
	MOV     R1,A
	INC     DPTR
	CLR     A
	MOVC    A,@A+DPTR
	MOV     R2,A
	INC     DPTR
	CLR     A
	MOVC    A,@A+DPTR
	MOV     R3,A    ;取an
	INC     DPTR
PLN:    ACALL   M1      	;计算(…((an·t+an-1)·t+an-2)·t+…+ai)·t
	CLR     A
	MOVC    A,@A+DPTR
	MOV     R0,A
	INC     DPTR
	CLR     A
	MOVC    A,@A+DPTR
	MOV     R1,A
	INC     DPTR
	CLR     A
	MOVC    A,@A+DPTR
	MOV     R2,A
	INC     DPTR
	CLR     A
	MOVC    A,@A+DPTR
	MOV     R3,A    	;取ai-1
	INC     DPTR
	ACALL   FPLAD   ;计算(…((an·t+an-1)·t+an-2)·t+…+ai)·t+ai-1
	CLR     A
	MOVC    A,@A+DPTR
	ACALL   GET1
	DEC     A
	JNZ     PLN     	;1为计算结束符
PEND:   JNB     7CH,REND
	ACALL   GET4
	ACALL   M1      	;计算奇次多项式值,再乘以x
REND:   MOV     A,#1
	JMP     @A+DPTR 	;转至结束符的下一地址
;------------------------------------------------
;清单11  标号: LNX,LGAX及LGX 功能:计算对数函数子程序
;------------------------------------------------
LNX:    MOV	A,R4    	;计算对数函数子程序
	JZ      OV4
	MOV     A,R5
	JNB     ACC.7,LN1
OV4:    LJMP    0FFFFH  	;x≤0,溢出
LN1:    CLR	79H     	;阶m的符号
	MOV     1CH,R4  	;设x=2m·t, 则ln x=m·ln 2+ln	t,先存p=m
	MOV     R1,#35h
	MOV     R2,#4
	MOV     R3,#0f3h	;t与√2/2相比较
	LCALL   CP3
	JNC     LN5     	;t≥√2/2转
	DEC     1CH     	;p=m-1, ln x=(m-1)·ln 2+ln(2t)
	CLR     7EH     	;(2t-1)为正
	MOV     A,R5
	ORL     A,R6
	ORL     A,R7
	MOV     R4,A
	JZ      LN5A   		;2t-1=0	勿计算ln(2t)
	LCALL   LD0
	CLR     C
	LCALL   LR0     	;(2t-1)
	LCALL   SRA0
	ORL     0DH,#80H	;2t+1
	MOV     R4,#7EH 	;1/(2t+1)的阶
	SJMP    LNTLP
LN5:    SETB    7EH     	;(t-1)为负
	CLR     C
	CLR     A
	SUBB    A,R7
	MOV     R3,A
	CLR     A
	SUBB    A,R6
	MOV     R2,A
	CLR     A
	SUBB    A,R5
	ADD     A,#80H
	MOV     R1,A            ;计算(t-1)
	LCALL   SRA0
	ORL     0DH,#0C0H       ;计算(t+1)
	MOV     R4,#7FH         ;1/(t+1)的阶
LNTLP:  CLR     C
	LCALL   LR0             ;(2t-1)或(t-1)规格化
	DEC     R4              ;调整(2t-1)/(2t+1)或(t-1)/(t+1)的阶
	MOV     A,R1
	JNB     ACC.7,LNTLP
	LCALL   FPD3            ;计算(2t-1)/(2t+1)或(t-1)/(t+1)
	LCALL   FPLN1           ;计算ln t或ln(2t)
	
        DB 7EH,12H,49H,25H      ;0.14285714
	DB 7EH,4CH,0CCH,0CDH    ;0.2
	DB 7FH,2AH,0AAH,0AAH    ;0.33333333
	DB 81H,0,0,0            ;1
	DB 1                    ;结束符
	INC     R4              ;得到ln t

⌨️ 快捷键说明

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