新手求救!单片机电压值的计算问题

l668866 2015-04-10 10:24:14

主程序为
void main()
{
uint adNum[5];
uint dat0 = 0;
long buf, temp;
uint k, count;
EA = 1;
TMOD = 0x00;
ET0 = 1;
TR0 = 0;
LcdInit();
while(1)
{
count++;

if(count>1)
{
count=0;

k++;
}

if(k >= 96)
k = 0;
dat0 = Read_ADC();
if(dat0 == 0)
LcdInit();
temp = buf = (50 * (dat0 - 32768) / 32767 ) * 1000;
if(buf < 0) buf = -buf;
adNum[4] = buf%10;
adNum[3] = (buf/10)%10;
adNum[1] = (buf/1000)%10;
adNum[2] = (buf/100)%10;
adNum[0] = (buf/10000)%10;
LcdWriteCom(0x80);
LcdWriteData('V');
LcdWriteData('O');
LcdWriteData('L');
LcdWriteData('T');
LcdWriteData('S');
LcdWriteData(':');
if(temp < 0) LcdWriteData('-');
if(adNum[0]) LcdWriteData('0'+adNum[0]);
LcdWriteData('0'+adNum[1]);
LcdWriteData('.');
LcdWriteData('0'+adNum[2]);
LcdWriteData('0'+adNum[3]);
LcdWriteData('0'+adNum[4]);
LcdWriteData('V');
LcdWriteData(0x20);
}
}
计算的数值通过LCD1602只显示整数,小数被舍去。应该怎么办?
...全文
324 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_42751731 2018-07-20
  • 打赏
  • 举报
回复
负载为纯电阻,采用直流供电,电源电压在200 mV~5V时,调整负载电阻,能测量40mW~1W负载功率,误差小于1%。
(2)负载为纯电阻,采用50Hz正弦交流供电,电源电压有效值在1V~5V时,调整负载电阻,能测量40mW~500mW负载功率,误差小于5%。
(3)该装置能自动识别交流、直流供电,并自动选择量程。
(4)负载为纯电阻,采用直流供电。电源电压在200 mV~30V时,调整负载电阻,能自动测量40mW~1W负载功率,误差小于1%。

求代码,急
mangoalx 2015-04-13
  • 打赏
  • 举报
回复
引用 3 楼 l668866 的回复:
[quote=引用 2 楼 wangfan027 的回复:]
adNum[4] = buf%10; 
         adNum[3] = (buf/10)%10;   
         adNum[1] = (buf/1000)%10; 
         adNum[2] = (buf/100)%10; 
         adNum[0] = (buf/10000)%10;
这个地方改下就可以了, 你看明白这几行就知道怎么改了
引用 2 楼 wangfan027 的回复:
adNum[4] = buf%10; 
         adNum[3] = (buf/10)%10;   
         adNum[1] = (buf/1000)%10; 
         adNum[2] = (buf/100)%10; 
         adNum[0] = (buf/10000)%10;
这个地方改下就可以了, 你看明白这几行就知道怎么改了
我把上面的temp = buf = (50 * (dat0 - 32768) / 32767 ) * 1000;改为 temp = buf = (50.0 * (dat0 - 32768) / 32767 ) * 1000;就可以显示小数了。 但问题是,测量的电压范围变小了。[/quote] 这样是用浮点数计算最后赋给整形,范围不会变吧? temp = buf = (50L * (dat0 - 32768)* 1000 / 32767 ) ; 这样改,只用长整形计算,最后才做除法以免损失精度
l668866 2015-04-11
  • 打赏
  • 举报
回复
引用 2 楼 wangfan027 的回复:
adNum[4] = buf%10; 
         adNum[3] = (buf/10)%10;   
         adNum[1] = (buf/1000)%10; 
         adNum[2] = (buf/100)%10; 
         adNum[0] = (buf/10000)%10;
这个地方改下就可以了, 你看明白这几行就知道怎么改了
引用 2 楼 wangfan027 的回复:
adNum[4] = buf%10; 
         adNum[3] = (buf/10)%10;   
         adNum[1] = (buf/1000)%10; 
         adNum[2] = (buf/100)%10; 
         adNum[0] = (buf/10000)%10;
这个地方改下就可以了, 你看明白这几行就知道怎么改了
我把上面的temp = buf = (50 * (dat0 - 32768) / 32767 ) * 1000;改为 temp = buf = (50.0 * (dat0 - 32768) / 32767 ) * 1000;就可以显示小数了。 但问题是,测量的电压范围变小了。
dceacho 2015-04-11
  • 打赏
  • 举报
回复
adNum[4] = buf%10; 
         adNum[3] = (buf/10)%10;   
         adNum[1] = (buf/1000)%10; 
         adNum[2] = (buf/100)%10; 
         adNum[0] = (buf/10000)%10;
这个地方改下就可以了, 你看明白这几行就知道怎么改了
worldy 2015-04-11
  • 打赏
  • 举报
回复
X10,X100再显示出来呗
dceacho 2015-04-11
  • 打赏
  • 举报
回复
 temp = buf = (50 * (dat0 - 32768) / 32767 ) * 1000;
改成
temp  = (50 *  1000);
temp*=(dat0 - 32768);
temp /= 32767  ;
buf=temp;
试试

27,382

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧