基于51单片机的十字路口交通灯系统

1 设计名称

基于51单片机的十字路口交通灯系统(C语言、Proteus开发环境)

2 设计要求

1、 基于51系列单片机设计一个十字路口交通灯控制系统,用于模拟道路十字路口交通灯实际运行的场景。

2、 东西向、南北向依次进行周期通行,默认设置为:东西向直行(绿灯)时间30秒,左转(蓝灯)时间15秒;南北向直行(绿灯)时间20秒,左转(蓝灯)时间10秒。

3、 每次直行(绿灯)变左转(蓝灯)和左转(蓝灯)变停车(红灯)前,黄灯需先闪烁3秒,此3秒时长包含在上述直行和左转时间内。

4、 可通过控制台按键实现对十字路口进行交通管制的功能。

5、 可通过控制台按键实现对十字路口各方向的通行时间进行设置的功能。

3 功能说明

整个十字路口由东西向道路和南北向道路垂直交叉形成,我们采用“上北下南,左西右东”的惯例进行构图。每个方向都有一组4色的LED灯来控制交通的流向和节奏。流向也即方向,通过不同LED灯颜色进行表征:红灯停,绿灯行,黄灯等一等,这里左转我们用蓝灯表示;节奏通过倒计时时间进行控制,该时间的时基由单片机的定时器提供。

十字路口的倒计时时间分别通过四个2位的七段共阴极数码管显示。绿灯点亮道路上的数码管显示的数字是该道路所剩余的可通行时间,红灯点亮道路上的数码管显示的数字是该道路所剩余的禁行时间,小伙伴需要注意区分两者不同的物理含义。

系统上电后,默认运行在“正常模式”下。此时南北向绿灯点亮,允许直行;东西向红灯点亮,禁止直行和左转。具体的状态迁移顺序可参照下面第 6 部分内容。

4 系统架构

整个架构非常简单,主要由四部分组成。分别是MCU单片机控制模块、按键输入扫描模块、数码管显示模块和交通灯显示模块。按键、数码管和LED灯都是典型的人机交互的元器件,按键用于接收命令,数码管和LED灯用于反馈信 和状态。数据流向也是单向的,由左至右。

 

我们现在将十字路口交通灯的运行场景抽象归纳一下,然后用下面的图表进行复盘。

5 运行模式

对照日常生活,我们来盘点一下交通灯运行的模式:

“正常模式”:模拟十字路口正常运行的场景,交通灯按正常的顺序进行周期循环;

“夜间模式”:模拟十字路口夜间运行的场景,东西向和南北向的黄灯同时闪烁;

“紧急模式”:模拟十字路口进入紧急情况下的场景(救护车、消防车通过等),东西向和南北向的红灯全部点亮;

“强制东西向通行模式”:强制东西向通行,南北向停车等待。

“强制南北向通行模式”:强制南北向通行,东西向停车等待。

6 ”正常模式“下状态迁移之状态机

不同国家、不同城市、不同十字路口都有不同的状态设置。有的路口是先直行再左转,有的路口是先允许左转再允许直行,有的路口压根就没有专门的左转灯,有的路口有人行道指示灯,而有的没有。所谓千人千面,五官各不相同,但确有一个共性,就是都有五官。状态机的思路可以很好的解决这个问题。

 

7 ”正常模式“下状态迁移之矩阵表

 

1 – 表征对应颜色交通灯点亮;0 – 表征对应颜色交通灯熄灭;

1/0 – 表征对应颜色交通灯闪烁;蓝色灯 – 表征对应道路左转状态;

8 仿真电路图

因为案例更侧重功能的实现,对于硬件电路的设计要求不是太高,达到能用就行的标准就行,所以这里只简要说一下重点吧。

1 单片机P0一定要加上拉电阻。为什么为P0口内部为开集电极输出,无法输出高电平,只有加了上拉电阻,P0口才能输出高电平。

2 数码管的驱动一定要加限流电阻。虽然在Proteus中仿真不加问题也不大,但是实际产品肯定是不允许的,而且也无法工作。

3 LED灯驱动一定要加限流电阻。如果不加限流电阻,单片机会工作异常,因为单片机引脚的驱动电流的能力是有限制的,超出则正常功能无法保证,甚至烧坏单片机。

4 LED灯不建议直接并联使用。虽然LED灯具有正向单调的伏安特性曲线,但是它的温度系数却是负向的,不利于均流。

5 按键模块采用的是普通的点对点的结构,但设计中也可采用矩阵式按键,小伙伴可以自行发挥。

6 当前的设计,单片机引脚基本被全部分配用完,没有冗余。对于实物产品的开发这是不被允许的,因为过于捉襟见肘的单片机资源完全不利于产品后期的功能升级和延展。如果单片机引脚紧张,除可以采用矩阵式键盘节省引脚外,也可以采用数字锁存器或者译码器对引脚进行扩展使用。

图4 Proteus环境仿真图

模块放大后的视图:

 

图5 Proteus环境十字路口放大视图

 

图6 Proteus环境单片机模块放大视图

 

图7 Proteus环境控制台按键模块放大视图

9 器件清单

 

图8 交通灯仿真图元器件清单

其他未尽事宜,诸如导线啊,芯片底座啊,电源插座啊,电源啊等等,都是基本功,这里暂就不表了。

10 C 语言核心源代码

软件架构采用的是时间触发机制+状态机的设计模式,这种模式的好处是MCU执行效率高,实时性好,另外一点很重要的就是灵活性,代码容易扩展。时间片调度周期为20ms,用于按键的扫描识别和LED数码管的动态刷新。交通灯运转的状态机是通过switch来完成的。大侠看到 络上很多的案例代码用到了外部中断来实现按键扫描,这是完全没必要的,主函数轮询扫描的方式完全就够用了,51单片机的外部中断资源毕竟有限且珍贵,何以要用中断呢道江郎才尽了外,设计中按键扫描模块实现了去抖的功能。

因版面受限,这里只能贴出核心状态机的源代码供各位看管参考学习了。其他功能相对简单,大家可以适当脑补,或者也可划至文章最后寻找解决方案。

10.1 变量定义

10.2 交通灯控制函数

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年9月15日
下一篇 2020年9月15日

相关推荐