武汉家电维修网 www.whjdw.com 欢迎您的光临!
当前位置: 主页 > 电子制作 > 单片应用技术 >

AVR-90 三字节浮点库及其使用

时间:2010-05-14 19:46来源:未知 作者:admin 点击:
本文介绍的AVR-90三字节浮点库包含15个子程序(数值转换、四则运算、浮点数处理等),不含函数库。浮点库占寄存器R0、R12~R31,大小为680个字,可任意浮动。程序中不含乘法、除法指令,可以移植到AT90其他系列的单片机。此程序已在AVRstudio 3.51下调试成功。
  有关约定如下:
  浮点数的格式(3字节):
 数符(1)阶码(7) ,尾数高字节(H)、尾数低字节(L)
  1. 二字节定点操作数。用[X]或[Y]表示存在由X或Y指示的连续单元中的数据,低地址单元存高字节。如果[X]=1234H,若[X]=60H,则(60H)=12H,(61H)=34H。
  2. 二进制浮点操作数。用三个字节表示,第一个字节的最高位为数符,其余七位为阶码(补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节。尾数用二字节纯小数(原码)来表示。当尾数的最高位为1时,称为规格化浮点数,简称操作数。在程序说明中,也用[X]或[Y]来表示X或Y指示的浮点操作数。
  例如:(1)0.8表示为[X]=00 80 00 ,用二进制浮点数表示为00 CCCDH。若[X]=60H,则(60H)=00H,(61H)=0CCH,(62H)=0CDH。(2)-0.8表示为[X]=80 80 00,用二进制浮点数表示为80 CCCDH。若(X)=60H,则(60H)=80H,(61H)=0CCH,(62H)=0CDH。(3)0.08表示为[X]=7F 8000,用二进制浮点数表示为7D A3 D7H。若(X)=60H,则(60H)=7DH,(61H)=0A3H,(62H)=0D7H。(4)-0.08表示为[X]=FF 80 00,用二进制浮点数表示为FD A3 D7 H。若(X)=60H,则(60H)=0FDH,(61H)=0A3H,(62H)=0D7H。
  3.十进制浮点操作数。用三个字节表示,第一个字节的最高位为数符,其余七位为阶码(二进制补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节。尾数用双字节BCD码纯小数(原码)来表示。当十进制数的绝对值大于1时,阶码就等于整数部分的位数,如 123.4 的阶码是03H,-123.4的阶码是 83H;当十进制数的绝对值小于1时,阶码就等于 80H 减去小数点后面零的个数,例如 0.00123 的阶码是7EH,-0.00123的阶码是0FEH。在程序说明中,用[X]或[Y]来表示X或Y指示的十进制浮点操作数。例如有一个十进制浮点操作数存放在60H、61H、62H中,数值是-0.01234,即-0.1234×(10的-1次方),则(60H)=0FFH,(61H)=12H,(62H)=34H。若用[X]来指向它,则应使(X)=60H。
  4.运算精度。单次定点运算精度为结果最低位的当量值;单次二进制浮点算术运算的精度优于1/65535;BCD码浮点数的精度为万分之一(4位有效数),不作为运算的操作数,仅用于输入或输出时的数制转换。不管哪种数据格式,随着连续运算的次数增加,精度都会下降。
  5. 工作区。 数据工作区固定在R0、R12~R31中,数符或标志工作区固定在SREG寄存器中。
  注意:用户不要在工作区中存放信息。
  6. 数值转换子程序的执行时间(主频为8MHz时;与数据大小无关)为80μs;四则运算的执行时间为60μs,比12MHz的MCS-51系列单片机快10倍。
  7. 子程序调用实例。 由于程序库特别注意了各子程序接口的相容性,很容易采用积木方式完成一个公式的计算。下面以浮点运算为例:
  计算 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子程序,还原成十进制形式。程序如下:
  TEST:
  LDI XL,S69 ;指向BCD码浮点操作数d
  RCALL BTOF   ;将其转换成二进制浮点操作数
  LDI XL,S66 ;指向BCD码浮点操作数c
  RCALL BTOF  ;将其转换成二进制浮点操作数
  LDI XL,S63 ;指向BCD码浮点操作数b
  RCALL BTOF  ;将其转换成二进制浮点操作数
  LDI XL,S30 ;指向BCD码浮点操作数a
  RCALL BTOF  ;将其转换成二进制浮点操作数
  LDI YL,S33 ;指向二进制浮点操作数b
  RCALL FMULU  ;浮点乘法运算
  LDI YL,S66 ;指向二进制浮点操作数c
  RCALL FDIV ;浮点除法运算
  LDI YL,S69 ;指向二进制浮点操作数d
  RCALL FADD  ;浮点加法运算
  RCALL FTOB  ;将结果转换成BCD码浮点数
  STOP: RJMP STOP
  END
  运行结果,[X]=803836H,即y=-0.3836,比较精确的结果应该是Y=-0.38357。
------分隔线----------------------------
栏目列表
推荐内容