首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

MCS-51浮点运算子程序及其使用说明(7)

MCS-51浮点运算子程序及其使用说明(7)

(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程序
返回列表