51单片机项目(3)——基于51单片机的交通灯设计

本次设计的功能如下:
设计任务
在十字路口的东西、南北方向各装有红、黄、绿指示灯,设计一个交通灯实时控制系统。并在Proteus中仿真运行。
2.功能 要求:
1)东西向和南北向通行时间分别为20s和35s
2)由绿灯变为红灯的5s内,绿灯灭黄灯亮
3)2位七段码做时间能倒计时显示

且有夜间模式。

功能演示视频如下:

51单片机交通灯功能演示

代码讲解视频如下:

51单片机交通灯讲解

目录

1.51单片机交通灯的课题意义

2.智能交通灯的国内外研究现状

3.设计原理


1 2 节有点长,需要代码的同学直接移步至第三节即可!!!

1.51单片机交通灯的课题意义

51单片机交通灯的课题意义

        交通灯是城市道路交通中的重要组成部分,它通过不同颜色的信号指示车辆和行人的通行状态,提高交通流畅性和交通安全性。在现代社会,随着车辆数量的不断增加和交通流量的日益复杂化,设计和控制一套高效可靠的交通灯系统成为一个重要的课题。基于51单片机的交通灯课题具有以下重要意义:

        1.交通安全性:交通灯作为道路交通管理的重要工具之一,可以通过精确的控制来保障交通的安全性。通过51单片机技术,我们可以实现对交通灯颜色和时间的精确控制,以确保交通流量的合理分配和道路的通行安全。

        2.交通流畅性:合理的交通灯控制可以优化交通流畅性,减少车辆拥堵和行人等待时间。通过对交通流量的实时监测和处理,51单片机可以根据道路情况动态调整交通灯信号,确保交通的高效运行。

        3.资源利用效率:交通灯的合理控制可以减少能源的浪费和交通设施的磨损。通过51单片机的精确控制,可以根据实际需求调整交通灯的亮灭时间,避免不必要的能源消耗,延长交通设备的使用寿命。

        4.科技创新:基于51单片机技术的交通灯设计和控制是现代科技的创新应用之一。通过这个课题,学生可以掌握51单片机的编程和电路设计技巧,培养创新思维和实践能力,为未来的科技领域打下坚实的基础。

        总之,基于51单片机的交通灯课题在提高交通安全性、优化交通流畅性、节约资源和促进科技创新等方面具有重要意义。同时,这个课题还可以培养学生的实践能力和创新意识,为他们未来的发展奠定坚实的基础。

2.智能交通灯的国内外研究现状

智能交通灯是应用人工智能技术的一种交通信号灯系统,可以根据交通流量、道路情况和车辆需求等信息进行智能调节和优化,以提高交通流畅性和交通安全性。以下是智能交通灯在国内外的研究现状:

国内研究现状:
        1. 实时交通流量监测:国内研究者通过传感器、摄像头等技术获取实时交通流量信息,例如通过车辆轨迹追踪,边缘计算和图像处理等技术,实现智能交通灯的实时交通流量监测,并根据监测结果进行优化调整。

        2. 基于深度学习的交通流量预测:国内研究者利用深度学习算法,通过历史数据和实时数据的训练,可以准确地预测交通流量的变化趋势,进而实现智能交通灯的动态调节和优化。

        3. 车辆识别与分类:国内研究者利用计算机视觉和机器学习技术进行车辆的实时识别和分类,可以通过交通灯系统实时获取车辆信息,并根据不同类别的车辆需求进行智能优化和调度。

国外研究现状:
        1. 基于无线传感器网络的智能交通灯:国外研究者利用无线传感器网络和通信技术,可以实现车辆和交通灯之间的实时通信和联动,从而实现更高效的交通流调节和优化。

        2. 混合智能优化算法:国外研究者将遗传算法、模拟退火算法等智能优化算法应用于交通灯调度,通过优化交通灯的时间配比和相位控制,以实现最佳的交通流畅性和通行效率。

        3. 自适应交通灯控制算法:国外研究者提出了多种自适应交通灯控制算法,通过实时数据的获取和处理,可以根据交通流量和车辆需求等动态调整交通灯的时序和配时,以提高交通的效率和安全性。

        综上所述,国内外对智能交通灯的研究主要集中在实时交通流量监测、交通流量预测、车辆识别分类、无线传感器网络、智能优化算法和自适应控制算法等方面。这些研究为智能交通灯的设计和优化提供了重要的理论和技术基础,并在实际应用中取得了一定的成果和效益。未来,随着人工智能技术的不断发展和应用,智能交通灯将能够更好地适应和应对不断变化的交通需求和挑战。

3.设计原理

设计思路在代码里面已经讲的很详细了,就不多赘述。直接给出代码:

#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;
 //数码管控制端口
sbit LSA=P2^2;       
sbit LSB=P2^1;
sbit LSC=P2^3;
sbit LSD=P2^4;

sbit k2=P3^2;//按键控制
sbit k3=P3^3;



sbit led1=P1^0;//南北 绿 
sbit led2=P1^1;//南北 黄 
sbit led3=P1^2; //南北 红


sbit led4=P1^3;//东西  绿 
sbit led5=P1^4;//东西 黄
sbit led6=P1^5; //东西 红



u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
					0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值

u8 sum2,sum1=0;
u16 i,j;
u16 js;//计数变量
u8 aa,bb;     //中间变量
u8 nbshi,dxshi,moshi; //时间中间标记
u8 nbshi1,dxshi1,moshi1; //时间中间标记1
u8 huangshi=5;//黄灯时间
u8 nbzlshi=30;    //南北各灯时间 直行    绿灯				
u8 nbzhshi=20;  //南北各灯时间 直行   红灯
		

					
u8 dxzlshi=15;   //东西各灯时间	直行  绿灯			
u8 dxzhshi=35;  //东西各灯时间	直行  红灯


u8 dxhshi,nbhshi;  //南北 东西红灯时间	中间变量

bit INT1_0;	//中断标志								
/*******************************************************************************
* 函 数 名         : delay
* 函数功能		   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
	while(i--);	
}



/*******************************************************************************
* 函 数 名         : Timer0Init
* 函数功能		   : 定时器0初始化
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Timer0Init()
{
	TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。

	TH0=0XFC;	//给定时器赋初值,定时1ms
	TL0=0X18;	
	ET0=1;//打开定时器0中断允许
	EA=1;//打开总中断
	TR0=1;//打开定时器			
}

void hlhdeng(u8 deng)
{
  switch(deng)
			{
				case 0x00:         //东西直行 绿灯
					if(sum1==0)
          led1=1; // 绿     // 南北 灯         
					led2=1; //黄
					led3=0; //红	
	        if(sum1==0)
          led4=0; // 绿       //东西 灯   
					led5=1; // 黄 
					led6=1; //红
	    
	      
						
				break;
				case 0x01:            //东西直行 黄灯
						if(sum1==0)
					 led1=1; // 绿     // 南北 灯         
					led2=1; //黄
					led3=0; //红	
	        if(sum1==0)
          led4=1; // 绿       //东西 灯   
					led5=0; // 黄 
					led6=1; //红
	    
	      
				break;
				case 0x02:            // 南北 直行 绿
					if(sum1==0)
					led1=0; // 绿     // 南北 灯         
					led2=1; //黄
					led3=1; //红	
	        if(sum1==0)
          led4=1; // 绿       //东西 灯   
					led5=1; // 黄 
					led6=0; //红
				break;
					case 0x03:            // 南北 直行 黄
						if(sum1==0)
					led1=1; // 绿     // 南北 灯         
					led2=0; //黄
					led3=1; //红	
	         if(sum1==0)
          led4=1; // 绿       //东西 灯   
					led5=1; // 黄 
					led6=0; //红
				break;
			
			}
}
/*******************************************************************************
* 函 数 名         : DigDisplay
* 函数功能		   : 数码管动态扫描函数,循环扫描8个数码管显示
*******************************************************************************/

void smg(u8 nbshi,u8 dxshi)
{
	 LSA=1; LSB=1;LSC=0; LSD=1;  
	       
		aa=nbshi/10;
		P0=smgduan[aa];         //显示南北方向时间的十位
		delay(50);
	 LSA=1; LSB=1;LSC=1; LSD=0; 
	            
		bb=nbshi%10;
		P0=smgduan[bb];          //显示南北方向时间的个位
		delay(50);
		
	   LSA=0; LSB=1;LSC=1; LSD=1; 
		aa=dxshi/10;
		P0=smgduan[aa];            //显示东西方向时间的十位
		delay(50);
	
	    LSA=1; LSB=0;LSC=1; LSD=1;               
		bb=dxshi%10;
		P0=smgduan[bb];            //显示东西方向时间的个位
		delay(50);

}

void nbzh(u8 nbshi,u8 dxshi,u8 moshi)      //南北直行 黄
{
	hlhdeng(moshi);   //4种

  smg(nbshi,dxshi); //南北 东西 

}
/*******************************************************************************
* 函 数 名         : Int1Init()
* 函数功能		   : 设置外部中断1
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Int0Init()
{
	//设置INT0
	IT0=1;//跳变沿出发方式(下降沿)
	EX0=1;//打开INT0的中断允许。	
	EA=1;//打开总中断	
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{	
	Timer0Init();//定时器中断初始化
	 Int0Init(); // 外部中断0初始化
  
	nbshi=nbzhshi;  //南北红灯时间
	dxshi=dxzlshi;  //东西 绿灯  
	while(1)
	{
			
     
	   if(INT1_0==0)           //非夜间模式 正常运行
      {  
	     	nbzh(nbshi,dxshi,moshi);			   	
	   	js++;
	   	if(js>=200)
	   	{
	   		js=0;
	   		if(moshi==0 && dxshi<5)	//东西直行 绿灯
                { 
                 sum1=1;
	             led4=!led4;
                }
	   	  if(moshi==2 && nbshi<5)	//南北 绿
               { 
                 sum1=1;
	   		 led1=!led1; 
               }
	   	
	      }
	   }
      else                    //夜间模式 黄灯常量
      {  
         led1=1;
         led2=!led2;
         led3=1;
         
         led4=1;
         led5=!led5;
         led6=1;
         moshi=0;    //模式重新归为0
         j=0;
         
          LSA=1; LSB=1;LSC=1; LSD=1; //数码管灭
         delay(50000);     //延时500ms
      }
	}					
}


/*******************************************************************************
* 函 数 名         : void Timer0() interrupt 1
* 函数功能		   : 定时器0中断函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Timer0() interrupt 1
{
	

	TH0=0XFC;	//给定时器赋初值,定时1ms
	TL0=0X18;
			
				i++;
			if(i==1000)                       //1s进入一次
			{
				 i=0;	    
								if(moshi==0)	//东西直行 绿灯
								{
									if(j==0) //第一次进入
									{
										j=1;
										nbshi=nbzhshi;  //南北红灯时间
										dxshi=dxzlshi;  //东西 绿灯  
									}
                           else
									{
										
											nbshi--;
											dxshi--;
                                 
                                 if(dxshi==0)         //东西绿灯时间减完了
                                 { 
                                    //dxshi--;      
                                    dxshi=huangshi;//东西黄灯时间 
                                    moshi++;
                                    sum1=0;
                                 }
										
										
									}
								}
								else if(moshi==1)	//东西 黄
								{
								
									  
										nbshi--;
										dxshi--;
                           if(dxshi==0)            //东西黄灯时间减完了
									{
										moshi++;
										//dxshi--;
										nbshi=nbzlshi;  //南北 绿灯时间
										dxshi=dxzhshi;  //东西红灯 
									}
								}
                        else if(moshi==2)	//南北 绿
								{
								 
									
										nbshi--;
										 dxshi--;
                            if(nbshi==0)     //南北绿灯时间减完了
									{
										
										
												moshi++;
												//dxshi--;
												sum1=0;
												nbshi=huangshi;  
											
									}
								}
                        else if(moshi==3)	//南北 黄
								{
                              
										 nbshi--;
										 dxshi--;
									 if(nbshi==0)      //南北黄灯时间减完了  
									{
										moshi=0;
										//dxshi--;
											j=0;
										nbshi=nbzhshi;  //南北红灯时间
										dxshi=dxzlshi;  //东西 绿灯  
									}
								}
								
					}	
	      
}
/*******************************************************************************
* 函 数 名         : Int0()	interrupt 0
* 函数功能		   : 外部中断0的中断函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void Int0()	interrupt 0		//外部中断0的中断函数
{
	delay(1000);	 //延时消抖
	if(k2==0)
	{
	 INT1_0=!INT1_0;
		
	}
}


 

  • 23
    点赞
  • 157
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
目 录 摘 要 2 一、 方案比较、设计与论证 2 2 显示界面方案 2 3 输入方案: 3 二、理论分析与计算 3 1.交通灯显示时序的理论分析与计算 3 2.交通灯显示时间的理论分析与计算 5 三、电路图及设计文件 6 1.灯控制电路设计 6 2.倒计时显示电路设计 7 四、程序设计思路与流程图 7 1.主程序流程图 7 2.按键子程序流程图 8 五、测试、数据及结果分析 8 1.状态灯显示测试 8 2.数码管的测试 9 3.整体电路测试 9 六、总结 9 参考文献 9 附 录 10 摘 要 本系统由单片机系统、键盘、LED 显示、交通灯演示系统组成。系统包括人行道、左转、右转、以及基本的交通灯的功能 。系统除基本交通灯功能外,还具有倒计时、时间设置、紧急情况处理、分时段调整信 号灯的点亮时间以及根据具体情况手动控制等功能。 关键词:AT89S51;交通规则 一、 方案比较、设计与论证 1 电源提供方案 为使模块稳定工作,须有可靠电源。我们考虑了两种电源方案 方案一:采用独立的稳压电源。此方案的优点是稳定可靠,且有各种成熟电路可供选 用;缺点是各模块都采用独立电源,会使系统复杂,且可能影响电路电平。 方案二:采用单片机控制模块提供电源。改方案的优点是系统简明扼要,节约成本; 缺点是输出功率不高。 综上所述,我们选择第二种方案。 2 显示界面方案 该系统要求完成倒计时、状态灯等功能。基于上述原因,我们考虑了三种方案: 方案一:完全采用数码管显示。这种方案只显示有限的符号和数码字苻,无法胜任题 目要求。 方案二:完全采用点阵式LED 显示。这种方案实现复杂,且须完成大量的软件工作;但功能强大,可方便的显示各种 英文字符,汉字,图形等。 方案三:采用数码管与点阵LED 相结合的方法因为设计既要求倒计时数字输出,又要求有状态灯输出等,为方便观看并 考虑到现实情况,用数码管与LED灯分别显示时间与提示信息。这种方案既满足系统功能 要求,又减少了系统实现的复杂度。权衡利弊,第三种方案可互补一二方案的优缺,我 们决定采用方案三以实现系统的显示功能。 3 输入方案: 题目要求系统能手动设灯亮时间、紧急情况处理,我们讨论了两种方案: 方案一:采用8155扩展I/O 口及键盘,显示等。该方案的优点是: 使用灵活可编程,并且有RAM,及计数器。若用该方案,可提供较多I/O 口,但操作起来稍显复杂。 方案二: 直接在IO口线上接上按键开关。因为设计时精简和优化了电路,所以剩余的资源还比较 多,我们使用四个按键,分别是K1、K2、K3、K4。 由于该系统对于交通灯及数码管的控制,只用单片机本身的I/O 口就可实现,且本身的计数器及RAM已经够用,故选择方案二。 二、理论分析与计算 1.交通灯显示时序的理论分析与计算 对于一个交通路口来说,能在最短的时间内达到最大的车流量,就算是达到了最佳的 性能,我们称在单位时间内多能达到的最大车流为车流量,用公式:车流量= 车流 / 时间 来表示。 先设定一些标号如图2-1 所示。 说明:此图为直方图,上边为北路口灯,右边为东路口灯,下边为南路口灯,左边为 西路口灯。图2-2 所示为一种红绿灯规则的状态图,分别设定为S1、S2、S3、S4,交通灯以这四的状态为 一个周期,循环执行(见图2-3)。 请注意图2-1b和图2-1d,它们在一个时间段中四个方向都可以通车,这种状态能在 一定的时间内达到较大的车流量,效率特别高。依据上述的车辆行驶的状态图,可以列 出各个路口灯的逻辑表,由于相向的灯的状态图是一样的,所以只需写出相邻路口的灯 的逻辑表;根据图2-3 可以看出,相邻路口的灯,它们的状态在相位上相差180°。因此最终只需写出一组S1、 S2、S3、S4的逻辑状态表。 如表2-1 所示。 表中的"×"代表是红灯亮(也代表逻辑上的0)," "是代表绿灯亮(也代表逻辑上的 1),依上表,就可以向相应的端口送逻辑值。 2.交通灯显示时间的理论分析与计算 东西和南北方向的放行时间的长短是依据路口的各个方向平时的车流量来设定,并且 S1、S2、S3、S4各个状态保持的时间之有严格的对应关系,其公式如下所示。 T-S1+T-S2=T-S3 T-S2=T-S4 T-S1=T-S3 我们可以依据上述的标准来改变车辆的放行时间。按照一般的规则,一个十字路口可 分为主干道和次干道,主干道的放行时间大于次干道的放行时间,我们设定值时也应以 此为参考。 三、电路图及设计文件 1.灯控制电路设计 由于32个LED 来实现红绿灯状态,若直接接在单片机的口线,路口倒计时的显示就不能实现,所以本 次设计中采用一种新型的电路如图3-1 所示。 图中74LS04的作用是倒相和驱动,它输出的电流大约48mA,实际测试发现足以满足要求 ,而且发光管也能达
模拟交通灯控制系统的设计 一、功能要求 利用红、绿、黄三种不同颜色的LED显示不同的通行情况,利用2个数码管进行1秒倒计时 显示,最大定时时间为90秒;要求LED点亮时间和倒计时时间准确;完成单片机最小系统 及其扩展设计,焊接电路板,组成功能完整的样机。模拟实际交通灯控制系统功能,完 成控制软件的编写与调试。 二、方案论证 采用标准AT89C51单片机作为控制器;东、西、南、北各方向通行倒计时显示采用2位 LED数码管,LED显示采用直接驱动方式;模拟交通信号灯采用直径为ψ5mm的圆形发光二 极管;紧急车辆通行采用实时中断完成;通过蜂鸣器实现盲人提示功能。按以上系统构 架设计单片机端口资源刚好满足要求,该系统设计方便,电路简单。 三、系统硬件电路的设计 整套电路系统由控制系统模块、通行灯控制显示模块、时间显示模块、特种车辆通行 控制模块和盲人提示电路模块等组成。 主控制系统 主控制器采用AT89C51单片机的P1.0~P1.5脚用于控制东西及南北方向的通行灯,P1. 6脚用于控制盲人提示电路;P0口及P2 口用于4组2位LED计时器的控制;特种车辆通过时使用外部中断0口(P3.2). 通行灯输出控制 模拟交通信号灯采用直径为ψ5mm的圆形发光二级管,东西南北方向各3个,颜色分别为红 、黄、绿。为使电流小于10mA应串联一个阻值为330Ω的限流电阻。 时间显示模块 道口通行剩余时间采用高亮红色7段LED发光数码管显示,采用共阴数码管,为了提高 亮度给数码管的位选串联一个NPN型三极管,给段选并联一个驱动芯片74LS245。 紧急车辆通行控制模块 运用外部中断0口,当有特种车辆通过时,按下开关,各个方向的红灯就会同时亮起 ,并且在延时10秒后自动恢复以前的状态。 盲人提示电路模块 道口控制系统设计中也考虑到了方便盲人过人行道的声音提示电路,采用蜂鸣器作为 声音提示装置,当绿灯倒计时10s时开始发声,当黄灯亮时,即行人结束通行,蜂鸣器停 止发声,东西方向和南北方向的提示音音频不同(东西方向1s钟蜂鸣器发声两次,南北 方向1s钟发声一次)。 四、系统主要程序的设计 道口交通控制系统控制程序主要分为以下几个模块:初始化程序、主程序、子程序( 包括信号灯提示、数码管倒计时显示、盲人提示功能和紧急车辆通行功能等)。 初始化程序 初始化程序主要包括声明IO口的连接对象、声明7段LED数码管驱动信号数组、声明基本 变量、定义无返回函数(延时函数)。 主程序 主程序主要负责总体程序管理功能,实现信号灯显示与数码管倒计时显示,以及蜂鸣 器提示和特种车通行提示。 主程序流程图如下 子程序流程图如下 状态1 状态2 状态3 状态4 状态5 五、调试及性能分析 1、硬件部分首先应用Proteus软件对电路原理图进行检查,检查无误后进行焊接,焊接 结束后利用万用表检查线路是否为通路。 2、软件部分首先应用keil u4软件对程序进行编译和调试,调试成功后,利用Proteus软件进行在线仿真,经过对程 序多次地修改后,仿真效果达到了预期的要求。 3、将最终调试好的程序烧录到单片机内,观察效果。 本系统以STC89C51单片机为核心,采用高亮度两位7段数码管并应用74LS245对数码管进 行驱动,可以很直观地显示红绿灯的开放及关闭时间;功能完善,不仅有普通交通灯的 指示功能,还增加了特种车辆通行和盲人提示功能。其控制功能与效果与真实道口管理 红绿灯完全一致。 六、小组成员总结 心得体会 问婉茹 为期两周的课程设计已接近尾声,此次课程设计我们的任务是交通灯,刚开始的时 候,几乎没有一点头绪,不知从何下手,可是真正完成了之后,觉得其实也并不是特别 困难,只要找到线头,顺着它一步步往下走,就可以顺利到达终点。通过这一学期对单 片机的学习,已经对单片机有了基本的了解,但那要说真正理解,我觉得差的还不是一 点点,毫无疑问,这次的课程设计就给了我们一个深入学习单片机,提高动手能力与团 结合作的大好机会。 这次课程设计中,我负责的主要是硬件,包括各种元件的检查,电路的焊接。提到 焊接就感到惭愧,由于以前在这方面经验比较少,加之为了元件排版美观,导致电路板 背面得导线焊得一塌糊涂,正如杨老师所说,一碗面条。以后在焊接方面还是有待提高 ,多动手。虽然没有负责软件,但比起以前,还是对程序以及此次用到的几个软件有了 一点了解。总之,这次课程设计还是让我收获挺多的不管是软件,硬件还是团结协作方 面。当然,任何事情都不是一次就能成功的,必须经过多次的尝试并改善才能得到最好 的。在这次设计中,我们也不可避免的遇到了同样的问题,在完成程序并通过软件仿真 之后,经过多次的尝试,我们还是遇到了问题,八个数码管中始终有五个很暗,刚开始 以为是电流过小,不能驱动这么多数码管,老师建议我们加个74

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式小李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值