#include <reg52.h>
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
unsigned char code LedChar[] = { //ÊýÂë¹ÜÏÔʾ×Ö·ûת»»±í
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char LedBuff[8] = { //ÊýÂë¹Ü+¶ÀÁ¢LEDÏÔʾ»º³åÇø
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF
};
unsigned char code image[3][8]={
0xE7,0xC3,0x81,0x24,0x66,0xE7,0xE7,0xE7,
0xE7,0xF3,0xF9,0x00,0x00,0xF9,0xF3,0xE7,
0xE7,0xCF,0x9F,0x00,0x00,0x9F,0xCF,0xE7
};
bit flag1s = 1;
unsigned char T0RH = 0;
unsigned char T0RL = 0;
unsigned char index = 0;
void ConfigTimer0(unsigned int ms);
void TrafficLight();
void dianzhenscan();
void main()
{
EA = 1; //¿ª×ÜÖжÏ
ENLED = 0; //ʹÄÜÊýÂë¹ÜºÍLED
ConfigTimer0(1); //ÅäÖÃT0¶¨Ê±1ms
while (1)
{
if (flag1s) //ÿÃëÖ´ÐÐÒ»´Î½»Í¨µÆË¢ÐÂ
{
flag1s = 0;
TrafficLight();
}
}
}
void ConfigTimer0(unsigned int ms)
{
unsigned long tmp; //ÁÙʱ±äÁ¿
tmp = 11059200 / 12; //¶¨Ê±Æ÷¼ÆÊýƵÂÊ
tmp = (tmp * ms) / 1000; //¼ÆËãËùÐèµÄ¼ÆÊýÖµ
tmp = 65536 - tmp; //¼ÆË㶨ʱÆ÷ÖØÔØÖµ
tmp = tmp + 18; //²¹³¥ÖжÏÏìÓ¦ÑÓʱÔì³ÉµÄÎó²î
T0RH = (unsigned char)(tmp>>8); //¶¨Ê±Æ÷ÖØÔØÖµ²ð·ÖΪ¸ßµÍ×Ö½Ú
T0RL = (unsigned char)tmp;
TMOD &= 0xF0; //ÇåÁãT0µÄ¿ØÖÆÎ»
TMOD |= 0x01; //ÅäÖÃT0Ϊģʽ1
TH0 = T0RH; //¼ÓÔØT0ÖØÔØÖµ
TL0 = T0RL;
ET0 = 1; //ʹÄÜT0ÖжÏ
TR0 = 1; //Æô¶¯T0
}
void TrafficLight()
{
static unsigned char color = 2;
static unsigned char timer = 0;
if(timer == 0)
{
switch(color)
{
case 0:
color = 1;
timer = 2;
LedBuff[6] = 0xE7;
break;
case 1:
color = 2;
timer = 19;
LedBuff[6] = 0xFC;
break;
case 2:
color = 0;
timer = 9;
LedBuff[6] = 0x3F;
break;
default:
break;
}
}
else
{
timer--;
}
LedBuff[0] = LedChar[timer%10];
LedBuff[1] = LedChar[timer/10];
}
void LedScan()
{
static unsigned char x = 0; //¶¯Ì¬É¨ÃèË÷Òý
ADDR3 = 1;
P0 = 0xFF; //¹Ø±ÕËùÓжÎѡ룬ÏÔʾÏûÒþ
P1 = (P1 & 0xF8) | x; //λѡË÷ÒýÖµ¸³Öµµ½P1¿ÚµÍ3λ
P0 = LedBuff[x]; //»º³åÇøÖÐË÷ÒýλÖõÄÊý¾ÝË͵½P0¿Ú
if (x < 6) //Ë÷ÒýµÝÔöÑ»·£¬±éÀúÕû¸ö»º³åÇø
x++;
else
x = 0;
}
void dianzhenscan()
{
static unsigned char i = 0; //¶¯Ì¬É¨ÃèË÷Òý
//ADDR3 = 0;
P0 = 0xFF; //¹Ø±ÕËùÓжÎѡ룬ÏÔʾÏûÒþ
P1 = (P1 & 0xF0) | i; //λѡË÷ÒýÖµ¸³Öµµ½P1¿ÚµÍ3λ
P0 = 0xFF;
P0 = image[index][i]; //»º³åÇøÖÐË÷ÒýλÖõÄÊý¾ÝË͵½P0¿Ú
if (i < 7) //Ë÷ÒýµÝÔöÑ»·£¬±éÀúÕû¸ö»º³åÇø
i++;
else
i = 0;
}
void InterruptTimer0() interrupt 1
{
static unsigned int tmr1s = 0; //1Ã붨ʱÆ÷
TH0 = T0RH; //ÖØÐ¼ÓÔØÖØÔØÖµ
TL0 = T0RL;
LedScan(); //LEDɨÃèÏÔʾ
dianzhenscan();
tmr1s++; //1Ã붨ʱµÄ´¦Àí
if (tmr1s >= 1000)
{
tmr1s = 0;
flag1s = 1; //ÉèÖÃÃ붨ʱ±êÖ¾
}
}
这是我的代码,同时显示LED,数码管和点阵,现在点阵LED亮度正常,但是数码管和LED小灯亮度很低,该怎么修改好啊
把电路图贴出来看看呢,是不是P1的低4位通过地址译码器后作为了数码管和LED的公共端?如果是这样,在切换到LED后,数码管的片选信号是否还保持?如果不能保持,可能导致数码管亮度过低。因为数码管显示完成后,就切换到了LED,然后就是等下一次中断,明显LED处于点亮的时间较长,亮度更高。
验证这个很简单,把中断里LedScan();和dianzhenscan();两个函数的调用交换一下位置试试就知道了。
看看限流电阻在哪里,可以考虑减小数码管的限流电阻或者加三极管增强驱动。
扫描频率是不是太低了