基于51及PROTEUS的十字路口交通灯控制系统的设计与仿真

1、前言

1、十字路口的交通控制系统指挥着人和各种车辆的安全运行,对交叉口实行科学的管理与控制是交通控制工程的重要研究课题,是保障交叉口的交通安全和充分发挥交叉口的通行能力的重要措施,是解决城市交通问题的有效途径。交通灯信号灯的出现是人类历史上的一次重大改革,使人类的聚居生活,产生了深远的影响。使交通得以有效管制,对于疏导交通流量,提高道路通行能力,减少交通事故有明显效果。如何采用合适的控制方法,最大限度利用好耗费巨资修建的城市高速道路,缓解主干道与匝道、城区同周边地区的交通拥堵状况,越来越成为交通运输管理和城市规划部门亟待解决的主要问题。随着电子技术的发展,利用单片机技术对交通灯进行智能化管理,已成为目前广泛采用的方法。

2、此十字路口交通灯控制系统,分东西道和南北道,设东西道为A道,南北道为B道。规定:A道放行时间为2分钟,B道放行1.5分钟;绿灯放行,红灯停止;绿灯转红灯时,黄灯亮2秒钟;若有紧急车辆要求通过时,此系统应能禁止普通车辆,而让紧急车辆通过。

3、应用单片机实现对交通灯的控制,在十字路口用红,黄,绿的指示灯,加上四个以倒计时显示的数码管来控制交通。考虑到紧急车辆,设计紧急车辆开关。

2、正文

2.1 芯片介绍

      AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

主要特性:

·与MCS-51 兼容

·4K字节可编程闪烁存储器

·寿命:1000写/擦循环

·数据保留时间:10年

·全静态工作:0Hz-24MHz

·三级程序存储器锁定

·128×8位内部RAM

·32可编程I/O线

·两个16位定时器/计数器

·5个中断源

·可编程串行通道

·低功耗的闲置和掉电模式

·片内振荡器和时钟电路

2.2 交通灯状态

  

S1:东西通行,南北禁止                   S2:东拐南,西拐北通行

S3:南北通行,东西禁止                   S4:北拐东,南拐西通行

S1状态120秒,S2状态20秒,S3状态90秒,S4状态20秒,循环执行。

2.3 设计步骤

1,利用proteus 7.5 sp3仿真软件绘制仿真实例

1用traffic lights和一个绿色LED灯表示红、黄、绿,以及允许左拐的信号灯。

2用P0口控制交通灯,用P1口控制数码管的段选,P2口控制数码管的位选。

3P3.6和P3.7接收中断信号并返回给INT0接口处理。

2,利用Keil软件按要求编写程序实现相应功能。

三、硬件设计

3.1 通过proteus 7.5 sp3设计如下仿真图:

S1状态:

 

                                                                     

黄灯亮:

                                       

S2状态:

 

黄灯亮:

                                                                                                                     

S3状态:

黄灯亮:

S4状态:

黄灯亮:

系统仿真调试

系统的仿真调试借助于PROTEUS仿真器,在进行系统仿真的连续调试之前要先进行软件的初调,就是要使各个子程序模块运行正确,程序的运行流程正确,生成hex文件。

附:

#include<reg51.h>

#define uchar unsigned char

#define uint unsigned int

sbit Button_A=P3^6;

//sbit Button_B=P3^7;

uchar table[ ]={0x3f,0x06,0x5b,0x4f,0x66,

                       0x6d,0x7d,0x07,0x7f,0x6f};              //共阴段码表0--9

char       Time_EW;                                                      //东西方向倒计时

char       Time_SN;                                                      //南北方向倒计时

uchar EW=89,SN=89,EWJ=29,SNJ=29,EWL=19,SNL=19; //程序初始化赋值

uchar count=0;

/********************************************************/

void delay(unsigned char i)                                        //延时i ms

{

              unsigned char j;

              while(i--)

              {

                     for(j=0;j<115;j++);

              }

}

/******************************************************/

void Display(void)

{            

              P2=0x08;

        P1=table[Time_EW/10];          

              delay(2);

              P2=0x04;

              P1=table[Time_EW%10];        

              delay(2);

                           

           P2=0x02;

              P1=table[Time_SN/10];          

              delay(2);             

              P2=0x01;

          P1=table[Time_SN%10];          

              delay(2);

}

/******************T0中断*************************************/

void time_0() interrupt 1

{

       TH0=0x3c;

       TL0=0xb0;

       count++;

       if(count==20)

       {

              Time_SN--;

              Time_EW--;

              count=0;

       }

}

void int0(void) interrupt 0

{     

       while(Button_A==0)

       {     

              P0=0x09;                             //所有都是红灯

              P1=0;                                   //关数码管

       }                 

}     

/******************主程序*******************************/

void main()

{    

       TR0=1;                                      //启动定时器0             

   TMOD=0x01;                             //定时器工作于方式1

       TH0=(65536-50000)/256;        //定时器赋初值

       TL0=(65536-50000)%256;

       EA=1;                                       //CPU开中断总允许

       ET0=1;                                      //开定时中断

       EX0=1;                                      //开外部INTO中断

       IT0=1;                                       //INT0负跳变触发

       while(1)

       {

      

       /*S1*****A道放行*******/ //S1状态

              Time_EW=EW;                         //90s

              Time_SN=SN;                           //90s

              while(Time_EW>=0)

              {     

                     P0=0x0c;

                     Display();

              }

       /******A道+30s********/

              Time_SN=SNJ;                   //SNJ=29

              Time_EW=EWJ;                //EWJ=29

              while(Time_EW>=2)

              {

                     P0=0x0c;

                     Display();

              }

       /******A道黄灯********/

              while(Time_EW>=0)

              {

                     P0=0x0a;

                     Display();

              }

       /*S2*****A道左拐******/          //S2状态

              Time_SN=SNL;                  //20 s

              Time_EW=EWL;             //20 s

              while(Time_EW>=2)

              {

                     P0=0x80;

                     Display();

              }

       /******A道黄灯*******/

              while(Time_EW>=0)

              {

                     P0=0x0a;

                     Display();

              }

       /*S3*****B道放行*****/            //S3状态

              Time_EW=EW;                         //90s

              Time_SN=SN;                           //90s

              while(Time_EW>=2)

              {

                     P0=0x21;

                     Display();

              }

       /******B道黄灯*******/

              while(Time_EW>=0)

              {

                     P0=0x11;

                     Display();

              }

       /*S4*****B道左拐*****/            //S4状态

              Time_SN=SNL;                  //20 s

              Time_EW=EWL;                //20 s

              while(Time_EW>=2)

              {

                     P0=0x40;

                     Display();

              }

       /******B道黄灯******/

              while(Time_EW>=0)

              {

                     P0=0x11;

                     Display();

              }     

       }

}

  • 20
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值