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