发表于:2008/11/2 0:53:00
#0楼
现在随着c语言的不断推广以及单片机的资源不断增加,在单片机里做适当运算处理也是比较轻松的了.但是对于一些小资源,小容量的单片机,如何用汇编去表示小数对初学者还是有一定难度的.
常量的表示:
比如我们要测量一个电压值并显示,就很容易要用到小数了,因为要表示每一个数量单位能够代表多少伏或者毫伏.在这种情况下,我们一般尽量避免小数的引用,比如你的系数是0.2的话,最好写成k*2/10这样的整数来处理.如下面我对红外电平宽度的常量定义就是采用整数的形式来处理小数的.
然而在一些精准测量中,如果完全舍去小数去处理,误差是比较大的,这是就必须要引入小数.一种简单的表示就是采用定点小数的表示方法去处理,这种表示方法需要程序设计者对自己的小数点位置十分清楚,不然也就容易出错了.
比如我们要用12位的ad,5v的参考电压来测量0~4v的电压值,那么每个数量单位能够表示的电压值是5/4096v,即使以毫伏为单位来计算,不使用小数的话系数也只能准到5000/4096,1毫伏了.这样当测量电压越高,误差就越大.为了逃避测量量化值直接和系数相乘引起的较大误差,就需要用测量量化值先与5000相乘,再去除以4096,这样做无疑会增加工作量,本来一次乘法就可以做好的事情,要分成一乘一除来完成.所以一些人为了逃避麻烦的计算就在参考电压下做文章了,比如选择4.096v为参考电压,这样每个量化数量刚好表示1毫伏,就比较好计算测量结果.
实在没有办法了,非要小数表示了,怎么办.那就用定点小数来处理吧,因为浮点小数运算开销的资源太多了,所以还是定点小数比较受青睐.我们已经知道0.5换成二进制小数后是.1,这样主要看我们的数字需要多少位二进制位来表示了.如果用16为来表示的话,我们完全可以用8位二进制数来表示小数.例如5000/4096=1.220703125.我们取小数点后面4位好了,为1.2207.这样系数为0x0138, 我们可以来看看结果差多少,0x0fff*0 x 0138 = 137ec8, 因为我们用了8位小数,所以后面的c8就成小数了,取整数时需要舍去137e,转换为十进制是4990,呵呵,最大量程竟然差了10mv了,看来精度在有些场合还不够呀.
算了,太晚需要休息了,有空再来,继续....
----------------------------------------------
此篇文章从博客转发
原文地址: Http://blog.gkong.com/more.asp?id=66277&Name=gongkong
常量的表示:
比如我们要测量一个电压值并显示,就很容易要用到小数了,因为要表示每一个数量单位能够代表多少伏或者毫伏.在这种情况下,我们一般尽量避免小数的引用,比如你的系数是0.2的话,最好写成k*2/10这样的整数来处理.如下面我对红外电平宽度的常量定义就是采用整数的形式来处理小数的.
然而在一些精准测量中,如果完全舍去小数去处理,误差是比较大的,这是就必须要引入小数.一种简单的表示就是采用定点小数的表示方法去处理,这种表示方法需要程序设计者对自己的小数点位置十分清楚,不然也就容易出错了.
比如我们要用12位的ad,5v的参考电压来测量0~4v的电压值,那么每个数量单位能够表示的电压值是5/4096v,即使以毫伏为单位来计算,不使用小数的话系数也只能准到5000/4096,1毫伏了.这样当测量电压越高,误差就越大.为了逃避测量量化值直接和系数相乘引起的较大误差,就需要用测量量化值先与5000相乘,再去除以4096,这样做无疑会增加工作量,本来一次乘法就可以做好的事情,要分成一乘一除来完成.所以一些人为了逃避麻烦的计算就在参考电压下做文章了,比如选择4.096v为参考电压,这样每个量化数量刚好表示1毫伏,就比较好计算测量结果.
实在没有办法了,非要小数表示了,怎么办.那就用定点小数来处理吧,因为浮点小数运算开销的资源太多了,所以还是定点小数比较受青睐.我们已经知道0.5换成二进制小数后是.1,这样主要看我们的数字需要多少位二进制位来表示了.如果用16为来表示的话,我们完全可以用8位二进制数来表示小数.例如5000/4096=1.220703125.我们取小数点后面4位好了,为1.2207.这样系数为0x0138, 我们可以来看看结果差多少,0x0fff*0 x 0138 = 137ec8, 因为我们用了8位小数,所以后面的c8就成小数了,取整数时需要舍去137e,转换为十进制是4990,呵呵,最大量程竟然差了10mv了,看来精度在有些场合还不够呀.
算了,太晚需要休息了,有空再来,继续....
----------------------------------------------
此篇文章从博客转发
原文地址: Http://blog.gkong.com/more.asp?id=66277&Name=gongkong
14PIN的单片MCU多核心时代已来临, 想在低容量的MCU系统跑多任务吗,欢迎登陆"http://gongkong.gkbk.com"我的博客 查看详情,谢谢!