51单片机C程序实验LED灯:[5]模拟交通灯
名称:LED 模拟交通灯
目的:东西向绿灯亮若干秒,黄灯闪3次后红灯亮, 红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁3次后变红灯,东西向变绿灯,如此重复。
分析一共有12个灯,每个与每个又有逻辑联系,但其实不是很复杂,分析比较重要,只要把交通灯的规律总结出来就很简单了,而且每个人总结规律是不同的,程序也就有更多种,所以这里算是一个比较广泛的例子。
proteus电路图
- 01
LED灯方面的元器件不是很复杂,之前说了很多,也差不多,只是灯不一样。 51单片机 电容 瓷片电容 晶振 绿色二极管 红色二极管 黄色二极管 电阻
- 02
电路图: 1为总体图,2,3为大图 PS:图要是不会画也可以评论提问。。
程序清单
- 01
说明分析(不想看请直接跳往下一步):通过思考我们发现灯的循环大致分为 1、横向绿灯亮,竖向红灯亮 2、横向黄灯闪三下,竖向红灯依旧亮 3、横向红灯亮,竖向绿灯亮 4、横向红灯依旧亮,竖向黄灯闪三下 由分析我们把程序也分为四个循环
- 02
【程序】图片版 按照程序顺序截图,前面是子程序,最后为主程序
- 03
【文字版】 /* 名称:LED 模拟交通灯 说明:东西向绿灯亮若干秒,黄灯闪3次后红灯亮, 红灯亮后, 南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁3次后变红灯, 东西向变绿灯,如此重复。*/ #include<reg51.h> #define uchar unsigned char #define uint unsigned int //规划好各个脚连接的灯,方便使用 sbit RED_1=P0^0; //东西向灯 sbit YELLOW_1=P0^1; sbit GREEN_1=P0^2; sbit RED_2=P0^3; //南北向灯 sbit YELLOW_2=P0^4; sbit GREEN_2=P0^5; uchar number=0,type=1; //闪烁次数,操作类型变量 //延时子程序 void Delay(uint x) { uchar i; while(x--) for(i=0;i<120;i++); } //交通灯切换程序 //总共分为四种情况,如此循环 //注:1为关灯,0为开灯 traffic() { switch(type) { case 1: //东西向绿灯与南北向红灯亮 RED_1=1;YELLOW_1=1;GREEN_1=0; RED_2=0;YELLOW_2=1;GREEN_2=1; Delay(2000); type=2; break; case 2: //东西向黄灯闪烁,绿灯关闭 Delay(300); YELLOW_1=~YELLOW_1;GREEN_1=1; if(++number!=6) return; //闪烁3次 number=0; type=3; break; case 3: //东西向红灯,南北向绿灯亮 RED_1=0;YELLOW_1=1;GREEN_1=1; RED_2=1;YELLOW_2=1;GREEN_2=0; Delay(2000); type=4; break; case 4: //南北向黄灯闪烁3次 Delay(300); YELLOW_2=~YELLOW_2;GREEN_2=1; if(++number!=6) return; number=0; type=1; } } //主程序,由于用了switch,为了便于循环选择,用一个traffic子函数写在外面 void main() { while(1) traffic(); }
完成结果仿真图
- 01