弄了几天没弄出来,就是黄灯闪烁的时候有点问题,一直不知道该怎么解决,希望大侠们帮帮忙,将感激不尽,重点关注case部分,附有电路图
#includeAT89X52.H
#defineucharunsignedchar
#defineuintunsignedint
ucharcodedis_7[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//共阳极LED数码管“0~9”
ucharcodescan_con[2]={0xfe,0xfd};
//位选择码
uchardatadis[2]={0x00,0x00};
//显示缓冲区
uchardatatimedata=5;
//分别为秒、分和小时的值
uchardatams10=0x00,ms50=0x00,con=0x00,i=0x00;
sbitkey0=P1^0;
sbitkey1=P1^1;
sbitkey2=P1^2;
sbitkey3=P1^3;
sbitRED_A=P2^2;
sbitYELLOW_A=P2^3;
sbitGREEN_A=P2^4;
sbitRED_B=P2^5;
sbitYELLOW_B=P2^6;
sbitGREEN_B=P2^7;
ucharFlash=0;
ucharType=1;
voidscan();
voiddelay1ms(uintx)
{
uchart;
while(x--)
{
for(t=120;t0;t--);
}
}
//按键处理函数
keyscan()
{
}
voidTraffic_lignt()
{
switch(Type)
{
case1:
RED_A=0;YELLOW_A=0;GREEN_A=1;
RED_B=1;YELLOW_B=0;GREEN_B=0;
scan();
if(timedata==3)
Type=2;
break;
case2:
ET1=1;
while(timedata)
{
scan();
while(ms10==0)
YELLOW_A=~YELLOW_A;
}
Type=3;
break;
case3:
RED_A=1;YELLOW_A=0;GREEN_A=0;
RED_B=0;YELLOW_B=0;GREEN_B=1;
scan();
if(timedata==3)
Type=4;
break;
case4:
ET1=1;
while(timedata)
{
scan();
while(!ms10)
YELLOW_B=~YELLOW_B;
}
Type=1;
break;
}
}
//数码管显示函数
voidscan()
{
dis[0]=timedata;dis[1]=timedata/10;
P0=~dis_7[dis[0]];//送个位段码,共阳
P2_0=0;P2_1=1;//显示个位
delay1ms(1);//延时
P2_0=1;P2_1=1;//关闭数码管
P0=~dis_7[dis[1]];//送十位段码,共阳
P2_0=1;P2_1=0;//显示十位
delay1ms(1);//延时
P2_0=1;P2_1=1;//关闭数码管
}
voidmain()//主函数
{
TH0=0x3c;TL0=0xb0;
TH1=0xd8;TL1=0xf0;
TMOD=0x11;ET0=1;TR0=1;EA=1;
while(1)
{
keyscan();
Traffic_lignt();
scan();
}
}
//定时器/计数器T0中断服务函数
voidtime_intt0(void)interrupt1
{
ET0=0;TR0=0;TH0=0x3c;TL0=0xb0;TR0=1;
ms50;
if(ms50==20)
{
ms50=0x00;timedata--;
if(timedata==-1)
{
timedata=5;
}
}
ET0=1;
}
voidtime_intt1(void)interrupt3
{
ET1=0;TR1=0;TH1=0xd8;TL1=0xf0;TR1=1;
ms10;
if(ms10==50)
{
ms10=0x00;
}
ET0=1;
} |