首 页电子技术网络电视电路设计论坛
您当前的位置:无限电子制作网电子技术实用技能 → 文章内容 退出登录 用户管理
本类热门文章
相关文章
热门产品





AVR-90 三字节浮点库及其使用
作者:佚名  来源:不详  发布时间:2007-1-19 20:53:16

减小字体 增大字体

 

>

本文介绍的AVR-90三字节浮点库包含15个子程序(数值转换、四则运算、浮点数处理等),不含函数库。浮点库占寄存器R0、R12~R31,大小为680个字,可任意浮动。程序中不含乘法、除法指令,可以移植到AT90其他系列的单片机。此程序已在AVR studio 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 CC CDH。若[X]=60H,则(60H)=00H,(61H)=0CCH,(62H)=0CDH。(2)-0.8表示为[X]=80 80 00 ,用二进制浮点数表示为80 CC CDH。若(X)=60H,则(60H)=80H,(61H)=0CCH,(62H)=0CDH。(3)0.08表示为[X]=7F 80 00,用二进制浮点数表示为7D A3 D7 H。若(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。


[] [返回上一页] [打 印]
文章评论 (评论内容只代表网友观点,与本站立场无关!)

用户名: 查看更多评论

分 值:100分 85分 70分 55分 40分 25分 10分 0分

内 容:

         (注“”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码

关于本站 - 网站帮助 - 广告合作 - 下载声明 - 友情连接 - 网站地图 - 产品订单

Copyright © 2005-2008 Wxdzz.Com. All Rights Reserved .
Powered by:NewAsp SiteManageSystem Version 3.0.0

赣ICP05000510号