资源文件夹包含:proteus仿真+原理图;keil编写的C语言程序;详细设计说明书。
资源链接:
加我QQ:1271370903
一、摘要
交通灯控制是目前智能交通系统ITS领域中的一个分支。随着城市化速度的加快,机动车日益普及,人们受到越来越多的交通拥堵的困扰。而城市道路中交通拥堵有多方面的原因:车辆多,道路少;道路设置不合理;平面交通多,立体交通少;交叉路口交通灯时间设置不合理等等。而城市交通中平面交通占得比重非常大。堵车地点多为交叉路口。主要是由于车流量大,等灯时间不合理造成的。这是目前城市交通亟待解决的问题。 目前我国城市街道交叉路口的交通信号灯虽然是自动的,但是仔细观察就会发现红绿灯的交替转换是定时式的,即转换的间隔时间是固定不变的。定时式并不符合实际要求。因为,如果东西和南北两方向车流量相差很大,而信号灯还是平均分配导通时间,就会出现这样的问题:车多的方向导通时间不足,而车少的方向导通时间剩余,造成一方向车挤另一方向车松的不合理的局面,这就是机器自动控制不如人工现场指挥的差别。
二、设计目的
(1)巩固和加深对单片机原理和接口技术知识的理解;
(2)培养根据课题需要选学参考书籍、查阅手册和文献资料的能力;
(3)学会方案论证的比较方法,拓宽知识,初步掌握工程设计的基本方法;
(4)掌握常用仪器、仪表的正确使用方法,学会软、硬件的设计和调试方法;
(5) 能按课程设计的要求编写课程设计报告,能正确反映设计和实验成果,能用计算机绘制电路图、仿真图和流程图。
三、设计要求及内容
(1)设计一个交通灯显示系统,实现交通灯显示功能,并通过数码管或LCD屏显示;东西方向、南北方向均有红、黄、绿三种信号灯。
(2)显示切换功能:带紧急制动按钮,按钮按下,所有方向亮红灯;再次按下恢复正常显示。以便120、110等及时通行
(3)夜间模式按钮按下:所有方向显示黄灯闪烁。
(4)附加功能:实时提醒绿灯亮的剩余时间。
四、总体设计方案
为了实现基于51单片机的十字路口交通灯设计,本文将实现以下设计需求:
(1)精确、实时的进行数码管自动倒计时、LED红绿灯自动切换,较好的模拟交通灯的运行情况;
(2)直接、清晰明了的显示测得的倒计时的数值;
(3)手动调整倒计时的时间,提升交通灯可控性;
(4)能够实现交通灯紧急情况处理,完善交通灯的功能;
(5)操作简单、功能完善、精确度高。
基于以上列出的几点,本设计利用AT89C51单片机控制数码管模块、LED灯模块、按键模块等外部电路实现相关功能,具体的设计框图如图下所示。
五、硬件设计
如图下图是本系统的硬件设计方案,具体地,硬件电路由以下模块构成:
(1)单片机最小系统。用于驱动和控制其他模块,以实现整体功能,其以AT89C51单片机为核心芯片,并辅以复位电路和晶振电路。
(2)数码管倒计时显示模块。由四个两位数码管组成,负责实时显示交通灯倒计时:主干道直行10秒,辅干道直行7秒,黄灯3秒。
(3)LED红绿灯模块。由9个LED灯组成,分别模拟红灯、黄灯、直行绿灯、左转绿灯。
(4)电源模块。用于整个系统的供电。
六、软件设计
根据本文设计需求,在第三章硬件电路设计的基础上,需要通过软件编程实现的具体功能:
(1)驱动各个模块工作,实现数码管的显示及LED灯的点亮;
(2)按键设置功能。实现紧急情况下所有路口红灯亮、自动模式倒计时增加、自动模式倒计时减少等功能;
(3)倒计时功能实现。实现主干道方向通行10秒,辅干道通行7秒,;
(4)LED红绿灯的切换。实现红灯和绿灯相互转换经过黄灯,并且黄灯闪烁三次。
具体设计流程如图下所示。
#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};
uchar sec=0,miao=0; //定时
uchar nan=0,dong=0;//东西南北时间
uchar mode=0; //路灯工作顺序
uchar nan_lim=6,dong_lim=6;//自由调整时主次干道绿灯时间
uchar moshi=0;
uchar bei=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;//南北红灯亮
nan=dong_lim+5;dong=dong_lim+1;//设置初始时间
break;
case 1:red1=0;yellow1=1;green1=1;red2=1;yellow2=0;green2=1;//东西黄灯亮
dong=4;nan=4;
break;
case 2:red1=1;yellow1=1;green1=0;red2=0;yellow2=1;green2=1;//东西红灯亮
nan=nan_lim+1;dong=nan_lim+5;//设置初始时间
break;
case 3:red1=1;yellow1=0;green1=1;red2=0;yellow2=1;green2=1;//南北黄灯亮
nan=4;dong=4;
}
}
void display() //显示各路口时间
{
P0=tabel[nan/10];//南北
smg1=1;
delay(100);
smg1=0;
P0=tabel[nan%10];
smg2=1;
delay(100);
smg2=0;
P0=tabel[dong/10];//东西
smg3=1;
delay(100);
smg3=0;
P0=tabel[dong%10];
smg4=1;
delay(100);
smg4=0;
}
void main()//主函数
{
TMOD=0x01;//定时器设置
TH0=0x3c; //50ms
TL0=0xb0;
ET0=1; //开中断
EA=1;
TR0=1; //启动定时器
control();
nan=dong_lim+4;dong=dong_lim;//设置初始时间
while(1)
{
if(moshi==0)
display();//显示
if(!k1)
{ //模式切换
if(moshi<2)
moshi++;
else
moshi=0;
while(!k1);
}
if(moshi==1)//调节南北时间
{
if(!k2)
{
if(nan_lim<99)
nan_lim++;
while(!k2);
}
if(!k3)
{
if(nan_lim>1)
nan_lim--;
while(!k3);
}
P0=tabel[nan_lim/10];//南北
smg1=1;
delay(100);
smg1=0;
P0=tabel[nan_lim%10];
smg2=1;
delay(100);
smg2=0;
}
if(moshi==2)//调节东西时间
{
if(!k2)
{
if(dong_lim<99)
dong_lim++;
while(!k2);
}
if(!k3)
{
if(dong_lim>1)
dong_lim--;
while(!k3);
}
P0=tabel[dong_lim/10];//东西
smg3=1;
delay(100);
smg3=0;
P0=tabel[dong_lim%10];
smg4=1;
delay(100);
smg4=0;
}
if(!k4)//夜间
{
if(bei==0)
{
bei=P1;
P1=0xff;
moshi=3;
}
else
{
P1=bei;
moshi=0;
}
while(!k4);
}
if(!k5)//管制
{
if(moshi!=4)
{
moshi=4;
bei=P1;
P1=0xff;
red1=0;
red2=0;
}
else
{
moshi=0;
P1=bei;
}
while(!k5);
}
}
}
void timer0() interrupt 1//定时器0中断
{
TH0=0x3c;//重装定时器
TL0=0xb0;
}
七、仿真演示
本系统用protues8.7设计的仿真原理图如图下所示。
以下分别是东西通行倒计时、南北黄灯倒计时、南北通行倒计时、夜间黄灯闪烁、紧急红灯五张仿真运行图。