请教如何在程序中处理小数变量?

2020-01-20 19:14发布

本帖最后由 wxdn 于 2015-1-21 20:32 编辑

写了一个读16位ADC的程序,程序中需要将读到的结果除以一个小数变量,再将得到的结果送给数码管显示出来,在实际的工作中,这个小数变量不是一个定值,需要校正,校正后要将校正的结果存储在EEPROM中,每次开机后,将存储在EEPROM中的小数变量读出,再去读ADC结果,再将结果除以这个小数变量,得到的商再通过数码管显示出来,请问如何处理这个小数?目前写了一个测试程序,如下:
void Read_byte(void)   //读ADC数据并显示
{
        unsigned char i,A,B,C,D,E;
        unsigned int dat=0;
        CLK=1;
        for(i=0;i<16;i++)
        {
                CLK=0;
                delayus();
                dat=(dat<<1)|OUT;
                delayus();
                CLK=1;
                delayus();
        }
        CLK=1;
        dat=dat/1.9367;//这里的1.9367就是上面所说的小数变量,请问如何将它存储并调用?
        A=dat/10000;
        B=dat%10000/1000;
        C=dat%1000/100;
        D=dat%100/10;
        E=dat%10;
}

补充说明:这个小数变量大概在1.9000-1.9999之间。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
21条回答
bad_fpga
1楼-- · 2020-01-22 07:05
      dat=dat/1.9367;//这里的1.9367就是上面所说的小数变量,请问如何将它存储并调用?
        A=dat/10000;
        B=dat%10000/1000;
        C=dat%1000/100;
        D=dat%100/10;
        E=dat%10;


============================
u32 dat = 0; //定义成32位
dat=dat*10000/19367;//把小数放大,转化成整数,最后要多少精度 ,自己再定义。最后显示的时候在相应位置加上小数点即可
lcw_swust
2楼-- · 2020-01-22 12:59
 精彩回答 2  元偷偷看……
jackiezeng
3楼-- · 2020-01-22 18:47
wxdn 发表于 2015-1-21 20:56
像我上面的例子应该如何处理?请指教。

初略看了一下,你说要除一个小数,何不改为乘以一个小数,,,如果你这个小数为0怎么除?
改为乘以一个小数后,将这个小数放大1000倍,我一般都搞1024倍,再来乘,,,
得到的结果就是放大了的结果,你可以定点小数,也可以弄成真正的小数,随便你了。。。整个过程都是整数操作,,仅仅在最后显示这一步可以小数,也可以定点小数,,
我一搬就是这样搞的。
zhuyi25762
4楼-- · 2020-01-22 23:46
32位浮点数,不就是四个字节么

直接存四个字节到eeprom就是了

联合体定义一下数据就是了
szmachine
5楼-- · 2020-01-23 04:04
我菜鸟级别的,上次搞了一个7位小数在6位数码管上显示的程序,搞了差不多10来天,换了3个算法。感觉程序写的很笨。
wxdn
6楼-- · 2020-01-23 05:35
lcw_swust 发表于 2015-1-21 21:10
你可以试试
不过,我太粗心了,把除看作乘了,程序得改改:
unsigned int x=19367;

谢谢你的指点,现在程序这样写的:dat=(unsigned long)dat*x/10000;请问X这个变量如何将它变成一个16位的16进制,再将这个16位的16进制分解成两个8位的16进制数?好将它存进EEPROM里。

一周热门 更多>