51单片机模拟交通灯效果是如何实现的
交通灯红绿灯是按一定的顺序进行亮灭的,亮灯的时间也是一定的。那么就有逻辑可循。而单片机就可以根据逻辑性进行控制程序编写,然后烧录程序进单片机,控制IO串口输出高低电平及中断延时以达到模拟交通灯的效果。
那么模拟交通灯效果可以做实物模拟,锻炼DIY的能力;另外有些单片机开发板自带交通灯电路和例程,自己可以跟着看看写写程序。下图中电路图可以参照着练练手。
另外对于模拟红绿灯这种小实验,可以通过仿真软件进行仿真实验就可以了。需要的软件有:
1、Keil (编写程序,生成单片机所需的HEX文件)
2、Proteus 仿真软件 (电路效果仿真,结果演示)
仿真实例分析:模拟交通灯
1、硬件:
前提条件:位于十字路口,一共需12个交通灯(红黄绿灯各四个)
亮灯规律:东西向绿灯亮若干秒,黄灯闪3次后红灯亮, 红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁3次后变红灯,东西向变绿灯,如此重复。(相对着的两个方向亮灯顺序和时间是一样的,那么单片机只要通过6个串口就能控制12个灯的状态了)。
仿真元件:51单片机、电容、瓷片电容、晶振、绿色二极管、红色二极管、黄色二极管、电阻......
仿真电路连接:在仿真软件proteus中找到上述元件,按下图连接。单片机P0.0~P0.5输出控制交通灯。
注意同方向交通灯跟单片机串口连接顺序。只要你同方向同种颜色的灯都连同一个单片机串口就不会错!电气标记0~5分别对应连接单片机串口P0.0~P0.5。
2、软件
通过Keil软件进行编程,程序编写逻辑按以下四个循环进行:
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; //闪烁次数,操作类型变量
//延时子程序www.dgzj.com
void Delay(uint x)
{
uchar i;
while(x--) for(i=0;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();
}
仿真效果图