发新帖我要提问
12
返回列表
打印

关于动态数码管驱动,有时闪烁的问题。

[复制链接]
楼主: hjiannew
手机看帖
扫描二维码
随时随地手机跟帖
21
hjiannew|  楼主 | 2011-1-6 17:25 | 只看该作者 回帖奖励 |倒序浏览
好的,感谢各位的热心相助,我试试用中断定期扫描。但我在进行采样时,也是通过定时采样的,如果开两个定时器公不会有问题,是否设置中断优先级,我是采用的20MS采样一次,总共采样4次,再进行滤波处理进行一次数据处理。然后送显。不过,采用中断定期对显示函数进行扫描,理论上是最合理的。

使用特权

评论回复
22
gx_huang| | 2011-1-6 18:56 | 只看该作者
看来是初哥。
定时器只要开一个就可以了。
比如定时周期5毫秒,每来一次中断刷新一个数码管,则15毫秒全部刷新,不会闪烁。
每来4次中断采样一次ADC。

使用特权

评论回复
23
hjiannew|  楼主 | 2011-1-10 14:09 | 只看该作者
采用了中断定时扫描,但问题还是没有得到解决,偶尔还是有闪烁,比之前稍微好一点。以下是我采用中断定时扫描程序。还请各位高手帮忙看下,到底是不是软件问题。

/T0中断处理程序
void  T0ISR(void)  interrupt  1       

{
   TH0=0xf6;
   TL0=0x3c;

     bai=1;
     shi=1;
     ge=1; //关闭数码管
         i_i++;         
         j_j++;

           if(j_j>3)j_j=1;
            switch(j_j)
                 {
                   case 1:
                              p0=0x00; //消隐
                                  _nop_();
                                  le=1;//573的LE锁存使能置高
                                  bai=0;
                                  shi=1;
                                  ge=1;
                                  p0=codetab[a_data1]; //点亮百位
                                  le=0;
                                  break;
                   case 2:
                          p0=0x00;
                                  _nop_();
                                  le=1;
                                  bai=1;
                                  shi=0;
                                  ge=1;
                                  p0=codetab[a_data2];//点亮十位
                                  p0_7=1;//小数点
                                  le=0;
                                  break;
                   case 3:
                                  p0=0x00;
                                  _nop_();
                                  le=1;
                                  bai=1;
                                  shi=1;
                                  ge=0;
                                  p0=codetab[a_data3];//点亮个位
                                  le=0;
                                   break;
                   default:
                          return;                                  
                 }
                
}

while(1)
   {  
                  if(i_i==4) //4*5ms=20ms
               {
                    i_i=0;//清数次
                adcst_0809();
                          if(adc_count==4) //4*20ms=80ms
                             {
                                   adc_count=0;
                                   DataProcess();
                                 }
                   }  
   }
}
//adc启动程序
void adcst_0809()
{
    p3_0=0;
    p3_1=0;
    p3_2=0;          //选择第一通道
  oe=0;
  _nop_();
  st=0;
  _nop_();
  st=1;
  _nop_();
  st=0;
  _nop_();
  while(!eoc);
     oe=1;
         _nop_();
         getdata[adc_count]=p1;
         adc_count++;
         oe=0;
}

//数据处理
void   DataProcess()
{  
  uchar count;
  uint sum=0;

//TR0=0;//数据处理时,关闭定时器
          for (count=0;count<N;count++)
            {
                  sum = sum + getdata[count];
                  _nop_();
                  _nop_();       
            }
          if(sum>1)
        {
                  sum1=(char)(sum/N);       
                }
          else
                  sum1=0;
                      temp=sum1*151;
                      temp=temp/128;
                          a_data1=temp/100;
                          a_data2=temp%100/10; //数据处理
                          a_data3=temp%10;
                         
//TR0=1;//数据处理完毕,重新开启定时器
}
数码管定时2MS刷新,4个2MS就是20MS,每20MS启动一次采样,共采样4个20MS,也就是80MS进行数据处理一次(采样值滤波,计算等),

使用特权

评论回复
24
gx_huang| | 2011-1-10 19:34 | 只看该作者
采用中断还闪,原因很简单:
在计算
a_data1=temp/100;
a_data2=temp%100/10; //数据处理
a_data3=temp%10;
时,中断发生了,比如前面显示123,现在显示132,如果数据变化频繁,感觉就闪烁。
所以要控制数据变化速率,也就是每秒刷新1到2次,80MS太短了。
你可以把a_data1-3这3个变量固定为一个数据,看看是否还闪。
调试程序是需要想办法的,在这里问作用不大。

使用特权

评论回复
25
宋业科| | 2011-1-10 21:31 | 只看该作者
楼上正解。太快了。

使用特权

评论回复
26
hjiannew|  楼主 | 2011-1-18 17:22 | 只看该作者
非常感谢楼上的回答,虽然我按照你说的,做了,但问题好像还是没有明显的变好,不过,你说得也有道理。我会再好好检查原因的。再此非深感谢。学习了。

使用特权

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

本版积分规则