用LED8和7模拟绿灯,1和2模拟红灯,4和5模拟黄灯
#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[7] = {
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
bit flag1s = 1;
unsigned char T0RH = 0;
unsigned char T0RL = 0;
void configTimer0(unsigned int ms);
void trafficLight();
void main()
{
EA = 1; //¿ª×ÜÖжÏ
ENLED = 0; //ʹÄÜÊýÂë¹ÜºÍLED
ADDR3 = 1;
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 + 13; //²¹³¥ÖжÏÏìÓ¦ÑÓʱÔì³ÉµÄÎó²î
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 = 0; //ÑÕÉ«Ë÷Òý£º0-ÂÌÉ«/1-»ÆÉ«/2-ºìÉ«
static unsigned char timer = 0; //µ¹¼ÆÊ±¶¨Ê±Æ÷
if (timer == 0) //µ¹¼ÆÊ±µ½0ʱ£¬Çл»½»Í¨µÆ
{
switch (color) //LED8/9´ú±íÂ̵ƣ¬LED5/6´ú±í»ÆµÆ£¬LED2/3´ú±íºìµÆ
{
case 0: //Çл»µ½»ÆÉ«£¬ÁÁ3Ãë
color = 1;
timer = 2;
ledBuff[6] = 0xE7;
break;
case 1: //Çл»µ½ºìÉ«£¬ÁÁ30Ãë
color = 2;
timer = 29;
ledBuff[6] = 0xFC;
break;
case 2: //Çл»µ½ÂÌÉ«£¬ÁÁ40Ãë
color = 0;
timer = 39;
ledBuff[6] = 0x3F;
break;
default:
break;
}
}
else //µ¹¼ÆÊ±Î´µ½0ʱ£¬µÝ¼õÆä¼ÆÊýÖµ
{
timer--;
}
ledBuff[0] = ledChar[timer%10]; //µ¹¼ÆÊ±ÊýÖµ¸öλÏÔʾ
ledBuff[1] = ledChar[timer/10]; //µ¹¼ÆÊ±ÊýֵʮλÏÔʾ
}
void ledScan()
{
static unsigned char i=0;
P0=0xFF;
P1=(P1&0xF8)|i;
P0=ledBuff[i];
if(i<6)i++;
else i=0;
}
void InterruptTimer0() interrupt 1
{
static unsigned int tmr1s=0;
TH0=T0RH;
TL0=T0RL;
ledScan();
tmr1s++;
if(tmr1s>=1000)
{
tmr1s=0;
flag1s=1;
}
}