久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1375|回復: 0
收起左側

交通燈控制

[復制鏈接]
ID:272466 發表于 2018-1-6 18:56 | 顯示全部樓層 |閱讀模式

#include<reg51.h>

#defineuchar unsigned char

#defineuint  unsigned int


uchardata buf[4];

uchardata sec_dx=20;           //東西數默認

uchardata sec_nb=30;           //南北默認值

uchardata set_timedx=20;       //設置東西方向的時間

uchardata set_timenb=30;       //設置南北方向的時間

intn,led1=0;

uchardata countt0;//定時器0中斷次數

sfrWDT_CONTR=0xA6;

//定義5組開關

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

sbit  k1=P3^5;       //時間加

sbit  k2=P3^6;       //時間減

sbit  k3=P3^4;       //確認

sbit  k5=P3^1;       //禁止

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

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

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


sbitRed_nb=P2^6;    //南北紅燈標志

sbitYellow_nb=P2^5; //南北黃燈標志

sbitGreen_nb=P2^4;     //南北綠燈標志


sbitRed_dx=P2^3;    //東西紅燈標志

sbitYellow_dx=P2^2; //東西黃燈標志

sbitGreen_dx=P2^1;      //東西綠燈標志

   

sbitBuzz=P3^0;      

bitBuzzer_Indicate;

bitset=0;           //調時方向切換鍵標志 =1時,南北,=0時,東西

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

};


//函數的聲明部分

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

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

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

voidkey_to2();

voidkey_to3();

voiddisplay();             //顯示子程序

voidlogo();                //開機LOGO

voidBuzzer();

//主程序

voidmain()

{

    TMOD=0X11;               //定時器設置

    TH0=0X3C;                //定時器0置初值 0.05S

    TL0=0XB0;

    EA=1;                    //開總中斷

    ET0=1;                   //定時器0中斷開啟

    TR0=1;                   //啟動定時0

    EX0=1;                   //開外部中斷0

    EX1=1;                   //開外部中斷1

    logo();

    P2=0Xc3;                 //開始默認狀態,東西綠燈,南北黃燈   

    sec_nb=sec_dx+5;            //默認南北通行時間比東西多5秒

    while(1)

    {   

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

       display();               //調用顯示程序

       Buzzer();

    }   

}

//函數的定義部分

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

{   

    if(k1!=1)                       //當K1(時間加)按下時

    {

       display();                  //調用顯示,用于延時消抖

       if(k1!=1)            

       {

           TR0=0;                      //關定時器

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

           sec_dx=set_timedx;          //

           do

           {

              display();

           }

           while(k1!=1);

       }

    }


    if(k2!=1)                       //當K2(時間減)按鍵按下時

    {      

       display();                  //調用顯示,用于延時消抖  

       if(k2!=1)

       {   

           TR0=0;                     //關定時器

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

           sec_dx=set_timedx;

           do  

          {

              display();           //調用顯示,用于延時

           }

           while(k2!=1);

       }

    }


    if(k3!=1)                       //當K3(確認)鍵按下時

    {   

       display();                  //調用顯示,用于延時消抖

       if(k3!=1)

       {

           TR0=1;                      //啟動定時器

           Buzzer_Indicate=0;

           sec_nb=set_timenb;              //從中斷回復,仍顯示設置過的數值

           sec_dx=set_timedx;              //顯示設置過的時間

           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;

           set=!set;                //取反set標志位,以切換調節方向

           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;                //全部置紅燈

           sec_dx=00;               //四個方向的時間都為00

           sec_nb=00;

           Buzzer_Indicate=1;   

           do

           {

              display();

           }   

           while(k5!=1);            

        }

    }

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

    {

        display();                 //調用顯示,用于延時消抖

        if(k6!=1)

        {   

           TR0=0;                   //關定時器

           P2=0x00;

           Yellow_dx=1;

           Yellow_nb=1;                //全部置黃燈

           sec_dx=00;               //四個方向的時間都為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位 東西秒個位

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

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

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

    P0=0x00;

    P1=0xfe;                 //片選LED1

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

    delay(1);            //延時

    P1=0xff;             //關顯示

    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   //定時中斷子程序

{

    TH0=0X3C;                       //重賦初值

    TL0=0XB0;

    TR0=1;                          //重新啟動定時器

    countt0++;                      //軟件計數加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)                        // 定時器中斷次數=20時(即1秒時)

    {   countt0=0;                  //清零計數器

       sec_dx--;                   //東西時間減1

       sec_nb--;                   //南北時間減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)        //當東西倒計時到0時,重置5秒,用于黃燈閃爍時間  

       {

           sec_dx=5;

           shanruo=1;

       }

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

       {

           sec_nb=5;

           shanruo=1;

       }

       if(dx_nb==0&&sec_nb==0)         //當黃燈閃爍時間倒計時到0時,

       {

           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)         //當黃燈閃爍時間到

       {

           P2=0X00;                 //重置東西南北的紅綠燈狀態

           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;                          //關定時器

    P2=0x00;

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

    Red_nb=1;                       //南北方向為紅燈

    Buzzer_Indicate=0;

    sec_dx=00;                      //四個方向的時間都為00

    sec_nb=00;

}


//外部中斷1

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

{

    TR0=0;                          //關定時器

    P2=0x00;

    Green_nb=1;                        //置南北方向為綠燈

    Red_dx=1;                       //東西方向為紅燈

    Buzzer_Indicate=0;

    sec_nb=00;                      //四個方向的時間都為00

    sec_dx=00;

}

voidlogo()//開機的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()        /*看門狗子函數*/

       {

         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)       //延時子程序

{

    uint j,k;

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

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国内精品视频一区二区三区 | 国产一区二区三区在线观看免费 | 国产精品国产三级国产aⅴ无密码 | 日韩精品一区二区三区在线播放 | www.国产精| 亚洲成人精品久久久 | 日本久久综合网 | 成人欧美一区二区三区黑人孕妇 | 曰韩三级| 亚洲精品1 | 麻豆av电影网 | 9191av| 国产精品日日做人人爱 | 久久久久国产精品午夜一区 | 成人av观看 | 91久久精品一区二区二区 | 奇米四色在线观看 | 国产精品99免费视频 | 国产精品夜色一区二区三区 | 一区二区三区四区av | 久久99精品久久久久久 | www.久草.com | 久久精品亚洲精品国产欧美 | 特黄特黄a级毛片免费专区 av网站免费在线观看 | 老司机成人在线 | 国产精品国产三级国产aⅴ浪潮 | 福利视频日韩 | 97日日碰人人模人人澡分享吧 | 久久尤物免费一区二区三区 | 一级毛片免费视频观看 | 国产精品美女一区二区 | 色婷婷综合在线观看 | 久久中文字幕一区 | 久久电影一区 | 一区二区不卡视频 | 国产在线一区二区三区 | 古装人性做爰av网站 | 欧美9999 | 嫩草91在线| 四色永久| 色爱综合网 |