要求:

1、红灯和绿灯相互转换时经过黄灯,黄灯闪烁三次(6秒);

2、主干道方向通行30秒,辅干道方向通行20秒,单独左转信号15秒;先直行信号,后左转信号。

3、设手动、自动、特殊情况三种方式。

4、特殊情况时所有路口红灯都亮,给120、110等通行。

5、自动时显示各种状态倒计时。

获取该 程序+protues 的方式:

2、关注微信公众号下载:

     ① 关注微信公众号:Tech云  

     ②

课程设计题七:交通灯控制器_protues

3、可以关注点赞并在下方评论,我给你邮箱发过去。

                           -------由于明天开始旅游,这一块注释不全、程序也有点小bug,预计7月15日开始更新-------

一、Protues仿真图:

课程设计题七:交通灯控制器_protues_02

课程设计题七:交通灯控制器_动态数码管显示_03

课程设计题七:交通灯控制器_protues_04

课程设计题七:交通灯控制器_按键扫描调试代码_05

课程设计题七:交通灯控制器_微信公众号_06

二、程序源码:

因为注释非常的全,这里就不再进行讲解了。

/*******************************************************************************
================================================================================
【平 台】STC89C51_sumjess平台
【编 写】sumjess
【软件版本】V2.0
【最后更新】2019年06月10日
【相关信息参考下列地址】
【网 站】

http://www.51hei.com/bbs/mcu-2-1.html
---------------------------------------------------------------------------------
【dev.env.】MDK4.02及以上版本
【Target 】STC89C51
第一次修订:2019/05/09
第二次修订:2019/05/21
第三次修订:2019/06/10
【problem 】
(1)库内补充的不全面;
(2)库内解释部分不全面;
(3)库内还存在一定的bug;
【direction】
下一步的目标就是把库继续集成!
【explain 】
为了方便使用,我也自己写了很多的库,和优化了算法和表示方式!
【warning】
目前程序中暂无错误 !
---------------------------------------------------------------------------------
没有完美的代码,只有不断的奉献,大家一起努力;
赠人玫瑰手留余香,欢迎大家反馈bug!
================================================================================
********************************************************************************/

#include <reg51.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int

uchar h;
uint r=0;
uint s;
uchar flag=1;
uchar code dis[]={0Xc0,0Xf9,0Xa4,0Xb0,0X99,0X92,0X82,0Xf8,0X80,0X90,0Xff,};
// 0 1 2 3 4 5 6 7 8 9 -
sbit key = P3^5;

void delay(uint c) //延时程序
{
uint i,j;
for(i=0;i<c;i++)
for(j=0;j<100;j++);
}

void t0(void) interrupt 0 using 1
{
delay(2);
if(INT0==0)
{
r++;
if(r==2)
{
r=0;
}
r%=2;
if(r==0)
{
P0=0xeb;
P1=0x00;
P2=0xff;
}while(1)
{
if(INT0==0|INT1==0|T0==0)
{
delay(2);
if(INT0==0|INT1==0|T0==0)
break;
}
if(key==0) {flag=0;break;}
}
}
}

void t1(void) interrupt 2 using 1
{
delay(2);
if(INT1==0)
{
r++;
if(r==2)
{
r=0;
}
r%=2;
if(r==0)
{
P0=0xdd;
P1=0x00;
P2=0xff;
}while(1)
{
if(INT1==0|INT0==0|T0==0)
{
delay(2);
if(INT1==0|INT0==0|T0==0)
break;
}
if(key==0) {flag=0;break;}
}
}
}

void t2(void) interrupt 1 using 1
{
TH0=0xff;
TL0=0xff;
delay(2);
if(T0==0)
{
P0=0xdb;
P1=0x00;
P2=0xff;
}
while(1)
{
if(INT0==0|INT1==0)
{
delay(2);
if(INT0==0|INT1==0)
break;
}
if(key==0) {flag=0;break;}
}
}



void main(void)
{
TMOD=0x06;
TH0=0xff;
TL0=0xff;
TR0=1;
EA=1;
EX0=1;
EX1=1;
ET0=1;

while(1)
{
flag=1;
if(flag==1){
P0=0xeb;
for(h=28;h>0;h--)
{
for(s=248;s>0;s--)
{
if(flag==0) break;
P1=0x00;
P2=0xff;
P1=0x01;
P2=dis[h/10];
delay(1);
P1=0x00;
P2=0xff;
P1=0x02;
P2=dis[h%10];
delay(1);
P1=0x00;
P2=0xff;
P1=0x04;
P2=dis[(h+2)/10];
delay(1);
P1=0x00;
P2=0xff;
P1=0x08;
P2=dis[(h+2)%10];
delay(1);
}
}
if(flag==0) break;
delay(248);

P0=0xf3;
for(h=3;h>0;h--)
{
if(flag==0) break;
delay(392);
P0=0xf3;
delay(1);
P1=0x00;
P2=0xff;
P1=0xaa;
P2=dis[(h-1)%10];
delay(600);
P0=0xfb;
}
if(flag==0) break;
delay(248);

P0=0xdd;
for(h=38;h>0;h--)
{
if(flag==0) break;
for(s=248;s>0;s--)
{
if(flag==0) break;
P1=0x00;
P2=0xff;
P1=0x01;
P2=dis[(h+2)/10];
delay(1);
P1=0x00;
P2=0xff;
P1=0x02;
P2=dis[(h+2)%10];
delay(1);
P1=0x00;
P2=0xff;
P1=0x04;
P2=dis[h/10];
delay(1);
P1=0x00;
P2=0xff;
P1=0x08;
P2=dis[h%10];
delay(1);
}
}
if(flag==0) break;
delay(248);

P0=0xde;
for(h=3;h>0;h--)
{
if(flag==0) break;
delay(392);
P0=0xde;
delay(1);
P1=0x00;
P2=0xff;
P1=0xaa;
P2=dis[(h-1)%10];
delay(600);
P0=0xdf;
}
if(flag==0) break;
delay(248);
}
}
}