单片机控制的交通灯控制系统设计Word格式文档下载.docx
《单片机控制的交通灯控制系统设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《单片机控制的交通灯控制系统设计Word格式文档下载.docx(23页珍藏版)》请在冰豆网上搜索。
2.6时间显示电路……………………………………………………………10
2.7交通灯电路………………………………………………………………10
3软件设计
3.1整体系统分析……………………………………………………………11
3.2相关参数计算……………………………………………………………11
3.3程序流程图………………………………………………………………12
4Proteus软件仿真
4.1系统仿真电路图…………………………………………………………13
4.2仿真结果分析……………………………………………………………15
5课程设计体会
参考文献
附1:
源程序代码
附2:
系统原理图
1.1课题名称
1.2设计要求
1)南北方向(主干道)车道和东西方向(支干道)车道两条交叉道路上的车辆交替运行,主干道每次通行时间都设为30秒、支干道每次通行间为20秒,时间可设置修改;
2)在绿灯转为红灯时,要求黄灯先亮5秒钟,才能变换运行车道;
3)黄灯亮时,要求每秒闪亮一次;
4)东西方向、南北方向车道除了有红、黄、绿灯指示外,每一种灯亮的时间都用显示器进行显示(采用计时的方法);
5)一道有车而另一道无车(实验时用开关K0和K1控制),交通灯控制系统能立即让有车道放行;
6)有紧急车辆要求通过时,系统要能禁止普通车辆通行,A、B道均为红灯,紧急车由K2开关模拟。
1.3设计意义
国内的交通灯一般设在十字路门,在醒目位置用红、绿、黄三种颜色的指示灯。
加上一个倒计时的显示计时器来控制行车。
对于一般情况下的安全行车,车辆分流尚能发挥作用,但根据实际行车过程中出现的情况,还存在以下缺点:
1.两车道的车辆轮流放行时间相同且固定,在十字路口,经常一个车道为主干道,车辆较多,放行时间应该长些;
另一车道为副干道,车辆较少,放行时间应该短些。
2.没有考虑紧急车通过时,两车道应采取的措施,臂如,消防车执行紧急任务通过时,两车道的车都应停止,让紧急车通过。
基于传统交通灯控制系统设计过于死板,红绿灯交替是间过于程式化的缺点,智能交通灯控制系统的设计就更显示出了它的研究意义,它能根据道路交通拥护,交叉路口经常出现拥堵的情况。
利用单片机控制技术.提出了软件和硬件设计方案,能够实现道路的最大通行效率。
2.1芯片的选择与简单介绍
主控芯片采用AT89S52单片机(其管脚图如图-1所示)。
单片机,亦称单片微型计算机。
它是把中央处理器(CPU)、数据存储器(RAM)、程序存储器(ROM)、输入/输出端口(I/0)等主要计算机功能部件都集成在一块集成电路芯片上的微型计算机。
计算机的产生加快了人类改造世界的步伐,但是它毕竟体积大。
于是,微型计算机(即单片机)在这种情况下诞生了。
纵观生活的各个领域,从导弹的导航装置,到飞机上各种仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据处理,以及我们生活中广泛使用的各种智能IC卡、电子宠物等,这些都离不开单片机。
单片机以体积小、功能全、性价比等诸多优点而独具特色,在工业控制、尖端武器、通信设备、家用电器等嵌入式应用领域中独占鳌头。
如果说C语言程序设计课程设计的基础课,那么单片机以其系统硬件构架完整、价格低廉、学生能动手等特点,成为工科学生硬件设计基础课。
MCS-51单片机是指由美国INTEL公司(大名鼎鼎的INTEL)生产的一系列单片机的总称,这一系列单片机包括了好些品种,如8031,8051,8751,8032,8052,8752等,其中8051是最早最典型的产品,该系列其它单片机都是在8051的基础上进行功能的增、减、改变而来的,所以人们习惯于用8051来称呼MCS-51系列单片机。
8051单片机包含中央处理器(CPU)、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线,现在我们分别加以说明:
1.中央处理器(CPU)
中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。
2.数据存储器(RAM)
8051内部有128个8位用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义的字型表。
3.程序存储器(内部ROM):
程序存储器用于存放程序和固定不变的常数等。
通常采用只读存储器,且其又多种类型,在89系列单片机中全部采用闪存。
AT89S51内部配置了4KB闪存。
3.1.定时/计数器(ROM):
定时/计数器用于实现定时和计数功能。
AT89S51共有2个16位定时/计数器。
3.2.并行输入输出(I/O)口:
8051共有4组8位I/O口(P0、P1、P2或P3),用于对外部数据的传输。
每个口都由1个锁存器和一个驱动器组成。
它们主要用于实现与外部设备中数据的并行输入与输出,有些I/O口还有其他功能。
4.全双工串行口:
A89S51内置一个全双工串行通信口,用于与其它设备间的串行数据传送,该串行口既可以用作异步通信收发器,也可以当同步移位器使用。
5.时钟电路:
时钟电路的作用是产生单片机工作所需要的时钟脉冲序列。
6.中断系统:
中断系统的作用主要是对外部或内部的终端请求进行管理与处理。
AT89S51共有5个中断源,其中又2个外部中断源和3个内部中断源。
7.定时/计数器
8051有两个16位的可编程定时/计数器,以实现定时或计数产生中断用于控制程序转向。
2.2系统方框图
2.3工作原理
由软件设置交通灯的初始时间,南北方向通行30秒,东西方向通行20秒,数码管采用动态显示,P0口送字形码,P2口送字位选通信号,通过单片机的P1口控制各种信号灯的燃亮与熄灭。
采用中断方式实现按键的功能。
2.4电路原理图
(图-2)
2.5单片机最小系统
单片机最小系统以80S52为核心,外加时钟和复位电路,电路结构简单,抗干扰能力强,成本相对较低,非常符合本设计的所有要求。
89C51单片机系列是MCS-51系列的基础上发展起来的,是当前8位单片机的典型代表,采用CHMOS工艺,即互补金属氧化物的HMOS工艺,CHMOS是CMOS和HMOS的结合,具有HMOS高速度和高密度的特点,还具有CMOS低功耗的特点。
时钟电路在单片机的外部通过XTAL1,XTAL2这两个引脚跨接晶体振荡器和微调电容,构成稳定的自激振荡器.本系统采用的为12MHz的晶振,一个机器周期为1us,C2,C3为30pF。
复位电路分为上电自动复位和按键手动复位,RST引脚是复位信号的输入端,复位信号是高电平有效.上电自动复位通过电容C1和电阻R4来实现,按键手动复位是图中复位键来实现的。
2.6时间显示电路
(图-4)
因为系统要求南北和东西方向的信号灯时间不一样,所以就利用单片机的P0口送出数据的段码,位选信号用P2口送出,用动态扫描的方法显示东西、南北的倒计时间(如图-4所示)。
数码管使用共阴数码管,需要接上470欧上拉电阻以提供足够大的电流来驱动数码管,数码管的每段的电流是约10毫安。
2.7交通灯电路
本设计利用单片机的p1口来驱动和控制各种信号灯的燃亮和燃亮时间,在实际中,交通灯的信号灯需要用高电压控制,在这里我们只是模拟一下它的控制信号,所以我们就只用单片机的信号引脚直接来控制发光二极管(如图-5所示)
(图-5)
3.1整体系统分析
总体流程图(实现各种状态间的转换):
3.2相关参数计算
T0的计数初值:
X=216-12*50*1000/12=15536=3CB0H
3.3程序流程图
(图-6)
4.1系统仿真电路图
1.交通灯控制系统正常运行时仿真图(见图-7)。
(图-7)
2.交通灯南北方向绿灯向红灯转变,黄灯闪烁时仿真图(见图-8)。
4、交通灯东西方向向南北方向转变,黄灯亮,见(图-9)。
(图-9)
4.2仿真结果分析
仿真实验实现南北方向车道和东西方向车道两条交叉道路的车辆交替运行,南北方向(主干道)每次通行时间设为30秒、东西方向通行时间设为20秒,时间可以在程序中修改。
同时能够实现红灯、黄灯、绿灯状态转换,红绿灯转换时间为5秒,转黄期间黄灯亮。
可以准确显示每个状态所剩余的时间,按下禁行普通车辆键,东西南北方向都亮红灯;
按下南北放行键,南北绿灯亮,东西红灯亮;
按下东西放行键,东西绿灯亮,南北红灯亮;
任何时候按下返回键,此系统都将回到初始状态,当紧急状况出现时,按下紧急开关,可实现主干道和支干道全部禁止通行,允许紧急车辆安全通行,实现了课程设计的要求。
本系统就是充分利用了AT89S52芯片的I/O引角。
系统统采用MSC-51系列单片机为中心器件来设计交通灯控制器,实现了能根据实际车流量通过单片机芯片的P1口控制红、黄、绿灯的燃亮与熄灭;
P0口外接数码管来显示各个信号灯的时间。
系统设计简便、实用性强、操作简单、程序设计简便。
系统不足之处不能控制车的左、右转、以及自动根据车流改变红绿灯时间等。
这是由于本身地理位子以及车流量情况所定,如果有需要可以设计扩充原系统来实现。
通过这次课程设计,我得到了一次用所学知识与技能分析和解决问题的可贵的锻炼机会,使我深刻邻会了单片机的基本原理和单片机应用系统开发的过程。
在常用编程设计思路技巧的掌握方面都向前迈了一大步,为日后成为合格的应用型人才打下良好的基础。
通过本次的毕业设计,受益匪浅,充分意识到自己所学的东西还是非常有限的,不过通过设计,还是学到了一些书本上没有学到的东西,为自己以后的工作奠定了一定的基础。
在撰写本文的过程中,深切地体会到当今科技技术飞速的发展,特别是单片机的发展使得许多技术难题迎刃而解,作者坚信,随着科学技术的不断发展,单片机技术的应用将是前途无量。
由于本设计涉及到的知识面比较广,再加上本人在相关领域知识的缺乏,所以本设计的性能指标还是有待改善的,然而,模拟仿真证明了本设计的设计思想和设计方法是现实可行的。
[1]余发山王福忠单片机原理及应用技术[M].徐州:
中国矿业大学出版社2008.
[2]吴黎明单片机原理及应用技术[M].北京:
科学出版社2003.
[3]刘乐善微型计算机接口技术及应用[M].北京:
华中科技大学出版社2004.
[4]李伯成.基于MCS-51单片机的嵌入式系统的设计[M].北京:
电子工业出版社,2004.
[5]吴黎明,王桂棠,洪添胜,等.单片机原理及应用技术[M].北京:
科学出版社,2005.
[6]韩克,柳秀山,等.电子技能与EDA技术[M].广州:
暨南大学出版社,2004.
/*#include<
REG51.H>
*/
#include<
AT89X51.H>
#defineucharunsignedchar/*定义字符串类型为无符号型*/
ucharcodea[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
ucharcodeb[4]={0x0D,0x0E,0x07,0x0B};
/****P2口,低有效*/
ucharcodec[4]={0xDE,0xDD,0xF3,0xEB};
/****P1口,低有效*/
charSN=25,WE=30;
charSN_G=25,WE_G=15,Y=5;
uchari,k=0,count=0;
voiddelay(uchart);
/*定义函数*/
voidlight();
/*定义函数*/
voidled();
/*定义函数*/
sbitK0=P3^7;
/*开关K0接P3^7管脚*/
sbitK1=P3^6;
/*开关K1接P3^6管脚*/
sbitK2=P3^3;
/*开关K2接P3^3管脚*/
sbitK3=P3^5;
/*开关K3接P3^5管脚*/
sbitK4=P3^2;
/*开关K4接P3^2管脚*/
/*程序初始化*/
voidinit(void)
{
/*12MHz*/
TMOD=0x01;
/**计数器用模式1,为16位计数器*****/
TH1=(65536-50000)/256;
/*0x3C*/
TL1=(65536-50000)%256;
/*0xB0*//*计50000个数,用时50ms*/
IT0=1;
/*外部中断0为边沿触发方式*/
ET0=1;
/*允许T0中断*/
TR0=1;
/*启动计数器*/
EA=1;
/*CPU开放总中断*/
EX0=1;
/*允许外部中断0中断,即允许响应端口P3^2(K4)中断*/
EX1=1;
/*允许外部中断1中断,即允许响应端口P3^3(K2)中断*/
}
/*中断0处理程序*/
voidint0(void)interrupt0
EA=0;
/*CPU禁止响应一切中断*/
P1=0xDB,P0=a[0];
/*东西南北方向均红灯亮,P0口输出0*/
for(;
;
)/*无条件循环*/
{
P2=b[0],P0=a[(SN_G+Y)%10];
/*南北方向数码管显示可通行时间的个位*/
delay(5);
/*延时*/
P2=b[1],P0=a[(SN_G+Y)/10];
/*南北方向数码管显示可通行时间的十位*/
P2=b[2],P0=a[(WE_G+Y)%10];
/*东西方向数码管显示可通行时间的个位*/
P2=b[3],P0=a[(WE_G+Y)/10];
/*东西方向数码管显示可通行时间的十位*/
/*设置南北方向通行时间*/
if(K0==0)/*P3^7=0*/
{
delay(10);
/*延时,把抖动的时间抛掉*/
if(K0==0)
{
while(!
K0)/*当松开K0开关时,跳出空循环,执行后面的程序*/
}
SN_G++;
/*南北方向绿灯时间+1*/
if(SN_G==100)
SN_G=0;
/*由于使用的是两位数码管,当南北方向绿灯时间加到100后清零*/
/*设置东西方向通行时间*/
if(K1==0)/*P3^6=0*/
if(K1==0)
K1)/*当松开K1开关时,跳出空循环,执行后面的程序*/
WE_G++;
/*东西方向绿灯时间+1*/
if(WE_G==100)
WE_G=0;
/*由于使用的是两位数码管,当东西方向绿灯时间加到100后清零*/
/*返回*/
if(K3==0)/*P3^5=0*/
if(K3==0)
while(!
K3)/*当松开K3开关时,跳出空循环,执行后面的程序*/
{
}
count=0;
/*清零*/
k=0;
/*南北方向通车,东西方向不通车*/
SN=SN_G,WE=SN_G+Y;
/*南北方向显示时间为南北方向绿灯通行时间,东西方向显示时间为南北方向绿灯通行时间加黄灯闪亮时间*/
light();
/*调用交通灯函数*/
led();
/*调用数码管函数*/
EA=1;
/*CPU开放总中断*/
break;
/*跳出*/
}
/*中断1处理程序*/
voidint1(void)interrupt2
{
P1=0xDB,P0=a[0];
TR0=!
TR0;
/*计数器停止工作*/
/*数码管扫描程序,*/
P2=b[0];
/*显示南北方向个位*/
/*延时*/
P2=b[1];
/*显示南北方向十位*/
P2=b[2];
/*显示东西方向个位*/
P2=b[3];
/*显示东西方向十位*/
/*返回*/
if(K3==0)/*P3^5=0*/
EA=1;
/*CPU开放总中断*/
TR0=!
/*启动计数器*/
}
/*键盘程序*/
voidkey()
/*南北有车而东西无车*/
if(K0==0)/*K0=0*/
if(K0==0)
K0)/*当松开K0开关时,跳出循环,执行后面的程序*/
count=0;
k=0;
SN=SN_G,WE=SN_G+Y;
led();
/*南北无车而东西有车*/
if(K1==0)/*K1=0*/
K1)/*当松开K1开关时,跳出循环,执行后面的程序*/
k=2;
/*南北方向不通车,东西方向通车*/
SN=WE_G+Y,WE=WE_G;
/*南北方向显示时间为东西方向绿灯通行时间加黄灯闪亮时间,东西方向显示时间为东西方向绿灯通行时间*/
/*定时函数*/
voidtime1(void)interrupt1
TH0=0x3c;
TL0=0xb0;
/*计50000个数,用时50ms*/
count++;
/*自增运算*/
if(count>
=20)/*当count大于或等于20时,历时1s,执行程序*/
SN--;
/*自减运算*/
WE--;
count=0;
if(SN==0||WE==0)/*当SN=0或者WE=0时,执行程序*/
k++;
/*自增运算*/
if(k>
3)/*当k>
3时,执行程序*/
switch(k)/*switch语句*/
case0:
SN=SN_G,WE=SN_G+Y;
break;
case1:
SN=Y,WE=Y;
/*东西南北方向显示时间均为黄灯闪亮时间*/
case2:
SN=WE_G+Y,WE=WE_G;
case3:
/*延时t毫秒*/
voiddelay(uchart)
uchari;
for(t;
t>
0;
t--)
for(i=2000;
i>
i--)
{}
}
/*交通灯函数*/
voidlight