找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2135|回复: 2
打印 上一主题 下一主题
收起左侧

求基于51单片机的交通灯控制系统设计

[复制链接]
跳转到指定楼层
楼主
ID:158732 发表于 2017-1-2 11:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用AT89C51单片机控制一个交通信号灯系统。设A车道与B车道交叉组成十字路口,A是主车道,B是支道。设计要求如下:
1)        用发光的二极管模拟交通信号灯,用按键开关模拟车辆检测信号;
2)        正常情况下,A、B车道轮流放行,A车道放行50s,其中5s用于警告;B车道放行30s,其中5s用于警告。
3)        在交通繁忙时,交通信号灯控制系统应有手控开关,可人为地改变信号灯的状态,以缓解交通拥堵情况。在B车道放行期间,若A车道有车而B车道无车,按下开关K1使A车道放行15s;在A车道放行期间,若B车道有车而A车道无车,按下开关K2使B车道放行15s。
4)        有紧急车辆通过时,按下K3开关使A、B车道均为红灯,禁行20s。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:196401 发表于 2017-5-4 10:49 | 只看该作者
#include<reg52.h> #include<bstv51.h> #define uchar unsigned char #define uint  unsigned int  sbit nbp1=P0^4;//南北方向数码管第一位; sbit nbp2=P0^5;//南北方向数码管第二位; sbit dxp1=P0^6;//东西方向数码管第一位; sbit dxp2=P0^7;//东西方向数码管第二位;  sbit hdnb=P0^2;//南北方向红灯; sbit hddx=P0^0;//东西方向红灯; sbit ldnb=P0^3;//南北方向绿灯; sbit lddx=P0^1;//东西方向绿灯; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,                       0x6d,0x7d,0x07,0x7f,0x6f};        //0-9 uchar num=30;num2,shi,ge;    void delayms(xms)           //延时函数x毫秒函数 {    uint i,j;    for(i=xms;i>0;i--)      for(j=110;j>0;j--); }  void display(uchar shi,uchar ge) //南北数码管显示函数 {     P1=table[shi]; nbp1=0;                                                        //选中南北方向数码管第一位 delayms(3); nbp1=1;                                                //关闭南北方向数码管第一位 P1=table[ge]; nbp2=0;                                                //选中南北第二位 delayms(3); nbp2=1;                                                //关闭南北方向数码管第二位   P2=table[shi]; dxp1=0;                                                //选中南北方向数码管第一位 delayms(3); dxp1=1;                                                //关闭南北方向数码管第一位 P2=table[ge]; dxp2=0;                                                //选中南北第二位 delayms(3); dxp2=1;                 }  void T1_time()interrupt 3                        //定时器1中断函数 {    TH1=(65536-45872)/256;   TL1=(65536-45872)%256;   num2++;         if(num2==20)   {    num2=0;                                                   //说明计时够一秒    num--;    if(num==0)     {          lddx=~lddx;                                                        hdnb=~hdnb;                                                    ldnb=~ldnb;        hddx=~hddx;            num=30;      }    }         shi=num/10;         ge=num%10; }   void main()                                           //主函数 {    TMOD=0x10;    TH1=(65536-45872)/256;    TL1=(65536-45872)%256;    EA=1;    ET1=1;    TR1=1;    lddx=0;                                                //东西方向绿灯亮    hdnb=0;                                            //南北方向红灯亮    ldnb=1;    hddx=1;  P1=0x00; P2=0x00; nbp1=1; dxp1=1; dxp2=1; nbp2=1;     while(1)    {    display(shi,ge);     } }

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:500398 发表于 2019-5-29 09:35 | 只看该作者
  /*#include<REG51.H>        */                                
#include<AT89X51.H>         
#define uchar unsigned char  
uchar code duanma[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
uchar code weima[4]={0x0D,0x0E,0x07,0x0B};
uchar code deng[4]={0xDE,0xDD,0xF3,0xEB};
char SN=50,WE=60;         
char SN_G=50,WE_G=40,Y=10;   
uchar i,k=0,count=0;   
void delayms(uchar ms);
void light();       
void led();
sbit  K0=P3^7;
sbit  K1=P3^6;
sbit  K2=P3^3;
sbit  K3=P3^5;
/*程序初始化*/
void init(void)
{   
        /*12MHz */
    TMOD=0x01;
    TH1=(65536-50000)/256;         /*0x3C*/
    TL1=(65536-50000)%256;         /*0xB0*//*计50000个数,用时50ms*/
    IT0=1;/*外部中断0为边沿触发方式*/
    ET0=1;/*允许T0中断*/
    TR0=1;/*启动计数器*/
    EA=1;/*CPU开放总中断*/
    EX0=1;/*允许外部中断0中断,即允许响应端口P3^2(K4)中断*/
    EX1=1;/*允许外部中断1中断,即允许响应端口P3^3(K2)中断*/
}
/*延时ms毫秒*/
void delayms(uchar ms)
{
    uchar i;
           while(ms--)
          {
        for(i=0;i<200;i++)
                {}
          }       
}  
/*中断0处理程序*/
void int0(void) interrupt 0
{   
    EA=0;/*CPU禁止响应一切中断*/
        P1=0xF6,P0=duanma[0];/*东西南北方向均红灯亮,P0口输出0*/
       
    while(1)/*无条件循环*/
        {
           P2=weima[0],P0=duanma[(SN_G+Y)%10];/*南北方向数码管显示可通行时间的个位*/
       delayms(10); /*延时*/
                  
           P2=weima[1],P0=duanma[(SN_G+Y)/10];/*南北方向数码管显示可通行时间的十位*/
           delayms(10); /*延时*/
                  
       P2=weima[2],P0=duanma[(WE_G+Y)%10];/*东西方向数码管显示可通行时间的个位*/
           delayms(10); /*延时*/
                  
       P2=weima[3],P0=duanma[(WE_G+Y)/10];/*东西方向数码管显示可通行时间的十位*/
           delayms(10); /*延时*/

           /*设置南北方向通行时间*/
           if(K0==0)          /*P3^7=0*/
           {  
          delayms(20);/*延时,把抖动的时间抛掉*/
          if(K0==0)
                  {
             while(K0==0)/*当松开K0开关时,跳出空循环,执行后面的程序*/
             {
             }
                         SN_G++;/*南北方向绿灯时间+1*/
             if(SN_G==100)
             SN_G=0;/*由于使用的是两位数码管,当南北方向绿灯时间加到100后清零*/
          }
           }
           /*设置东西方向通行时间*/
           if(K1==0)          /*P3^6=0*/
           {  
             delayms(20);/*延时,把抖动的时间抛掉*/
             if(K1==0)
                     {
               while(K1==0)/*当松开K1开关时,跳出空循环,执行后面的程序*/
               {
               }
                           WE_G++;/*东西方向绿灯时间+1*/
               if(WE_G==100)
               WE_G=0;/*由于使用的是两位数码管,当东西方向绿灯时间加到100后清零*/
             }
           }
           /*返回*/
           if(K3==0)   /*P3^5=0*/
       {  
                delayms(20);/*延时,把抖动的时间抛掉*/
                    if(K3==0)
                    {
                        while(K3==0)/*当松开K3开关时,跳出空循环,执行后面的程序*/
                           {
                           }
                           count=0;/*清零*/
                           k=0;/*南北方向通车,东西方向不通车*/
                           SN=SN_G,WE=SN_G+Y;/*南北方向显示时间为南北方向绿灯通行时间,东西方向显示时间为南北方向绿灯通行时间加黄灯闪亮时间*/
               light();/*调用交通灯函数*/
                           led(); /*调用数码管函数*/
                           EA=1; /*CPU开放总中断*/       
                   break;/*跳出*/       
                    }                      
       }
    }
}
/*中断1处理程序*/       
void int1(void) interrupt 2
{
        P1=0xF6,P0=duanma[0];/*东西南北方向均红灯亮,P0口输出0*/
    EA=0;/*CPU禁止响应一切中断*/
        TR0=!TR0;/*计数器停止工作*/       
    while(1)/*无条件循环*/
        {/*数码管扫描程序,*/
           P2=weima[0];/*显示南北方向个位*/
           delayms(10);/*延时*/
           P2=weima[1];/*显示南北方向十位*/
           delayms(10);/*延时*/
           P2=weima[2];/*显示东西方向个位*/
           delayms(10);/*延时*/
           P2=weima[3];/*显示东西方向十位*/
           delayms(10);/*延时*/
           /*返回*/   
       if(K3==0)    /*P3^5=0*/
       {  
              delayms(20);/*延时,把抖动的时间抛掉*/
                  if(K3==0)
                  {
                    while(K3==0)/*当松开K3开关时,跳出空循环,执行后面的程序*/
                        {
                        }
                    EA=1;/*CPU开放总中断*/       
                        TR0=!TR0;/*启动计数器*/       
                break;/*跳出*/       
                  }                      
       }
        }
}
/*键盘程序*/
void  key()
{
        /*南北有车而东西无车*/
    if(K0==0)          /*K0=0*/
    {  
       delayms(20);/*延时,把抖动的时间抛掉*/
       if(K0==0)                         
       {
          while(K0==0)/*当松开K0开关时,跳出循环,执行后面的程序*/
          {  
            light();/*调用交通灯函数*/
                        led(); /*调用数码管函数*/
          }
                  count=0;/*清零*/
          k=0;/*南北方向通车,东西方向不通车*/
          SN=SN_G,WE=SN_G+Y;/*南北方向显示时间为南北方向绿灯通行时间,东西方向显示时间为南北方向绿灯通行时间加黄灯闪亮时间*/
          light();/*调用交通灯函数*/
                  led(); /*调用数码管函数*/
       }
    }
    /*南北无车而东西有车*/
    if(K1==0)          /*K1=0*/
    {  
       delayms(20);/*延时,把抖动的时间抛掉*/
       if(K1==0)
       {
          while(K1==0)/*当松开K1开关时,跳出循环,执行后面的程序*/
          {
            light();/*调用交通灯函数*/
                        led(); /*调用数码管函数*/
          }
                  count=0;/*清零*/
          k=1;/*南北方向不通车,东西方向通车*/
          SN=WE_G+Y,WE=WE_G;/*南北方向显示时间为东西方向绿灯通行时间加黄灯闪亮时间,东西方向显示时间为东西方向绿灯通行时间*/
          light();/*调用交通灯函数*/
                  led(); /*调用数码管函数*/
           }
        }
}
/*定时函数*/
void time1(void) interrupt 1
{
        TH0=0x3c;
        TL0=0xb0;/*计50000个数,用时50ms*/
        count++;         /*自增运算*/
        if(count>=20)/*当count大于或等于20时,历时1s,执行程序*/
        {
           SN--;/*自减运算*/
           WE--;/*自减运算*/
           count=0;/*清零*/
           if(SN==0||WE==0)/*当SN=0或者WE=0时,执行程序*/
           {
          k++;/*自增运算*/
          if(k>3)/*当k>3时,执行程序*/
          k=0;/*清零*/
          switch(k)/*switch        语句*/
          {   
             case 0:SN=SN_G,WE=SN_G+Y;break;/*南北方向显示时间为南北方向绿灯通行时间,东西方向显示时间为南北方向绿灯通行时间加黄灯闪亮时间*/
             case 1:SN=Y,WE=Y;break;        /*东西南北方向显示时间均为黄灯闪亮时间*/
             case 2:SN=WE_G+Y,WE=WE_G;break;/*南北方向显示时间为东西方向绿灯通行时间加黄灯闪亮时间,东西方向显示时间为东西方向绿灯通行时间*/
             case 3:SN=Y,WE=Y;break;        /*东西南北方向显示时间均为黄灯闪亮时间*/
          }
       }
        }
}
/*交通灯函数*/
void  light()
{         
    P1=deng[k];/*交通灯对应着k的值变化*/
    if(P1==deng[1]&&count==0)/*当南北方向亮黄灯且count=0时,执行程序*/
        {
           TH1=(65536-50000)/256;          
       TL1=(65536-50000)%256;/*延时50ms*/          
           P1=0xDF;/*南北方向黄灯熄灭,东西方向亮红灯*/
        }
    else
        if(P1==deng[3]&&count==0)/*当东西方向亮黄灯且count=0时,执行程序*/
        {
           TH1=(65536-300000)/256;          
       TL1=(65536-300000)%256;/*延时50ms*/
           P1=0xFB;/*南北方向亮红灯,东西方向黄灯熄灭*/
        }
}
/*数码管函数*/
void led()
{
        P2=weima[0],P0=duanma[SN%10];/*显示南北方向个位*/
    delayms(10);/*延时*/
        P2=weima[1],P0=duanma[SN/10];/*显示南北方向十位*/
        delayms(10);/*延时*/         
        P2=weima[2],P0=duanma[WE%10];/*显示东西方向个位*/
        delayms(10);/*延时*/        
        P2=weima[3],P0=duanma[WE/10];/*显示东西方向十位*/
        delayms(10); /*延时*/
}
/*主函数*/

void main(void)
{
        init();/*调用程序初始化函数*/
    while(1)/*无条件循环*/
        {
           key();/*调用键盘程序*/
           light();/*调用交通灯函数*/
           led(); /*调用数码管函数*/  
        }
}  


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表