你的位置:首页 > 微处理器 > Linux > Linux > Linux > 正文
AVR-90三字节浮点库及其使用说明
来源:单片机与嵌入式系统应用 作者:湖南长沙新开铺育新学校 李杰 2006/2/12 0:00:00 人气:402
内容导读:

  此浮点库包含15个子程序(数值转换、四则运算、浮点数处理等),不含函数库。

  占寄存器(R0、R12~R31),大小为680个字,可任意浮动。程序中不含有乘法、除法指令,因此可以移植到AT90的其它系列的单片机。此程序在AVR studio 3.51下调试成功!

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

  浮点数的格式(3字节):

  ①  二字节定点操作数:用[X]或[Y]来表示存放在由X或Y指示的连续单元中的数据,地址小的单元存放高字节。如果[X]=1234H,(X)=60H,则(60H)=12H,(61H)=34H。

  ②  二进制浮点操作数,用三个字节表示:第一个字节的最高位为数符,其余七位为阶码(补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节。尾数用二字节纯小数(原码)来表示。当尾数的最高位为1时,便称为规格化浮点数,简称操作数。在程序说明中,也用[X]或[Y]来表示X或Y指示的浮点操作数。

  例如:

  0.8:[X]=00 80 00 ,则二进制浮点数表示为00 CC CDH;若(X)=60H,则(60H)=00H,(61H)=0CCH。(62H)=0CDH。
  -0.8:[X]=80 80 00 ,则二进制浮点数表示为80 CC CDH;若(X)=60H,则(60H)=80H,(61H)=0CCH,(62H)=0CDH。
  0.08:[X]=7F 80 00 ,则二进制浮点数表示为7D A3 D7 H;若(X)=60H,则(60H)=7DH,(61H)=0A3H,(62H)=0D7H。
  -0.08:[X]=FF 80 00 ,则二进制浮点数表示为FD A3 D7 H;若(X)=60H,则(60H)=0FDH,(61H)=0A3H,(62H)=0D7H。

  ③  十进制浮点操作数,用三个字节表示:第一个字节的最高位为数符,其余七位为阶码(二进制补码形式);第二个字节为尾数的高字节;第三个字节为尾数的低字节。尾数用双字节BCD码纯小数(原码)来表示。当十进制数的绝对值大于1时,阶码就等于整数部分的位数,如123.4的阶码是03H,-123.4 的阶码是 83H;当十进制数的绝对值小于1时,阶码就等于 80H 减去小数点后面零的个数,例如 0.001 23 的阶码是 7EH,-0.001 23的阶码是 0FEH。在程序说明中,用[X]或[Y]来表示X或Y指示的十进制浮点操作数。例如,有一个十进制浮点操作数存放在60H、61H、62H中,数值是 -0.012 34,即-0.1234乘以10的-1次方,则(60H)=0FFH,(61H)=12H,(62H)=34H。若用[X]来指向它,则应使(X)=60H。

  ④  运算精度:单次定点运算精度为结果最低位的当量值;单次二进制浮点算术运算的精度优于1/655 35;BCD码浮点数的精度万分之一(4位有效数),不作为运算的操作数,仅用于输入或输出时的数制转换。不管哪种数据格式,随着连续运算的次数增加,精度都会下降。

  ⑤  工作区:数据工作区固定在R0、R12~R31中,数符或标志工作区固定在SREG寄存器中。
  用户请不要在工作区中存放信息!

  ⑥  数值转换子程序的执行时间(8 MHz;与数据大小无关):80μs
  四则运算的执行时间:60μs。比12 MHz的MCS-51系列单片机快10倍!

  ⑦  子程序调用范例:由于本程序库特别注意了各子程序接口的相容性,很容易采用积木方式完成一个公式的计算。以浮点运算为例,计算y = ab/c+d。已知:a = -123.4,b = 0.7577,c = 56.34;d = 1.276,它们分别存放在60H开始的连续单元中。用BCD码浮点数表示时,分别为a = 831234H;b = 007577H;c = 025634H;d = 011276H。

  求解过程:通过调用BTOF子程序,将各变量转换成二进制浮点操作数,再进行各种运算,最后调用FTOB子程序,还原成十进制形式,供输出使用。运行结果,[X]=803836H,即y= -0.3836,比较精确的结果应该是-0.38357。

  程序文件如下:

TEST:
LDI XL,$69 ;指向BCD码浮点操作数d
RCALL BTOF ;将其转换成二进制浮点操作数
LDI XL,$66 ;指向BCD码浮点操作数c
RCALL BTOF ;将其转换成二进制浮点操作数
LDI XL,$63 ;指向BCD码浮点操作数b
RCALL BTOF ;将其转换成二进制浮点操作数
LDI XL,$30 ;指向BCD码浮点操作数a
RCALL BTOF ;将其转换成二进制浮点操作数
LDI YL,$33 ;指向二进制浮点操作数b
RCALL FMULU ;进行浮点乘法运算
LDI YL,$66 ;指向二进制浮点操作数c
RCALL FDIV ;进行浮点除法运算
LDI YL,$69 ;指向二进制浮点操作数d
RCALL FADD ;进行浮点加法运算
RCALL FTOB ;将结果转换成BCD码浮点数
STOP: RJMP STOP
END

 
标签:
商品推荐



相关文章
阅读排行
最近更新
推荐阅读