电子设计系统作品
基于AT89C51单片机的交通灯控制系统设计与模拟
[摘要]:
本系统以AT89C51为控制核心,由矩阵键盘输入,LED倒计时、交通灯显示等模块组成,模拟了一个交通灯控制系统。系统除基本交通灯功能外,还具有通行时间手动设置、可倒计时显示、急车强行通过、状态切换等相关功能。
1作品功能

状态1 状态2

状态3 状态4
系统功能图
本系统以AT89C51为控制核心,正常状态下实现四种状态的依次切换,状态1南北直行,通行时间20S,状态2南北向左右通行,东西向右通行,通行时间30S.状态3东西直行,通行时间20S,状态4东西向左右通行,南北向右通行,通行时间30S。
通过按键可以实现倒计时时间的停止和启动,并对时间进行修改。设置两个特殊按键可以切换到状态1和状态3,目的是为了在东西或者南北车流量比较少的情况下优先放行车流量多的方向。切换不进行直接切换,有一个闪烁切换按键,如果这个按键按下,黄灯闪烁显示5秒,然后接受按键输入切换到状态1或者状态3,后面状态的变化依次进行,状态4完毕后转回执行状态1.如果没有按键按下,那么黄灯倒计时到0,系统自动切换到下一状态。另外设置一个急车强行通过键,按键按下之后,系统对当前的状态和倒计时时间进行保留,四个方向显示红灯,倒计时时间20S。状态执行完之后,对原通行状态和时间返回接着执行。
2硬件设计

系统框图
2.1显示模块

数码管显示模块
单片机I/O口通过反相器和数码管的数据口和选通口直接相连,由于人的视觉暂留效应,通过定时器进行动态扫描,使数码管显示数字。
2.2输入模块

矩阵键盘输入模块
对按键的扫描尽可能不放在主循环里一直检测,放在定时器里面,经过一定的时间扫描一次或者把四个输入口线接一个四输入与门接入外部中断,有按键按下才开始进行键值的扫描。
2.3交通灯模块
交通灯显示模块
交通灯通过反相器接到单片机I/O口,单片机输出高电平灯亮,反相器具有防止过大的电流倒灌进单片机的作用。
2.4电源模块

电源模块
通过7805芯片的降压作用,将12V电压转化为5V输入到单片机供电。
3软件设计

程序流程图
在没有按键按下的情况下,系统将按正常状态进行循环显示,从状态1到状态4,再回到状态1.按键0~9为时间设定键,键值为10的键暂停定时器的计时,11对定时器进行启动。按键12切换到急车强制通行状态,按键13切换到状态1,即南北向行驶状态,按键14切换到状态3,即东西向行驶状态。最后一个按键为提示切换键,按下这个键可以接受转换到状态1和3,如果没有按下这两个键,那么在5S后自动切换到下一状态。

按键功能图
特色功能:
- 直接用键盘输入想要的时间,方便快捷。
- 对常规状态进行改变的时候设定一个切换键,切换键按下,黄灯闪5秒,这时可以接受状态1或3的输入,切换到南北通行状态或东西通行状态。
- 切换键按下没有按转换到状态1和3的按键,那么倒计时到0以后自动转换到下一状态。
- 设置东西南北全是红灯的急车强制通行状态,时间20S,状态执行完毕对原状态和原剩余时间进行返回执行。
单片机源程序:
代码:
- /****************************************************
- *项目名称:基于AT89C52的交通灯
- *程序作者:宋*杰
- *程序版本:V1.0
- *程序功能:模拟交通灯的循环变化,按键实现特殊状态的
- 调用,0~9的数字键用于输入通行时间
- ****************************************************/
- #include<reg52.h> //52寄存器库
- #include"KeyBoard.h" //自定义键盘输入的库
- #include"KeyControl.h" //按键处理头文件
- #include"Global.h" //全局变量定义头文件
- #include"7SEG.h" //数码管显示的头文件
- #include"Lights.h" //红绿灯状态变化
- uchar Status = 0;
- uchar Status_Val = 0;
- uchar Second_Val = 0;
- bit Switch_Flag = 0;
- /****************************************************
- *函数名称:main
- *入口参数:无
- *出口参数:无
- *函数功能:扫描按键,对相应的键值和状态执行显示
- ****************************************************/
- void main( void )
- {
- Timer0_Init( );
- LED_Init( );
- while( 1 )
- {
- ScanKey( );
- ReadKey( );
- if ( 0 < KeyNum && KeyNum< 11 )
- {
- R_KeyNum( ); //读入键值
- }
- else if ( KeyNum == 11 )
- {
- Halt( ); //暂停进入时间调整
- XUAN1 = 0; //选通端打开
- XUAN2 = 0; //时间就会停留不正常
- }
- else if ( KeyNum == 12 )
- {
- Start( ); //用新设定时间启动计时
- }
- else if ( KeyNum == 13 )
- {
- Second = 20; //进入四个方向都是红灯的状态
- Status = 4;
- }
- else if ( KeyNum == 14 )
- {
- Status = 5; //进入南北直行状态
- }
- else if ( KeyNum == 15 )
- {
- Status = 6; //进入东西直行状态
- }
- else if ( KeyNum == 16 )//闪动切换状态
- {
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
所有资料51hei提供下载: