色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 單片機交通燈設(shè)計源程序

          單片機交通燈設(shè)計源程序

          作者: 時間:2014-01-13 來源:網(wǎng)絡(luò) 收藏
          #include reg51.h>
          #include intrins.h>
          #define uchar unsigned char
          #define uint unsigned int
          sbit k1=P1^6;
          sbit k2=P1^7;
          sbit k3=P2^7;
          sbit k4=P3^0;
          sbit yellowled_nb=P1^4; //南北黃燈
          sbit yellowled_dx=P1^1; //東西黃燈
          uchar code table[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//共陰
          uchar data dig; //位選
          uchar data led; //
          uchar data buf[4];
          uchar data sec_dx=20;//東西數(shù)碼指示值
          uchar data sec_nb=20;//南北數(shù)碼指示值
          uchar data set_timedx=20;
          uchar data set_timenb=20;//倒計時設(shè)置的鍵值保存
          uchar data b;//定時器中斷次數(shù)
          bit time;//燈狀態(tài)循環(huán)標(biāo)志
          bit int0_time;//中斷強行標(biāo)志
          bit set;//調(diào)時方向切換鍵標(biāo)志
          void delay(int ms);//延時子程序
          void key();//按鍵掃描子程序
          void key_to1();//鍵處理子程序
          void key_to2();
          void display();//顯示子程序
          void main()
          {
          TMOD=0X01;
          TH0=0X3C;
          TL0=0XB0;
          EA=1;
          ET0=1;
          TR0=1;
          EX0=1;
          EX1=1;
          P1=0Xf3;// 東西通行
          while(1)
          {
          key(); //調(diào)用按鍵掃描程序
          display(); //調(diào)用顯示程序
          }
          }
          void key() //按鍵掃描子程序
          {
          if(k1!=1)
          {
          delay(10);
          if(k1!=1)
          {
          while(k1!=1);
          key_to1();
          }
          }
          if(k2!=1)
          {
          delay(10);
          if(k2!=1)
          {
          while(k2!=1);
          key_to2();
          }
          }
          if(k4!=1)
          {
          delay(10);
          if(k4!=1)
          {
          while(k4!=1);
          set=!set;
          }
          }
          if(k3!=1int0_time==1)
          {
          TR0=1; //啟動定時器
          sec_nb=20;
          sec_dx=20;
          int0_time=0;//清標(biāo)志
          } else if(k3!=1int0_time==0)
          {
          TR0=1;
          set_timenb=sec_nb;
          set_timedx=sec_dx; //設(shè)置的鍵值返回保存
          }
          }
          void display()
          {
          buf[1]=sec_dx/10; //第1位 東西秒十位
          buf[2]=sec_dx%10; //第2位 東西秒個位
          buf[3]=sec_nb/10; //第3位 南北秒十位
          buf[0]=sec_nb%10; //第4位 南北秒個位
          P0=table[buf[led]];
          delay(2); //先延時,提前顯示一位了
          P2=dig;
          dig=_crol_(dig,1);
          led++;
          if (led==4)
          {led=0;
          dig=0xfe;
          }
          }
          void time0(void) interrupt 1 using 1 //定時中斷子程序
          {
          b++;
          if(b==10) // 定時器中斷次數(shù)。
          {
          b=0;
          sec_dx--;
          sec_nb--;
          /******************南北黃燈閃爍判斷*************************/
          if(sec_nb==3time==0)
          {
          yellowled_nb=1;//南北黃燈亮
          delay(300);
          yellowled_nb=0;
          }
          if(sec_nb==2time==0)
          {
          yellowled_nb=1;//南北黃燈亮
          delay(300);
          yellowled_nb=0;
          }
          if(sec_nb==1time==0)
          {
          yellowled_nb=1;
          delay(300);
          yellowled_nb=0;
          }
          /*******************東西黃燈閃判斷************************/
          if(sec_dx==3time==1)
          {
          yellowled_dx=1;//南北黃燈亮
          delay(300);
          yellowled_dx=0;
          }
          if(sec_dx==2time==1)
          {
          yellowled_dx=1;//南北黃燈亮
          delay(300);
          yellowled_dx=0;
          }
          if(sec_dx==1time==1)
          {
          yellowled_dx=1;
          delay(300);
          yellowled_dx=0;
          }
          /*******************************************/
          if(sec_dx==0||sec_nb==0) //東西或南北先到達(dá)1S時即開始重新計時
          {
          sec_dx=set_timedx;
          sec_nb=set_timenb; //第一次循環(huán)結(jié)束重置
          if(time==1)
          {
          P1=0XF3; //東西通行
          }
          else
          {
          P1=0xde; //南北通行
          }
          time=!time; //取反
          }
          }
          }
          void key_to1()
          {
          TR0=0; //關(guān)定時器
          if(set==0)
          sec_nb++; //南北加1S
          else
          sec_dx++;//東西加1S
          if(sec_nb==100)
          sec_nb=1;
          if( sec_dx==100)
          sec_dx=1;//加到100置1
          }
          void key_to2()
          {
          TR0=0;//關(guān)定時器
          if(set==0)
          sec_nb--; //南北減1S
          else
          sec_dx--; //東西減1S
          if(sec_nb==0)
          sec_nb=99;
          if( sec_dx==0 )
          sec_dx=99;//減到1重置99


          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉