设计、仿真并制作一基于51单片机的简易交通灯控制装置,该装置具有指挥十字路口不同方向车辆通行的功能,交通信号灯有红、黄、绿三种颜色,同时具有倒计时功能。
一、设计要求:
①十字路口分东西和南北2个方向,当东西方向车辆通行时,该方向上的绿灯亮、红灯灭,时间为9s,数码管从9倒计时到1;同时南北方向上车辆停止通行,该方向上的红灯亮、绿灯灭,倒计时9s。反之亦然。
②从通行到停止之间,以及从停止到通行之间,有准备时间3s,此时黄灯亮,其余灯灭,数码管显示3s倒计时。
③使用Protues软件进行设计,在AltiumDesigner软件里设计电路板,使用Keil开发单片机软件。
二、原理图设计:
根据设计要求,设计该装置电路原理图如下:
对该电路各部分做简要分析:
P1是接线端子,外部供电电源通过接线端子给系统供电;
S1是开关,控制供电电源的通断;
C5和C4一大一小两个容值的电容是给系统电源滤波;
U1、C1、C2、C3、R1、Y1组成单片机最小系统,即单片机能够正常工作所需的最少外围电路,主要包括晶振电路和复位电路;
RP1是排阻,因为P0口是开漏输出,所以需要外接上拉电阻才能输出高电平。
R2~R17为限流电阻,即限制数码管电流的电阻;
D1~D3和D4~D6分别是两个方向上的2组交通信号灯,他们的亮灭由单片机的P0口控制;
DS1和DS2为两个方向上的2个倒计时数码管,它们分别由单片机P1口和P2口控制;
P2和单片机的串口相连,用来给单片机下载处出现。
三、仿真电路搭建
在Protues软件里搭建所设计的电路原理图,用来进行仿真验证。
所搭建的仿真电路,和刚才我们设计的电路略有差异,我们设计的电路有接线端子和电源开关,仿真电路里没有,因为我们仿真主要是为了验证设计的电路能否正确工作,所以仿真电路里直接用J1排针作为电源输入。
我们设计的电路中,和P1、P2相连的限流电阻采用的是单独封装的200Ω电阻,而仿真电路里使用的是RN1和RN2两个200Ω排阻,其实它们的功能是一样的,排阻相当于把8个分立电阻封装在一起作为一组来使用。
四、单片机程序编写
51单片机软件可以使用Keil来进行设计开发。程序代码如下:
//交通灯
#include <reg51.h>
#include <intrins.h>
typedef unsigned char Uchar;
typedef unsigned int Uint;
#define ledport P0
#define north_south_time P1
#define east_west_time P2
sbit north_south_red=ledport^0;
sbit north_south_yellow=ledport^1;
sbit north_south_green=ledport^2;
sbit east_west_red=ledport^3;
sbit east_west_yellow=ledport^4;
sbit east_west_green=ledport^5;
//共阳数码管的显示码
Uchar discode[]={ 0xC0,0xF9,0xA4,0xB0,
0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,
0xC6,0xA1,0x86,0x8E};
//函数声明
void Delay_nms(Uint nms);
void seg7_dis(Uchar Ntime);
//主函数
void main()
{ ledport=0xff; //初始化,所有显示关闭
north_south_time=0xff;
east_west_time=0xff;
//南北绿,东西红,9秒,黄3秒,南北绿,东西红,9秒,黄3秒
while(1)
{ north_south_green=0;east_west_red=0;
seg7_dis(9);
north_south_green=1;east_west_red=1;
north_south_yellow=0;east_west_yellow=0;
seg7_dis(3);
north_south_yellow=1;east_west_yellow=1;
north_south_red=0;east_west_green=0;
seg7_dis(9);
north_south_yellow=0;east_west_yellow=0;
north_south_red=1;east_west_green=1;
seg7_dis(3);
north_south_yellow=1;east_west_yellow=1;
}
}
void Delay_nms(Uint nms) //@11.0592MHz ,1ms*N
{
Uchar i, j;
do{
_nop_();
i = 2;
j = 219;
do
{
while (--j);
} while (--i);
}
while(--nms);
}
//共阳数码管显示
void seg7_dis(Uchar Ntime)
{ Uchar tmp;
do{
tmp=discode[Ntime];
north_south_time=tmp;
east_west_time=tmp;
Delay_nms(1000);
}while(--Ntime);
}
在Keil中建立工程,并编译生成hex文件,然后将生成的hex文件添加到Protues仿真电路的单片机模型中,点击运行,便可在Protues中看到运行效果。
51单片机简易交通灯Protues仿真
原理图+PCB+C程序代码+Protues仿真文件下载链接:
https://download.youkuaiyun.com/download/jeffashan/88497581
关注公众号 ,随时获取最新内容: