51单片机C程序实验LED灯:[5]模拟交通灯
的有关信息介绍如下:名称:LED 模拟交通灯
目的:东西向绿灯亮若干秒,黄灯闪3次后红灯亮, 红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁3次后变红灯,东西向变绿灯,如此重复。
分析一共有12个灯,每个与每个又有逻辑联系,但其实不是很复杂,分析比较重要,只要把交通灯的规律总结出来就很简单了,而且每个人总结规律是不同的,程序也就有更多种,所以这里算是一个比较广泛的例子。
LED灯方面的元器件不是很复杂,之前说了很多,也差不多,只是灯不一样。
51单片机
电容
瓷片电容
晶振
绿色二极管
红色二极管
黄色二极管
电阻
电路图:
1为总体图,2,3为大图
PS:图要是不会画也可以评论提问。。
说明分析(不想看请直接跳往下一步):通过思考我们发现灯的循环大致分为
1、横向绿灯亮,竖向红灯亮
2、横向黄灯闪三下,竖向红灯依旧亮
3、横向红灯亮,竖向绿灯亮
4、横向红灯依旧亮,竖向黄灯闪三下
由分析我们把程序也分为四个循环
【程序】图片版
按照程序顺序截图,前面是子程序,最后为主程序
【文字版】
/* 名称:LED 模拟交通灯
说明:东西向绿灯亮若干秒,黄灯闪3次后红灯亮, 红灯亮后,
南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁3次后变红灯,
东西向变绿灯,如此重复。*/
#include
#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();
}