基于单片机的十字路口交通灯设计(带夜间带紧急按钮带调时间)

资源文件夹包含: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设计的仿真原理图如图下所示。
在这里插入图片描述
以下分别是东西通行倒计时、南北黄灯倒计时、南北通行倒计时、夜间黄灯闪烁、紧急红灯五张仿真运行图。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值