单片机C语言程序设计实训100例
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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();
        }