基于单片机的交通灯系统设计.docx
《基于单片机的交通灯系统设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的交通灯系统设计.docx(37页珍藏版)》请在冰豆网上搜索。
基于单片机的交通灯系统设计
摘要
本设计是一个以微电子技术,计算机和通信技术为先导的,而计算机技术怎样与实际应用更有效的结合并有效的发挥其作用是科学界最热门的话题,也是当今计算机应用中空前活跃的领域。
十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊。
那么靠什么来实现这井然秩序呢?
靠的就是交通信号灯的自动指挥系统。
本系统由单片机系统、按键、四位数码管显示、交通灯演示系统组成。
设计一个用于东西、南北走向的交通管理。
南北方向(主干道)车道和东西方向(支干道)车道两条交叉道路上的车辆交替运行,主干道每次通行时间都设为30秒、支干道每次通行间为20秒。
系统除基本交通灯功能外,还具有倒计时、时间设置、紧急情况处理、分时段调整信号灯的点亮时间以及根据具体情况手动控制等功能。
本系统结构简单,操作方便;可实现自动控制,具有一定的智能性;对优化城市交通具有一定的意义。
本设计将各任务进行细分包装,使各任务保持相对独立;能有效改善程序结构,便于模块化处理,使程序的可读性、可维护性和可移植性都得到进一步的提高。
近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构软硬件结合,加以完善。
本文主要从单片机的应用上来实现十字路口交通灯智能化的管理,用以控制过往车辆的正常运作。
关键词:
交通灯;单片机;AT89S52
1概述………………………………………………………………………………3
1.1设计背景………………………………………………………………………3
1.2设计任务……………………………………………………………………3
2系统总体方案及硬件设计………………………………………………………4
2.1AT89S52单片机简介…………………………………………………………4
2.2系统硬件电路的设计………………………………………………………4
3软件设计…………………………………………………………………………7
3.1交通灯的设计程序流程图……………………………………………………7
3.2定时器0及中断响应…………………………………………………………8
4Proteus软件仿真…………………………………………………………………10
4.1仿真电路图……………………………………………………………………10
4.2仿真步骤………………………………………………………………………10
5课程设计体会……………………………………………………………………11
参考文献……………………………………………………………………………11
附1:
源程序代码………………………………………………………………12
附2:
系统原理图………………………………………………………………18
1概述
1.1设计背景
如今随着人们生活水平的提高,车辆越来越多,交通事故频繁发生。
交通信号灯的出现,使交通得以有效管制,对于疏导交通流量,提高道路通行能力,减少交通事故有明显效果。
交通灯在城市交通中起着重要的作用,它与人们日常生活密切相关,是人们出行的安全保障。
因此提供一个可靠、安全、便捷的多功能交通灯控制系统有着现实的必要性。
为了解决这些问题,我们更应该提高交通控制和管理水平,合理使用现有交通设施,充分发挥其能力,提高交通效率,促进和谐交通的建立。
近年来随着科技的飞速发展,单片机的应用正在不断地走向深入,同时带动传统控制检测日新月益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象特点的软件结合,加以完善。
本系统设计一个基于单片机的交通灯控制系统。
能方便的对交通灯进行控制,使交通更和谐。
1.2设计任务
1)设计一个十字路口的交通灯控制电路,要求南北方向(主干道)车道和东西方向(支干道)车道两条交叉道路上的车辆交替运行,主干道每次通行时间都设为30秒、支干道每次通行间为20秒,时间可设置修改。
2)在绿灯转为红灯时,要求黄灯先亮5秒钟,才能变换运行车道;
3)黄灯亮时,要求每秒闪亮一次。
4)东西方向、南北方向车道除了有红、黄、绿灯指示外,每一种灯亮的时间都用显示器进行显示(采用计时的方法)。
5)一道有车而另一道无车(实验时用开关K0和K1控制),交通灯控制系统能立即让有车道放行。
6)有紧急车辆要求通过时,系统要能禁止普通车辆通行,A、B道均为红灯,紧急车由K2开关模拟。
2系统总体方案及硬件设计
2.1AT89S52单片机简介
AT89S52是一种低功耗、高性能CMOS8位微控制器。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S52具有以下标准功能:
8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
鉴于以上的优点本系统采用AT89S52作为主控芯片,实现对整个系统的控制。
2.2系统硬件电路的设计
(1)时钟电路设计
图2-1时钟电路原理图
如图2-1所示,采用内部时钟产生方式,在XTAL1和XTAL2两端跨接晶体或陶瓷振荡器,与内部反相器构成稳定的自击荡器。
其发出的时钟脉冲直接送入片内定时控制部件。
(2)复位电路设计
图2-2上电+按钮电平复位电路原理图
如图2-2所示,采用上电+按钮电平复位方式,当按下按钮时,RST管脚高电平触发。
为保证复位可靠,RC时间常数应大于两个机器周期,一般电容去22uF,电阻取1K。
(3)灯控制电路设计
图2-3交通灯状态显示电路
如图2-3所示,交通灯状态显示电路由东西南北四个方向各三个LED灯组成,分别显示四个方向上红、黄、绿三个状态,用以指示十字路口各方向车辆的行驶。
通过软件编程,可使路口交通变化情况为:
南北方向(主干道)车道和东西方向(支干道)车道两条交叉道路上的车辆交替运行,主干道每次通行时间都设为30秒、支干道每次通行间为20秒;在绿灯转为红灯时,要求黄灯先亮5秒钟,才能变换运行车道;黄灯亮时每秒闪亮一次。
(4)倒计时显示电路设计
图2-4数码管显示电路原理图
如图2-4所示,由一个共阳极四位数码管来实现倒计时。
由于P0口输出电流小,需外接上拉电阻,COME端接5V电源。
(5)按键控制电路设计
图2-5键盘电路原理图
如图2-5所示,开光控制由PD1-PD5四个连接到单片机的控制按钮组成。
通过软件编程,按下PD1电路进入外部中断响应,数码显示时间将停止倒计时,此时,可通过按钮PD3和PD4设置通行时间,每按一下PD3时间增加1s,而按下PD4时间减少1s。
按下PD5将使程序重新进入循环点亮状态。
3软件设计
3.1交通灯的设计程序流程图
3.2定时器0及中断响应
N
Y
N
Y
4Proteus软件仿真
4.1仿真图
4.2仿真步骤
(1)根据电路图选择器件连接电路
(2)双击AT89S52装入源程序编译生成的HEX文件
(3)单击运行按钮运行仿真
(4)根据仿真情况与程序实现任务对比,对于不能实现的任务修改并调试程序,重新装载重新运行调试仿真,直到能完全实现所要求的功能为止
(5)进一步改进和简化程序在进行调试仿真
5课程设计体会
通过这次单片机实训课程学习,才深刻体会到自己实际操作能力的匮乏。
从刚开始老师对单片机的整体介绍及其应用前景,对单片机产生了浓厚的兴趣,并利用自己的课余时间提前学习有关单片机的基本知识。
但空有理路知识,却无半点的实际操作经验。
后来在老师的建议下,选择运用单片机设计一个交通灯控制系统,从简单开始,后期逐步复杂化。
从给定电路图的分析到实际电路元件的识别、焊接,再到后期的程序设计以及系统调试,初步掌握了运用单片机系统设计特定功能的设计步骤,也对单片机有了更深的体会。
了解和掌握了一些简单的编程思想,对单片机各管脚的功能,I/O口的使用条件都有了更深的理解。
这次的课程设计让我把单片机的理论知识运用的实践中,实现了理论与实践的相结合,从中更懂得了理论是实践的基础,实践更能检验理论的真实性,让我受益匪浅。
参考文献:
[1]李朝青.单片机原理及接口技术(修订版).北京:
北京航空航天大学出版社,1998
[2]李广弟.单片机基础.北京:
北京航空航天大学出版社,1992
[3]何立民.单片机应用技术大全.北京:
北京航空航天大学出版社,1994
[4]张毅刚.单片机原理及接口技术.哈尔滨:
哈尔滨工业大学出版社,1990
[5]谭浩强.单片机课程设计.北京:
清华大学出版社,1989
[6]余发山.单片机原理及应用技术焦作:
中国矿业大学出版社,2007
附录1源程序代码
//#include
#include//对单片机的口进行了定义
#defineuintunsignedint
#defineucharunsignedchar
ucharcodea[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段码组合,共阴极
ucharcodeb[4]={0xfe,0xfd,0xfb,0xf7};//位码组合低有效
ucharcodec[4]={0xcc,0xd4,0x78,0xb8};/*P1绿红、黄红、红绿、红黄*/
//12MHz
//*************************************************************************************
ucharNB=25,DX=30,NBG=25,DXG=15,H=5;/*数码管显示值设置*/
uchari,k=0,cnt=0,j=0;
sbitK0=P3^5;/*支干道通行*/
sbitK1=P3^6;/*主干道通行*/
sbitK4=P3^7;/*返回*/
sbitK3=P3^2;/*设置时间*/
sbitK2=P3^3;/*紧急刹车*/
voiddelay(uchart);/*定义延时程序*/
voidkey();/*定义键盘程序*/
voiddisplay();/*定义显示程序*/
voidsettime();/*定义时间设置显示程序*/
//*************************程序初始*********************************************
voidinit(void)
{
TMOD=0x01;/*使用定时器0模式一*/
TH0=0x3c;/*(65536-5000)/256*/
TL0=0xb0;/*(65536-5000)%256*/
IT0=1;//开中断
ET0=1;
TR0=1;
EA=1;
EX0=1;
EX1=1;
P1=c[k];//开启交通灯
}
//*************************中断0处理程序***************************************
voidint0(void)interrupt0//通行时间设置
{
EA=0;
P1=0xd8;/*红灯全亮*/
for(;;)
{
settime();
if(K1==0)/*P3^6=0设置主干道通行时间*/
{
delay(40);
if(K1==0)
{
while(!
K1)
{
settime();
}
NBG++;/*主干道通行时间加1*/
if(NBG==100)
NBG=0;
}
}
if(K0==0)/*P3^5=0设置支干道通行时间*/
{
delay(40);
if(K0==0)
{
while(!
K0)
{
settime();
}
DXG++;/*支干道通行时间加1*/
if(DXG==100)
DXG=0;
}
}
if(K4==0)/*P3^7=0返回*/
{
delay(40);
if(K4==0)
{
while(!
K4)
{
}
k=0;P1=c[k];
NB=NBG,DX=NBG+H;
display();
EA=1;
break;
}
}
}
}
/***********************************中断1处理程序********************
voidint1(void)interrupt2//紧急情况
{
/*东西南北红灯亮*/
EA=0;
TR0=!
TR0;/*停止计数*/
for(;;)/*主支干道显示全为0*/
{P1=0xd8,P0=a[0];
P2=0xfe;
delay(20);
P2=0xfd;
delay(20);
P2=0xfb;
delay(20);
P2=0xf7;
delay(20);
if(K4==0)/*返回*/
{
delay(20);
EA=1;
P1=c[k];/*返回紧急前状态开始计数*/
TR0=!
TR0;/*重启计数*/
break;
}
}
}
voidtime1(void)interrupt1/*交通灯控制程序*/
{
TH0=0x3c;/*定时50ms*/
TL0=0xb0;
cnt++;
if(cnt>=20)/*每20*50ms=1s自减一*/
{
NB--;
DX--;
cnt=0;
if(NB==0||DX==0)
{
k++;
if(k>3)/*k取0,1,2,3*/
k=0;
switch(k)
{
case0:
NB=NBG,DX=NBG+H;j=0;P1=c[k];break;/*主干道通行显示绿红*/
case1:
NB=H;j=1;P1=c[k];break;/*主干道黄灯闪烁*/
case2:
NB=DXG+H,DX=DXG;j=0;P1=c[k];break;/*支干道通行显示红绿*/
case3:
DX=H;j=2;P1=c[k];break;/*支干道黄灯闪烁*/
}
}
}
}
voiddelay(uchart)//延时程序延时0.1*nms
{
uchari;
do
{
for(i=0;i<20;i++)
;;;
}while(t--);
}
voidsettime()
{
P2=0xfe,P0=a[(NBG+H)%10];/*显示主干道通行时间*/
delay(20);
P2=0xfd,P0=a[(NBG+H)/10];
delay(20);
P2=0xfb,P0=a[(DXG+H)%10];/*显示支干道通行时间*/
delay(20);
P2=0xf7,P0=a[(DXG+H)/10];
delay(20);
}
voidkey()//键盘程序用KOK1模拟一道有车一道无车
{
if(K1==0)/*主干道有车支干道无车*/
{
delay(40);
if(K1==0)
{
while(!
K1)
{
display();
}
k=0,P1=c[k];cnt=0;
NB=NBG,DX=NBG+H;
display();
}
}
if(K0==0)/*支干道有车主干道无车*/
{
delay(40);
if(K0==0)
{
while(!
K0)
{
display();
}
k=2,P1=c[k];cnt=0;
NB=DXG+H,DX=DXG;
display();
}
}
}
voiddisplay()//显示程序
{
P2=0xfe,P0=a[NB%10];/*由k的不同值进入确定显示数值*/
delay(20);
P2=0xfd,P0=a[NB/10];
delay(20);
P2=0xfb,P0=a[DX%10];
delay(20);
P2=0xf7,P0=a[DX/10];
delay(20);
}
voidmain(void)
{//主程序
init();
for(;;)
{
display();
key();
//黄灯闪烁程序
while(j==1)/*主干道黄灯闪烁*/
{
P1=0xdc;/*给黄灯一高电平黄灯灭*/
for(i=83;i>0;i--){display();}/*执行for循环延时*/
P1=c[k];/*再给黄灯一低电平黄灯亮*/
for(i=83;i>0;i--){display();}
}
while(j==2)
{/*支干道黄灯闪烁*/
P1=0xf8;
for(i=83;i>0;i--){display();}
P1=c[k];
for(i=83;i>0;i--){display();}
}
}
}
附录2系统原理图
在该设计基础上,作者增加了日历显示功能,显示月、日、时、分,电路图和程序如下:
交通灯程序:
#include
#defineucharunsignedchar//宏定义uchar
#defineuintunsignedint//宏定义uint
sbitRED_DONGXI=P1^0;//南北方向红灯亮
sbitYELLOW_DONGXI=P1^1;//南北方向黄灯亮
sbitRED_NANBEI=P1^3;//东西方向红灯亮
sbitGREEN_DONGXI=P1^2;//南北方向绿灯亮
sbitYELLOW_NANBEI=P1^4;//东西方向黄灯亮
sbitGREEN_NANBEI=P1^5;//东西方向绿灯亮
sbitDXweixuan1=P1^6;//南北方向数码管位选1
sbitDXweixuan2=P1^7;//南北方向数码管位选2
sbitNBweixuan1=P3^0;//东西方向数码管位选1
sbitNBweixuan2=P3^1;//东西方向数码管位选2
sbitL1=P3^5;
sbitL2=P3^6;
sbitL3=P3^7;//数码管显示位月、日、时、分选控制端
uintaa,bai,shi,ge,bb;
uintshi1,ge1,shi2,ge2,minute=00,hour=07,day=20,month=11;//月日时分初始值设定
uintmonth1,month2,day1,day2,hour1,hour2,minute1,minute2;//定义变量
/*数码管显示0-9*/
uintcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uintcodetable1[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};
/*子函数声明*/
voiddelay(uintz);
voiddelay0(uintz);
voidinit(uinta);
voiddisplay(uintshi1,uintge1,uintshi2,uintge2);
voidxtimer0();
voidinit1();
voidinit2();
voidinit3();
voidinit4();
voidinit5();
voidinit6();
voiddisplay1();
/*********************************************************
主函数
*********************************************************/
voidmain()
{
P0=0xFF;
P1=0xFF;
P2=0x00;
P3=0xFF;
EA=1;//打开外部中断
EX0=1;//允许外部中断0中断
IT0=0;
EX1=1;//允许外部中断1中断
IT1=0;
display1();//INT0为沿触发方式
init1();//第1个位状态
while
(1)
{
init6();//第6个状态
init2();//第2个状态
init3();//第3个状态
init4();//第4个状态
init5();//第5个状态
}
}
voidinit1()//预备状态东、西、南、北方向均亮红灯3S
{
uinttemp;
temp=3;//变量赋初值
TMOD=0x01;//定时器0工作于方式1
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;//