大家好,我是新手,想问个单片机求平均值问题,部分程序如下:
//采样电压平均值//
uint pjz(uint s)
{
uint v;
v=s/20;
return v;
}
//-------------------------------------------------------------------
// 函数名称: main
// 函数功能: 主程序
//-------------------------------------------------------------------
main()
{
uchar i;
delay(10); //延时
lcd_init(); //初始化LCD
lcd_pos(0); //设置显示位置为第一行的第1个字符
i = 0;
while(dis4[i] != '\0')
{ //显示字符
lcd_wdat(dis4[i]);
i++;
}
lcd_pos(0x40); //设置显示位置为第二行第1个字符
i = 0;
while(dis5[i] != '\0')
{
lcd_wdat(dis5[i]); //显示字符
i++;
}
while(1)
{
uchar i,j,x;
uint s0;
i=0,s0=0,j=0;
while(i<20)
{
iicInit(); //I2C总线初始化
ADC_PCF8591(0x04);
if(SystemError == 1) //有错误,重新来
{
iicInit(); //I2C总线初始化
ADC_PCF8591(0x04);
}
sum0[j]=receivebuf[0];
s0=s0+sum0[j];
j++;
}
x=(uchar)pjz(s0);
show_value(x); //显示通道0
lcd_pos(0x02);
lcd_wdat(dis[2]); //整数位显示
lcd_pos(0x04);
lcd_wdat(dis[1]); //第一位小数显示
lcd_pos(0x05);
lcd_wdat(dis[0]); //第二位小数显示
delay(50); //延时
}
}
我用的是AT89S52单片机,通过PCF8591芯片采集电阻两端电压。如果将程序中的“show_value(x); //显示通道0” 中的X换成 receivebuf[0](0通道接收的数据在receivebuf[0]中),液晶显示的数字电压和电阻两端的模拟电压是相同的,而且很稳定。可是我想采集20次,取平均值,如上面的程序,可是结果液晶显示的数据却一直在变,而且波动很大,不知道为什么,是不是程序错了,请高手赐教,谢谢。 |