加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入

基于51单片机的交通信号灯系统设计

09/23 10:07
1178
服务支持:
技术交流群

完成交易后在“购买成功”页面扫码入群,即可与技术大咖们分享疑惑和经验、收获成长和认同、领取优惠和红包等。

虚拟商品不可退

当前内容为数字版权作品,购买后不支持退换且无法转移使用。

加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论
放大
实物图
相关方案
  • 方案介绍
  • 相关文件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

功能:

十字路口交通灯控制程序: 正常时,EW方向计时60s,SN方向计时40s 若按时间加按键(Add_Button)按钮,EW、SN方向各加5s,不可大于99s,79s 若按时间减按键(Reduces_Button)按键,EW、SN方向各减5s,不可小于40s,20s 若按EW方向强制通行(QZ_EW_Btton)按钮,EW方向强制通行,SN方向禁止通行 若按SN方向强制通行(QZ_SN_Btton)按钮,SN方向强制通行,EW方向禁止通行。

仿真原理图

/ #define TRAFFIC_GLOBAL 1

#include "TRAFFIC.H"

/********************************************************************************************

* 函数名称:延时子程序

* 功    能:延时,给LED显示的延时时间

* 入口参数:时间参数

* 出口参数:无

*********************************************************************************************/

void Delay(uchar     a)

{

uchar       i;

i=a;

while(i--){;}

}

/********************************************************************************************

* 函数名称:显示子函数

* 功    能:EW方向,SN方向主干道数码管显示驱动

* 入口参数:无

* 出口参数:无

*********************************************************************************************/

void Display(void)

{

char h,l;

h=Time_EW/10;              //EW方向计时的十位数

l=Time_EW%10;              //EW方向计时的个位数

P0=table[l];              //显示EW计时时间的低位

EW_LED2=1;

Delay(2);

EW_LED2=0;

P0=table[h];            //显示EW计时时间的高位

EW_LED1=1;

Delay(2);

EW_LED1=0;

h=Time_SN/10;                //SN方向计时的十位数

l=Time_SN%10;               //SN方向计时的个位数

P0=table[l];              //显示SN计时时间的低位

SN_LED2=1;

Delay(2);

SN_LED2=0;

P0=table[h];            //显示SN计时时间的高位

SN_LED1=1;

Delay(2);

SN_LED1=0;

h= EW1/10;                      //直行时间的十位

l= EW1%10;                      //直行时间的个位

P0=table[l];              //时间的个位显示

Time_Show_LED1=1;

Delay(2);

Time_Show_LED1=0;

P0=table[h];             //时间的十位显示

Time_Show_LED2=1;

Delay(2);

Time_Show_LED2=0;

}

/********************************************************************************************

* 函数名称:外部0中断服务程序

* 功    能:中断,检测按钮的类别,执行相应的操作;

若Add_Button==0,通行时间加5s ;

若Reduces_Button==0,通行时间减5s ;

若Busy_Btton==0,开繁忙信号灯,关特殊信号灯,通行时间45s,30s;

若Add_Button==0,关繁忙信号灯,开特殊信号灯,通行时间75s,55s;

* 入口参数:无

* 出口参数:无

*********************************************************************************************/

void EXINT0(void) interrupt 0 using 0

{

EA = 0;                    //关中断

if(Add_Button==0)                  //时间加

{

EW1+=5;                                      //通行时间加5s

SN1+=5;

if(EW1>=100)                 //通行时间不得大于100s,80s

{

EW1=99;

SN1=79;

}

}

if(Reduces_Button==0)             //时间减

{

EW1-=5;                         //通行时间减5s

SN1-=5;

if(EW1<=40)                  //通行时间不得小于40s,20s

{

EW1=40;

SN1=20;

}

}

EA = 1;                  //开中断

}

/******************************************************************************

* 函数名称:外部中断1

* 功    能:中断,当遇到紧急情况,需要人工控制时,强制直行的函数处理

若QZ_EW_Btton按下时,EW方向绿灯亮,SN方向红灯亮 ,并点亮QZ_EW_LED指示灯

若QZ_SN_Btton按下时,EW方向红灯亮,SN方向绿灯亮 ,并点亮QZ_SN_LED指示灯

* 入口参数:无

* 出口参数:无

********************************************************************************/

void EXINT1(void) interrupt 2 using 2

{

EA = 0;

if(QZ_EW_Btton==0)              //EW方向强制通行按键是否按下

{

QZ_EW = ~QZ_EW;        //

QZ_SN = 0;

if(QZ_EW)

{QZ_EW_LED = 1;

QZ_SN_LED = 0;}

else           QZ_EW_LED = 0;

}

if(QZ_SN_Btton==0)             //测试按键是否按下,按下为特殊状态

{

QZ_SN = ~QZ_SN;

QZ_EW = 0;

if(QZ_SN)

{QZ_SN_LED = 1;

QZ_EW_LED = 0;}

else

QZ_SN_LED = 0;

}

EA = 1;

}

/******************************************************************************

* 函数名称:main()

* 功    能:主函数

* 入口参数:无

* 出口参数:无

********************************************************************************/

void main(void)

{

QZ_EW_LED = 0;

QZ_SN_LED = 0;

QZ_EW = 0;

QZ_SN = 0;

IT0=1;                          //INT0负跳变触发

IT1=1;                  //INT0负跳变触发

TMOD=0x01;                  //定时器工作于方式1

TH0=(65536-50000)/256;      //定时器赋初值

TL0=(65536-50000)%256;

EA=1;                       //CPU开中断总允许

ET0=1;                      //开定时中断

EX0=1;                      //开外部INTO中断

EX1=1;                      //开外部INT1中断

TR0=1;                      //启动定时

while(1)

{                                  /*******SN通行,EW红灯*** ***************/

Flag_EW_Yellow=0;             //EW关黄灯显示信号

Time_EW=EW;

Time_SN=SN;

while(Time_SN>=5&QZ_EW == 0&QZ_SN == 0)

{P1=LIGHT[0];                       //SN通行,EW红灯

Display();}

/*******SN黄灯亮,等待左拐信号,EW红灯***/

P1=0x00;

while(Time_SN>=0&QZ_EW == 0&QZ_SN == 0)

{Flag_SN_Yellow=1;           //SN开黄灯信号位

EW_Red=1;                     //SN黄灯亮,等待左拐信号,EW红灯

Display();

}

/*******SN左拐绿灯亮,EW红灯*************/

Flag_SN_Yellow=0;             //SN关黄灯显示信号

Time_SN=SNL;

while(Time_SN>=5&QZ_EW == 0&QZ_SN == 0)

{P1=LIGHT[2];                 //SN左拐绿灯亮,EW红灯

Display();}

/*******SN黄灯亮,等待停止信号,EW红灯******/

P1=0x00;

while(Time_SN>=0&QZ_EW == 0&QZ_SN == 0)

{Flag_SN_Yellow=1;           //SN开黄灯信号位

EW_Red=1;                     //SN黄灯亮,等待停止信号,EW红灯

Display();}

/****EW黄灯亮,等待停止信号,SN红灯***/

P1=0X00;

while(Time_EW>=0&QZ_EW == 0&QZ_SN == 0)

{Flag_EW_Yellow=1;               //EW开黄灯信号位

SN_Red=1;                       //EW黄灯亮,等待停止信号,SN红灯

Display();}

/*********EW方向强制通行**************/

while(QZ_EW)

{Time_EW = 88;

Time_SN = 88;

EW1 = 88;

Display();

P1=LIGHT[4];                         //EW通行,SN红灯

EW1 = 60;

SN1 = 40;}

/*********SN方向强制通行**************/

while(QZ_SN)

{Time_EW = 88;

Time_SN = 88;

EW1 = 88;

 

  • 有需要资料的可了解一下.docx

相关推荐

电子产业图谱