標(biāo)題: 基于51單片機(jī)的交通燈原理圖+程序 [打印本頁]

作者: mazhibing    時(shí)間: 2019-7-11 16:23
標(biāo)題: 基于51單片機(jī)的交通燈原理圖+程序
花了一個(gè)星期制作的交通燈仿真程序+原理圖,通過數(shù)碼管顯示路口的時(shí)間,通過led顯示紅綠燈。


#include<reg51.H>      // 對(duì)單片機(jī)的口進(jìn)行了定義
#define uint unsigned int
#define uchar unsigned char
uchar code a[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//段碼組合,共陽極
uchar code b[4]={0x01,0x02,0x04,0x08}; //位碼組合  
uchar code c[4]={0xcc,0xd4,0x78,0xb8};/*P1 綠紅、黃紅、紅綠、紅黃*/
     
//12MHz     
//*************************************************************************************
uchar NB=25,DX=30,NBG=25,DXG=15,H=5;    /*數(shù)碼管顯示值設(shè)置*/
uchar  i,k=0,cnt=0,j=0;
sbit K0=P3^4;      /*支干道通行*/
sbit K1=P3^5;      /*主干道通行*/
sbit K4=P3^6;      /*返回*/
sbit K3=P3^2;   /*設(shè)置時(shí)間*/
sbit K2=P3^3;   /*緊急剎車*/
void delay(uchar t);  /*定義延時(shí)程序*/
void key();    /*定義鍵盤程序*/
void display();   /*定義顯示程序*/
void settime();  /*定義時(shí)間設(shè)置顯示程序*/
//*************************程序初始*********************************************
void init(void)
{
TMOD=0x01;     /*使用定時(shí)器0模式一*/
TH0=0x3c;     /*(65536-5000)/256*/
TL0=0xb0;     /*(65536-5000)%256*/
IT0=1;      //開中斷
ET0=1;
TR0=1;
EA=1;
EX0=1;
EX1=1;
P1=c[k];      //開啟交通燈
}
//*************************中斷0處理程序***************************************
void int0(void) interrupt 0   // 通行時(shí)間設(shè)置
{  
  EA=0;
  P1=0xd8;    /*紅燈全亮*/
  
for(;;)
{
    settime();
     if(K1==0)       /*P3^6=0設(shè)置主干道通行時(shí)間*/
    {  
          delay(40);
          if(K1==0)
    {
             while(!K1)
             {settime();}
     DXG++;    /*主干道通行時(shí)間加1*/
             if(DXG==100)
             DXG=0;   
          }
    }
   
     if(K0==0)        /*P3^5=0設(shè)置支干道通行時(shí)間*/
    {  
             delay(40);
             if(K0==0)
       {
               while(!K0)
               {settime();}
      NBG++;      /*支干道通行時(shí)間加1*/
               if(NBG==100)
               NBG=0;  
             }
    }
   
    if(K4==0)          /*P3^7=0返回*/
       {  
         delay(40);
      if(K4==0)
      {
         while(!K4)
      {
      }
             k=0;P1=c[k];
      NB=NBG,DX=NBG+H;
         display();
      EA=1;
   
            break;
      }               
       }
    }
}

//***********************************中斷1處理程序********************
void int1(void) interrupt 2      //緊急情況
{              
        /*東西南北紅燈亮*/
EA=0;         
TR0=!TR0;           /*停止計(jì)數(shù)*/
for(;;)           /*主支干道顯示全為0*/
{  
  P1=0xd8,
  P0=a[0];
    P2=b[0];
    delay(20);
   
     P2=b[1];
    delay(20);
    P2=b[2];
    delay(20);
    P2=b[3];
    delay(20);
   
    if(K4==0)         /*返回*/
{
   delay(20);
  EA=1;
     
  P1=c[k];       /*返回緊急前狀態(tài)開始計(jì)數(shù)*/
  TR0=!TR0;      /*重啟計(jì)數(shù)*/
  break;         
  }
}
}
void time1(void) interrupt 1      /*交通燈控制程序*/
{
TH0=0x3c;          /*定時(shí)50ms*/
TL0=0xb0;            
cnt++;

if(cnt>=20)            /*每20*50ms=1s自減一*/
{
  NB--;
  DX--;
  cnt=0;
  if(NB==0||DX==0)
  {
   k++;
   if(k>3)         /*k取0,1,2,3*/
   k=0;
   switch(k)
   {
    case 0:NB=NBG,DX=NBG+H;j=0;P1=c[k];break;   /*主干道通行顯示綠紅*/
       case 1:NB=H;j=1;P1=c[k];break;        /*主干道黃燈閃爍*/
    case 2:NB=DXG+H,DX=DXG;j=0;P1=c[k];break;   /*支干道通行顯示紅綠*/
    case 3:DX=H;j=2;P1=c[k];break;        /*支干道黃燈閃爍*/
   }
  }   
}
}
void delay(uchar t)    //延時(shí)程序延時(shí)0.1*nms   
{
  uchar i;
  do
   {
     for(i=0;i<20;i++)
     ;;;
   } while(t--);
}
void settime()
{
    P2=b[0],P0=a[(NBG+H)%10]; /*顯示主干道通行時(shí)間  */
       delay(20);
   
    P2=b[1],P0=a[(NBG+H)/10];
    delay(20);
   
    P2=b[2],P0=a[(DXG+H)%10];  /*顯示支干道通行時(shí)間*/
    delay(20);
           
       P2=b[3],P0=a[(DXG+H)/10];
    delay(20);
}
void  key()    //鍵盤程序用KO K1模擬一道有車一道無車
{
     if(K1==0)        /*主干道有車支干道無車*/
    {  
       delay(40);
       if(K1==0)   
       {
          while(!K1)
          {  
            display();
          }
      k=0,P1=c[k];cnt=0;
          NB=NBG, DX=NBG+H;
         display();
       }
    }
    if(K0==0)         /*支干道有車主干道無車*/
    {  
       delay(40);
       if(K0==0)
       {
          while(!K0)
          {
           display();
          }
         k=2,P1=c[k];cnt=0;
          NB=DXG+H,DX=DXG;
            display();
    }
}
}
void display()       //顯示程序
{
  P2=b[0],P0=a[NB%10];      /*由k的不同值進(jìn)入確定顯示數(shù)值*/
  delay(20);

  P2=b[1],P0=a[NB/10];
  delay(20);

  P2=b[2],P0=a[DX%10];
  delay(20);
         
  P2=b[3],P0=a[DX/10];
  delay(20);
}
void main(void)
{  //主程序
init();

for(;;)
{
   display();
   key();
   
   //黃燈閃爍程序
   while(j==1)           /*主干道黃燈閃爍*/
       {              
       P1=0xdc;         /*給黃燈一高電平黃燈滅*/   
    for(i=83;i>0;i--){display();}      /*執(zhí)行for循環(huán)延時(shí)*/   
    P1=c[k];         /*再給黃燈一低電平黃燈亮*/
    for(i=83;i>0;i--){display();}
  }
while(j==2)
         {              /*支干道黃燈閃爍*/
      
    P1=0xf8;
    for(i=83;i>0;i--){display();}
    P1=c[k];
    for(i=83;i>0;i--){display();}
   }           
   }
}


作者: @qaz    時(shí)間: 2019-9-15 17:44
為什么數(shù)碼管會(huì)亂碼
作者: 245624863255    時(shí)間: 2020-4-1 13:56
@qaz 發(fā)表于 2019-9-15 17:44
為什么數(shù)碼管會(huì)亂碼

你好,你弄這個(gè)程序了嗎?可以發(fā)我一份嗎?
作者: 1187A    時(shí)間: 2020-12-3 10:02
你好,怎樣讓南北跟東西的燈亮的時(shí)間不一樣
作者: 冷雨叟    時(shí)間: 2021-6-24 17:13
你好,這個(gè)設(shè)計(jì)都做完后結(jié)果紅綠燈按了啟動(dòng)數(shù)字那個(gè)還是下面顯示運(yùn)行,沒亮




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1