求 51单片机浮点运算子程序 C51编程

原来用汇编编的,直接调用子程序,对子程序没有仔细分析过。现在公司要求改用C语言。网上都是汇编的,C要付款。如有请发邮箱:[email protected]
我需要把测量的电压、电流AD值转换为4字节浮点数(IEEE75格式)再进行加减乘除等运算。最好有16进制转浮点数(IEEE75)和浮点数(IEEE75)转16进制。
即把IEEE754格式的数值进行四则运算C51程序。
以前学的是汇编,对C 不是很熟悉。求各位帮帮忙!

你应该了解一下所用的C编译程序有没有带浮点库。如能选用一个带浮点库的C编译程序,就行了。
否则,你要自己编写浮点子程序的话,最好也不应该用C语言编,而应该用汇编来编,最后连接时再和你的C语言的主程序连接在一起。
因为,如过你的浮点子程序都是直接用C语言写的,那效率就太低了。在51单片机这样的环境下,恐怕大多数的应用,都会嫌它太笨重,不合要求。

你说你过去用汇编语言“直接调用子程序”,请问那些子程序是自己编的呢?还是某个开发系统提供的标准子程序?
如果是你自己编的,那么,你只要了解一下C51中函数的出口入口的寄存器规则,将你的子程序改一下,使他符合这些规则,即可。
如果那些子程序是别人提供的标准子程序,那么您可以了解一下,那些子程序的入口、出口条件是否和C语言的要求兼容,如果兼容,那就可以直接连接了。
【补充一点看法】
从您的问题补充来看,您的应用中对精度的要求不高,完全可以采用定点的Q格式,不用浮点运算。最合理。
假如用浮点,即使浮点子程序都是汇编编的,效率也会比定点的Q格式差很远(一、两个数量级)。如果子程序本身再用C语言来编,那就更不知差到什么程度了。追问

我们的精度较高,AD24位。原来用汇编先把数据转换为IEEE754再进行计算。这个设备原来被人开发的。现在要添加功能。公司要求用C编程。方便以后移植。
另外能不能把Q格式的运算子程序、16进制与Q格式相互转换的程序发一份给我参考。谢谢。
如有请发邮箱:[email protected]

追答

或许我孤陋寡闻,但据我所知AD转换精度有8位、10位、12位的都很常见,16位的就罕见了。似乎没有听说过24位的?
子程序直接用C语言编不见得就能“便于移植”,用汇编语言编写也不见得就不“便于移植”。须知现在流行的C语言所带的标准子程序库,开发时大都是用汇编语言的,编译好后只把目标码封装到库中提供给你用(汇编清单并不给你),同时把各个子程序的“原型”写成一个“头文件”给你,使你可以用C语言调用它,就可以了。
所谓Q格式,并非一种什么特殊的格式,通常也没有什么专门的“转换程序”。所谓Q格式,不过就是用整数形式(如long型、int型、unsigned long型、unsigned int型)直接处理,只不过是把它看成“定点小数”,由程序员自己在上下文中掌握小数点位置。
例如一个int型的变量,如果我们把它看做有15位小数的量(我们称作Q15格式)他就可以代表从-1到略小于+1范围的小数,精度可以达到2的15次方分之一。
下面这个链接中,我的回答里,对Q格式做了略细的说明。限于篇幅这里不重复了。
http://zhidao.baidu.com/question/351938353.html?oldq=1

追问

谢谢haolizhong4924 ,我们的AD转换是用分立元件构成的,转换精度相当于24位。现在的LCR测量仪在测量时大都采用这种方法。主要是便宜。

追答

标准C和目前大多数的基于单片机的C语言都是有浮点库的。我对基于51单片机的C语言没用过,不熟悉,但我刚刚翻了一些介绍资料,似乎很多都是具有浮点功能的。
所以,我看最简单的方式还是了解一下你所用的C编译程序有没有带浮点库。如果没有的话,换一个具有浮点的C版本,不就行了吗?
唯一的问题是:一般的资料对于该版本浮点的内部格式不一定公开。所以不知道是否符合您所说的IEEE75格式标准。
但是我想,这对于一般的应用,应该没有妨碍。因为这个格式标准仅仅在内部使用。
对于C语言的程序员,只有以下两种情况,才需要了解浮点的具体内部格式:
(1)需要自己编写与此语言链接的汇编语言程序段时;
(2)某些外部设备要求按照浮点二进制代码来和你的系统交换信息时。
除了这两种情况以外,对于C语言编写的程序中,则完全不必考虑浮点格式是什么。例如输入的如果是定点数据,要转换为浮点,只要给一个浮点类型的变量赋值,编译程序就会自动实行强制类型转换。这些强制类型转换,其实就是在调用内部的“定点——浮点转换子程序”。但这个调用过程,在高级语言的程序中是看不见的。

追问

我自己用C编了这部分程序,感觉不是很好,想借鉴已使用这类的程序优化一下。不过人感谢你的回答。积分送给你。

温馨提示:答案为网友推荐,仅供参考