谁能帮我把这个单片机程序纠正一下,是关于交通灯的?(仔细看,程序其实并不复杂)

[复制链接]
查看11 | 回复0 | 2011-4-29 12:01:36 | 显示全部楼层 |阅读模式
弄了几天没弄出来,就是黄灯闪烁的时候有点问题,一直不知道该怎么解决,希望大侠们帮帮忙,将感激不尽,重点关注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;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行