没有合适的资源?快使用搜索试试~ 我知道了~
首页mcs-51四字节浮点库16个子程序
资源详情
资源评论
资源推荐

MCS-51 四字节浮点库及其使用说明
此浮点库包含 16 个子程序(数值转换、四则运算、浮点数处理等),不含函数库。
占 RAM (A,B,R0~R7,08H~0FH,23H);大小: 1。6K;可任意浮动。
为便于读者使用本程序库,先将有关约定说明如下:
浮点数的格式(4 字节):
数符(1) 阶码(7) 尾数高字节(H) 尾数中字节(M)尾数低字节
(L)
1.三字节定点操作数:用[R0]或[R1]来表示存放在由 R0 或 R1 指示的连续单元中的
数据,地址小 的单元存放高 字节。如果 [R0]=123456H,若(R0)=30H ,则(30H)=12H ,
(31H)=34H,(32)=56h。
2.二进制浮点操作数:用四个字节表示,第一个字节的最高位为数符,其余七位为
阶码(补码形式),第二字节为尾数的高字节,第三字节为尾数的中字节,第四字节为尾
数的低字节。尾数用三字节纯小数(原码)来表示。当尾数的最高位为1时,便称为规格
化浮点数,简称操作数。在程序说明中,也用[R0]或[R1]来表示 R0 或 R1 指示的浮点操作
数。
例如:
A 、 0.8 则 : [R0]=00 80 00 00 , 则 二 进 制 浮 点 数 表 示 为 00 CC CC CDH 。 若
(R0)=30H,则(30H)=00H,(31H)=0CCH,(32H)=0CCH, (33H)=0CDH。
B 、 -0.8 则 : [R0]=80 80 00 00 , 则 二 进 制 浮 点 数 表 示 为 80 CC CC CDH 。 若
(R0)=30H,则(30H)=80H,(31H)=0CCH,(32H)=0CCH, (33H)=0CDH。
C 、 0.08 则 : [R0]=7F 80 00 00 , 则 二 进 制 浮 点 数 表 示 为 7D A3 D7 0BH 。 若
(R0)=30H,则(30H)=7DH,(31H)=0A3H,(32H)=0D7H, (33H)=0BH。
D 、 -0.08 则 : [R0]=FF 80 00 00 , 则 二 进 制 浮 点 数 表 示 为 FD A3 D7 0BH 。 若
(R0)=30H,则(30H)=0FDH,(31H)=0A3H,(32H)=0D7H, (33H)=0BH。
3.十进制浮点操作数:用四个字节表示,第一个字节的最高位为数符,其余七位为
阶码(二进制补码形式),第二字节为尾数的高字节,第三字节为尾数的中字节,第四字
节为尾数的低字节。尾数用双字节BCD码纯小数(原码)来表示。当十进制数的绝对值
大于1时,阶码就等于整数部分的位数,如 123.4 的阶码是 03H,-123.4 的阶码是 83H;当
十进制数的绝对值小于 1 时,阶码就等于 80H 减去小数点后面零的个数,例如 0.00123 的
阶码是 7EH,-0.00123 的阶码是 0FEH。在程序说明中,用[R0]或[R1]来表示 R0 或 R1 指示
的十进制浮点操作数。例如有一个十进制浮点操作数存放在 30H、31H、32H、33h 中,数
值是 -0.0123456,即-0.123456 乘以 10 的-1 次方,则(30H)=0FFH,31H=12H,(32H)=34H,

(33H)=56H。若用[R0]来指向它,则应使(R0)=30H。
4.运算精度:单次定点运算精度为结果最低位的当量值;单次二进制浮点算术运算
的精度优于一千六百万分之一(1/16777216);BCD码浮点数的精度百万分之一 (6 位有
效数),不作为运算的操作数,仅用于输入或输出时的数制转换。不管那种数据格式,随着
连续运算的次数增加,精度都会下降。
5.工作区:数据工作区固定在 A、B、R0~R7,08H~0FH(共 18 个字节),数符
或标志工作区固定在 PSW 和 23H 单元(位 1CH~1FH)。
用户请不要在工作区中存放信息!
6.数值转换子程的执行时间(12MHz;与数据大小无关):1.5mS
四则运算的执行时间:1.2~1.8mS
7.子程序调用范例:由于本程序库特别注意了各子程序接口的相容性,很容易采用
积木方式完成一个公式的计算。以浮点运算为例:
计算 y = ab/c+d
已知:a=-123.456;b=0.757712;c=56.3412;d=1.27623; 它们分别存放在 30H 开始的
连 续 单 元 中 。 用 B C D 码 浮 点 数 表 示 时 , 分 别 为 a=83123456H ; b=00757712H ;
c=02563412H;d=01127623H。
求解过程:通过调用BTOF子程序,将各变量转换成二进制浮点操作数,再进行各
种运算,最后调用FTOB子程序,还原成十进制形式,供输出使用。程序如下:
TEST:
MOV R0,#3CH ;指向BCD码浮点操作数d
LCALL BTOF ;将其转换成二进制浮点操作数
MOV R0,#38H ;指向BCD码浮点操作数c
LCALL BTOF ;将其转换成二进制浮点操作数
MOV R0,#34H ;指向BCD码浮点操作数b
LCALL BTOF ;将其转换成二进制浮点操作数
MOV R0,#30H ;指向BCD码浮点操作数a
LCALL BTOF ;将其转换成二进制浮点操作数
MOV R1,#34H ;指向二进制浮点操作数b
LCALL FMUL ;进行浮点乘法运算
MOV R1,#38H ;指向二进制浮点操作数c
LCALL FDIV ;进行浮点除法运算
MOV R1,#3CH ;指向二进制浮点操作数d
LCALL FADD ;进行浮点加法运算
LCALL FTOB ;将结果转换成BCD码浮点数

STOP: LJMP STOP
END
运行结果,[R0]=80384084H,即y=-0.384084,比较精确的结果应该是-0.3840841。
程序清单:
(1) 标号: BTOF 功能:浮点BCD码转换成格式化浮点数
入口条件:浮点BCD码操作数在[R0]中。
出口信息:转换成的格式化浮点数仍在[R0]中。
BTOF: INC R0
INC R0
inc r0;read L
MOV 07h,@R0
DEC R0
MOV 06h,@R0
DEC R0
mov 05h,@r0
;r5r6r7=0.hml(dec)
dec r0 ;;r0 to jie_ma
mov a,r7
ORL A,R6
orl a,r5
jnz btf0 ;jb r5r6r7=0
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
JC BTF2
MOV @R0,#41H
INC R0

MOV @R0,#0
INC R0
MOV @R0,#0
inc r0
MOV @R0,#0
DEC R0
DEC R0
dec r0
RET
BTF1: SUBB A,#19
JC BTF2
MOV A,#3FH
MOV C,1DH
MOV ACC.7,C
MOV @R0,A
INC R0
MOV @R0,#0FFH
INC R0
MOV @R0,#0FFH
inc r0
MOV @R0,#0FFH
dec r0
DEC R0
DEC R0
RET
BTF2: CLR A ;use r1.r2r3r4
MOV R4,A
MOV R3,A
MOV R2,a
mov r1,#24 ;3byte =3*8=24
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,r5
addc a,r5
da a
mov r5,a;r5r6r7*2
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
mov a,r2
rlc a
mov r2,a ;count .r5r6r7(10)=>.r2r3r4(2)
DEC R1
JNB ACC.7,BTF3
MOV A,R5
ADD A,#0B0H
CLR A
ADDC A,R4
MOV R4,A
CLR A
ADDC A,R3
MOV R3,A
CLR A
ADDC A,R2
MOV R2,A
JNC BTF4
MOV R2,#80H
INC R1
BTF4:
MOV DPTR,#BTFL
MOV A,@R0
剩余33页未读,继续阅读













安全验证
文档复制为VIP权益,开通VIP直接复制

评论1