官术网_书友最值得收藏!

3.5 LED模擬交通燈

本例中的12只LED分成東西向和南北向兩組,各組指示燈均有相向的2只紅色、2只黃色與2只綠色的LED,本例中對相應的LED單獨進行定義,程序運行時模擬了十字路口交通信號燈的切換過程與顯示效果。

本例電路如圖3-5所示。

圖3-5 LED模擬交通燈電路

程序設計調試與實訓:

源程序中用6行sbit對東西和南北向的紅、黃、綠指示燈分別進行定義,這樣便于對它們進行單獨控制。

本例將交通指示燈切換時間設置得較短,這樣可在調試的時候較快觀察到運行效果,讀者可在調試運行本例后修改代碼,使指示燈切換過程更接近于實際的交通指示燈切換過程。

源程序代碼:

        //-----------------------------------------------------------------
        //  名稱: LED模擬交通燈
        //-----------------------------------------------------------------
        //  說明: 東西向綠燈亮若干秒后,黃燈閃爍,閃爍5次后亮紅燈,
        //       紅燈亮后,南北向由紅燈變為綠燈,若干秒后南北向黃燈閃爍,
        //       閃爍5次后亮紅燈,東西向綠燈亮,如此重復。
        //
        //-----------------------------------------------------------------
        #include <reg51.h>
        #define uchar unsigned char
        #define uint  unsigned int
        sbit    RED_A =  P0^0;   //東西向指示燈
        sbit  YELLOW_A =  P0^1;
        sbit   GREEN_A =  P0^2;
        sbit    RED_B =  P0^3;   //南北向指示燈
        sbit  YELLOW_B =  P0^4;
        sbit   GREEN_B =  P0^5;
        uchar Flash_Count = 0, Operation_Type = 1; //閃爍次數及操作類型變量
        //-----------------------------------------------------------------
        // 延時
        //-----------------------------------------------------------------
        void DelayMS(uint x)
        {
          uchar i;
          while (x--) for ( i = 0; i< 120; i++);
        }
        //-----------------------------------------------------------------
        // 交通燈切換子程序
        //-----------------------------------------------------------------
        void Traffic_Light()
        {
            switch (Operation_Type)
            {
              case 1:  //東西向綠燈與南北向紅燈亮
                      RED_A = 1; YELLOW_A = 1; GREEN_A = 0;
                      RED_B = 0; YELLOW_B = 1; GREEN_B = 1;
                      DelayMS(2000);         //延時
                      Operation_Type = 2;    //下一操作
                      break;
              case 2:  //東西向黃燈開始閃爍,綠燈關閉
                      DelayMS(300);          //延時
                      YELLOW_A = !YELLOW_A; GREEN_A = 1;
                      //閃爍5次
                      if (++Flash_Count != 10) return;
                      Flash_Count = 0;
                      Operation_Type = 3;    //下一操作
                      break;
              case 3:  //東西向紅燈與南北向綠燈亮
                      RED_A = 0; YELLOW_A = 1; GREEN_A = 1;
                      RED_B = 1; YELLOW_B = 1; GREEN_B = 0;
                      //南北向綠燈亮若干秒后切換
                      DelayMS(2000);                      //延時
                      Operation_Type = 4;                 //下一操作
                      break;
              case 4:  //南北向黃燈開始閃爍
                      DelayMS(300); //延時
                      YELLOW_B = !YELLOW_B; GREEN_B = 1;
                      if (++Flash_Count != 10) return;   //閃爍5次
                      Flash_Count = 0;
                      Operation_Type = 1;                 //回到第一種操作
            }
        }
        //-----------------------------------------------------------------
        // 主程序
        //-----------------------------------------------------------------
        void main()
        {
          while(1) Traffic_Light();
        }
主站蜘蛛池模板: 建阳市| 怀集县| 尖扎县| 房山区| 铁岭县| 通辽市| 甘谷县| 天门市| 定襄县| 泸溪县| 海兴县| 聊城市| 阿坝县| 阳江市| 建平县| 永泰县| 昭平县| 蒙城县| 张北县| 多伦县| 宝丰县| 安化县| 乐清市| 襄汾县| 淮滨县| 长岛县| 连城县| 尼勒克县| 健康| 龙山县| 广昌县| 庆阳市| 晋州市| 红河县| 类乌齐县| 利辛县| 汤阴县| 林州市| 三江| 闸北区| 雷州市|