51单片机 AD转换后运算错误

AD转换程序没有问题 Display是P1 仿真后P1连接的二极管显示AD转换的结果是对的 但是用这个值计算 结果是0 比如:ad输入4V P1显示为204 正确 ,用P1的值乘100再除51 应该得400 但是结果为0;这是为什么 一下是代码

/*************************************************
数据比较
*************************************************/
void data_compare()
{ uchar dd;
Display=ReadADCH0();
dd=Display;
height_real=(dd*100)/51;
P0=height_real;

if(height_real<height_min)
{
BELL=1;
MOTOR1=1;
}
/* if(height_real>=height_max)
{
BELL=1;
MOTOR2=1;
}
if(height_real==height_set)
{
BELL=0;
MOTOR1=0;
MOTOR2=0;
}*/
}

/*************************************************
主函数
*************************************************/
void main()
{
init();

while(1)
{

data_compare();

}
}

第1个回答  2014-04-13
8位机,表示正数的范围0-255,400(从P0口输出)超界了。追问

那个没用 只是想看看有没有值 超界了也是有值的吧

追答

超界了,C语言编译后是如何处理的,这里看不出来。你把AD值减小一半试试。

追问

我改成2V   P1显示102  是对的   P0显示0  还是不对

第2个回答  2014-04-13
height_real=(dd*100)/51;
-----------------------------------
height_real变量没有声明,char的最大值为255,400超过了
声明height_real变量为int类型追问

height_real是int型的 我写P0=height_real;是想看看P0有没有值 这句没有用 主要是height_real比较的那句 一直不对 height_real值一直是0

第3个回答  2014-04-13
这个应该是数据类型的问题,
uchar dd; 把dd改成unsigned int的试试
Display=ReadADCH0();
dd=Display;
height_real=(dd*100)/51;追问

int dd;
Display=ReadADCH0();
dd=Display;
height_real=(dd*100)/51;
if(height_real<height_min)
{
BELL=1;
MOTOR1=1;
}
改过后还是不行 那个height_real总是0

昨天用浮点数还是不行 同学说51运算浮点数有点问题 就改成整形 结果还不对

追答

这样吧,直接给dd赋值10,然后执行height_real=(dd*100)/51,再看height_real的值是多少

追问

这样算的是没问题的 应该是我ad0832程序的问题? 但是Display显示的是没问题的啊 、还有您看那个截图 P1口引脚有灰色的不确定电平是不是有问题

追答

这样没问题,那就应该是ReadADCH0();函数的问题了。我很少用这个仿真软件,灰色应该是因为没有加限流电阻的关系,把二极管加个限流电阻试试

追问

显示的是没问题 我输入是4v P1显示值204 8位精度ad 值是没问题的 关键就是height_real算出来是0

追答

unsigned int dd;
Display=ReadADCH0();
dd=Display;
height_real=(dd*100)/51;当dd = 204的时候,这样计算出来也是0吗?
如果height_real也是 unsigned int类型的
P0=height_real;P0应该是height_real的低8位,也就是0x90啊

追问

对啊 就是0 很是郁闷 就算是204 算出来400 P0也是有值的啊 不可能为0啊 我把输入改成2V 算出来应该是200 不会超 也是0 大神 加一下QQ吧 细谈好吧

本回答被提问者采纳
相似回答