打印
[AVR单片机]

C语言,ICCAVR,奇怪问题,乘数一字不同,结果十万八千....

[复制链接]
904|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yarnn|  楼主 | 2015-11-7 10:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
先贴程序,
uchar shuzi[10]={0123456789};

void dianliu(uint zen,uint fu)//输出电流
{uchar i;
uint zen1=(20000*zen)/4096;
uint fu1=(20000*fu)/4096;
for(i=0;i<2;i++)
{if(i==1)zen1=fu1;
xianshi((i*4),105,13,3,shuzi[(zen1/10000)]);
xianshi((i*4),119,13,3,shuzi[(zen1%10000)/1000]);
xianshi((i*4),136,13,3,shuzi[(zen1%1000)/100]);
xianshi((i*4),150,13,3,shuzi[(zen1%100)/10]);
xianshi((i*4),164,13,3,shuzi[(zen1%10)]);
}
}

void dianya(uint zen,uint fu)//输出电压
{ uchar i;
uint zen1=(50000*zen)/4096;
uint fu1=(50000*fu)/4096;
for(i=0;i<2;i++)
{if(i==1)zen1=fu1;
xianshi((i*4),18,13,3,shuzi[(zen1/10000)]);
xianshi((i*4),32,13,3,shuzi[(zen1%10000)/1000]);
xianshi((i*4),49,13,3,shuzi[(zen1%1000)/100]);
xianshi((i*4),63,13,3,shuzi[(zen1%100)/10]);
xianshi((i*4),77,13,3,shuzi[(zen1%10)]);
}

}


void ytdl(uint tlz,uint tlf)  //预调电流
{uchar i;
   tlz=(20000*tlz)/4096;
  tlf=(20000*tlf)/4096;
for(i=0;i<2;i++)
{if(i==1)tlz=tlf;
xianshi((3+i*4),85,6,1,xiaoshu[(tlz/10000)]);
xianshi((3+i*4),92,6,1,xiaoshu[(tlz%10000)/1000]);
xianshi((3+i*4),101,6,1,xiaoshu[(tlz%1000)/100]);
xianshi((3+i*4),108,6,1,xiaoshu[(tlz%100)/10]);
xianshi((3+i*4),115,6,1,xiaoshu[(tlz%10)]);
}
}


void gonglv(uint v,uint I,uchar i)//功率显示,
{uint w;   
  w=(v*I*50000*20000)/(1000*4096*4096);
  xianshi(3+i,133,6,1,xiaoshu[(w/100000)]);
  xianshi(3+i,140,6,1,xiaoshu[(w%100000)/10000]);
  xianshi(3+i,147,6,1,xiaoshu[(w%10000)/1000]);
  xianshi(3+i,154,6,1,xiaoshu[(w%1000)/100]);
  xianshi(3+i,163,6,1,xiaoshu[(w%100)/10]);
  xianshi(3+i,170,6,1,xiaoshu[(w%10)]);

}




void main()
{uint h,m,zen2,fu2,yty,ytl,dl1,dl2;
zen2=0xe54;
fu2=0xe43;
yty=0xe54;
ytl=0x800;
dl1=0x802;
dl2=0x0b0;
CLI();

dytz(yty,fu2);//调整的电压输出显示
ytdl(ytl,ytl);//调整的电压输出显示
gonglv(zen2,dl1,0);//功率的输出显示



}


问题是这样的,电流和电压输出显示函数,程序只相差一个字,电压函数处理时,是uint zen1=(50000*zen)/4096;  电流处理是uint zen1=(20000*zen)/4096;但输出结果电压输出是对的,比如,处理0Xe54,得到结果44.775V,但是把这个数值放到电流函数里面,输出结果就是00.0013A,把uint zen1=(20000*zen)/4096;,换成uint zen1=(40000*zen)/4096;结果也是对的,为什么更换这个数值会对结果产生这么大的影响。
另外,功率处理函数结果也不对,不敢却定是电流结果影响了,所以还没找到原因。大侠们帮我看看,是什么原因。

相关帖子

沙发
yarnn|  楼主 | 2015-11-7 10:47 | 只看该作者
刚才试了N多数字,发现一个有趣的现像,当乘数大于32767,也就是大于7EEE后,计算的结果是对的,低于这个数,结果就是00000,或是0000X而已,好奇怪!~按说如果是字长的问题,应该是越大,有溢出才出错,为什么小于这个数会出问题呢

使用特权

评论回复
板凳
yarnn|  楼主 | 2015-11-7 12:19 | 只看该作者
确实是字长的问题,把变量变成unsigned long int 就可以了,但是为什么大于32767就能正常,一直想不明白,32768刚好是4096的8倍,会不会跟这个有关系

使用特权

评论回复
地板
ccxlslr| | 2015-11-7 20:54 | 只看该作者
本帖最后由 ccxlslr 于 2015-11-7 21:03 编辑

小于32768按有符号整数编译,因为int可以表示,大于32768要用long表示。有可能是这个原因。这个是有规定的。记得是常数!
而且还分10进制和16进制,表示方法也不一样。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:一穷二白三无懒

5

主题

29

帖子

0

粉丝