智能车制作

标题: 小弟一个简单C语言问题求教!! [打印本页]

作者: lieklieke    时间: 2013-2-16 23:35
标题: 小弟一个简单C语言问题求教!!
小弟最近正在玩STC单片机的AD功能 用C语言写了一下小程序 但是出现的一个问题让我感到很惊讶 特地前来求教
首先vin 与vin1都是float的
但是 这段程序Keil编译没问题 但是实际结果是a有数值 b和c都没有数值

          vin=(result*5)/256;
                temp=vin*100;
                a=temp/100;
                b=(temp/10)%10;
                c=(temp%100)%10;
                display_595_1(1,a);
                display_595(2,b);       
                display_595(3,c);       


我小小改动了一下程序

          vin1=result*5;
          vin=vin1/256;
                temp=vin*100;
                a=temp/100;
                b=(temp/10)%10;
                c=(temp%100)%10;
                display_595_1(1,a);
                display_595(2,b);       
                display_595(3,c);

就是把AD值的计算分成了两步 让我诧异的是这样子分成两步计算 实际结果就是正确的 要是只用一步来计算就会丢失b与c的值 求大侠赐教啊!!!
为什么计算一个值怎么分成两步没有问题 一步就出错呢?????



作者: lieklieke    时间: 2013-2-16 23:54
自己坐沙发
作者: 灰原姐姐    时间: 2013-2-17 00:37
100 100.0  10 10.0
作者: 灰原姐姐    时间: 2013-2-17 00:41
乘除被优化掉了,用实数写。变量全部改成或强转成浮点型。关掉优化。
作者: lieklieke    时间: 2013-2-17 00:47
灰原姐姐 发表于 2013-2-17 00:37
100 100.0  10 10.0



作者: lieklieke    时间: 2013-2-17 00:47
灰原姐姐 发表于 2013-2-17 00:41
乘除被优化掉了,用实数写。变量全部改成或强转成浮点型。关掉优化。

哪里有优化 软件的哪里设置的??

作者: exiao    时间: 2013-2-17 09:39
学习一下
作者: 灰原姐姐    时间: 2013-2-17 11:12
昨晚用手机打的,没说清楚。
vin=(result*5)/256
被优化为
vin=result(5/256) 注:在数学上此优化是没有问题的

5/256 == 0
所以
。。。

所以你只需要写成
vin=(result*5.0)/256.0
应该就可以了。

作者: lieklieke    时间: 2013-2-17 11:59
灰原姐姐 发表于 2013-2-17 11:12
昨晚用手机打的,没说清楚。
vin=(result*5)/256
被优化为

恩呢 我改成5.0和256.0的确是没问题了 但是灰原姐姐 如果像你所说被优化成了result* (5/256)     5/256=0 那result*0=0   那不会出现a的值正确的情况啊 按照你的温习应该a也不会出现值 a也应该为0  但实际情况为a有正确的值 b、c不能正常提取  求姐姐再帮忙分析分析呗

作者: 灰原姐姐    时间: 2013-2-17 12:51
lieklieke 发表于 2013-2-17 11:59
恩呢 我改成5.0和256.0的确是没问题了 但是灰原姐姐 如果像你所说被优化成了result* (5/256)     5/256=0 ...

贴完整代码出来。包括变量申明。

作者: lieklieke    时间: 2013-2-17 15:01
灰原姐姐 发表于 2013-2-17 12:51
贴完整代码出来。包括变量申明。

#include<STC15F2K60S2.H>
#include<intrins.h>

#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long

sbit RCK=P4^1;
sbit DS=P4^4;
sbit CLK=P4^2;

void write_595(uint dat);
void display_595(uchar i,uchar j);
void display_595_1(uchar i,uchar j);

uchar code wei[]={0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar code duan_1[]={0x40,0x79,0x24,0x30,0x19,0x02,0x02,0x78,0x00,0x10};

uchar result;
float vin;
void main()
{
        uchar i;
        uchar a=0,b=0,c=0,status;
        uint temp=0;
        P1ASF=0x10;
        ADC_CONTR=0x84;
        for(i=0;i<10;i++)
        {for(i=0;i<100;i++);}
        while(1)
        {
                ADC_CONTR=0x8c;
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                status=0;
                while(status==0)
                {
                        status=ADC_CONTR&0x10;
                }
                ADC_CONTR=0x81;
                result=ADC_RES;
                vin=(result*5.0)/256.0;
                temp=vin*100;
                a=temp/100;
                b=(temp/10)%10;
                c=(temp%100)%10;
                display_595_1(1,a);
                display_595(2,b);       
                display_595(3,c);       
                P0=~result;
       
        }
}


void write_595(uint dat)
{
        uchar i;
        for(i=0;i<16;i++)
        {
                CLK=0;
                if((dat&0x8000)==0x8000)
                {
                        DS=1;
                }
                else
                {
                        DS=0;
                }
                CLK=1;
                dat<<=1;
        }               
                RCK=0;       
                RCK=1;

}

void display_595(uchar i,uchar j)
{
        uint a=0x0000;
        uchar b=wei;
        uchar c=duan[j];
        a=b<<8;
        a=a+c;
        write_595(a);       
}

void display_595_1(uchar i,uchar j)
{
        uint a=0x0000;
        uchar b=wei;
        uchar c=duan_1[j];
        a=b<<8;
        a=a+c;
        write_595(a);       
}


作者: lieklieke    时间: 2013-2-17 15:02
灰原姐姐 发表于 2013-2-17 12:51
贴完整代码出来。包括变量申明。

望灰原姐姐赐教哈  

作者: jpbirdy    时间: 2013-2-17 16:51
去看C语言隐式强转那部分
不是优化的问题,别听她扯淡。
如果result不是double而是int,整个表达式不会隐式强转,除法两边都是int,则做int的整除操作。
如果换成5.0,5.0是double型,乘以result则隐式强转为double,除法两边存在double,做的是除法操作。
作者: jpbirdy    时间: 2013-2-17 16:52
你的result是uchar的,result*5会隐式强转为int。
其他的就不多解释了。
作者: lieklieke    时间: 2013-2-17 18:07
jpbirdy 发表于 2013-2-17 16:52
你的result是uchar的,result*5会隐式强转为int。
其他的就不多解释了。

我真心明白了  谢谢哈{:soso_e144:}





欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2