基于单片机的智能红绿灯控制系统设计方案

收藏和点赞,您的关注是我创作的动力

文章目录

  • 概要
  • 一、设计思路
  • 2.1设计原理
  • 2.2方案选择
  • 二、元件展示
  • 3.1单片机展示
  • 三、 内容截图
  • 四、 主要代码
  • 四、 文章目录
  • 概要

      随着社会经济的快速发展以及人们生活水平的提高 ,机动车数量也在急剧增加 ,交通问题逐渐成为人们关注的重点对象,因城市发展所带来的交通拥堵等问题,利用智能交通来解决传统交通日渐出现的问题成为大势所趋。本设计基于传统交通,详细介绍了交通灯控制系统软件以及硬件的设计过程,并且使用 Proleus 软件对整体系统进行仿真,采用了单片机作为基础的开发模板,结合plc等其他技术进行交通的智能化的交通设计,可自动控制红绿灯的交替闪烁,观察车流情况自动改变倒计时的情况,已达到改善交通拥堵的情况。本设计是基于理想情况下设计的交通控制系统,基于实际道路情况的复杂程度,不同的车辆高度长度的和随机出现的行人以及出现交通事故等突发情况,本设计结合实际的交通系统还是存在一定难度,但该发展方向存在大量实际利益,是值得我们去探讨如何发展的,在硬件开发成熟后可以优先享用该成果。
      关键词:单片机;信号灯;智能交通

    一、设计思路

      根据传统的交通信号控制系统,智能交通系统需要改善机动车的城市灯的红色,黄色和绿色,包括左右转向在内每个行驶方向的相互显示控制,通过车流量的测量装置,它也可以与十字路口和区域交通状况结合在一起。利用提供的信息,灵活更改每个信号指示器的时间,以实现道路网络上交通流量的最佳配置。这要求系统能够根据每个行车道的交通流反馈信息和相应的算法来设置信号时间,连接控制系统和控制中心以实现跨区域交通控制。假设东西方向的交通量较大,为了避免行人和车辆争抢交通资源,控制行人和车辆之间的交通流量,一般的,当车辆直行时,相应人行道的绿灯亮起,行人可以通过。虽然这种做法对交通利用率较高,但是会牺牲左右转弯车辆的通行效率。在转向信号的路口汽车左转时,人行道上的红灯亮,禁止行人通行,使汽车和行人不会争道,可以有效地预防交通事故,提高十字路口的通行能力。随着科技的演进,在一些发达国家已开始研发所谓的“智慧信号”。该信号可以依据各车辆的位置、速度及方向来试着与各车辆沟通,并提醒驾驶员灯号即将变换等资讯,然而仍有少部分的车辆并无与此类信号沟通的装备,使得部分驾驶员可能无法得知智慧信号所传达的资讯。
      智能交通信号灯负责人员和各种车辆的安全,红色,黄色和信号灯的全自动指挥的完成是城市道路交通智能的重点研究课题。在城市街道十字路口,为了确保交通管理和机动车安全,通常在每条道路上都有一组红色,黄色和绿色的交通信号灯,该红色信号灯一直亮着,表示禁止道路通过标志;灯亮,未通过该路面上的停车线的车辆将停止行驶,而已通过停车线的车辆则可以继续行驶;绿色信号灯亮起,表明该路面允许行驶。和传统的交通一样,交通信号控制系统,需要完成自动循环变化信号灯,在保障正常行车和行人的安全前提下,负责为各种车辆和非机动车提供更加智能人性化的出行体验,并完善了十字路口的城市道路交通自动化程度。在传统交通信号自动控制系统的基础上,智能交通信号自动控制系统基于单片机设计的智能控制系统,能完成以下功能:交通信号控制在十字路口,指挥通行方向和等待方向的两个路口的汽车。,两个方向的信号灯可以根据交通量自动调整通行时间。交通量大,通行时间长,交通量小,通行时间短;每次信号灯变绿时,在汽车驾驶离开路口前,统计该方向的交通流量。除了东西方向和南北方向上的红色,黄色和绿色信号灯外,每次打开带有倒计时功能的led灯、数字显像管等用于显示当前信号灯持续时间。

    2.1设计原理

      本人选用了51单片机作为实现智能控制的单片机。每个方向的左转弯,直行,右转弯等信号均由双色LED灯泡实现。交通灯的倒计时显示是通过数字管实现的,该管通常由2位数字和8段组成。对于应用设计的微控制器,I / O端口的数量非常有限。为了节省单片机的I / O端口,使用多个74LS245芯片来控制不同驱动方向上的LED灯泡,并且每个方向上的灯数由BC7281B芯片控制。人机交互系统通过串口与外部系统相连,MAX232芯片更适合于操作要求。为了交通远程控制,需要可以远程收发的装置,此处以 XL02- 232AP1 无线串口收发模,作为模拟实现功能,在总设计系统中,以单片机作为最小系统,将芯片作为主控制器,用以控制其他模块协调工作;交通灯模块作为不同车道的目前通行情况的表示(红灯表示该车道停止前进,绿灯表示该车道可以优先通行,黄灯表示该车道的通行情况的过渡时间 );红绿灯倒计时显示模块和外部链接的键盘控制模块,需要人工进行参数修改,以达到不同情况的模拟,由单片机外接接口控制。
      在正常单片机运作周期中,红绿灯工作时,先主道绿灯亮起,同时辅道红灯亮,实现主道先行,该红绿灯常亮时间由人工设定(设定范围为00—99s),交通系统的开启受人工控制,按下键盘上启动键后,系统开始工作,按照预定的设计方案开始自动交替亮灯,同时开启红绿灯时间倒计时显示。当倒计时显示时问减为0时,原本亮起绿灯的道路转为黄灯闪烁,并维持2秒,亮起红灯的道路继续维持红灯2秒。倒计时显示又减为0时,黄灯道路转为红灯亮起,另一方向转为绿灯亮起,两者的维持时间仍由预先设定,当红绿灯的倒计时再次又减为0时,重复上述流程操作,时钟周期开始循环往复,以达到不同道路不断交替通行。
    在该设计中,运用模糊检测原理用于检测车辆通过道路。模糊控制原理只是另一种模糊逻辑,而模糊逻辑不是两者之间推理的逻辑,这在传统意义上是不正确的。多值逻辑,但在承认事物属于真值之间的过渡时,他们还认为事物在形式具有其他形式。既无法精确获得信息,而通过大体特点推导出物体的大概,因此,如何处理不正确的模糊输入信息,是对有效降低模糊控制错误率,并仅仅需要较少的存储空间,就可以掌握信息的主要特征,并保证信息处理的实时性、多功能性和完整度。这样,隶属度用于定量描述宇宙中元素与宇宙概念之间的一致性程度。展开以便可以使用隶属函数表示模糊集。

    2.2方案选择

      智能交通的系统主要以靠智能电路实现,利用不同元件的控制方案是多种多样的,有很多可以使用的器件,常见使用PLC、CPLD、单片机或纯电路设计等设计方案,不同的元件有各种的长处,需要结合实际需求进行选择。从控制的灵活性、实现的方便程度以及性价比等方面综合考虑,单片机有其他方案所没有的优势,能规避一部分其他元件使用配合上的弊端,加上我们的专业课程上有较为系统的学习过单片机,整体系统才用单片机作为控制的核心元件,模拟仿真不同情况下智能交通灯控制的情形,并对模拟的结果进行改良系统,达到预设的效果,从而实现经济、智能、简单的设计要求,也比较符合对硬件大小的预期。
    软件采用汇编语言的系统进行仿真,采用Keil C51的集成汇编软件,将上述的软件编制导入汇编软件中,对软件程序进行编写,查找设计上的功能是否能正常实现,为了方便程序调试,本人采用Proteus仿真电路,模拟仿真所编写的程序,最初的程序在不同的红绿灯交替亮起是存在不少的问题,不同的控制叠加在一起时引起逻辑判断出现了问题,而且随着情况越发复杂,单片机的接口也有限,大量的判断需要优化整合到同一个程序判断中,之后便可以实现封装,调试或者生产pcb版等后续操作。

    二、元件展示

    3.1单片机展示

    89C51是一种低压,高性能CMOS 8位微处理器,具有4K字节的闪存可编程可擦写只读存储器(FPEROM闪存可编程可擦写只读存储器),通常称为微控制器。 MCU的可擦除只读存储器可以重复擦除100次。该器件采用ATMEL高密度非易失性存储器制造技术制造,并且与行业标准的MCS-51指令集和输出引脚兼容。由于在单个芯片中结合了多功能8位CPU和闪存,ATMEL的89C51是高效的微控制器,而89C2051是其简化版本。

    图3.1 单片机的内部逻辑结构示意图

    表3.1 单片机的功能表
    单片机的最小系统描述:时钟信号的产生:MCS-51芯片内部有一个高增益反相放大器,其输入端子是芯片引脚XTAL1,其输出端子是引脚XTAL 2 。在芯片外部,晶体振荡器和微调电容器连接在XTAL1和XTAL2之间,并形成了稳定的自激振荡器。这是微控制器的时钟振荡电路。触发器将频率除以2后,时钟电路产生的振荡脉冲变成微控制器的时钟脉冲信号。通常,电容C2和C3约为30pF,晶体的振荡频率为1.2-1-2MHz。如果晶体振荡频率高,则系统的时钟频率也高,并且单片机的操作速度也快。单片机的复位使CPU和其他功能组件处于特定的初始状态,并从该状态开始工作。微控制器的复位条件:必须在两个机器周期(即两个4个振荡周期)内向引脚9添加一个高电平。
    AT89S51是美国ATMEL公司生产的最为广泛运用的CMOS8位单片微型计算机,具有低功耗和高性能的特点,可运用性很高,单个片中安置了4k bytes的可编程的Flash只读程序存储器,材料的选取十分严格,结合公司的加工工艺,不易对储存造成损害,兼容标准8051指令系统及引脚。AT89S51集合了Flash程序存储器于内部,使其可使用在线编程(ISP),又兼容传统方法进行编程,还存有通用8位微处理器于单片芯片中,ATMEL公司有着悠久的硬件加工历史,加工出来的成品功能强大,工艺精湛,价格低廉,AT89S51单片机是性价比十分高的一款热销型号,可灵活应用于各种控制领域。其与市面上其他产品兼容8K字节在系统可编程Flash存储器,拥有1000次的擦写周期和全静态操作的机能,覆盖0Hz~33Hz,设有三级加密程序存储器,外置32个可编程I/O口,可转换计时定时器3个,8个独立运作的终端源,配合全双工UART串行通道低功耗空闲和掉电模式、掉电后中断可唤醒、看门狗定时器、双数据指针、掉电标识符。

    图3.2 单片机引脚示意图

    三、 内容截图



    四、 主要代码

    程序源代码
    
    #include<reg51.h>
    sbit g1=P1^0; 	//位定义
    sbit r1=P1^1; 
    sbit y1=P1^2; 
    sbit g2=P1^3; 
    sbit r2=P1^4; 
    sbit y2=P1^5; 
    unsigned char f=0;
    unsigned char nanbei_time=15;	 //定义南北的时间长度
    unsigned char dongxi_time=11;    //定义东西的时间长度
    unsigned char m; 
    unsigned char code  t[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F,0x6F}; 
    void init_timer0(void) 	   //中断初始化函数
    	{
      	TMOD=0x01;  
      	TH0=(65536-50000)/256;  
     	 TL0=(65536-50000)%256;  
     	 ET0=1;  
     	 EA=1;  
      	TR0=1; 
     	 } 
     void display(unsigned char x) 
     	 {  
      	unsigned char m,n;  
    	m=x/10;  
    	n=x%10;  
    	P0=t[m];  
    	P2=t[n]; 
    	} 
    void timer(void) interrupt 1 using 1  //中断服务函数
    {
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        f++;
        if(f==20)
        {
            f=0;
            m--;
        }
    }
    void main() 
    {
    	m=nanbei_time;
       	P1=0x00;  
    	init_timer0(); 
       	while(1)  {  
      	 do   {   
    	 display(m);   
       		g1=1;  
    		r1=0;
            g2=0;
            r2=1;
            }
            while(m!=3);
            do
            {        
                if(m<=3)
                {
                    y1=~y1;
    				r1=0;
    				g1=0;
                    r2=1;
    				g2=0;
                         }
            display(m);    
            		r1=0;
            g2=0;
            r2=1;
            }
            while(m!=3);
            do
            {        
                if(m<=3)
                {
                    y1=~y1;r1=0;g1=0;
                    r2=1;g2=0; 
                 }
            display(m);    
            }
    		while(m!=0);
    		if(m==0)
    {        m = dongxi_time;
    		y1 = 0;
    		y2 = 0;
        }
    	do{
    	display(m);
    	g1 = 0;
    	r1 = 1;
    	g2 = 1;
    	r2 = 0;
    	}
    	while(m!=3);
    	do{
    	      if(m<=3)
                {    
                    r1=1,g1=0;
                    y2=~y2,r2=0,g2=0;
              }
            display(m);
            }while(m!=0);
                if(m==0)
                {
                    m=nanbei_time;
                    y1=0;
                    y2=0;
                }
        }
    }
    			
    
    
    
    
    .         
    #include<reg52.h>     
    #include<math.h>  
    #define uchar unsigned char
    #define uint  unsigned int
    #define ulang unsigned lang
    static unsigned char count;
    code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; 
             //共阴数码管 0-9
    uchar smg[8];                 //定义缓冲区
    uint  we,ns,h,j;   //ns代表南北,we代表东西
     
       
    int aaa();   //东西红灯亮,南北绿灯,黄灯亮
    int bbb();   //南北红灯亮,东西绿灯,黄灯亮
    int eee();   //第一次完成显示,继续第二次初始化
    void delay(unsigned int cnt)
    {
     while(--cnt);
    }
     
    void display( )
    {
                                     //取每一位的数字
                smg[0]=tab[we/10];     
           smg[1]=tab[we%10];
      smg[2]=0x00;             
                smg[3]=0x00;   
                  smg[4]=0x00;
           smg[5]=0x00;            
                     smg[6]=tab[ns/10];  
      smg[7]=tab[ns%10];
    }
    void main()
    {
         uchar i;
         TMOD |=0x01;  //定时器0 10ms in 12M crystal 用于计时
    TH0=0xd8;     //初值
    TL0=0xf0;
    ET0=1;
    TR0=1;
         EA =1;     
      display();
      while(1)
      {
        
    for(i=0;i<8;i++)    //显示函数,因单片机而异
       {
          P0=smg[i];
     P2=i;
     delay(100);
       }
               ccc();     //进入交通灯控制程序
    display( );    //扫描数码管
           }  
     
    }
    void timer() interrupt 1             //中断函数
    {
       
       TH0=0xd8;                  //重新赋值
       TL0=0xf0;
       count++;
    }
    int aaa()       
    {
              if(j<25)                 //东西红灯计数30秒,南北25秒绿灯亮
          {
          if(j==1) { we=30,ns=25; }
     ns--;
          we--;
          P1=0xde;
     return 0; } 
     
        if(25<=j<30)          //南北黄灯5秒
      {       
          if(j==26)  {  ns=5; } 
         P1=0xee;     
    ns--; 
    we--;   
    return 0;    }
    }
    int bbb()
    {
                if(h<25)   
          {                    //南北红灯30秒,东西绿灯25秒
          if(h==1) { we=25,ns=30; }
     ns--;
          we--;
           P1=0xf3;
     return 0; } 
     
        if(25<=h<30)           //东西黄灯5秒
      {       
          if(h==26)  {  we=5; } 
         P1=0xf5;     
    ns--; 
    we--;   
    return 0;    }
     
         
     }
     int eee()      //一次周期交通灯显示完后,重新赋值,等待第二次
     {
      j=0;
     h=0;
     return 0;
     }
     int ccc()          //交通灯控制函数
     {
         
      if (count==100)       //定时一秒
        {
                count=0;
        j++;            //算法函数
     if ( (j>30)&&(j!=61))  { h++;      bbb();  return 0;   }
        if(j==61)   { eee(); return 0;}
                   aaa();        return 0;   
       } 
     }
     
    
    
    

    四、 文章目录

    目 录

    1 引言 1
    1.1 本设计的目的、意义及应达到的技术要求 1
    1.2 本设计在国内外的发展概况及存在的问题 2
    1.3 本设计的中心要点 4
    2 设计思路 5
    2.1设计原理 6
    2.2方案选择 7
    2.2.1分析问题 7
    3 元器件展示 8
    3.1单片机展示 8
    3.2汇编软件展示 10
    4 系统设计流程概述 11
    4.1设计流程概述 12
    4.2汽车数量检查电路 13
    4.3交通指示灯电路 13
    4.4倒计时显示电路 14
    4.5紧急处理电路 15
    5 系统仿真 15
    6 结论 20
    参考文献 22
    致谢 23
    附录 24

    物联沃分享整理
    物联沃-IOTWORD物联网 » 基于单片机的智能红绿灯控制系统设计方案

    发表评论