標(biāo)題: 交通燈控制 [打印本頁(yè)]

作者: 勝多負(fù)少的    時(shí)間: 2018-1-6 18:56
標(biāo)題: 交通燈控制

#include<reg51.h>

#defineuchar unsigned char

#defineuint  unsigned int


uchardata buf[4];

uchardata sec_dx=20;           //東西數(shù)默認(rèn)

uchardata sec_nb=30;           //南北默認(rèn)值

uchardata set_timedx=20;       //設(shè)置東西方向的時(shí)間

uchardata set_timenb=30;       //設(shè)置南北方向的時(shí)間

intn,led1=0;

uchardata countt0;//定時(shí)器0中斷次數(shù)

sfrWDT_CONTR=0xA6;

//定義5組開(kāi)關(guān)

sbit  k4=P3^7;     //切換方向

sbit  k1=P3^5;       //時(shí)間加

sbit  k2=P3^6;       //時(shí)間減

sbit  k3=P3^4;       //確認(rèn)

sbit  k5=P3^1;       //禁止

sbit  k6=P1^5;       //夜間模式

//       P3^2     //只允許東西方向通行,中斷0

//       P3^3     //只允許南北方向通行,中斷1


sbitRed_nb=P2^6;    //南北紅燈標(biāo)志

sbitYellow_nb=P2^5; //南北黃燈標(biāo)志

sbitGreen_nb=P2^4;     //南北綠燈標(biāo)志


sbitRed_dx=P2^3;    //東西紅燈標(biāo)志

sbitYellow_dx=P2^2; //東西黃燈標(biāo)志

sbitGreen_dx=P2^1;      //東西綠燈標(biāo)志

   

sbitBuzz=P3^0;      

bitBuzzer_Indicate;

bitset=0;           //調(diào)時(shí)方向切換鍵標(biāo)志 =1時(shí),南北,=0時(shí),東西

bitdx_nb=0;         //東西南北控制位

bitshanruo=0;


ucharcode table[11]={   //共陰極字型碼

    0x3f, //--0

    0x06, //--1

    0x5b, //--2

    0x4f, //--3

    0x66, //--4

    0x6d, //--5

    0x7d, //--6

    0x07, //--7

    0x7f, //--8

    0x6f, //--9

    0x00  //--NULL

};


//函數(shù)的聲明部分

voiddelay(int ms);         //延時(shí)子程序

voidkey();                 //按鍵掃描子程序

voidkey_to1();             //鍵處理子程序

voidkey_to2();

voidkey_to3();

voiddisplay();             //顯示子程序

voidlogo();                //開(kāi)機(jī)LOGO

voidBuzzer();

//主程序

voidmain()

{

    TMOD=0X11;               //定時(shí)器設(shè)置

    TH0=0X3C;                //定時(shí)器0置初值 0.05S

    TL0=0XB0;

    EA=1;                    //開(kāi)總中斷

    ET0=1;                   //定時(shí)器0中斷開(kāi)啟

    TR0=1;                   //啟動(dòng)定時(shí)0

    EX0=1;                   //開(kāi)外部中斷0

    EX1=1;                   //開(kāi)外部中斷1

    logo();

    P2=0Xc3;                 //開(kāi)始默認(rèn)狀態(tài),東西綠燈,南北黃燈   

    sec_nb=sec_dx+5;            //默認(rèn)南北通行時(shí)間比東西多5秒

    while(1)

    {   

       key();                   //調(diào)用按鍵掃描程序

       display();               //調(diào)用顯示程序

       Buzzer();

    }   

}

//函數(shù)的定義部分

voidkey(void)    //按鍵掃描子程序

{   

    if(k1!=1)                       //當(dāng)K1(時(shí)間加)按下時(shí)

    {

       display();                  //調(diào)用顯示,用于延時(shí)消抖

       if(k1!=1)            

       {

           TR0=0;                      //關(guān)定時(shí)器

           shanruo=0;

           P2=0x00;

           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 ;      //設(shè)置的數(shù)值賦給東西南北

           sec_dx=set_timedx;          //

           do

           {

              display();

           }

           while(k1!=1);

       }

    }


    if(k2!=1)                       //當(dāng)K2(時(shí)間減)按鍵按下時(shí)

    {      

       display();                  //調(diào)用顯示,用于延時(shí)消抖  

       if(k2!=1)

       {   

           TR0=0;                     //關(guān)定時(shí)器

           shanruo=0;

           P2=0x00;

           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 ;         //設(shè)置的數(shù)值賦給東西南北

           sec_dx=set_timedx;

           do  

          {

              display();           //調(diào)用顯示,用于延時(shí)

           }

           while(k2!=1);

       }

    }


    if(k3!=1)                       //當(dāng)K3(確認(rèn))鍵按下時(shí)

    {   

       display();                  //調(diào)用顯示,用于延時(shí)消抖

       if(k3!=1)

       {

           TR0=1;                      //啟動(dòng)定時(shí)器

           Buzzer_Indicate=0;

           sec_nb=set_timenb;              //從中斷回復(fù),仍顯示設(shè)置過(guò)的數(shù)值

           sec_dx=set_timedx;              //顯示設(shè)置過(guò)的時(shí)間

           if(set==0)                  //時(shí)間倒時(shí)到0時(shí)

           {

              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)                       //當(dāng)K4(切換)鍵按下

    {

       display();                  //調(diào)用顯示,用于延時(shí)消抖

       if(k4!=1)

       {  

           TR0=0;

           set=!set;                //取反set標(biāo)志位,以切換調(diào)節(jié)方向

           dx_nb=set;

           do

           {

              display();

           }            

           while(k4!=1);

       }

    }   


    if(k5!=1)                       //當(dāng)K5(禁止)鍵按下時(shí)

    {

        display();                 //調(diào)用顯示,用于延時(shí)消抖

        if(k5!=1)

        {   

           TR0=0;                   //關(guān)定時(shí)器

           P2=0x00;

           Red_dx=1;

           Red_nb=1;                //全部置紅燈

           sec_dx=00;               //四個(gè)方向的時(shí)間都為00

           sec_nb=00;

           Buzzer_Indicate=1;   

           do

           {

              display();

           }   

           while(k5!=1);            

        }

    }

    if(k6!=1)                       //當(dāng)K6(夜間模式)按下

    {

        display();                 //調(diào)用顯示,用于延時(shí)消抖

        if(k6!=1)

        {   

           TR0=0;                   //關(guān)定時(shí)器

           P2=0x00;

           Yellow_dx=1;

           Yellow_nb=1;                //全部置黃燈

           sec_dx=00;               //四個(gè)方向的時(shí)間都為00

           sec_nb=00;

           Buzzer_Indicate=1;   

           do

           {

              display();

           }   

           while(k6!=1);            

        }

    }

}

voiddisplay(void) //顯示子程序

{      

    buf[1]=sec_nb/10;        //第1位 東西秒十位

    buf[2]=sec_nb%10;        //第2位 東西秒個(gè)位

    buf[3]=sec_dx/10;        //第3位 南北秒十位

    buf[0]=sec_dx%10;        //第4位 南北秒個(gè)位      

    P1=0xff;                 //初始燈為滅的

    P0=0x00;

    P1=0xfe;                 //片選LED1

    P0=table[buf[1]];    //送東西時(shí)間十位的數(shù)碼管編碼

    delay(1);            //延時(shí)

    P1=0xff;             //關(guān)顯示

    P0=0x00;            

   

    P1=0xfd;                 //片選LED2

    P0=table[buf[2]];

    delay(1);

    P1=0xff;

    P0=0x00;

    P1=0Xfb;             //片選LED3

    P0=table[buf[3]];

    delay(1);

    P1=0xff;

    P0=0x00;

    P1=0Xf7;

    P0=table[buf[0]];    //片選LED4

    delay(1);

}


voidtime0(void) interrupt 1 using 1   //定時(shí)中斷子程序

{

    TH0=0X3C;                       //重賦初值

    TL0=0XB0;

    TR0=1;                          //重新啟動(dòng)定時(shí)器

    countt0++;                      //軟件計(jì)數(shù)加1

    if(countt0==10)

    {

       if((sec_nb<=5)&&(dx_nb==0)&&(shanruo==1))        //東西黃燈閃      

        {

           Green_dx=0;

           Yellow_dx=0;

           Buzz=0;

       }                    

       if((sec_dx<=5)&&(dx_nb==1)&&(shanruo==1))        //南北黃燈閃      

        {

           Green_nb=0;

           Yellow_nb=0;

           Buzz=0;

       }   

    }

      

    if(countt0==20)                        // 定時(shí)器中斷次數(shù)=20時(shí)(即1秒時(shí))

    {   countt0=0;                  //清零計(jì)數(shù)器

       sec_dx--;                   //東西時(shí)間減1

       sec_nb--;                   //南北時(shí)間減1


       if((sec_nb<=5)&&(dx_nb==0)&&(shanruo==1))        //東西黃燈閃      

        {

           Green_dx=0;

           Yellow_dx=1;

           Buzz=1;

       }                    

       if((sec_dx<=5)&&(dx_nb==1)&&(shanruo==1))        //南北黃燈閃      

        {

           Green_nb=0;

           Yellow_nb=1;

           Buzz=1;

       }                          

       if(sec_dx==0&&sec_nb==5)        //當(dāng)東西倒計(jì)時(shí)到0時(shí),重置5秒,用于黃燈閃爍時(shí)間  

       {

           sec_dx=5;

           shanruo=1;

       }

       if(sec_nb==0&&sec_dx==5)    //當(dāng)南北倒計(jì)時(shí)到0時(shí),重置5秒,用于黃燈閃爍時(shí)間  

       {

           sec_nb=5;

           shanruo=1;

       }

       if(dx_nb==0&&sec_nb==0)         //當(dāng)黃燈閃爍時(shí)間倒計(jì)時(shí)到0時(shí),

       {

           Buzz=1;

           P2=0x00;                 //重置東西南背方向的紅綠燈

           Green_nb=1;

           Red_dx=1;

           dx_nb=!dx_nb;

           shanruo=0;

           sec_nb=set_timenb;          //重賦南北方向的起始值

           sec_dx=set_timenb+5;     //重賦東西方向的起始值

       }      

       if(dx_nb==1&&sec_dx==0)         //當(dāng)黃燈閃爍時(shí)間到

       {

           P2=0X00;                 //重置東西南北的紅綠燈狀態(tài)

           Green_dx=1;

           Red_nb=1;

           dx_nb=!dx_nb;

           shanruo=0;

           sec_dx=set_timedx;          //重賦東西方向的起始值

           sec_nb=set_timedx+5;     //重賦南北方向的起始值

       }

    }   

}



//外部中斷0

voidint0(void) interrupt 0 using 1       //只允許東西通行

{

    TR0=0;                          //關(guān)定時(shí)器

    P2=0x00;

    Green_dx=1;                        //東西方向置綠燈

    Red_nb=1;                       //南北方向?yàn)榧t燈

    Buzzer_Indicate=0;

    sec_dx=00;                      //四個(gè)方向的時(shí)間都為00

    sec_nb=00;

}


//外部中斷1

voidint1(void) interrupt 2 using 1         //只允許南北通行

{

    TR0=0;                          //關(guān)定時(shí)器

    P2=0x00;

    Green_nb=1;                        //置南北方向?yàn)榫G燈

    Red_dx=1;                       //東西方向?yàn)榧t燈

    Buzzer_Indicate=0;

    sec_nb=00;                      //四個(gè)方向的時(shí)間都為00

    sec_dx=00;

}

voidlogo()//開(kāi)機(jī)的Logo  "- -- -"

{

    for(n=0;n<50;n++)

    {

       P0=0x40;

       P1=0xfe;

       delay(1);

       P1=0xfd;

       delay(1);

       P1=0Xfb;

       delay(1);

       P1=0Xf7;

       delay(1);

        P1= 0xff;

    }

}

void watchdog()        /*看門狗子函數(shù)*/

       {

         WDT_CONTR=0xE1;  /*喂狗指令*/

         led1=0;

         delay(500);

         led1=1;      

         while(1)

         {

                  delay(1000);

        }

    }

            


voidBuzzer()

{

   if(Buzzer_Indicate==1)

       Buzz=!Buzz;

   else Buzz=1;

}


voiddelay(int ms)       //延時(shí)子程序

{

    uint j,k;

    for(j=0;j<ms;j++)        //延時(shí)ms

      for(k=0;k<124;k++);      //大約1毫秒的延時(shí)
}





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