位置:51电子网 » 技术资料 » 单 片 机

MCS-96/196三字节浮点库

发布时间:2008/5/27 0:00:00 访问次数:786

应用于mcs-96系列单片机的浮点库有许多。大多数是五字节(8位十进制数),运行速度慢。而在实际应用中,许多计算只需4位十进制数即可。

为此,本人参考周航慈教授编写的《单片机应用程序设计技术》(北京航空航天大学出版社),编写了mcs-96/196三字节浮点库,运行速度快( 12 mhz 196kc数值转换:150us,四则运算:80us)。

程序简洁(1.3 kb),可任意浮动。占用资源:1ah~25h,堆栈深度:2字节。可将程序清单,粘于源程序后,直接调用。

本浮点子程序库只包含浮点加(fadd)、减(fsub)、乘(fmul)、除(fdiv)等子程序。程序清单见本刊网站:www.dpj.com.cn。

为便于读者使用本程序库,现将有关约定说明如下。

双字节定点操作数。用[cx]或[dx]表示存放在由cx或dx指示的连续单元中的数据,地址小的单元存放高字节。如果[cx]=1234h,若(cx)=30h,则(30h)=12h,(31h)=34h。

二进制浮点操作数。用3个字节表示:第1个字节的最高位为数符,其余7位为阶码(补码形式);第2个字节为尾数的高字节;第3个字节为尾数的低字节,尾数用双字节纯小数(原码)来表示。当尾数的最高位为1时,便称为规格化浮点数,简称操作数。在程序说明中,也用[cx]或[dx]来表示cx或dx指示的浮点操作数。例如:当[cx]=-6.000时,二进制浮点数表示为83c000h;若(cx)=30h,则(30h)=83h (31h)=0c0h,(32h)=00h。

十进制浮点操作数。用3个字节表示:第1个字节的最高位为数符,其余7位为阶码(二进制补码形式);第2个字节为尾数的高字节;第3个字节为尾数的低字节,尾数用双字节bcd码纯小数(原码)来表示。当十进制数的绝对值大于1时,阶码就等于整数部分的位数,如 876.5 的阶码是03h,-876.5 的阶码是 83h;当十进制数的绝对值小于1时,阶码等于 80h 减去小数点后面零的个数。例如 0.00382 的阶码是 7eh,-0.00382的阶码是 0feh。在程序说明中,用[cx]或[dx]来表示cx或dx指示的十进制浮点操作数。例如,有一个十进制浮点操作数存放在30h、31h、32h中,数值是-0.07315,即 -0.7315×10-1,则(30h)=0ffh,31h=73h,(32h)=15h。若用[cx]来指向它,则应使(cx)=30h。

运算精度。单次定点运算精度为结果最低位的当量值;单次二进制浮点算术运算的精度优于3/105;单次二进制浮点超越函数运算的精度优于1/104,bcd码浮点数本身的精度比较低(1/104~ 1/103),不宜作为运算的操作数,仅用于输入或输出时的数制转换。不管哪种数据格式,随着连续运算次数的增加,精度都会下降。

工作区。数据工作区固定在ax、bx、cx、dx、ex,标志工作区固定在1ah、1b单元。

子程序调用范例。用积木方式(或流水线方式)完成一个公式的计算。以浮点运算为例:
计算y=ab/c+d

已知:a=-123.4,b=0.757 7,c=56.34,d=1.276,分别存放在30h、33h、36h、39h开始的三个连续单元中。用bcd码浮点数表示时,分别为a= 831234h,b=007577h,c=025634h,d=011276h。求解过程:通过调用btof子程序,将各变量转换成二进制浮点操作数,再进行各种运算,最后调用ftob子程序,还原成十进制形式,供输出使用。程序如下:

;****************************************
ax equ 1ch
bx equ ax+2
cx equ bx+2
dx equ cx+2
ex equ dx+2
;************************
ah equ ax+1
al equ ax
bh equ bx+1
bl equ bx
ch equ cx+1
cl equ cx
dh equ dx+1
dl equ dx
eh equ ex+1
el equ ex
org 2080h
main:
ld sp,#200h
test:
ldb cx,#39h ;指向bcd码浮点操作数d
lcall btof ;将其转换成二进制浮点操作数
ldb cx,#36h ;指向bcd码浮点操作数c
lcall btof ;将其转换成二进制浮点操作数
ldb cx,#33h ;指向bcd码浮点操作数b
lcall btof ;将其转换成二进制浮点操作数
ldb cx,#30h ;指向bcd码浮点操作数a
lcall btof ;将其转换成二进制浮点操作数
ldb dx,#33h ;指向二进制浮点操作数b
lcall fmul ;进行浮点乘法运算
ldb dx,#36h ;指向二进制浮点操作数c
lcall fdiv ;进行浮点除法运算
ldb dx,#39h ;指向二进制浮点操作数d
lcall fadd ;进行浮点加法运算
lcall ftob ;将结果转换成bcd码浮点数
stop: ljmp stop
;运行结果,[cx]=803836h,即y=-0.383 6。比较精确的结果应该是-0.383 57。


应用于mcs-96系列单片机的浮点库有许多。大多数是五字节(8位十进制数),运行速度慢。而在实际应用中,许多计算只需4位十进制数即可。

为此,本人参考周航慈教授编写的《单片机应用程序设计技术》(北京航空航天大学出版社),编写了mcs-96/196三字节浮点库,运行速度快( 12 mhz 196kc数值转换:150us,四则运算:80us)。

程序简洁(1.3 kb),可任意浮动。占用资源:1ah~25h,堆栈深度:2字节。可将程序清单,粘于源程序后,直接调用。

本浮点子程序库只包含浮点加(fadd)、减(fsub)、乘(fmul)、除(fdiv)等子程序。程序清单见本刊网站:www.dpj.com.cn。

为便于读者使用本程序库,现将有关约定说明如下。

双字节定点操作数。用[cx]或[dx]表示存放在由cx或dx指示的连续单元中的数据,地址小的单元存放高字节。如果[cx]=1234h,若(cx)=30h,则(30h)=12h,(31h)=34h。

二进制浮点操作数。用3个字节表示:第1个字节的最高位为数符,其余7位为阶码(补码形式);第2个字节为尾数的高字节;第3个字节为尾数的低字节,尾数用双字节纯小数(原码)来表示。当尾数的最高位为1时,便称为规格化浮点数,简称操作数。在程序说明中,也用[cx]或[dx]来表示cx或dx指示的浮点操作数。例如:当[cx]=-6.000时,二进制浮点数表示为83c000h;若(cx)=30h,则(30h)=83h (31h)=0c0h,(32h)=00h。

十进制浮点操作数。用3个字节表示:第1个字节的最高位为数符,其余7位为阶码(二进制补码形式);第2个字节为尾数的高字节;第3个字节为尾数的低字节,尾数用双字节bcd码纯小数(原码)来表示。当十进制数的绝对值大于1时,阶码就等于整数部分的位数,如 876.5 的阶码是03h,-876.5 的阶码是 83h;当十进制数的绝对值小于1时,阶码等于 80h 减去小数点后面零的个数。例如 0.00382 的阶码是 7eh,-0.00382的阶码是 0feh。在程序说明中,用[cx]或[dx]来表示cx或dx指示的十进制浮点操作数。例如,有一个十进制浮点操作数存放在30h、31h、32h中,数值是-0.07315,即 -0.7315×10-1,则(30h)=0ffh,31h=73h,(32h)=15h。若用[cx]来指向它,则应使(cx)=30h。

运算精度。单次定点运算精度为结果最低位的当量值;单次二进制浮点算术运算的精度优于3/105;单次二进制浮点超越函数运算的精度优于1/104,bcd码浮点数本身的精度比较低(1/104~ 1/103),不宜作为运算的操作数,仅用于输入或输出时的数制转换。不管哪种数据格式,随着连续运算次数的增加,精度都会下降。

工作区。数据工作区固定在ax、bx、cx、dx、ex,标志工作区固定在1ah、1b单元。

子程序调用范例。用积木方式(或流水线方式)完成一个公式的计算。以浮点运算为例:
计算y=ab/c+d

已知:a=-123.4,b=0.757 7,c=56.34,d=1.276,分别存放在30h、33h、36h、39h开始的三个连续单元中。用bcd码浮点数表示时,分别为a= 831234h,b=007577h,c=025634h,d=011276h。求解过程:通过调用btof子程序,将各变量转换成二进制浮点操作数,再进行各种运算,最后调用ftob子程序,还原成十进制形式,供输出使用。程序如下:

;****************************************
ax equ 1ch
bx equ ax+2
cx equ bx+2
dx equ cx+2
ex equ dx+2
;************************
ah equ ax+1
al equ ax
bh equ bx+1
bl equ bx
ch equ cx+1
cl equ cx
dh equ dx+1
dl equ dx
eh equ ex+1
el equ ex
org 2080h
main:
ld sp,#200h
test:
ldb cx,#39h ;指向bcd码浮点操作数d
lcall btof ;将其转换成二进制浮点操作数
ldb cx,#36h ;指向bcd码浮点操作数c
lcall btof ;将其转换成二进制浮点操作数
ldb cx,#33h ;指向bcd码浮点操作数b
lcall btof ;将其转换成二进制浮点操作数
ldb cx,#30h ;指向bcd码浮点操作数a
lcall btof ;将其转换成二进制浮点操作数
ldb dx,#33h ;指向二进制浮点操作数b
lcall fmul ;进行浮点乘法运算
ldb dx,#36h ;指向二进制浮点操作数c
lcall fdiv ;进行浮点除法运算
ldb dx,#39h ;指向二进制浮点操作数d
lcall fadd ;进行浮点加法运算
lcall ftob ;将结果转换成bcd码浮点数
stop: ljmp stop
;运行结果,[cx]=803836h,即y=-0.383 6。比较精确的结果应该是-0.383 57。


相关IC型号

热门点击

 

推荐技术资料

硬盘式MP3播放器终级改
    一次偶然的机会我结识了NE0 2511,那是一个远方的... [详细]
版权所有:51dzw.COM
深圳服务热线:13692101218  13751165337
粤ICP备09112631号-6(miitbeian.gov.cn)
公网安备44030402000607
深圳市碧威特网络技术有限公司
付款方式


 复制成功!