基于51单片机的模拟交通灯控制系统

举报
二哈侠 发表于 2024/05/17 21:44:06 2024/05/17
【摘要】 一、设计要求 (1)利用51单片机设计一个交通灯控制系统,来实现行人与车流的分流的目的。该系统主要应用在十字路口,纵向为主干道,横向为支干道; (2)主、支干道交替通行,两个干道上的交通灯工作方式同时进行,主干道每次绿灯放行15秒,支干道每次放行10秒,放行时间可通过按键更改; (3)每次绿灯变红之前,黄灯先闪烁3秒,此时,另一干道上仍保持红灯; (4)通过按键实现对十字路口交通管制功能;

一、设计要求

(1)利用51单片机设计一个交通灯控制系统,来实现行人与车流的分流的目的。该系统主要应用在十字路口,纵向为主干道,横向为支干道;

(2)主、支干道交替通行,两个干道上的交通灯工作方式同时进行,主干道每次绿灯放行15秒,支干道每次放行10秒,放行时间可通过按键更改;

(3)每次绿灯变红之前,黄灯先闪烁3秒,此时,另一干道上仍保持红灯;

(4)通过按键实现对十字路口交通管制功能;

(5)给出整个系统的结构图、软硬件流程图;

二、系统概述

东西主干道和南北支干道各由一组三色交通灯来控制,分别是主干道方向的红、黄、绿以及支干道方向的红、黄、绿。

逻辑分析可知,当主干道为绿灯通行时,支干道必须为红灯禁行;绿灯结束后,主干道进入黄灯闪烁等待状态,支干道红灯;黄灯结束后,主干道变为红灯禁行,支干道变为绿灯通行;支干道绿灯结束后,支干道进入黄灯闪烁等待状态,主干道红灯,如此循环。

从这个过程中可以看出,交通灯控制共分4个状态,分别为:S1状态,主干道方向为绿灯,支干道方向为红灯;S2状态,主干道方向为黄灯闪烁,支干道红灯;S3状态,主干道方向为红灯,支干道方向为绿灯;S4状态,支干道方向为黄灯闪烁,主干道红灯。这四个状态不断循环。由此我们可以列出4个状态的列表和做出4个状态的流程图。

系统设置有4个按键,分别为设置键,加键,减键和交通管制键。设置键是对设置的启动和确认,加键和减键是对通行时间做调整,交通管制键是对红绿灯系统进行强制设置。

当系统上电或手动复位之后,默认模式下会按照断电前程序里记录的参数运行。若此时设置键按下,则进入通行时间设置状态,数码管上显示原本记录的时间并闪烁,可通过加键或减键键对东西、南北干道等待时间进行修改,修改完成后,按下设置键将新参数保存。

交通管制键,用于对十字路口进行交通管制。有五种模式:东西、南北干道红灯;东西红灯,南北绿灯;东西绿灯,南北红灯;东西绿灯,南北绿灯;东西黄灯,南北黄灯。

Proteus仿真电路

原理图

洞洞板实物

仿真结果分析

在交通灯实物中,是竖着操作,纵向为南北;在仿真电路图中,从正视看纵向为东西,从左边斜着看和实物是一样的。因此,实物和仿真是一一对应的!

加载“基于毕业51单片机的交通灯设计.hex”文件到单片机,点击运行,交通灯开始工作(二极管显示红、黄、绿三色灯,LED显示倒计时)。

在程序里我们设置,东西主干道绿灯通行时间为15S,南北支干道通行时间为10S。系统自动进入状态S1:东西主干道绿灯亮,南北支干道红灯亮。

可以看出,东西主干道绿灯通行时间为15S,南北支干道红灯等待时间为15S。东西、南北干道LED倒计时12S后,系统进入S2状态:东西主干道黄灯闪烁3S,南北支干道红灯。

3S后,系统进入S3状态:东西主干道红灯,南北绿干道绿灯,通行时间为10S。仿真结果如下所示。

7S后,系统进入S4状态:南北干道黄灯闪烁3S,东西干道仍为红灯。然后进入S1状态,不断循环。

按下“设置”键后,系统进入设置模式,通过“加”键和“减”键设置东西干道绿灯通行时间。再次按下“设置”键,可以设置南北干道通行时间。通行时间设置完成后,再次按下“设置”键,系统回到运行状态。

从上图看出,东西主干道通行时间由原来的15S设置为16S。可以通过“交通管制”键,对交通灯系统进行管制。

参考设计

为给大家提供更多参考,现附赠另一套交通灯设计(包含仿真和程序),运行效果如下图所示。

C代码

u8 Key_Scan()

{

static u8 key_up=1;//按键按松开标志

if(key_up&&(Key1==0||Key2==0||Key3==0||Key4==0))

{

delay_1ms(10);//去抖动

key_up=0;

if(Key1==0) return 1;

else if(Key2==0)return 2;

else if(Key3==0)return 3;

else if(Key4==0)return 4;

}

else if(Key1==1&&Key2==1&&Key3==1&&Key4==1)

key_up=1;

return 0;// 无按键按下

}



uchar flag_s;

uchar menu_1;//纵横加减标示



/********************设置函数*****************/

void key_with()

{

if(key_can == 4) //交通管制按键

{

flag_jdgz ++;

if(flag_jdgz > 5)

flag_jdgz = 0;

if(flag_jdgz == 1) // 全部亮红灯

{

dx_red = 0; //亮

nb_red = 0; //亮

dx_green = 1; //灭

dx_yellow = 1; //灭

nb_green = 1; //灭

nb_yellow = 1; //灭

}

if(flag_jdgz == 2) // 东西绿灯 南北红灯

{

dx_red = 0; //亮

nb_green = 0; //亮

dx_green = 1; //灭

dx_yellow = 1; //灭

nb_red = 1; //灭

nb_yellow = 1; //灭

}

if(flag_jdgz == 3) // 南北绿灯 东西红灯

{

dx_green = 0; //亮

nb_red = 0; //亮

dx_red = 1; //灭

dx_yellow = 1; //灭

nb_green = 1; //灭

nb_yellow = 1; //灭

}

if(flag_jdgz == 4) // 南北绿灯 东西绿灯

{ //

dx_green = 0; //亮

nb_green = 0; //亮

dx_red = 1; //灭

dx_yellow = 1; //灭

nb_red = 1; //灭

nb_yellow = 1; //灭

}

if(flag_jdgz == 5) // 南北黄灯 东西黄灯

{

dx_red = 1; //灭

dx_green = 1; //灭

nb_red = 1; //灭

nb_green = 1; //灭

nb_yellow = 0; //亮

dx_yellow = 0; //亮

}

}

if(key_can == 1) //设置键

{

menu_1 ++;

if(menu_1 >= 3)

{

menu_1 = 0;

}

}


if(menu_1 == 1) //设置东西的时间

{

if(key_can == 2)

{

dx_time ++ ; //加1

if(dx_time > 99)//时间最大值为99s

dx_time = 99;

}

if(key_can == 3)

{

dx_time -- ; //减1

if(dx_time <= 5)//时间最小值为5s

dx_time = 5;

}

dis_smg[0] = DisplayOther[2] ; //显示为B

dis_smg[1] = DisplayOther[2] ; //显示为B

dis_smg[2] = smg_du[(dx_time-1) % 10] ; //显示东西设置的时候

dis_smg[3] = smg_du[(dx_time-1) / 10] ;

}


if(menu_1 == 2) //设置南北的时间

{

if(key_can == 2)

{

nb_time ++ ; //加1

if(nb_time > 99) //时间最大值为99s

nb_time = 99;

}

if(key_can == 3)

{

nb_time -- ; //减1

if(nb_time <= 5)//时间最小值为5s

nb_time = 5;

}

dis_smg[0] = smg_du[(nb_time-1) % 10] ; //显示为A

dis_smg[1] = smg_du[(nb_time-1) / 10] ; //显示为A

dis_smg[2] = DisplayOther[2] ; //显示东西设置的时候

dis_smg[3] = DisplayOther[2] ;

}


}


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。