IEEE754数据转换程序_第1页
IEEE754数据转换程序_第2页
IEEE754数据转换程序_第3页
IEEE754数据转换程序_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1/ 51问题的提出笔者在系统开发中采用 RS485 实现单片机与外围设备的通信,通信采用通用串行 接口 协议(USS ),按照串行 总线的主从通讯原理来确定访问的方法。USS 规定了一套严格的通信规则,关于浮点数参数值,USS 规定采用 IEEE-754 格式进行传送。例如,浮点数 50.0, 在通信中传送的是它的 IEEE-754 格式,即 4 字节的十六进制 424800H.因此,单片机的 C 程序,在发送或接收外围设各的参数值时,需要解决如何实现浮点数与IEEE 格式转换的问题。2.IEEE浮点数的格式在计算机中,浮点数的存储均采用4 字节的 IEEE-754 格式。例如,浮点数 50

2、.0 的IEEE 表示形式如下:二进制:符号S阶码n尾数m0 1000010 0 1001000 00000000 00000000十六进制:42 480000其中,最高位表示符号,1表示负,0表示正;第 2330 位表示阶码。注意:阶码 是以 2 为底的指数再加上偏移量 127.第 022 位是尾数部分。尾数的整数部分永远为1,因此不予保存,但它是隐含存在的。一个浮点数计算式为:|(-1)吹2叹(1莎|例如,前面绘出的浮点数的表示形式中,s=0 ,n=132,m=(1/2+0/4+0/8+1/16+0/32+),则计算结果为 50.0.3.浮点数与IEEE格式转换在最初的 C 语言编程中,笔

3、者根据上面介绍的 IEEE 表示形式,采用移位计算的方法实 现浮点数和 IEEE格式转换。当接收到外围设备传来的4 字节 IEEE 格式参数值时,依次将符号、阶码、尾数通过移位取出,然后按照IEEE 计算规则计算出对应的浮点数。当需要发送给外围设备的浮点数时,按相反的方法将其转化为IEEE 格式后再发送出去。笔者一直感觉上述方法太麻烦,而且效率太低。后来笔者想到,既然在C 语言中浮点数本身就是采用 IEEE 格式来存储的,能否利用 C 语言本身的机制来实现浮点数和IEEE 格 式的转2/ 5换?经过尝试,发现利用 union 数据类型可以很好地完成这工作,即只需定义下面这个 union 类型:

4、union类型:unionpacket;floata;char b4;;注意:类型定义的后面别忘了还有个符号 ”;”,u nion 类型虽然有两个内部变量,但两个 内部变量占用同-地址空间,它只占用 4 个字节。内部 float 变量 a (占用 4 个字节)和 char 数组 b (同样占用 4 个字节)从同一个地址开始存放,并共享同一块内存空间。C 语言中,对于单精度浮点数 a,采用四个字节(IEEE 格式)来存储,依次存储在四个连续的存储单元 内,低字节存储在低地址存储单元,高字节存在高地址存储单元;字符数组b 也采用和 a同样的存储方式。利用 union 数据类型,可以直接访问浮点数以

5、 IEEE 格式存放在存储单 元中的十六进制字节,通过直接读取或修改这些十六进制字节,便可以巧妙地实现浮点数与IEEE 格式的转换。(1)IEEE 格式转换浮点数当单片机接收来自 USS 总线的数据时,只需将 4 个字节的数据放到内部变量 b 中,再 访问内部变量 a,即可实现转换。下面给出示意程序,供参考。3/ 5char i;float datum; union packet p;/注意imion数据类型禹定义方式for (i= 0; i 4; i+) p.bi = SBUF;/此处的SBUF为 单片机的输入寄存器datium = p.a;/通过此语句可实 现IEEE格式向float的转换

6、(2 )浮点数转换 IEEE 格式当单片机处理好数据后,需要把浮点型的数据转换成 IEEE 格式,输出给 USS 总线。只需把数据赋予内部变量 a,再从内部变量 b 中取出对应的 4 个字节即可。p.a = datum;/注意union类型内部变量的访问方式for (i = 0; i 4; i+) SBUF = p.bi;/此处的SBUF为单片机的输出寄存器2.1 定义 union 数据typedef unionfloat ul_Temp;4/ 5uint8 uc_Buf4;un _DtformC onver;2.2 应用un _DtformC on ver DtformC on ver;uint8 i;in t32 il_Temp32;float f_Temp;/十进制 float 型数据转换成 IEEE754 标准DtformCo nver.ul_Temp = 220.1;il_Temp32=0;for(i=0;i4;i+)il_Temp32 |= (in t32)(DtformCo nver.uc_Bufi(i*8);/IEEE754 标准转换成十进制 floatil_Temp32 = 0 x435C0000;/实际十进制值是memset(uint8 *)&DtformConver.uc_Buf

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论