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

📄 zz51.a51

📁 基于mcs51单片机的四字节浮点数的库程序
💻 A51
📖 第 1 页 / 共 4 页
字号:
	
LN5A:   MOV     A,1CH
	ADD     A,#80H
	JZ      LN53
	JC      LN51
	CPL     A
	INC     A
	CPL     79H             ;p为负,取绝对值,记数符
LN51:   LCALL   LD1
	MOV     R6,A
	MOV     R5,#0
	LCALL   LDD             ;|p|规格化
	LCALL   GLN2            ;取ln2
	LCALL   FPMU            ;计算|p|·ln 2
	LCALL   GET1            ;取ln	t
	JNB     79H,LN52
	XRL     0DH,#80H        ;p<0计算lnt-|p|·ln2
LN52:   LCALL   FPAD            ;p≥0 计算ln t+|p|·ln2
LN53:   RET
LGX:    ACALL   LNX             ;先计算ln x
	ACALL   GLN10           ;取ln 10
	ACALL   EX
	AJMP    FPDI            ;转计算log10 x=ln x/ln10
LGAX:   ACALL   LD2             ;存a
	ACALL   EX
	ACALL   LNX             ;计算ln x
	ACALL   GET2            ;取a
	ACALL   LD2             ;存ln x
	ACALL   EX
	ACALL   LNX             ;计算ln a
	ACALL   GET2            ;转计算loga x=ln x/lna
	AJMP    FPDI
;------------------------------------------------
;清单12  标号: DXP 功能:计算...
;------------------------------------------------
DXP:    ACALL   GLN10           ;先取ln 10
	SJMP    EXP0            ;转计算x·ln a
AXP:    ACALL   LD2             ;存x
	ACALL   EX
	ACALL   LNX             ;计算ln a
	ACALL   GET2            ;取x
EXP0:   ACALL   FPMU            ;计算x·ln a
EXP:    CJNE    R4,#68H,E1      ;计算ex子程序
E1:     JNC     E2
	ACALL   G0
	MOV     R4,#81H         ;X的阶<68H,取ex=1
	RET
E2:     MOV     A,R5
	RLC     A
	MOV     79H,C           ;存数符
	ANL     0DH,#7FH        ;取绝对值|x|
	MOV     R0,#87H
	MOV     R1,#30H
	MOV     R2,#0fH
	MOV     R3,#33H
	ACALL   FPCP            ;|x|与88.029 69比较
	JC      E3              ;|x|<88.029 69,转
	JNB     79H,E4
G0:     CLR     A               ;否则,当x<-88.029 69时
	MOV     R4,A            ;ex =0
	MOV     R5,A
	MOV     R6,A
	MOV     R7,A
	RET
E4:     LJMP	0FFFFH          ;x>88.02969时,溢出
E3:     MOV     1CH,#0          ;整数部分预清除
	MOV     R0,#81H
	MOV     R1,#38H
	MOV     R2,#0AAH
	MOV     R3,#3BH         ;取log2 e(1/ln 2)
	ACALL   FPMU            ;计算x/ln 2
	JNB     79H,$+6
	ORL     0DH,#80H
	CJNE    R4,#81H,$+3
	JC      E6              ;x/ln 2整数部分为0,转
	ACALL   BRK     ;否则分解该浮点数为整数,小数部分(I和F)
	MOV     R4,#80H
	MOV     C,79H
	MOV     7BH,C           ;x的数符
	ACALL   NOM             ;小数部分规格化为符点数F
	MOV     A,R3
	JNB     79H,EP5
	CPL     A
	INC     A               ;x为负数时,将整数部分I求负
EP5:    MOV	1CH,A           ;整数部分送入1CH
E6:     ACALL   FPLN2           ;计算EXP(F·ln 2)

	DB 69H,5AH,92H,9FH      ;0.10178086 E-6
	DB 6DH,31H,60H,11H      ;0.13215487 E-5
	DB 70H,7FH,0E5H,0FEH    ;0.15252374 E-4
	DB 74H,21H,84H,89H      ;0.15403530 E-3
	DB 77H,2EH,0C3H,0FFH    ;0.13333333 E-2
	DB 7AH,1DH,95H,5BH      ;0.96181290 E-2
	DB 7CH,63H,58H,47H      ;0.55504109 E-1
	DB 7EH,75H,0FDH,0F0H    ;0.24022651
	DB 80H,31H,72H,18H      ;0.69314718
	DB 81H,0,0,0    ;1
	DB 1            	;结束符
	
	MOV     A,R4
	ADD     A,1CH   	;x/ln 2整数部分加入阶码中
	MOV     R4,A
COM6:   RET
SHX:    ACALL   SUB11   	;计算双曲正弦
	ACALL   FPSU
	JNZ     NX48
	RET
CHX:    ACALL   SUB11   	;计算双曲余弦
	ACALL   FPAD
NX48:   DEC     R4
	RET
SUB11:  ACALL   EXP
	ACALL   LD2
	ACALL   INVX
	AJMP    GET2
ASHX:   ACALL   SUB2    	;计算反双曲正弦
	ACALL   FPAD
ASH:    ACALL   FPSQ
	ACALL   GET2
	ACALL   FPAD
	AJMP    LNX
ACHX:   ACALL   SUB2    	;计算反双曲余弦
	ACALL   EX
	ACALL   FPSU
	SJMP    ASH
SUB2:   ACALL   LD2     	;存x
	ACALL   LD0
	ACALL   FPMU    	;得x2
	AJMP    G1      	;取1
;------------------------------------------------
;清单13: 标号COTX 功能:正弦函数及其衍生函数子程序
;------------------------------------------------
COTX:   ACALL   RTOG    	;弧度化为角度
COTX1:  ACALL   TANX1   	;计算tan x
	AJMP    INVX		;取倒数为ctan x
TANX:   ACALL   RTOG    	;弧度化为角度
TANX1:  ACALL   LD2     	;存x
	ACALL   SINX1   	;计算sin x
	ACALL   GET2    	;取x
	ACALL   LD2     	;存sin x
	ACALL   EX
	ACALL   COSX1   	;计算cos x
	JNZ     NX39
	LJMP    0FFFFH  	;cos x=0,溢出
NX39:   ACALL   GET2    	;取sin x
	AJMP    FPDI    	;tan x=sin x/cos x
COSX:   ACALL   RTOG    	;余弦函数子程序,先将弧度化为角度
COSX1:  ACALL   G90     	;取90°
	ACALL   FPSU
	AJMP    SINX1   	;cos x=sin(90-x)
SINX:   ACALL   RTOG    	;正弦函数子程序,先将弧度化为角度
SINX1:  MOV     A,R5    	;x1为角度
	RLC     A 
	MOV     79H,C   	;存数符
	ANL     0DH,#7FH	;x→|x|
NX30:   ACALL   G90
	INC     R0
	INC     R0      	;取360°
	ACALL   FPCP    	;|x|与360°比较
	JZ      GE0     	;相等,转出
	JC      NX31    	;|x|<360°.再与180°比较
	ACALL   EX
	ACALL   FPSU    	;|x|-360°→|x|
	SJMP    NX30
NX31:   DEC     R0
	ACALL   FPCP    	;|x|与180°比较
	JZ      GE0     	;相等,转出
	JC      NX32    	;|x|<180°,与90°比较
	ACALL   EX
	ACALL   FPSU    	;|x|-180°→|x|
	CPL     79H     	;数符求反1次
NX32:   ACALL   G90
	ACALL   FPCP    	;|x|与90°比较
	JC      NX36
	INC     R0
	ACALL   FPSU    	;|x|>90°时,取180°-|x|→|x|
	SJMP    NX36
GE0:    AJMP    G0      	;|x|=sin x=0
NX36:   ACALL   GTOR    	;变回弧度
        CJNE    R4,#79H,$+3 	;阶码<79H时,sin x=x
NX37:   JC	PP2
	ACALL   FPLN1   	;计算sin |x|
	
	DB 60H,30H,92H,32H      ; 0.16059043 E-9
	DB 67H,0D7H,32H,2AH     ;-0.25052108 E-7
	DB 6EH,38H,0EFH,1CH     ; 0.27557309 E-5
	DB 74H,0D0H,0DH,1       ;-0.19841270 E-3
	DB 7AH,8,88H, 88H       ; 0.83333333 E-2
	DB 7EH,0AAH,0AAH,0AAH   ;-0.16666667
	DB 81H,0,0,0    ;1
	DB 1            	;结束符
PP2:    JNB	79H,DON6
PP3:    ORL	0DH,#80H	;配置数符
DON6:   RET	
;------------------------------------------------	
;清单14: 标号:ASINX 功能:反正弦函数及其衍生函数子程序
;------------------------------------------------
ASINX:  CJNE    R4,#78H,$+3    ;反正弦函数子程序
	JC      DON6    	;x的阶<78H,acrsin x=x
	MOV     A,R5
	RLC     A
	MOV     79H,C   	;存数符
	ANL     0DH,#7FH	;取绝对值
	LCALL   G1
	LCALL   FPCP
	JZ      AA
	JC      AA1
	LJMP    0FFFFH  	;|x|>1,溢出
AA:     ACALL   GHPI
	ACALL   EX
	SJMP    PP2     	;|x|=1,arcsin x=±π/2
AA1:    CLR	7DH     	;|x|<0.5标志
	CJNE    R4,#80H,AS1;|x|≤0.5
	MOV     A,R5
	ORL     A,R6
	ORL     A,R7
	JZ      AS1     	;x=0.5,转
	SETB    7DH     	;x>0.5标志,|x|≤0.5时,y=|x|
	CLR     A
	CLR     C
	SUBB    A,R7
	MOV     R7,A
	CLR     A
	SUBB    A,R6
	MOV     R6,A
	CLR     A 
	SUBB    A,R5
	ADD     A,#80H
	MOV     R5,A
	MOV     R4,#7FH ;sqr((1-|x|)/2)的阶最大为7FH
NRMLP:  ACALL   SHIF
	DEC     R4
	MOV     A,R5
	JNB     ACC.7,NRMLP
	ACALL   FPS0    ;sqr((1-|x|)/2)→y
AS1:    ACALL   FPLN1   ;计算arcsin y

	DB 7AH,3DH,43H,0C4H     ;0.115 518 01 E-1
	DB 7AH,64H,0CCH,0CDH    ;0.139 648 44 E-1
	DB 7BH,0EH,27H,62H      ;0.173 527 64	E-1
	DB 7BH,37H,45H,0D1H     ;0.223 722 59 E-1
	DB 7BH,78H,0E3H,8EH     ;0.303 819 44 E-1
	DB 7CH,36H,0DBH,6EH     ;0.446 428 57 E-1
	DB 7DH,19H,99H,9AH      ;0.075
	DB 7EH,2AH,0AAH,0AAH    ;0.166 666 67
	DB 81H,0,0,0    ;1
	DB 1    ;结束符
	
	JNB     7DH,PP20        ;|x|≤0.5,转去配置数符,有arcsin |x|=arcsin y
	INC     R4
	JNB     7FH,AS2
	JNB     79H,ACSRT       ;7FH=1为计算ACOSX标志,若x>0 则arccos x=2arcsin y
	ACALL   GHPI
	INC     R0
	SJMP	AS3     ;x<0,arccosx=Л-2arcsiny
AS2:    ACALL   GHPI    ;取π/2
	ACALL   FPSU    ;|x|>0.5 arcsin |x|=π/2-2arcsin y
PP20:   AJMP    PP2     ;转去配置数符
ACOSX:  SETB    7FH     ;反余弦函数子程序,值为弧度 先建立计算arccosx标志
	ACALL   ASINX   ;计算arcsinx
	JNB     79H,ACSRT;如果79H=0且7FH=0,说明arccosx=2arcsiny已计算完毕,返回!
	ACALL   GHPI    ;取 Л/2
AS3:    ACALL   FPSU    ;|x|≤0.5,arccos x=π/2-arcsinx 
ACSRT:  CLR     7FH
	RET
ATANX:  CJNE    R4,#98H,$+3	;反正切函数子程序
	JC      AT1
	ACALL   GHPI    	;x的阶码≥98H时,取π/2
	ACALL   EX
	MOV     A,R1
	JNB     ACC.7,AT2
	ORL     0DH,#80H        ;arctan x=±π/2
AT2:    RET
AT1:    CJNE    R4,#74H,$+3    ;x的阶码<74H时,arctan x=x
	JC      AT2
	ACALL   LD0
	ACALL   LD1     	;存x
	ACALL   FPMU    	;计算x2
	ACALL   G1
	ACALL   FPAD
	ACALL   FPSQ    	;计算√1+x2 
	ACALL   GET1
	ACALL   FPDI
	AJMP    ASINX   ;转计算arctan x=arcsin(x/√1+x2) 
ACTNX:  ACALL   ATANX   ;反余切函数子程序
	ACALL   GHPI
	AJMP    FPSU    ;arcctan x=π/2-arctan x
ASNX:   ACALL   ASINX   ;反正弦函数,结果以角度表示
	AJMP    RTOG
ACSX:   ACALL   ACOSX   ;反余弦函数,结果以角度表示
	AJMP    RTOG
ATNX:   ACALL   ATANX   ;反正切函数,结果以角度表示
	AJMP    RTOG
ACNX:   ACALL   ACTNX   ;反余切函数,结果以角度表示
	AJMP    RTOG
;------------------------------------------------		
;清单15: 标号:DMST2 功能:函数子程序的演示程序
;------------------------------------------------
;清单16  标号:NP 功能:阶乘子程序
;n! =n(n-1)(n-2). ... .3.2.1,为1至n连续n个自然数的乘积,
;其设计方法如下: (1)n=0或n=1时,置结果n!=1; 
; (2) n≥2时,令np=1,t=1,t每增加1后即乘以1次up,并以乘积替np,直到连续乘n-1项为止,结果即为n!
;------------------------------------------------
NP:     MOV     A,R4    ;阶乘子程序,定点二进制整数n在R4中
	JZ      GG
	ADD     A,#0DEH
	JNC     NX58
	LJMP    0FFFFH  	;n>33,溢出
NX58:   DJNZ    R4,NX59
GG:     LCALL   G1
	LJMP    SAV0    	;n≤1,n!=1
NX59:   MOV     1CH,R4  	;存n
	MOV     R5,#0
	MOV     R6,#1   	;取t=1
	LCALL   LD2     	;存入
	LCALL   LDD     	;t规格化
	LCALL   LD1     	;存规格化t
L43:    LCALL   GET2   		;取出t
	LCALL   SAV0
	INC     R6      	;t+1→t
	LCALL   LD2     	;存t
	LCALL   LDD     	;t规格化
	LCALL   GET1    	;阶段阶乘值
	LCALL   FPMU    	;计算t!
	LCALL   LD1
	DJNZ    1CH,L43		;t=n时得到n!
	RET
;------------------------------------------------
;清单17  标号: CONV1 功能:定点整数二翻十
;------------------------------------------------
CONV1:  MOV     B,#24   ;定点整数二翻十
	CLR      A
	MOV     R5,A    ;(R1 R2 R3)→R5 R6 R7
	MOV     R6,A
	MOV     R7,A
CV1:    CLR	C
	ACALL   LR0
	MOV     A,R7
	ADDC    A,R7
	DA      A
	MOV     R7,A
	MOV     A,R6
	ADDC    A,R6
	DA      A
	MOV     R6,A
	MOV     A,R5
	ADDC    A,R5
	DA      A
	MOV     R5,A
	DJNZ    B,CV1
	RET
CONV2:  MOV     B,#24   ;定点整数十翻二
CONV21: CLR     A
	MOV     R5,A	;R5 R6 R7←(R1 R2 R3)
	MOV     R6,A
	MOV     R7,A
CV2:    CLR	C
	ACALL   RR0
	ACALL   SRA
	XCH     A,R1
	LCALL   BB
	XCH     A,R1
	XCH     A,R2
	LCALL   BB
	XCH     A,R2
	XCH     A,R3
	LCALL   BB
	XCH     A,R3
	DJNZ    B,CV2
	RET
CONV3:  MOV     B,#24   ;定点小数二翻十
CONV31: CLR     A
	MOV     R1,A    ;(R5 R6	R7)→R1	R2 R3 R4
	MOV     R2,A
	MOV     R3,A
	MOV     R4,A
CV3:    ACALL   SRA0
	ACALL   RR0
	XCH     A,R4
	RRC     A
	XCH     A,R4
	XCH     A,R1
	LCALL   BB
	XCH     A,R1
	XCH     A,R2
	LCALL   BB
	XCH     A,R2
	XCH     A,R3
	LCALL   BB
	XCH     A,R3
	XCH     A,R4
	LCALL   BB
	XCH     A,R4
	DJNZ    B,CV3
	RET	
CONV4:  MOV     B,#20H  ;定点小数十翻二
CONV41: CLR     A       ;(R4 R5 R6 R7)→R0 R1 R2 R3→R4 R5 R6 R7
	MOV     R0,A
	MOV     R1,A
	MOV     R2,A
	MOV     R3,A
CV4:    MOV	A,R7
	ADD     A,R7
	DA      A
	MOV     R7,A
	MOV     A,R6
	ADDC    A,R6
	DA      A
	MOV     R6,A
	MOV     A,R5
	ADDC    A,R5
	DA      A
	MOV     R5,A
	MOV     A,R4
	ADDC    A,R4
	DA      A
	MOV     R4,A
	ACALL   LR0
	XCH     A,R0
	RLC     A
	XCH     A,R0
	DJNZ    B,CV4
	AJMP    SAV0    ;结果转入R4~R7
;------------------------------------------------
;清单18  标号:DTOB1 功能:定点十进制数转为二进制浮点操作数
;入口:定点十进制整数在 R1,R2,R3中,其中R1为高字节
;[如1: R1=00H,R2=00H,R3=01H]
;定点十进制小数在 R4,R5,R6,R7中,其中R4为高位字
;[如0.1: R4=10H,R5=00H,R6=00H,R7=00H]
;数符为7BH位,0表正,1表负
;出口: R4,R5,R6,R7.其中R4为阶码,R5,R6,R7为尾数
;------------------------------------------------
DTOB1:  ACALL   LD1     ;定点十进制数变二进制浮点数,数符已装入7BH位,0表正,1表负
	ACALL   CONV2   	;整数部分十翻二
	ACALL   GET1    	;取出小数部分
	ACALL   LD1
	ACALL   SAV0
	CALL    CONV4           ;小数部分十翻二
	ACALL   GET1            ;取整数部分
	MOV     R0,#98H         ;预置阶码
LP11:   MOV     A,R1
	JB      ACC.7,NX63      ;已规格化,转
	ACALL   SHIF
	XCH     A,R4
	RLC     A
	XCH     A,R4

⌨️ 快捷键说明

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