你的加里下雨了奥

导航

求助,51单片机定时器中断控制数码管

遇到的问题是:

动态显示时,如果位选变化间隔太小,会导致计数的部分失效,数码管一直显示0000,间隔在30时数字会有变化,但是显示闪烁的效果太明显了
代码如下:


#define uint unsigned int
#define uchar unsigned char
//位选定义
sbit wei0 =P1^3;
sbit wei1 =P1^4;
sbit wei2 =P1^5;
sbit wei3 =P1^6;
//数码管显示段选数组
uint NUM_SEG[10]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
//延时函数
void delay(uint time)
{
	uint i,j;
	for(i=0;i<time;i++)
	{
		for(j=0;j<100;j++);
	}
}
//数码管位选函数
void wei(uint wx)
{
	switch(wx)
	{
		case 0:
			wei0 = 0; wei1=1;wei2=1;wei3=1;
			break;
		case 1:
			wei0 = 1; wei1=0;wei2=1;wei3=1;
			break;
		case 2:
			wei0 = 1; wei1=1;wei2=0;wei3=1;
			break;
		case 3:
			wei0 = 1; wei1=1;wei2=1;wei3=0;
			break;
		default:
     		 wei0 = 1; wei1=1;wei2=1;wei3=1;
			break;
	}
}
//定时器中断初始化函数,用的是定时器0,方式1
void Timer0Init() {
    TMOD = 0x01;                          
    TH0 = (65535-50000)/256; 
    TL0 = (65535-50000)%256; 
		ET0 = 1;
		EA  = 1;
    TR0 = 1;                                      
}
uint count = 0;
uint i = 0;
//中断响应函数
void Timer0() interrupt 1
{
	TH0 = (65535-50000)/256;
	TL0 = (65535-50000)%256;
	//每过1s让i进行自加,加到9999置零
	count++;
	if(count == 20)
	{
		count = 0;
		i++;
		if(i==9999)
		{
			i = 0;
		}
	}
}

//主函数
void main ()
{
	uint ge,shi,bai,qian;//用来显示数码管不同位的数字
	P0=0X00;
	while(1)
	{
		Timer0Init();//定时器中断初始化函数
        //计算数码管显示的数字
		ge=i%10;
		shi=i%100/10;
		bai=i/100%10;
		qian=i/1000;
        //动态显示代码
		wei(3);
		P0=NUM_SEG[ge];//数码管显示
		delay(3);//程序的问题是延时短的话数码管显示为0000,延时设置为30,就可以正常显示数字变化,但是闪烁问题严重
		wei(2);
		P0=NUM_SEG[shi];
		delay(3);
		wei(1);
		P0=NUM_SEG[bai];
		delay(3);
		wei(0);
		P0=NUM_SEG[qian];
		delay(3);
	}
} 

posted on 2025-01-18 16:18  风带不走的遗憾  阅读(43)  评论(1)    收藏  举报