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

📄

📁 该文件里包含了大量的常用经典的程序代码,可以为51编程者带来事半功倍的效果,
💻
📖 第 1 页 / 共 3 页
字号:
	DEC	R0
	DEC	R0
	CLR	OV
	RET 	
EXP2:	MOV	A,R2	;将指数复制到第二工作区
	MOV	R5,A
	MOV	A,R3
	MOV	R6,A
	MOV	A,R4
	MOV	R7,A
	MOV	C,1FH
	MOV	1EH,C
	LCALL	INT	;对第一区取整
	MOV	A,R3
	JZ	EXP4
EXP3:	CLR	C	;使尾数高字节R3对应一个字节整数
	RRC	A
	INC	R2
	CJNE	R2,#8,EXP3
EXP4:	MOV	R3,A
	JNB	1FH,EXP5
	CPL	A	;并用补码表示
	INC	A
EXP5:	PUSH	ACC	;暂时保存之
	LCALL	RLN	;重新规格化
	CPL	1FH
	SETB	F0
	LCALL	AS1	;求指数的小数部分
	LCALL	MOV0	;回传指数的小数部分
	LCALL	FPLN	;通过多项式计算指数的小数部分的幂
	DB	77H,0B1H,0C9H;1.3564×10-3
	DB	7AH,0A1H,68H;9.8514×10-3
	DB	7CH,0E3H,4FH;0.055495
	DB	7EH,0F5H,0E7H;0.24014
	DB	0,0B1H,72H;0.69315
	DB	1,80H,0	;1.00000
	DB	40H	;结束
	POP	ACC	;取出指数的整数部分
	ADD	A,R2	;按补码加到幂的阶码上
	MOV	R2,A
	CLR	1FH	;幂的符号为正
	LJMP	MOV0	;将幂传回[R0]中

    (24)标号:  DTOF    功能:双字节十六进制定点数转换成格式化浮点数

入口条件:双字节定点数的绝对值在[R0]中,数符在位1FH中,整数部分的位数在A中。
出口信息:转换成格式化浮点数在[R0]中(三字节)。
影响资源:PSW、A、R2、R3、R4、位1FH  堆栈需求:  6字节

DTOF:	MOV	R2,A	;按整数的位数初始化阶码
	MOV	A,@R0	;将定点数作尾数
	MOV	R3,A
	INC	R0
	MOV	A,@R0
	MOV	R4,A
	DEC	R0
	LCALL	RLN	;进行规格化
	LJMP	MOV0	;传送结果到[R0]中

    (25)  标号:  FTOD    功能:格式化浮点数转换成双字节定点数

入口条件:格式化浮点操作数在[R0]中。
出口信息:OV=1时溢出,OV=0时转换成功:定点数的绝对值在[R0]中(双字节),数符
在位1FH中,F0=1 时为整数,CY=1时为一字节整数一字节小数,否则为纯小数。
影响资源:PSW、A、B、R2、R3、R4、位1FH    堆栈需求:  6字节

FTOD:	LCALL	MVR0	;将[R0]传送到第一工作区
	MOV	A,R2
	JZ	FTD4	;阶码为零,纯小数
	JB	ACC.7,FTD4;阶码为负,纯小数
	SETB	C
	SUBB	A,#10H
	JC	FTD1
	SETB	OV	;阶码大于16,溢出
	RET
FTD1:	SETB	C
	MOV	A,R2
	SUBB	A,#8	;阶码大于8否?
	JC	FTD3
FTD2:	MOV	B,#10H	;阶码大于8,按双字节整数转换
	LCALL	FTD8
	SETB	F0	;设立双字节整数标志
	CLR	C
	CLR	OV
	RET
FTD3:	MOV	B,#8	;按一字节整数一字节小数转换
	LCALL	FTD8
	SETB	C	;设立一字节整数一字节小数标志
	CLR	F0
	CLR	OV
	RET
FTD4:	MOV	B,#0	;按纯小数转换
	LCALL	FTD8
	CLR	OV	;设立纯小数标志
	CLR	F0
	CLR	C
	RET
FTD8:	MOV	A,R2	;按规定的整数位数进行右规
	CJNE	A,B,FTD9
	MOV	A,R3	;将双字节结果传送到[R0]中
	MOV	@R0,A
	INC	R0
	MOV	A,R4
	MOV	@R0,A
	DEC	R0
	RET 	
FTD9:	CLR	C
	LCALL	RR1	;右规一次
	SJMP	FTD8

    (26)  标号:  BTOF    功能:浮点BCD码转换成格式化浮点数

入口条件:浮点BCD码操作数在[R0]中。
出口信息:转换成的格式化浮点数仍在[R0]中。
影响资源:PSW、A、B、R2~R7、位1DH~1FH  堆栈需求:6字节

BTOF:	INC	R0	;判断是否为零。
	INC	R0
	MOV	A,@R0
	MOV	R7,A
	DEC	R0
	MOV	A,@R0
	MOV	R6,A
	DEC	R0
	ORL	A,R7
	JNZ	BTF0
	MOV	@R0,#41H;为零,转换结束。
	RET
BTF0:	MOV	A,@R0
	MOV	C,ACC.7
	MOV	1DH,C	;保存数符。
	CLR	1FH	;以绝对值进行转换。
	MOV	C,ACC.6	;扩充阶码为八位。
	MOV	ACC.7,C
	MOV	@R0,A
	JNC	BTF1
	ADD	A,#19	;是否小于1E-19?
	JC	BTF2
	MOV	@R0,#41H;小于1E-19时以0计。
	INC	R0
	MOV	@R0,#0
	INC	R0
	MOV	@R0,#0
	DEC	R0
	DEC	R0
	RET
BTF1:	SUBB	A,#19
	JC	BTF2
	MOV	A,#3FH	;大于1E19时封顶。
	MOV	C,1DH
	MOV	ACC.7,C
	MOV	@R0,A
	INC	R0
	MOV	@R0,#0FFH
	INC	R0
	MOV	@R0,#0FFH
	DEC	R0
	DEC	R0
	RET
BTF2:	CLR	A	;准备将BCD码尾数转换成十六进制浮点数。
	MOV	R4,A
	MOV	R3,A
	MOV	R2,#10H	;至少两个字节。
BTF3:	MOV	A,R7
	ADD	A,R7
	DA	A
	MOV	R7,A
	MOV	A,R6
	ADDC	A,R6
	DA	A
	MOV	R6,A
	MOV	A,R4
	RLC	A
	MOV	R4,A
	MOV	A,R3
	RLC	A
	MOV	R3,A
	DEC	R2
	JNB	ACC.7,BTF3;直到尾数规格化。
	MOV	A,R6	;四舍五入。
	ADD	A,#0B0H
	CLR	A
	ADDC	A,R4
	MOV	R4,A
	CLR	A
	ADDC	A,R3
	MOV	R3,A
	JNC	BTF4
	MOV	R3,#80H
	INC	R2
BTF4:	MOV	DPTR,#BTFL;准备查表得到十进制阶码对应的浮点数。
	MOV	A,@R0
	ADD	A,#19	;计算表格偏移量。
	MOV	B,#3
	MUL	AB
	ADD	A,DPL
	MOV	DPL,A
	JNC	BTF5
	INC	DPH
BTF5:	CLR	A	;查表。
	MOVC	A,@A+DPTR
	MOV	C,ACC.6
	MOV	ACC.7,C
	MOV	R5,A
	MOV	A,#1
	MOVC	A,@A+DPTR
	MOV	R6,A
	MOV	A,#2
	MOVC	A,@A+DPTR
	MOV	R7,A
	LCALL	MUL1	;将阶码对应的浮点数和尾数对应的浮点数相乘。
	MOV	C,1DH	;取出数符。
	MOV	1FH,C
	LJMP	MOV0	;传送转换结果。

   (27)  标号:  FTOB    功能:格式化浮点数转换成浮点BCD码

入口条件:格式化浮点操作数在[R0]中。
出口信息:转换成的浮点BCD码仍在[R0]中。
影响资源:PSW、A、B、R2~R7、位1DH~1FH   堆栈需求:6字节

FTOB:	INC	R0
	MOV	A,@R0
	INC	R0
	ORL	A,@R0
	DEC	R0
	DEC	R0
	JNZ	FTB0
	MOV	@R0,#41H
	RET
FTB0:	MOV	A,@R0
	MOV	C,ACC.7
	MOV	1DH,C
	CLR	ACC.7
	MOV	@R0,A
	LCALL	MVR0
	MOV	DPTR,#BFL0;绝对值大于或等于1时的查表起点。
	MOV	B,#0	;十的0次幂。
	MOV	A,R2
	JNB	ACC.7,FTB1
	MOV	DPTR,#BTFL;绝对值小于1E-6时的查表起点。
	MOV	B,#0EDH	;十的-19次幂。
	ADD	A,#16
	JNC	FTB1
	MOV	DPTR,#BFLN;绝对值大于或等于1E-6时的查表起点。
	MOV	B,#0FAH	;十的-6次幂。
FTB1:	CLR	A	;查表,找到一个比待转换浮点数大的整数幂。
	MOVC	A,@A+DPTR
	MOV	C,ACC.6
	MOV	ACC.7,C
	MOV	R5,A
	MOV	A,#1
	MOVC	A,@A+DPTR
	MOV	R6,A
	MOV	A,#2
	MOVC	A,@A+DPTR
	MOV	R7,A
	MOV	A,R5	;和待转换浮点数比较。
	CLR	C
	SUBB	A,R2
	JB	ACC.7,FTB2;差为负数。	
	JNZ	FTB3
	MOV	A,R6
	CLR	C
	SUBB	A,R3
	JC	FTB2
	JNZ	FTB3
	MOV	A,R7
	CLR	C
	SUBB	A,R4
	JC	FTB2
	JNZ	FTB3
	MOV	R5,B	;正好是表格中的数。
	INC	R5	;幂加一。
	MOV	R6,#10H	;尾数为0·1000。
	MOV	R7,#0
	SJMP	FTB6	;传送转换结果。
FTB2:	INC	DPTR	;准备表格下一项。
	INC	DPTR
	INC	DPTR
	INC	B	;幂加一。
	SJMP	FTB1	;	
FTB3:	PUSH	B	;保存幂值。
	LCALL	DIV3	;相除,得到一个二进制浮点数的纯小数。
FTB4:	MOV	A,R2	;取阶码。
	JZ	FTB5	;为零吗?
	CLR	C
	LCALL	RR1	;右规。
	SJMP	FTB4
FTB5:	POP	ACC	;取出幂值。
	MOV	R5,A	;作为十进制浮点数的阶码。
	LCALL	HB2	;转换尾数的十分位和百分位。
	MOV	R6,A
	LCALL	HB2	;转换尾数的千分位和万分位。
	MOV	R7,A
	MOV	A,R3	;四舍五入。
	RLC	A
	CLR	A
	ADDC	A,R7
	DA	A
	MOV	R7,A
	CLR	A
	ADDC	A,R6
	DA	A
	MOV	R6,A
	JNC	FTB6
	MOV	R6,#10H
	INC	R5
FTB6:	INC	R0	;存放转换结果。
	INC	R0
	MOV	A,R7
	MOV	@R0,A
	DEC	R0
	MOV	A,R6
	MOV	@R0,A
	DEC	R0
	MOV	A,R5
	MOV	C,1DH	;取出数符。
	MOV	ACC.7,C
	MOV	@R0,A	
	RET
HB2:	MOV	A,R4	;尾数扩大100倍。
	MOV	B,#100
	MUL	AB
	MOV	R4,A
	MOV	A,B
	XCH	A,R3
	MOV	B,#100
	MUL	AB
	ADD	A,R3
	MOV	R3,A
	JNC	HB21
	INC	B
HB21:	MOV	A,B	;将整数部分转换成BCD码。
	MOV	B,#10
	DIV	AB
	SWAP	A
	ORL	A,B
	RET
BTFL:	DB	41H,0ECH,1EH	;1.0000E-19
	DB	45H,93H,93H	;1.0000E-18
	DB	48H,0B8H,78H	;1.0000E-17
	DB	4BH,0E6H,96H	;1.0000E-16
	DB	4FH,90H,1DH	;1.0000E-15
	DB	52H,0B4H,25H	;1.0000E-14
	DB	55H,0E1H,2EH	;1.0000E-13
	DB	59H,8CH,0BDH	;1.0000E-12
	DB	5CH,0AFH,0ECH	;1.0000E-11
	DB	5FH,0DBH,0E7H	;1.0000E-10
	DB	63H,89H,70H	;1.0000E-9
	DB	66H,0ABH,0CCH	;1.0000E-8
	DB	69H,0D6H,0C0H	;1.0000E-7
BFLN:	DB	6DH,86H,38H	;1.0000E-6
	DB	70H,0A7H,0C6H	;1.0000E-5
	DB	73H,0D1H,0B7H	;1.0000E-4
	DB	77H,83H,12H	;1.0000E-3
	DB	7AH,0A3H,0D7H	;1.0000E-2
	DB	7DH,0CCH,0CDH	;1.0000E-1
BFL0:	DB	1,80H,00H	;1.0000
	DB	4,0A0H,00H	;1.0000E1
	DB	7,0C8H,00H	;1.0000E2
	DB	0AH,0FAH,00H	;1.0000E3
	DB	0EH,9CH,40H	;1.0000E4
	DB	11H,0C3H,50H	;1.0000E5
	DB	14H,0F4H,24H	;1.0000E6
	DB	18H,98H,97H	;1.0000E7
	DB	1BH,0BEH,0BCH	;1.0000E8
	DB	1EH,0EEH,6BH	;1.0000E9
	DB	22H,95H,03H	;1.0000E10
	DB	25H,0BAH,44H	;1.0000E11
	DB	28H,0E8H,0D5H	;1.0000E12
	DB	2CH,91H,85H	;1.0000E13
	DB	2FH,0B5H,0E6H	;1.0000E14
	DB	32H,0E3H,60H	;1.0000E15
	DB	36H,8EH,1CH	;1.0000E16
	DB	39H,31H,0A3H	;1.0000E17
	DB	3CH,0DEH,0BH	;1.0000E18
	DB	40H,8AH,0C7H	;1.0000E19

    (28)  标号:  FCOS    功能:浮点余弦函数

入口条件:操作数在[R0]中。
出口信息:结果仍在[R0]中。
影响资源:DPTR、PSW、A、B、R2~R7、位1DH~1FH  堆栈需求:  6字节

FCOS:	LCALL	FABS	;COS(-X) = COS X
	MOV	R5,#1	;常数1.5708(π/2)
	MOV	R6,#0C9H
	MOV	R7,#10H
	CLR	1EH
	LCALL	MVR0
	CLR	F0
	LCALL	AS1	;x+(π/2)
	LCALL	MOV0	;保存结果,接着运行下面的FSIN程序

    (29)  标号:  FSIN    功能:浮点正弦函数

入口条件:操作数在[R0]中。
出口信息:结果仍在[R0]中。
影响资源:DPTR、PSW、A、B、R2~R7、位1DH~1FH  堆栈需求:  6字节

FSIN:	MOV	A,@R0
	MOV	C,ACC.7
	MOV	1DH,C	;保存自变量的符号
	CLR	ACC.7	;统一按正数计算
	MOV	@R0,A
	LCALL	MVR0	;将[R0]传送到第一工作区
	MOV	R5,#0	;系数0.636627(2/π)
	MOV	R6,#0A2H
	MOV	R7,#0FAH
	CLR	1EH
	LCALL	MUL1	;相乘,自变量按(π/2)规一化
	MOV	A,R2	;将结果复制到第二区
	MOV	R5,A
	MOV	A,R3
	MOV	R6,A
	MOV	A,R4
	MOV	R7,A
	LCALL	INT	;第一区取整,获得象限信息
	MOV	A,R2
	JZ	SIN2
SIN1:	CLR	C	;将浮点象限数转换成定点象限数
	LCALL	RR1
	CJNE	R2,#10H,SIN1
	MOV	A,R4
	JNB	ACC.1,SIN2
	CPL	1DH	;对于第三、四象限,结果取反
SIN2:	JB	ACC.0,SIN3
	CPL	1FH	;对于第一、三象限,直接求规一化的小数
	SJMP	SIN4
SIN3:	MOV	A,R4	;对于第二、四象限,准备求其补数
	INC	A
	MOV	R4,A
	JNZ	SIN4
	INC	R3
SIN4:	LCALL	RLN	;规格化
	SETB	F0
	LCALL	AS1	;求自变量归一化等效值
	LCALL	MOV0	;回传
	LCALL	FPLN	;用多项式计算正弦值
	DB	7DH,93H,28H;0.07185
	DB	41H,0,0	;0
	DB	80H,0A4H,64H;-0.64215
	DB	41H,0,0	;0
	DB	1,0C9H,2;1.5704
	DB	41H,0,0	;0
	DB	40H	;结束
	MOV	A,@R0	;结果的绝对值超过1.00吗?
	JZ	SIN5
	JB	ACC.6,SIN5
	INC	R0	;绝对值按1.00封顶
	MOV	@R0,#80H
	INC	R0
	MOV	@R0,#0
	DEC	R0
	DEC	R0
	MOV	A,#1
SIN5:	MOV	C,1DH	;将数符拼入结果中
	MOV	ACC.7,C
	MOV	@R0,A
	RET

    (30)  标号:  FATN    功能:浮点反正切函数

入口条件:操作数在[R0]中。
出口信息:结果仍在[R0]中。
影响资源:DPTR、PSW、A、B、R2~R7、位1CH~1FH 堆栈需求:7字节

FATN:	MOV	A,@R0
	MOV	C,ACC.7
	MOV	1DH,C	;保存自变量数符
	CLR	ACC.7	;自变量取绝对值
	MOV	@R0,A
	CLR	1CH	;清求余运算标志
	JB	ACC.6,ATN1;自变量为纯小数否?
	JZ	ATN1
	SETB	1CH	;置位求余运算标志
	LCALL	FRCP	;通过倒数运算,转换成纯小数
ATN1:	LCALL	FPLN	;通过多项式运算,计算反正切函数值
	DB	0FCH,0E4H,91H;-0.055802
	DB	7FH,8FH,37H;0.27922
	DB	0FFH,0EDH,0E0H;-0.46460
	DB	7BH,0E8H,77H;0.028377
	DB	0,0FFH,68H;0.9977
	DB	72H,85H,0ECH;3.1930×10-5
	DB	40H	;结束
	JNB	1CH,ATN2;需要求余运算否?
	CPL	1FH	;准备运算标志
	MOV	C,1FH
	MOV	F0,C	;常数1.5708(π/2)
	MOV	R5,#1
	MOV	R6,#0C9H
	MOV	R7,#10H
	LCALL	AS1	;求余运算
	LCALL	MOV0	;回传
ATN2:	MOV	A,@R0	;拼入结果的数符
	MOV	C,1DH
	MOV	ACC.7,C
	MOV	@R0,A
	RET

    (31)  标号:  RTOD    功能:浮点弧度数转换成浮点度数

入口条件:浮点弧度数在[R0]中。
出口信息:转换成的浮点度数仍在[R0]中。
影响资源:PSW、A、B、R2~R7、位1EH、1FH  堆栈需求:6字节

RTOD:	MOV	R5,#6	;系数(180/π)传送到第二工作区
	MOV	R6,#0E5H
	MOV	R7,#2FH
	SJMP	DR	;通过乘法进行转换

    (32)  标号:  DTOR    功能:浮点度数转换成浮点弧度数

入口条件:浮点度数在[R0]中。
出口信息:转换成的浮点弧度数仍在[R0]中。
影响资源:PSW、A、B、R2~R7、位1EH、1FH  堆栈需求:6字节

DTOR:	MOV	R5,#0FBH;系数(π/180)传送到第二工作区
	MOV	R6,#8EH
	MOV	R7,#0FAH
DR:	LCALL	MVR0	;将[R0]传送到第一工作区
	CLR	1EH	;系数为正
	LCALL	MUL1	;通过乘法进行转换
	LJMP	MOV0	;结果传送到[R0]中
	END

⌨️ 快捷键说明

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