基于单片机的交通控制系统的设计Word文档格式.docx
《基于单片机的交通控制系统的设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于单片机的交通控制系统的设计Word文档格式.docx(29页珍藏版)》请在冰豆网上搜索。
![基于单片机的交通控制系统的设计Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-12/17/1bf24023-91ff-4378-abbe-661929c89bd4/1bf24023-91ff-4378-abbe-661929c89bd41.gif)
左右转弯车辆都必须让合法地正在路口内行驶的车辆和过人行横道的行人优先通行。
红灯是禁行信号,面对红灯的车辆必须在交叉路口的停车线后停车。
黄灯是警告信号,面对黄灯的车辆不能越过停车线,但车辆已十分接近停车线而不能安全停车时可以进入交叉路口。
随着经济的发展,交通运输中出现了一些传统方法难以解决的问题。
道路拥挤现象日趋严重,造成的经济损失越来越大,并一直保持大比例的增长。
现在交通系统已不能满足经济发展的需求。
由于生活水平的提高,人们对交通运输的安全性及服务水平提出了更高的要求。
在交通中管理引入单片机交通灯控制代替交管人员在交叉路口服务,有助于提高交通运输的安全性、提高交通管理的服务质量。
并在一定程度上尽可能的降低由道路拥挤造成的经济损失,同时也减小了工作人员的劳动强度。
中国车辆数量不断增加,交通控制在未来的交通管理中起着越来越重要的作用。
智能交通灯的管理比重修一条马路无论在经济、交通运行速率上都有很好的效益、更加节约资源。
使交管人员有更多的精力投入到管理整个城市交通控制,带来更大的经济和社会效益,为创造美好的城市交通形象发挥更多的作用。
1.2设计目的及思路
1.2.1设计目的
了解交通灯管理的基本工作原理,熟练掌握STC89C52的工作原理和应用编程,熟悉STC89C52单片机并行接口的各种工作方式和应用,并了解计数器/定时器的工作方式和应用编程外部中断的方法,掌握多位LED显示问题的解决。
1.2.2设计思路
(1)分析目前交通路口的基本控制技术以及各种通行方案,并以此为基础提出自己的交通控制的初步方案。
(2)确定系统交通控制的总体设计,包括,十字路口具体的通行方案设计以及系统应拥有的各项功能,在这里,本设计除了有信号灯状态控制能实现基本的交通功能,还增加了倒计时显示提示。
(3)进行显示电路,灯状态电路的设计和对各器件的选择及连接,大体分配各个器件及模块的基本功能要求。
(4)进行软件系统的设计,对于本系统,本人采用语言编写程序,对单片机内部结构和工作情况做了充足的研究,了解定时器,中断以及延时原理,总体上完成了软件的编写。
2方案选择
2.1总体设计方案
根据十字路口交通灯的要求,可将本系统分为三个模块,第一模块是控制模块,主要负责整个系统的控制和运算,从而使各模块正常工作,第二个模块式显示模块包括LED灯和数码管;
第三是电源模块,给各模块提供电源,让各模块工作。
其系统设计结构如图2.1所示:
图2.1系统设计结构图
2.2控制模块选择方案
方案一:
由计数器74LS161级联组成,配合译码器和秒脉冲信号发生器等器件组成交通灯系统,整个系统简单,控制简单,调试容易等优点。
方案二:
采用单片机STC89C52作为控制器。
单片机运算能力强,软件编程灵活,自由度大。
采用STC89C52单片机稳定可靠、应用广泛、通用性强。
方案比较:
采用方案一来实现十字路口交通灯控制系统非常方便,电路结构简单,控制单一,但整个系统性能不是很高,倒计时不是非常精确,如果要求系统能设置不同工作时间不容易,因而对于完成题目较困难,而方案二完全能实现设计要求,容易掌握,利于编程,易控制,I/O接口很多,易于扩展外围电路,价格便宜,故选择方案二。
2.3倒计时显示界面方案
该系统要求完成倒计时功能。
只需显示数字,基于上述原因,我考虑了二种方案:
采用全数码管显示。
这种方案只显示有限的符号和数码字符,简单,方便。
采用点阵式LED显示。
这种方案虽然功能强大,并可方便的显示各种英文字符,汉字,图形等,但实现复杂,且须完成大量的软件工作。
综上所述,我选择第一种方案,四个路口分别采用一个二位共阳数码管。
3详细设计
3.1交通灯显示时序及状态转换的理论分析及程序流程图
3.1.1.理论分析
红绿灯状态转换图如图3.1所示。
S2
S1
S4
S3
图3.1红绿灯状态转换图
东西、南北两干道交于一个十字路口,各干道有一组红、黄、绿三色的指示灯,指挥车辆和行人安全通行。
红灯亮禁止通行,绿灯亮允许通行。
黄灯亮提示人们注意红、绿灯的状态即将切换,且黄灯燃亮时间为东西、南北两干道的公共停车时间、指示灯燃亮的方案如表3.1。
表3.1十字路口指示灯燃灯方案
状态
时间
87s
5s
30s
东西道
红灯亮
绿灯亮
黄灯亮
南北道
表3.1说明:
(1)当东西方向为红灯,此道车辆禁止通行,东西道行人可通过;
南北道为绿灯,此道车辆通过,行人禁止通行。
时间为60秒。
(2)黄灯闪烁5秒,警示车辆和行人红、绿灯的状态即将切换。
(3)当东西方向为绿灯,此道车辆通行;
南北方向为红灯,南北道车辆禁止通过,行人通行。
时间为80秒。
东西方向车流大通行时间长。
(4)这样如上表的时间和红、绿、黄出现的顺序依次出现这样行人和车辆就能安全畅通的通行。
(5)此表可根据车流量动态设定红绿灯初始值。
共四种状态,分别设定为S1、S2、S3、S4,交通灯以这四种状态为一个周期,循环执行图3.2所示:
图3.2交通灯状态循
程序就是在上述四种状态下循环转化的。
3.1.2.程序流程图
系统的程序流程图如图3.3所示。
图3.3程序流程图
3.2系统总体硬件方案论证
本设计以单片机为控制核心,采用模块化设计,共分以下几个功能模块:
单片机控制系统、状态显示模块、倒计时模块、电源模块。
经上述各模块的方案选择与论证,十字路口交通灯控制系统的控制芯片选用单片机STC89C52作为整个系统的核心控制器件,主要负责整个系统工作的控制和运算,从而使各模块正常工作;
采用七段LED数码管和LED灯作为显示器件,用七段LED数码管完成倒计时显示,用LED灯作为状态灯指示功能;
以电池供电作为系统电源部分,可对各个模块供电并便于演示。
单片机作为整个硬件系统的核心,它既是协调整机工作的控制器,又是数据处理器。
它由单片机振荡电路、复位电路等组成。
3.3STC89C52RC单片机
STC89C52RC是STC89系列单片机中应用较为广泛的一种型号,芯片内部有8KB的闪速存储器FlashROM。
内部的8KB存储器用于存放可编程控制器监控程序。
STC89C52RC单片机的40条引脚按功能来分,可以分为3部分,电源及时钟引脚、控制引脚和输入/输出引脚。
其引脚图如图3.4所示。
图3.4STC89C52单片机引脚图
89C52单片机引脚功能:
主电源及时钟引脚
此类引脚包括电源引脚Vcc、Vss、时钟引脚XTAL1、XTAL2。
(1)Vcc(40脚):
接+5V电源,为单片机芯片提供电能。
(2)Vss(20脚)接地。
(3)XTAL1(18脚)在单片机内部,它是一个反向放大器的输入端,该放大器构成了片内的振荡器,可提供单片机的时钟控制信号。
(4)XTAL2(19脚)在单片机内部,接至上述振荡器的反向输出端。
控制引脚
此类引脚包括RESET(即RSR/VPD)、ALE、PSEN、EA,可以提供控制信号,有些具有复用功能。
(1)RSR/VPD(9脚):
复位信号输入端,高电平有效,当振荡器运行时,在此引脚加上两个机器周期的高电平将使单片机复位(REST)。
复位后应使此引脚电平保持为不高于0.5V的低电平,以保证单片机正常工作。
掉电期间,此引脚可接上备用电源(VPD),以保持内部RAM中的数据不丢失。
当Vcc下降到低于规定值,而VPD在其规定的电压范围内(5±
0.5V)时,VPD就向内部RAM提供备用电源。
(2)ALE/PROG(30脚):
ALE为地址锁存允许信号。
当单片机访问外部存储器时,ALE(地址锁存允许)输出脉冲的下降沿用于锁存16位地址的低8位。
即使不访问外部存储器,ALE端仍有周期性正脉冲输出,其频率为振荡器频率的1/6。
但是每当访问外部数据存储器时,在两个机器周期中ALE只出现一次,即丢失一个ALE脉冲。
ALE端可以驱动8个LSTTL负载。
(3)PSEN(29脚):
程序存储器允许输出控制端。
此输出为单片内访问外部程序存储器的读选通信号。
在从外部程序存储器取指令(或取常数)期间,每个机器周期均PSEN两次有效。
但在此期间,每当访问外部数据存储器时,这两次有效的PSEN信号将不会出现。
PSEN同样可以驱动8个LSTTL负载。
(4)EA(31脚):
EA功能为内外程序存储器选择控制端。
当EA端保持高电平时,单片机访问内部程序存储器,但在PC(程序计数器)值超过0FFFH时将自动转向执行外部程序存储器内的程序。
输入/输出引脚此类引脚包括P0口、P1口、P2口和P3口。
(1)P0(P0.0~P0.7)是一个8位三态双向I/O口,在不访积压处部存储器时,做通用I/O口使用,用于传送CPU的输入/输出数据,当访问外部存储器时,此口为地址总路线低8位及数据总路线分时复用口,可带8个LSTTL负载。
(2)P1(P1.0~P2.7)是一个8位准双向I/O口(作为输入时,口锁存器置1),带有内部上拉电阻,可带4个LSTTL负载。
(3)P2(P2.0~P2.7)是一个8位准双向I/O口,与地址总路线高8位复用,可驱动4个LSTTL负载。
(4)P3(P3.0~P3.7)是一个8位准双向I/O口,除此之外每位还具有第二功能。
P3口功能表如表3.1所示。
表3.1P3口各个位的第二功能表
P3口的位
第二功能
说明
P3.0
RXD
串行数据接收口
P3.1
TXD
串行数据发射口
P3.2
INT0
外部中断0输入
P3.3
INT1
外部中断1输入
P3.4
T0
计数器0计数输入
P3.5
T1
计数器1计数输入
P3.6
WR
外部RAM写信号
P3.7
RD
外部RAM读信号
STC89C52内部结构图如图3.5所示:
图3.5STC89C52内部结构图
3.4电路图
交通控制系统的电路图如图3.6所示。
图3.6交通控制系统电路图
4系统的仿真测试
交通控制系统的仿真图如图4.1所示。
(a)
(b)
图4.1交通控制系统仿真图
5作品的焊接
5.1焊接过程
交通控制系统的焊接图如图5.1所示。
(c)
图5.3焊接图
5.2具体程序
#include<
REGX52.H>
#defineuintunsignedint
#defineucharunsignedchar
ucharnight_flag=0;
//深夜标志位
uchartime_cl=0;
//定义时间控制标志位取0
ucharflag=0;
//方向通行标志位
ucharB_N_D_flag=1;
//定义北南通灯行标志位
ucharX_D_D_flag=1;
//定义西东通灯行标志位
uchari,j;
//定义变量i
uchart=3;
//数码管动态扫描延时时间基数
ucharnum=0;
//时间基数初始化为0
//ucharnum_night=0;
//深夜模式时间基数为0
uchartime=90;
//time初始化定为30秒
intbei,nan,xi,dong;
//定义北南西东
ucharcodeData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF};
//定义数组数码管0123456789-
/***************定义红黄绿灯**************/
#defineB_RP1_0//北面红灯
#defineB_YP1_1//北面黄灯
#defineB_GP1_2//北面绿灯
#defineN_RP1_3//南面红灯
#defineN_YP1_4//南面黄灯
#defineN_GP1_5//南面绿灯
#defineX_RP1_6//西面红灯
#defineX_YP1_7//西面黄灯
#defineX_GP3_2//西面绿灯
#defineD_RP3_3//东面红灯
#defineD_YP3_4//东面黄灯
#defineD_GP3_5//东面绿灯
/***************定义数码管*****************/
#defineSMG_XSP0//数码管数据显示
#defineSMG_KZP2//数码管控制显示
voiddelay(uinttime)//扫描延时函数
{
uintx,y;
for(x=time;
x>
0;
x--)
for(y=110;
y>
y--);
}
voiddisp_init()//显示初始化
for(i=0;
i<
3;
i++)
{
SMG_XS=Data[10];
//数码管显示"
--------"
SMG_KZ=0x00;
//允许数码管显示
P1=0x00;
//北,南,西,东红黄绿灯亮
P3=0x00;
delay(300);
//延时
SMG_KZ=0xff;
//关闭数码管显示
P1=0xff;
//关闭北,南,西,东红黄绿灯
P3=0xff;
}
voiddisp(bei,nan,xi,dong)//显示(北南西东)时间函数
SMG_XS=Data[bei/10];
//显示北的十位
SMG_KZ=0xfd;
//允许北十位显示
delay(t);
//小延时一下,使数码管显示更清楚
SMG_KZ=0xff;
//关闭数码管显示(消隐)
SMG_XS=Data[bei%10];
//显示北的个位
SMG_KZ=0xfe;
//允许北个位显示
//关闭数码管显示(消隐)
SMG_XS=Data[nan/10];
//显示南的十位
SMG_KZ=0xf7;
//允许南十位显示
SMG_XS=Data[nan%10];
//显示南的个位
SMG_KZ=0xfb;
//允许南个位显示
SMG_XS=Data[xi/10];
//显示西的十位
SMG_KZ=0xdf;
//允许西十位显示
SMG_XS=Data[xi%10];
//显示西的个位
SMG_KZ=0xef;
//允许西个位显示
SMG_XS=Data[dong/10];
//显示东的十位
SMG_KZ=0x7f;
//允许东十位显示
SMG_XS=Data[dong%10];
//显示东的个位
SMG_KZ=0xbf;
//允许东个位显示
voidTime0_init()//定时器0初始化函数
TMOD=0x01;
//定时器0为方式1
TL0=(65536-50000)%256;
TH0=(65536-50000)/256;
//12M晶振定时时间50ms
ET0=1;
//开定时器0中断
EA=1;
//开总中断
TR0=1;
//启动定时器0
voidnight_mode()//深夜模式
B_R=1;
B_Y=~B_Y;
//北黄灯取反
B_G=1;
N_R=1;
N_Y=~N_Y;
//南黄灯取反
N_G=1;
X_R=1;
X_Y=~X_Y;
//西黄灯取反
X_G=1;
D_R=1;
D_Y=~D_Y;
//东黄灯取反
D_G=1;
voidB_N_G()//北南通(绿灯)西东(红灯)
B_G=0;
//北绿灯亮
N_G=0;
//南绿灯亮
B_Y=1;
N_Y=1;
X_R=0;
//西红灯亮
D_R=0;
//东红灯亮
X_Y=1;
D_Y=1;
voidX_D_G()//西东通(绿灯)北南(红灯)
B_R=0;
//北红灯亮
N_R=0;
//南红灯亮
X_G=0;
//西绿灯亮
D_G=0;
//东绿灯亮
voidB_N_tong()//北南通行
if(B_N_D_flag==1)//当北南通灯行标志位为1
B_N_G();
//北南通(绿灯)西东(红灯)
B_N_D_flag=0;
//北南通灯行标志位置0
while(num==20)//当1s时间到
num=0;
//num清0
bei--;
//北时间减1
nan--;
//南时间减1
xi--;
//西时间减1
dong--;
//东时间减1
if(bei<
=6&
&
bei>
=0||nan<
nan>
=0)//当北和南时间在0到6秒之间
{
if(bei<
3||nan<
3)//进一步判断北和南时间是否在3到6秒之间
{
B_G=~B_G;
//北绿灯取反
N_G=~N_G;
//南绿灯取反
}
=3&
nan<
=3)//进一步判断北和南时间是否在3秒以内
B_G=1;
//北绿灯不亮
N_G=1;
//南绿灯不亮
B_Y=0;
//北黄灯亮
N_Y=0;
//南黄灯亮
}
else//否则(即北和南时间不在0到6秒之间)
B_G=0;
//北绿灯亮
N_G=0;
//南绿灯亮
B_Y=1;
//北黄灯不亮
N_Y=1;
//南黄灯不亮
voidX_D_tong()//西东通行
if(X_D_D_flag==1)//当西东通灯行标志位为1
X_D_G();
//西东通(绿灯)北南(红灯)
X_D_D_flag=0;
//西东通灯行标志位置0
while(num==20)//当1s时间到
//num清0
//北时间减1
//南时间减1
//西时间减1
//东时间减1
if(xi