基于51单片机的交通信号灯系统设计

功能:

十字路口交通灯控制程序: 正常时,EW方向计时60s,SN方向计时40s 若按时间加按键(Add_Button)按钮,EW、SN方向各加5s,不可大于99s,79s 若按时间减按键(Reduces_Button)按键,EW、SN方向各减5s,不可小于40s,20s 若按EW方向强制通行(QZ_EW_Btton)按钮,EW方向强制通行,SN方向禁止通行 若按SN方向强制通行(QZ_SN_Btton)按钮,SN方向强制通行,EW方向禁止通行。

仿真原理图:

/ #define TRAFFIC_GLOBAL 1 

#include "TRAFFIC.H" 

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

* 函数名称:延时子程序

* 功    能:延时,给LED显示的延时时间

* 入口参数:时间参数

* 出口参数:无

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

void Delay(uchar     a)

         {

                  uchar       i;

                  i=a;

                  while(i--){;}

         }

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

* 函数名称:显示子函数

* 功    能:EW方向,SN方向主干道数码管显示驱动

* 入口参数:无

* 出口参数:无

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

void Display(void)

         {

                  char h,l;

                  h=Time_EW/10;              //EW方向计时的十位数

                  l=Time_EW%10;              //EW方向计时的个位数

          P0=table[l];              //显示EW计时时间的低位

                  EW_LED2=1;

                  Delay(2);

                  EW_LED2=0;

             P0=table[h];            //显示EW计时时间的高位

                  EW_LED1=1;

                  Delay(2);

                  EW_LED1=0;

                  h=Time_SN/10;                //SN方向计时的十位数

                  l=Time_SN%10;               //SN方向计时的个位数

                  P0=table[l];              //显示SN计时时间的低位

                  SN_LED2=1;

                  Delay(2);

                  SN_LED2=0;

             P0=table[h];            //显示SN计时时间的高位

                  SN_LED1=1;

                  Delay(2);

                  SN_LED1=0;

                 

                  h= EW1/10;                      //直行时间的十位

                  l= EW1%10;                      //直行时间的个位

                  P0=table[l];              //时间的个位显示

                  Time_Show_LED1=1;

                  Delay(2);

        Time_Show_LED1=0;

                  P0=table[h];             //时间的十位显示

                  Time_Show_LED2=1;

                  Delay(2);

             Time_Show_LED2=0;

}

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

* 函数名称:外部0中断服务程序

* 功    能:中断,检测按钮的类别,执行相应的操作;

            若Add_Button==0,通行时间加5s ;

            若Reduces_Button==0,通行时间减5s ;

            若Busy_Btton==0,开繁忙信号灯,关特殊信号灯,通行时间45s,30s;

            若Add_Button==0,关繁忙信号灯,开特殊信号灯,通行时间75s,55s;

* 入口参数:无

* 出口参数:无

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

void EXINT0(void) interrupt 0 using 0

         {

                  EA = 0;                    //关中断

if(Add_Button==0)                  //时间加

       {

            EW1+=5;                                      //通行时间加5s

            SN1+=5;

              if(EW1>=100)                 //通行时间不得大于100s,80s

                             {

                               EW1=99;

                               SN1=79;

               }

            }

if(Reduces_Button==0)             //时间减

       {

            EW1-=5;                         //通行时间减5s

            SN1-=5;

            if(EW1<=40)                  //通行时间不得小于40s,20s

              {

                               EW1=40;

                 SN1=20;

               }

                      }              

                  EA = 1;                  //开中断

         }

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

* 函数名称:外部中断1

* 功    能:中断,当遇到紧急情况,需要人工控制时,强制直行的函数处理

           若QZ_EW_Btton按下时,EW方向绿灯亮,SN方向红灯亮 ,并点亮QZ_EW_LED指示灯

                     若QZ_SN_Btton按下时,EW方向红灯亮,SN方向绿灯亮 ,并点亮QZ_SN_LED指示灯

* 入口参数:无

* 出口参数:无

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

void EXINT1(void) interrupt 2 using 2

{

EA = 0; 

if(QZ_EW_Btton==0)              //EW方向强制通行按键是否按下

        {          

                          QZ_EW = ~QZ_EW;        //

                          QZ_SN = 0;                                                                        

                          if(QZ_EW) 

                          {QZ_EW_LED = 1;

                           QZ_SN_LED = 0;}

                          else           QZ_EW_LED = 0;

        }

if(QZ_SN_Btton==0)             //测试按键是否按下,按下为特殊状态

        {

                      QZ_SN = ~QZ_SN;

                          QZ_EW = 0;    

                          if(QZ_SN) 

                          {QZ_SN_LED = 1;

                           QZ_EW_LED = 0;}

                          else           

                           QZ_SN_LED = 0;

             }                                      

EA = 1;                      

}

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

* 函数名称:main()

* 功    能:主函数

* 入口参数:无

* 出口参数:无

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

void main(void)

{

         QZ_EW_LED = 0;

         QZ_SN_LED = 0;

         QZ_EW = 0;

         QZ_SN = 0;

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

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

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

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

         TL0=(65536-50000)%256;

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

         ET0=1;                      //开定时中断

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

         EX1=1;                      //开外部INT1中断

    TR0=1;                      //启动定时

     while(1)

{                                  /*******SN通行,EW红灯*** ***************/

                Flag_EW_Yellow=0;             //EW关黄灯显示信号

                                   Time_EW=EW;       

                                   Time_SN=SN;         

                                   while(Time_SN>=5&QZ_EW == 0&QZ_SN == 0)

                              {P1=LIGHT[0];                       //SN通行,EW红灯

                           Display();}

                                   /*******SN黄灯亮,等待左拐信号,EW红灯***/

                              P1=0x00;

                                   while(Time_SN>=0&QZ_EW == 0&QZ_SN == 0)

                             {Flag_SN_Yellow=1;           //SN开黄灯信号位

                              EW_Red=1;                     //SN黄灯亮,等待左拐信号,EW红灯                                

                               Display();

                                   }

                                   /*******SN左拐绿灯亮,EW红灯*************/

                              Flag_SN_Yellow=0;             //SN关黄灯显示信号

                                   Time_SN=SNL;                                                                     

                                   while(Time_SN>=5&QZ_EW == 0&QZ_SN == 0)

                                   {P1=LIGHT[2];                 //SN左拐绿灯亮,EW红灯

                                    Display();}

                            /*******SN黄灯亮,等待停止信号,EW红灯******/

                                   P1=0x00;

                                   while(Time_SN>=0&QZ_EW == 0&QZ_SN == 0)

                             {Flag_SN_Yellow=1;           //SN开黄灯信号位

                              EW_Red=1;                     //SN黄灯亮,等待停止信号,EW红灯                              

                              Display();}                   

                        

                                   /****EW黄灯亮,等待停止信号,SN红灯***/

                                   P1=0X00;                                                      

                                   while(Time_EW>=0&QZ_EW == 0&QZ_SN == 0)

                             {Flag_EW_Yellow=1;               //EW开黄灯信号位

                              SN_Red=1;                       //EW黄灯亮,等待停止信号,SN红灯 

                              Display();}

                                   /*********EW方向强制通行**************/

                                   while(QZ_EW)

                                   {Time_EW = 88;

                                    Time_SN = 88;

                                    EW1 = 88;                                                                 

                                    Display();

                                    P1=LIGHT[4];                         //EW通行,SN红灯      

                                    EW1 = 60;

                                    SN1 = 40;} 

                                   /*********SN方向强制通行**************/

                                   while(QZ_SN)

                                   {Time_EW = 88;

                                    Time_SN = 88;

                                    EW1 = 88;                                                                 

          

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

白茶丫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值