打印

单片机求平均值

[复制链接]
5143|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
caoye87|  楼主 | 2012-5-26 14:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,我是新手,想问个单片机求平均值问题,部分程序如下:
//采样电压平均值//
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次,取平均值,如上面的程序,可是结果液晶显示的数据却一直在变,而且波动很大,不知道为什么,是不是程序错了,请高手赐教,谢谢。

相关帖子

沙发
diweo| | 2012-5-27 08:54 | 只看该作者
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++;
  }

while(i<20)用的是i,后面再也没有i了,而是j。但是这样的话应该是死循环,怎么还会到下面去显示数据呢。。。

另外,建议不要做20次平均,而是做16次平均,这样只要把总和右移4位就可以。不然除以20的话,相对来说麻烦一点,虽然具体细节是C编译器帮你实现的。

使用特权

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

本版积分规则

6

主题

20

帖子

0

粉丝