单片机交通灯c语言

各位兄弟姐妹帮我编一个C语言程序,急用。
设计要求:从LED中选择三个表示红黄绿等并实现红绿灯交替点亮(红绿灯各30s,黄灯5s)、用两位数码管显示点亮的时间、在绿灯要灭前5秒钟变成黄灯闪烁。
是那种#include<reg52.h>这种。跪求跪求
邮箱[email protected]

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

sbit RED_A=P3^0; //东西向指示灯

sbit YELLOW_A=P3^1;

sbit GREEN_A=P3^2;

sbit RED_B=P3^3; //南北向指示灯

sbit YELLOW_B=P3^4;

sbit GREEN_B=P3^5;

sbit KEY1=P1^0;

sbit KEY2=P1^1;

sbit KEY3=P1^2;

//延时倍数,闪烁次数,操作类型变量

uchar Flash_Count=0,Operation_Type=1,LEDsng,LEDsns,LEDewg,LEDews,discnt;

uint Time_Count=0,time;

uchar ledtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};

void displaysn()

{

 LEDsng=((time-Time_Count)/20)%10;

 LEDsns=((time-Time_Count)/20)/10;

 LEDewg=0x10;

 LEDews=0x10;

}

void displayew()

{

 LEDewg=((time-Time_Count)/20)%10;

 LEDews=((time-Time_Count)/20)/10;

 LEDsng=0x10;

 LEDsns=0x10;

}

//定时器0 ä¸­æ–­å‡½æ•°

void T0_INT() interrupt 1

{

 TH0=(65536-50000)/256;

 TL0=(65536-50000)%256;

 switch(Operation_Type)

 {

 case 1: //东西向绿灯与南北向红灯亮

  if((Time_Count%20)==0)displayew();

  RED_A=0;YELLOW_A=0;GREEN_A=1;

  RED_B=1;YELLOW_B=0;GREEN_B=0;

  if(++Time_Count!=time) return;

  Time_Count=0;

  Operation_Type=2;

  break;

 case 2: //东西向黄灯开始闪烁,绿灯关闭

 LEDewg=0x0;

 LEDews=0x0;

  if(++Time_Count!=8) return;

  Time_Count=0;

  YELLOW_A=~YELLOW_A;GREEN_A=0;

  if(++Flash_Count!=10) return; //闪烁

  Flash_Count=0;

  Operation_Type=3;

  break;

 case 3: //东西向红灯与南北向绿灯亮

  if((Time_Count%20)==0)displaysn();

  RED_A=1;YELLOW_A=0;GREEN_A=0;

  RED_B=0;YELLOW_B=0;GREEN_B=1;

  if(++Time_Count!=time) return;

  Time_Count=0;

  Operation_Type=4;

  break;

 case 4: //南北向黄灯开始闪烁,绿灯关闭

 LEDsng=0x0;

 LEDsns=0x0;

  if(++Time_Count!=8) return;

  Time_Count=0;

  YELLOW_B=~YELLOW_B;GREEN_A=0;

  if(++Flash_Count!=10) return; //闪烁

  Flash_Count=0;

  Operation_Type=1;

  break;

 }

}

void t1_isr() interrupt 3

{

 TR1=0;

 TH1=(65536-3000)/256;

 TL1=(65536-3000)%256;

 TR1=1;

 switch(discnt)

 {

 case 0:

  P2=0x02;

  P0=ledtab[LEDewg];

  break;

 case 1:

  P2=0x01;

  P0=ledtab[LEDews];

  break;

 case 2:

  P2=0x08;

  P0=ledtab[LEDsng];

  break;

 case 3:

  P2=0x04;

  P0=ledtab[LEDsns];

  break;

 default:discnt=0;break;

 }

 discnt++;

 discnt&=0x03;

}

void delay()

{

 uint i;

 for(i=0;i<1000;i++);

}

//主程序

void main()

{

 TMOD=0x11; //T0 æ–¹å¼1

 EA=1;

 ET0=1;

 TR0=1;

 TH1=(65536-3000)/256;

 TL1=(65536-3000)%256;

 TR1=1;

 ET1=1;

 time=600;

 Time_Count=600;

 Time_Count=0;

 Operation_Type=1;

 while(1)

 {

  if(KEY1==0)    //按一下加1S

  {

   delay();

   if(KEY1==0)

   {

   while(KEY1==0);

   TR0=0;

   time+=20;

   LEDsng=(time/20)%10;

   LEDsns=(time/20)/10;

   LEDewg=0x10;

   LEDews=0x10;

   }

  }

  if(KEY2==0)    //按一下减1S

  {

   delay();

   if(KEY2==0)

   {

   while(KEY2==0);

   TR0=0;

   time-=20;

   if(time==0)time=20;

   LEDewg=(time/20)%10;

   LEDews=(time/20)/10;

   LEDsng=0x10;

   LEDsns=0x10;

   }

  }

  if(KEY3==0)   //启动

  {

   delay();

   if(KEY3==0)

   {

   while(KEY2==0);

   TR0=1;

   Time_Count=0;

   }

  }

 }

}

追问

怎么分东西,南北的?

追答

随便你怎么安排都可以呀,按图当然是上下南北、左右东西,这是国家标准嘛。

追问

我这个要做实验,就是做出我题目那个效果就可以了,不用什么东西南北

追答

我给你的这个就可以,嫌多,可以去掉一半,东西去一个,南北去一个,我将这个发你邮箱吧,proteus+程序。

追问

可以帮我去掉吗?我自己不懂。不用东西南北走向。就只要3个灯就可以了

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-10-25
留个邮箱什么的啊 这个网上也很多资料的
第2个回答  2012-10-25
邮箱呢 直接发给你 带仿真电路追问

[email protected]

相似回答