当前位置: 代码迷 >> 单片机 >> 计时器 为啥会闪烁
  详细解决方案

计时器 为啥会闪烁

热度:241   发布时间:2016-04-28 15:47:57.0
计时器 为什么会闪烁?
实现 一个简单的计时器,程序如下。

find_zero函数是想让计时时候数值最高位以上的位不显示。
但是运行时除了最高位,其它的位会闪烁。当去掉find_zero函数及相关语句时,可以正常计数。
请教 低位的闪烁是怎么回事?


#include<stdio.h>
#include<reg52.h>
 typedef unsigned char unit8;
 typedef unsigned int unit16;
 typedef unsigned long unit32;


 unit8 code p[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f},
  num[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
 unit8 a[8];  
 static unit8 j=0;

void timer1_init()
{
  TMOD|=0x10;
  TMOD&=0xdf;
  TH1=0xFC;
  TL1=0x67;
  TR1=1;
}

void int_init()
{
  EA=1;
  ET1=1;

}

  find_zero()
{
  unit8 x; 
for(x=j+1;x<=7;x++)
{
if (a[x]!=0)
return 1;  

}  
return 0;

}


refresh()
{
   
if (find_zero())
P1=num[7-j];
else { j++;
return 0;
}
switch(j)
{
case 0:P2=p[a[0]];j++;break;
case 1:P2=p[a[1]];j++;break;
case 2:P2=p[a[2]];j++;break;
case 3:P2=p[a[3]];j++;break;
case 4:P2=p[a[4]];j++;break;
case 5:P2=p[a[5]];j++;break;
case 6:P2=p[a[6]];j++;break;
case 7:P2=p[a[7]];j=0;break;
}

}
  



main()
{
  timer1_init();
  int_init();
  while(1);
}


void interrupt_timer1() interrupt 3
{
  unit16 counter;
  
  static unit32 m=0;
  TF1=0;
  TH1=0xFC;
  TL1=0x67;
  counter++;
  if (counter==1000)
  {
  counter=0;
m++;

a[0]=m%10;
a[1]=m/10%10;
a[2]=m/100%10;
a[3]=m/1000%10;
a[4]=m/10000%10;
a[5]=m/100000%10;
a[6]=m/1000000%10;
a[7]=m/10000000%10;

  }
  if (m==99999999)
  m=0;
refresh();
 
}

------解决方案--------------------
可以理解成一个动态扫描数码管的程序,每个定时扫描一个数码管
1、保证扫描每位扫描数码管的时间最大限度一致,find_zero()的返回值做成在最后统一返回;refresh()也是一样;这样就能做到要么都是不闪,要么都闪;
2、会闪烁是因为两次扫描同一个数码管的时间间隔太长的原因,调整定时器时间即可,太短也不好,具体自己调试体会
3、写代码要专业一点,该写返回值要写清楚,该写参数要写明白,该缩进要缩进,看书像一坨屎一样,实在令人难以忍受
4、会问题是很好的,更要学会调试,调好了记得发篇心得上来给大家参考参考···
  相关解决方案