1、 项目背景
交通灯控制系统是城市交通管理的重要组成部分,其作用是合理分配道路资源,缓解交通拥堵,保障行人和车辆的安全。传统的交通灯系统多为固定时长控制,而基于单片机的交通灯控制系统可以通过编程实现更灵活的控制逻辑,例如根据车流量调整信号时长,甚至实现智能交通管理。
2、设计要求
1、双向十字路口交通灯(最长不要超过20秒)
2、时间倒计时显示
3、按键设置路口时间
4、按键控制应急功能
5、扩展功能:带有左转指示灯
3、设计思想
交通灯设计是以单片机AT89C51芯片作为核心原件,LED灯、八段数码管等构成交通灯显示系统,利用单片机的电源电路、时钟电路、复位电路、数码管和LED灯显示电路及按键控制电路等组成。具有实时显示交通灯各种工作状态的特点,同时利用c语言程序设计,实现了交通灯显示系统的自动化。
本设计以单片机 AT89C51为控制核心,采用模块化设计,共分以下几个功能模块:单片机控制系统模块、电源模块、时钟模块、复位模块、按键控制模块、 显示模块等。
交通灯显示系统主要有日常模式、紧急模式和夜间模式三种模式,能实时显示当前状态南北和东西方向红绿灯状态及倒计时时间,还有自定义设置红绿灯时间的功能。
4、硬件电路
5、程序源代码(部分 需要完整版详见评论区联系方式或私信获取)
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit k1=P3^2;//按钮
sbit k2=P3^3;
sbit k3=P3^4;
sbit k4=P3^5;
sbit k5=P3^6;
sbit red1 =P1^0; //南北方向
sbit yellow1=P1^1;
sbit green1 =P1^2;
sbit red2 =P1^3; //东西方向
sbit yellow2=P1^4;
sbit green2 =P1^5;
sbit smg1=P2^0;//数码管引脚
sbit smg2=P2^1;
sbit smg3=P2^2;
sbit smg4=P2^3;
uchar code tabel[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//0,1,2,3,4,5,6,7,8,9
uchar temp=0,miao=0; //定时
uchar south=0,east=0;//东西南北时间
uchar mode=0; //路灯工作顺序
uchar south_green=6,east_green=6;//自由调整时主次干道绿灯时间
uchar pattern=0;//模式
uchar backups=0;//备份
void delay(uint i)//延时
{
while(i--);
}
void control()//控制路灯
{
switch(mode)
{
case 0:red1=0;yellow1=1;green1=1;red2=1;yellow2=1;green2=0;//南北红灯亮
south=east_green+5;east=east_green+1;//设置初始时间
break;
case 1:red1=0;yellow1=1;green1=1;red2=1;yellow2=0;green2=1;//东西黄灯亮
east=4;south=4;
break;
case 2:red1=1;yellow1=1;green1=0;red2=0;yellow2=1;green2=1;//东西红灯亮
south=south_green+1;east=south_green+5;//设置初始时间
break;
case 3:red1=1;yellow1=0;green1=1;red2=0;yellow2=1;green2=1;//南北黄灯亮
south=4;east=4;
}
}
void display() //显示各路口时间
{
P0=tabel[south/10];//南北
smg1=1;
delay(100);
smg1=0;
P0=tabel[south%10];
smg2=1;
delay(100);
smg2=0;
P0=tabel[east/10];//东西
smg3=1;
delay(100);
smg3=0;
P0=tabel[east%10];
smg4=1;
delay(100);
smg4=0;
}
void main()//主函数
{
TMOD=0x01;//定时器设置
TH0=0x3c; //50ms
TL0=0xb0;
ET0=1; //开中断
EA=1;
TR0=1; //启动定时器
control();
south=east_green+4;east=east_green;//设置初始时间
while(1)
{
if(pattern==0)
display();//显示
if(!k1)
{ //模式切换
if(pattern<2)
pattern++;
else
pattern=0;
while(!k1);
}
6、调试中遇到的问题
1. 程序死机或复位
• 原因:可能是程序中存在死循环、外部干扰(如电源电压不稳定或电磁干扰)或单片机内部故障。
• 解决方法:
• 检查程序逻辑,避免死循环。
• 确保电源电压稳定,减少电磁干扰。
• 检查单片机是否损坏,必要时更换。
2. 状态机异常
• 原因:状态机设计不合理、状态变量被意外修改或外部干扰。
• 解决方法:
• 重新设计状态机,确保状态转换逻辑正确。
• 使用中断保护状态变量,防止意外修改。
• 屏蔽外部干扰,或在程序中添加异常处理机制。
3. 定时器中断异常
• 原因:定时器配置错误、中断服务程序执行时间过长或外部干扰。
• 解决方法:
• 检查定时器配置,确保中断时间准确。
• 优化中断服务程序,缩短执行时间。
• 屏蔽外部干扰,或在程序中添加异常处理机制。
4. 按键或显示器故障
• 原因:硬件故障、连接不良或程序驱动错误。
• 解决方法:
• 检查按键或显示器是否损坏,必要时更换。
• 检查硬件连接是否可靠。
• 检查程序中的驱动代码是否正确。
5. 倒计时逻辑错误
• 原因:倒计时逻辑设计不合理,导致多个方向的倒计时同时递减。
• 解决方法:
• 确保每个方向的倒计时独立控制。
• 在定时器中断中,仅递减当前活动方向的倒计时变量。
• 在倒计时结束后,正确切换交通灯状态。
6. 按键响应不及时
• 原因:按键扫描逻辑设计不合理。
• 解决方法:
• 确保按键扫描函数能够正确跳出循环,检测下一次按键状态。
• 使用防抖动技术,避免误触发。
7. 数码管显示不准确
• 原因:显示逻辑错误或硬件连接问题。
• 解决方法:
• 检查数码管的驱动代码是否正确。
• 确保数码管与单片机的连接正确。
调试建议
• 单步调试:逐行执行程序,检查变量值和寄存器状态。
• 断点调试:在关键代码处设置断点,暂停程序执行,方便检查。
• 仿真调试:使用仿真器模拟单片机运行,观察程序执行过程。
通过以上方法,可以有效解决交通灯调试过程中遇到的问题,确保项目顺利进行。
7、项目成果
1. 成功实现交通灯的基本控制功能:包括东西方向和南北方向的红绿灯切换。
2. 倒计时显示准确:通过数码管实时显示剩余时间。
3. 紧急模式切换正常:通过按键实现优先放行特定方向的交通。
4. 故障报警功能有效:在检测到硬件故障或异常状态时,蜂鸣器能够及时报警。
8、项目反思
1. 硬件设计改进:在实际运行中发现,数码管的显示亮度受环境光影响较大,可以考虑增加光敏电阻实现自动调节亮度。
2. 软件优化:状态机设计可以进一步优化,减少冗余代码,提高程序运行效率。
3. 功能扩展:可以考虑增加车流量检测功能,进一步提升交通灯系统的智能化程度。
4. 团队协作:在项目开发过程中,团队成员之间的沟通和协作至关重要,合理分工和及时交流能够有效提高开发效率。
9、总结与展望
通过本次单片机课程设计,我们成功实现了一个基于单片机的交通灯控制系统。在项目开发过程中,我们不仅掌握了单片机硬件设计和软件编程的基本技能,还学会了如何调试和优化系统。虽然项目中遇到了一些问题,但通过团队合作和不断探索,我们最终成功解决了这些问题。在未来的学习和开发中,我们将继续深入学习单片机技术,探索更多应用场景,提升自己的实践能力和创新能力。
希望这篇文章能够为你的单片机课程设计提供参考和帮助!