单片机定时器控制七段数码管会闪烁问题
void main()
{
unsigned char m, j;
TMOD=0x01; //定时器0工作模式1
TH0=0x3c;
TL0=0xb0;
TR0=1;
IE=0x8a;
。
。
。
}[code=C/C++][/code]
void Timer0( void ) interrupt 1 //定时器0中断处理函数
{
TF0=0; //溢出标记
TR0=0;
TH0=0x3c;
TL0=0xb0; //装载初值
TR0=1; //开始计数
i++;
if(i==20) {i=0;secondL--;}
}
七段数码管显示的时候会间隔闪烁,且时间一下快一下慢
for (j=255;j>0;j--); //消除视觉暂留
[解决办法]
这是什么代码?在哪点的数码管?
for (j=255;j>0;j--); 丢哪去了?
main函数的循环体呢?
[解决办法]
定时器中断里没见到你控制数码管的代码,大概LZ是怎么弄的?
[解决办法]
首先,从百度百科里面借点资料吧!数码管是一种半导体发光器件,其基本单元是发光二极管。
静态显示驱动
静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89S51单片机可用的I/O端口才32个呢:),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。
动态显示驱动
数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
平时我们点亮数码管时最主要是要考虑到电压和电流。静态时,推荐使用10-15mA;动态时,16/1动态扫描时,平均电流为4-5mA,峰值电流50-60mA。电压嘛,可以查引脚排布图,看一下每段的芯片数量是多少?当红色与黄绿色时,使用1.9V乘以每段的芯片串联的个数;当绿色/蓝色时,使用3.1V乘以每段的芯片串联的个数。
这次我用的是四位七段数码管,就先介绍它们了,首先根据网上查的资料确定了,公共极(位选)以及段选。具体的是:从正面看,数码管有引脚的一面向下,按逆时针为:1、2、3、、、12:下面一排是1到6,上面一排是7到12,具体如下;
1af23b(上排)
edpcg4(下排)
其中1234为位选,p为点。
重要:共阴、共阳都是这样的。
下面说说与单片机使用时需要注意的事项:
1、共阳数码管与单片相连时,需要接三极管放大电流来点亮数码管,具体接法要看使用什么三极管了,这个网上应该有很多资料,所以我就不说了。
2、共阴数码管与单片机相连时,需要接锁存器,经过验证它的作用像是扩流,但是最终却发现是稳压的。具体的其实我也没有弄清,大家还是自己慢慢研究哈.