红绿灯十字路东西红灯亮60秒,黄灯亮1秒,灭1秒,共10秒,绿灯亮50秒,单片机程序

急求
2024-12-25 17:28:48
推荐回答(1个)
回答1:

  太简单,我的百度空间有类似的程序,改一下就行。你实在不会给我留言,我马上解决(下面程序就是你需要的)
  设计一个交通灯模拟系统,要求
  1南北方向和东西方向通行时间都是60秒
  2绿灯变红灯时有10秒的黄灯闪烁时间,黄灯亮1秒,灭1秒
  3设置两个LED,用于时间倒计时的显示

  #include
  #define uchar unsigned char
  #define uint unsigned int
  sbit red1=P1^0;//红灯1(所有灯0亮,1灭)
  sbit yellow1=P1^1;//黄灯1
  sbit green1=P1^2;//绿灯1
  sbit red2=P1^3;//红灯2
  sbit yellow2=P1^4;//黄灯2
  sbit green2=P1^5;//绿灯2
  bit change;//选择通行方向
  uchar timer0_tick;//timer0_tick计数
  uchar i=0,n=0,time=0,timer;
  code seven_seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//1,2,3, 4, 5, 6, 7, 8, 9
  code scan[4]={0xf7,0xfb,0xfd,0xfe};
  uchar counter[4]={0,0,0,0};
  static void timer0_isr(void) interrupt 1 using 0 //中断函数,200次每秒,晶振为12M
  {
  TR0=0;
  TL0=0x00;
  TH0=0xee;
  TR0=1;
  i++;
  if(i==4) i=0;
  P0=seven_seg[counter[i]];
  P2=scan[i];
  timer0_tick=timer0_tick+1;
  if(timer0_tick==200)
  {
  timer0_tick=0;
  time=time+1;
  timer=timer-1;
  if(timer==0)
  {
  change=~change;
  timer=60;//重复计时
  }
  if(time==60)
  {
  time=0;//重复计时
  }
  }
  if(change==0)
  {
  if(time<=50)//南北
  {
  green1=0;//南北向绿灯亮50秒
  yellow1=1;
  red1=1;
  green2=1;
  yellow2=1;
  red2=0;//东西红灯亮50 }
  if(50  {
  n=n+1;
  if(n==200)
  {
  n=0;
  yellow1=~yellow1;//南北向黄灯闪烁10秒
  }

  green1=1;
  red1=1;
  yellow2=1;
  green2=1;
  red2=0;//东西红灯继续亮
  }
  }
  if(change==1)
  {
  if(time<=50)//东西
  {
  red1=0;//南北向红灯亮50秒
  yellow1=1;
  green1=1;
  red2=1;
  yellow2=1;
  green2=0;//东西绿灯灯亮50 }
  if(50  {
  red1=0;//南北向红灯继续亮10秒
  yellow1=1;
  green1=1;
  red2=1;
  n=n+1;
  if(n==200)
  {
  n=0;
  yellow2=~yellow2;//东西向黄灯闪烁10秒黄灯亮1秒,灭1秒
  }
  green2=1;
  }
  }
  counter[1]=timer/10;//倒计时1的十位
  counter[0]=timer%10;//倒计时1的个位
  counter[3]=timer/10;//倒计时2的十位
  counter[2]=timer%10;//倒计时2的个位
  }
  static void timer0_initialize(void)//中断初始化
  {
  EA=0;
  timer0_tick=0;
  TR0=0;
  TMOD=0x01;
  TL0=0x00;
  TH0=0xee;
  PT0=0;
  ET0=1;
  TR0=1;
  EA=1;
  }
  void main(void)
  {
  timer=60;
  timer0_initialize();
  while(1);
  }