智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 2611|回复: 14
打印 上一主题 下一主题

[咨询] 小弟一个简单C语言问题求教!!

[复制链接]

85

主题

877

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
7835

活跃会员奖章优秀会员奖章论坛骨干奖章在线王奖章论坛元老奖章

威望
5349
贡献
1386
兑换币
150
注册时间
2012-12-20
在线时间
550 小时
毕业学校
哈尔滨
跳转到指定楼层
1#
发表于 2013-2-16 23:35:44 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
小弟最近正在玩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的值 求大侠赐教啊!!!
为什么计算一个值怎么分成两步没有问题 一步就出错呢?????


85

主题

877

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
7835

活跃会员奖章优秀会员奖章论坛骨干奖章在线王奖章论坛元老奖章

威望
5349
贡献
1386
兑换币
150
注册时间
2012-12-20
在线时间
550 小时
毕业学校
哈尔滨
15#
 楼主| 发表于 2013-2-17 18:07:08 | 只看该作者
jpbirdy 发表于 2013-2-17 16:52
你的result是uchar的,result*5会隐式强转为int。
其他的就不多解释了。

我真心明白了  谢谢哈
回复 支持 反对

使用道具 举报

8

主题

337

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2131
威望
1054
贡献
481
兑换币
110
注册时间
2009-6-14
在线时间
298 小时
14#
发表于 2013-2-17 16:52:10 | 只看该作者
你的result是uchar的,result*5会隐式强转为int。
其他的就不多解释了。
回复 支持 反对

使用道具 举报

8

主题

337

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2131
威望
1054
贡献
481
兑换币
110
注册时间
2009-6-14
在线时间
298 小时
13#
发表于 2013-2-17 16:51:06 | 只看该作者
去看C语言隐式强转那部分
不是优化的问题,别听她扯淡。
如果result不是double而是int,整个表达式不会隐式强转,除法两边都是int,则做int的整除操作。
如果换成5.0,5.0是double型,乘以result则隐式强转为double,除法两边存在double,做的是除法操作。
回复 支持 反对

使用道具 举报

85

主题

877

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
7835

活跃会员奖章优秀会员奖章论坛骨干奖章在线王奖章论坛元老奖章

威望
5349
贡献
1386
兑换币
150
注册时间
2012-12-20
在线时间
550 小时
毕业学校
哈尔滨
12#
 楼主| 发表于 2013-2-17 15:02:59 | 只看该作者
灰原姐姐 发表于 2013-2-17 12:51
贴完整代码出来。包括变量申明。

望灰原姐姐赐教哈  
回复 支持 反对

使用道具 举报

85

主题

877

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
7835

活跃会员奖章优秀会员奖章论坛骨干奖章在线王奖章论坛元老奖章

威望
5349
贡献
1386
兑换币
150
注册时间
2012-12-20
在线时间
550 小时
毕业学校
哈尔滨
11#
 楼主| 发表于 2013-2-17 15:01:55 | 只看该作者
灰原姐姐 发表于 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);       
}

回复 支持 反对

使用道具 举报

36

主题

1837

帖子

3

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6375
威望
3368
贡献
1847
兑换币
2326
注册时间
2013-2-3
在线时间
580 小时
10#
发表于 2013-2-17 12:51:34 | 只看该作者
lieklieke 发表于 2013-2-17 11:59
恩呢 我改成5.0和256.0的确是没问题了 但是灰原姐姐 如果像你所说被优化成了result* (5/256)     5/256=0 ...

贴完整代码出来。包括变量申明。
回复 支持 反对

使用道具 举报

85

主题

877

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
7835

活跃会员奖章优秀会员奖章论坛骨干奖章在线王奖章论坛元老奖章

威望
5349
贡献
1386
兑换币
150
注册时间
2012-12-20
在线时间
550 小时
毕业学校
哈尔滨
9#
 楼主| 发表于 2013-2-17 11:59:07 | 只看该作者
灰原姐姐 发表于 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不能正常提取  求姐姐再帮忙分析分析呗
回复 支持 反对

使用道具 举报

36

主题

1837

帖子

3

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6375
威望
3368
贡献
1847
兑换币
2326
注册时间
2013-2-3
在线时间
580 小时
8#
发表于 2013-2-17 11:12:35 | 只看该作者
昨晚用手机打的,没说清楚。
vin=(result*5)/256
被优化为
vin=result(5/256) 注:在数学上此优化是没有问题的

5/256 == 0
所以
。。。

所以你只需要写成
vin=(result*5.0)/256.0
应该就可以了。
回复 支持 反对

使用道具 举报

1

主题

2067

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5124

论坛元老奖章在线王奖章活跃会员奖章优秀会员奖章

威望
2752
贡献
898
兑换币
59
注册时间
2012-12-8
在线时间
737 小时
7#
发表于 2013-2-17 09:39:37 | 只看该作者
学习一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-28 09:20 , Processed in 0.164126 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表