基于STC89C52单片机的智能交通灯设计

描述

 

 

功能

 

1、本设计基于STC89C51/52(与AT89S51/52、AT89C51/52通用,可任选)单片机

2、数码管倒计时显示时间。

3、东西和南北方向各有两个数码管,分别显示时间,东西和南北的时间是不一样的哦,要相差黄灯的时间才是正确的。

4、可以分别设置主干道和支干道的通行时间。

5、有紧急模式,可以特种车辆优先通行或交通事故应急处理。

 

操作说明

 

按键依次功能:黄灯长亮(深夜模式)、红灯长亮(禁行)、确定调时时间、时间加、时间减、切换调时方向(东西和南北均可以分别设置通行时间)。单独的是复位按键。

 

参考论文

 

 

STC89C52

 

原理图

 

STC89C52

 

程序源代码

 

//主程序
void main()
{
  TMOD=0X11;             //定时器设置
  TH1=0X3C;    
  TL1=0XB0;
  TH0=0X3C;          //定时器0置初值 0.05S
  TL0=0XB0;
  EA=1;            //开总中断
  ET0=1;            //定时器0中断开启
  ET1=1;             //定时器1中断开启
  TR0=1;            //启动定时0
  TR1=0;               //关闭定时1
    logo();            //开机初始化
  P2=0Xc3;          // 开始默认状态,东西绿灯,南北黄灯   
    sec_nb=sec_dx+5;       //默认南北通行时间比东西多5秒
  while(1)            //主循环
  {   
    key();           //调用按键扫描程序
    display();         //调用显示程序
  }  
}
//函数的定义部分
void key(void)  //按键扫描子程序
{   
  if(k1!=1)              //当K1(时间加)按下时
  {
    display();               //调用显示,用于延时消抖
    if(k1!=1)              //如果确定按下
    {
        TR0=0;                 //关定时器  
      shanruo=0;          //闪烁标志位关
      P2=0x00;          //灭显示
      TR1=0;              //启动定时1
      if(set==0)          //设置键按下
        set_timedx++;       //南北加1S
      else
        set_timenb++;        //东西加1S
      if(set_timenb==100)
        set_timenb=1;
      if(  set_timedx==100)
        set_timedx=1;       //加到100置1
      sec_nb=set_timenb ;     //设置的数值赋给东西南北
      sec_dx=set_timedx;      
        do
       { 
        display();         //调用显示,用于延时
      }
      while(k1!=1);       //等待按键释放
    }
  }


  if(k2!=1)              //当K2(时间减)按键按下时
  {    
    display();               //调用显示,用于延时消抖  
    if(k2!=1)            //如果确定按下
    {  
       TR0=0;                 //关定时器0  
      shanruo=0;          //闪烁标志位关
      P2=0x00;          //灭显示
      TR1=0;            //关定时器1  
      if(set==0)
        set_timedx--;        //南北减1S
      else
        set_timenb--;        //东西减1S
      if(set_timenb==0)
        set_timenb=99;  
      if(  set_timedx==0 )
        set_timedx=99;       //减到1重置99
      sec_nb=set_timenb ;       //设置的数值赋给东西南北
      sec_dx=set_timedx;
        do  
        { 
        display();           //调用显示,用于延时
      }
      while(k2!=1);         //等待按键释放
    }
  }


  if(k3!=1)              //当K3(确认)键按下时
  {  
    display();               //调用显示,用于延时消抖
    if(k3!=1)            //如果确定按下
    {
      TR0=1;              //启动定时器0
      sec_nb=set_timenb;        //从中断回复,仍显示设置过的数值
      sec_dx=set_timedx;        //显示设置过的时间
      TR1=0;              //关定时器1  
      if(set==0)            //时间倒时到0时
      { 
        P2=0X00;           //灭显示
        Green_dx=1;            //东西绿灯亮
        Red_nb=1;          //南北红灯亮
        sec_nb=sec_dx+5;       //回到初值
      }
      else 
      { 
        P2=0x00;          //南北绿灯,东西红灯
        Green_nb=1;
        Red_dx=1;
        sec_dx=sec_nb+5; 
      }
    }
  }


  if(k4!=1)              //当K4(切换)键按下
    {
    display();               //调用显示,用于延时消抖
    if(k4!=1)            //如果确定按下
    {  
       TR0=0;            //关定时器0  
      set=!set;          //取反set标志位,以切换调节方向
      TR1=0;            //关定时器1
      dx_nb=set;
      do
      {
        display();          //调用显示,用于延时
      }        
      while(k4!=1);        //等待按键释放
    }
  }  


  if(k5!=1)              //当K5(禁止)键按下时
  {
       display();               //调用显示,用于延时消抖
       if(k5!=1)            //如果确定按下
       {   
        TR0=0;            //关定时器
      P2=0x00;          //灭显示
      Red_dx=1;
      Red_nb=1;          //全部置红灯
      TR1=0;
      sec_dx=00;          //四个方向的时间都为00
      sec_nb=00;
      do
      {
        display();         //调用显示,用于延时
      }  
      while(k5!=1);      //等待按键释放  
       }
  }
  if(k6!=1)              //当K6(夜间模式)按下 
  {
       display();               //调用显示,用于延时消抖 
       if(k6!=1)            //如果确定按下
       {   
        TR0=0;            //关定时器
      P2=0x00;
      TR1=1;
      sec_dx=00;          //四个方向的时间都为00
      sec_nb=00;
      do
      {
        display();         //调用显示,用于延时
      }  
      while(k6!=1);      //等待按键释放  
       }
  }
}

 

 

 审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分