基于51单片机的十字路口交通灯设计

目录

具体实现功能

设计介绍

51单片机简介

设计思路

设计内容

原理图(AD19)

程序(Keil5)

仿真实现(protues8.7)

全部资料


具体实现功能

系统由STC89C52单片机+数码管模块+LED指示灯模块+按键模块+电源构成。

具体功能:

1、红灯和绿灯相互转换经过黄灯,并且黄灯闪烁三次;

2、主干道方向通行30秒,辅干道通行20秒,单独左转信号15秒,先直行信号,后左转信号;

3、设置自动、手动、特殊情况三种方式。自动模式下自动显示各种状态的倒计时,红绿灯自动切换;手动模式下可以根据道路车流量情况手动调节红灯绿灯相应时间;紧急情况下所有路口红灯亮,黄灯闪烁,以便120、110等及时通行。

设计介绍

51单片机简介

51单片是一种低功耗、高性能CMOS-8位微控制器,具有8K可编程Flash存储器,使得其为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

51系列单片机具有以下标准功能:

8k字节Flash,512字节RAM,

32位I/O口线,看门狗定时器,

内置4KB EEPROM,

MAX810复位电路,

三个16位定时器/计数器,

一个6向量2级中断结构,

全双工串行口。

另外, 51系列在空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机停止工作,直到下一个中断或硬件复位为止。本设计所使用的芯片可兼容以下所有的51系列单片机(包括AT系列和STC系列)。

设计思路

文献研究法:搜集整理相关研究资料,阅读文献,为研究做准备;

调查研究法:通过调查、分析、具体实验等方法,发现相关存在问题和解决办法;

比较分析法:比较不同设计的具体原理,以及同一类传感器性能的区别,分析系统的研究现状与发展前景;

软硬件设计法:通过软硬件设计实现硬件,最后测试各项功能是否满足要求。

设计内容

原理图(AD19)

本系统原理图设计采用Altium Designer19,具体如图。

程序(Keil5)

本设计利用KEIL5软件实现程序设计,主函数如下:

/*********************主程序开始***********************/
void	main(void)
{ 
IT0=1;	   //INT0负跳变触发	 设置成 低电平触发方式,IT0=1为下降沿触发
TMOD=0x01; //定时器工作于方式1
TH0=(65536-50000)/256; //定时器赋初值
TL0=(65536-50000)%256;
EA=1;  //CPU开中断总允许
ET0=1; //开定时中断
EX0=1; //开外部INTO中断
TR0=1; //启动定时

    while(1)
    {
			 Flag_zhuanhuan=0;	//南北倒计时		
			        /*******S0状态,南北直行30S倒计时**********/
			Flag_EW_Yellow=0;	   //EW关黄灯显示信号,黄灯不亮
			Time_EW=EW;//赋倒计时初值20S
			Time_SN=SN;//赋倒计时初值30S
			while(Time_SN>=0)//南北倒计时大于零则继续循环
					{    
					    P1 = S[0];	//给P1口赋值,使SN绿灯,EW红灯
					    Display();//调用显示函数,显示
						if(zj==0)			//增加按键按下
						{
							Delay(3);//延时消抖
							if(zj==0)//确认增加按键按下
							{	
								while(!zj);					//去除抖动,确认是否增加按键按下
								Time_SN=Time_SN+1;			//倒计时加一
							}
						}
						if(jx==0)		//减少按键按下							//减少按键按下
						{
							Delay(3);//延时消抖
							if(jx==0)				//确认按键按下
							{	
								while(!jx);					//去除抖动,确认是否减少按键按下
								Time_SN=Time_SN-1;			//倒计时减一
							}			
						}
							if(Special_Btton==0)//紧急按键按下
							{
								Delay(3);//延时消抖
								if(Special_Btton==0)//确认按键按下
									{	
											while(!Special_Btton)		// 去除抖动,确认是否按键按下
											P1=0XCC;			//所有红灯亮
									} 
							}	
					}
			
					/*******S1状态,南北左转15S绿灯**********/
			Flag_SN_Yellow=0; //SN关黄灯显示信号
			Time_SN=SNL;
			while(Time_SN>=6)//大于6S一直倒计时
					{
							P1=S[2];      //SN左拐绿灯亮,EW红灯
							Display();
									if(zj==0)									//增加按键按下
						{
							Delay(3);
							if(zj==0)
							{	
								while(!zj);					//去除抖动,确认是否增加按键按下
								Time_SN=Time_SN+1;
							}
						}
						if(jx==0)									//减少按键按下
						{
							Delay(3);
							if(jx==0)
							{	
								while(!jx);					//去除抖动,确认是否减少按键按下
								Time_SN=Time_SN-1;
							}
						}
							if(Special_Btton==0)
							{
								Delay(3);
								if(Special_Btton==0)
									{	
										while(!Special_Btton)		 
										P1=0XCC;
									} 
							}	
					}		
							/*******S2状态,绿灯转黄灯**********/
					P1=0x00;
					while(Time_SN>=0)//倒计时6S到0S转黄灯
					{
							Flag_SN_Yellow=1; //SN开黄灯信号位
							Flag_EW_Yellow=1; //SN开黄灯信号位
							P1=P1|0x44;    //保持EW红灯
							Display();
							if(zj==0)									//增加按键按下
						{
							Delay(3);
							if(zj==0)
							{	
								while(!zj);					//去除抖动,确认是否增加按键按下
								Time_SN=Time_SN+1;
							}
						}
						if(jx==0)									//减少按键按下
						{
							Delay(3);
							if(jx==0)
							{	
								while(!jx);					//去除抖动,确认是否减少按键按下
								Time_SN=Time_SN-1;
							}
						}
							if(Special_Btton==0)
							{
								Delay(3);
								if(Special_Btton==0)
									{	
										while(!Special_Btton)		 
										P1=0XCC;
									} 
							}	
					}
			Flag_zhuanhuan=1;
			/***********赋值*********/
			EW=EW1;		//重新给倒计时时间赋初始值
			SN=SN1;		//重新给倒计时时间赋初始值
			EWL=EWL1;	//重新给倒计时时间赋初始值
			SNL=SNL1;	//重新给倒计时时间赋初始值

					/*******S3状态,东西直行30S**********/
			Flag_SN_Yellow=0; //SN关黄灯显示信号
			Time_EW=EW;
			Time_SN=SN;	//倒计时时间赋值	
			while(Time_EW>=0)		//30S倒计时
					{
					    P1=S[4];	  //EW通行,SN红灯
						  Display();
									if(zj==0)									//增加按键按下
						{
							Delay(3);
							if(zj==0)
							{	
								while(!zj);					//去除抖动,确认是否增加按键按下
								Time_EW=Time_EW+1;
							}
						}
						if(jx==0)									//减少按键按下
						{
							Delay(3);
							if(jx==0)
							{	
								while(!jx);					//去除抖动,确认是否减少按键按下
								Time_EW=Time_EW-1;
							}
						}
							if(Special_Btton==0)
							{
								Delay(3);
								if(Special_Btton==0)
									{	
											while(!Special_Btton)		 
											P1=0XCC;
									} 
							}	
					}
					/*******S4状态,东西左转15S倒计时**********/
			Flag_EW_Yellow=0;//EW关黄灯显示信号
			Time_EW=EWL;
			while(Time_EW>=6)//大于6S时一直为左转绿灯
					{
						P1=S[6];     //EW左拐绿灯亮,SN红灯
						Display();
								if(zj==0)
							{	
								while(!zj);					//去除抖动,确认是否增加按键按下
								Time_EW=Time_EW+1;
							}
						}
						if(jx==0)									//减少按键按下
						{
							Delay(3);
							if(jx==0)
							{	
								while(!jx);					//去除抖动,确认是否减少按键按下
								Time_EW=Time_EW-1;
							}
						}
						if(Special_Btton==0)
							{
								Delay(3);
								if(Special_Btton==0)
									{	
											while(!Special_Btton)		 
											P1=0XCC;
									} 
							}
						/*******S5状态**********/	
           P1=0x00;
					while(Time_EW>=0)//小于6S后为黄灯
					{
							Flag_EW_Yellow=1; //SN开黄灯信号位
							Flag_SN_Yellow=1; //SN开黄灯信号位
							P1=P1|0x44;    //保持EW红灯
							Display();
							if(zj==0)									//增加按键按下
						{
							Delay(3);
							if(zj==0)
							{	
								while(!zj);					//去除抖动,确认是否增加按键按下
								Time_EW=Time_EW+1;
							}
						}
						if(jx==0)									//减少按键按下
						{
							Delay(3);
							if(jx==0)
							{	
								while(!jx);					//去除抖动,确认是否减少按键按下
								Time_EW=Time_EW-1;
							}
						}
							if(Special_Btton==0)
							{
								Delay(3);
								if(Special_Btton==0)
									{	
										while(!Special_Btton)		 
										P1=0XCC;
									} 
							}	
					}			
					P1=0XFF;						
					}
	   }

代码运行截图:

仿真实现(protues8.7)

本设计利用protues8.7软件实现仿真设计。

全部资料

全部资料包括程序(注释)、AD原理图、protues仿真、参考论文、程序讲解、仿真讲解、仿真视频、原理图讲解、资料使用介绍等,具体如图,全网最全!!

 

资料获取:
https://docs.qq.com/doc/DSVJBVU5rY3BWVFpa

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值