交通灯实验报告.docx

上传人:b****7 文档编号:10819243 上传时间:2023-02-23 格式:DOCX 页数:31 大小:189.28KB
下载 相关 举报
交通灯实验报告.docx_第1页
第1页 / 共31页
交通灯实验报告.docx_第2页
第2页 / 共31页
交通灯实验报告.docx_第3页
第3页 / 共31页
交通灯实验报告.docx_第4页
第4页 / 共31页
交通灯实验报告.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

交通灯实验报告.docx

《交通灯实验报告.docx》由会员分享,可在线阅读,更多相关《交通灯实验报告.docx(31页珍藏版)》请在冰豆网上搜索。

交通灯实验报告.docx

交通灯实验报告

1.设计思路1

2.1电源提供方案1

2.2显示界面方案2

2.3输入方案:

2

3单片机交通控制系统总体设计2

3.1单片机交通控制系统的通行方案设计2

3.2单片机交通控制系统的功能要求3

3.3单片机交通控制系统的基本构成及原理4

4智能交通灯控制系统的硬件设计4

4.1AT89C51单片机简介4

4.1.1AT89C51单片机的主要特性5

4.1.2主要引脚功能5

4.2交通灯中的中断处理流程7

4.3系统硬件总电路构成及原理8

4.3.1系统硬件电路构成8

4.3.2系统工作原理8

4.4其它硬件介绍及连接9

4.4.1八段LED数码管9

5系统软件程序的设计11

5.1程序主体设计流程11

5.2理论基础知识12

5.2.1定时器原理12

5.2.2软件延时原理13

5.2.3中断原理13

5.3子程序模块设计13

5.3.1状态灯显示及判断13

5.3.2LED倒计时显示14

5.3.3紧停及调整时间中断子程序14

5.3.4红绿灯时间调整程序15

5.4系统软件调试17

5.4.1TKS仿真器17

5.4.2集成开发环境KEIL17

参考文献……………………………………………………………………………………………..17

设计心得体会………………………………………………………………………………………...18

附录……………………………………………………………………………………………………19

 

基于单片机的交通控制系统模拟设计

1、实验目的

1.学习8051定时器时间计时处理、按键扫描及LED数码管显示的设计方法。

2.设计任务及要求利用实验平台上4个LED数码管,设计时间递减

 

2、实验要求

1:

利用单片机的定时器产生秒信号,控制十字路口的红绿黄灯交替点亮和熄灭,

2:

能够用4只LED数码管显示十字路口两个方向的剩余时间。

要求能用按键设置两个方向的通行时间(绿灯点亮的时间)和暂缓通行时间(黄灯点亮的时间)。

3:

系统的工作应符合一般交通灯控制的要求。

3、实验基本原理

实现本设计要求的具体功能,可以选用AT89C51单片机及外围器件构成最小控制系统,12个发光二极管分成4组红绿黄三色灯构成信号灯指示模块,8个LED东西南北各两个构成倒计时显示模块,若干按键组成时间设置和紧急按钮。

系统硬件电路构成

本系统以单片机为核心,系统硬件电路由状态灯,LED显示,按键,组成。

其具体的硬件电路总图如图3.1所示。

其中P0用于送显两片LED数码管,P1用于控制红绿黄发光二极管,XTAL1和XTAL2接入晶振时钟电路,REST引脚接上复位电路,P2.6与P2.7对数码管进行片选,P3.2即INT0紧急情况处理按键,P3.3即INT1接时间调整中断按键。

系统工作原理

系统上电或手动复位之后,系统先显示状态灯及LED数码管,将状态码值送显P1口,将要显示的时间值的个位和十位分别送显P0口,在此同时用软件方法计时1秒,到达1s就要将时间值减1,刷新LED数码管。

时间到达一个状态所要全部时间,则要进行下一状态判断及衔接,并装入次状态的相应状态码值以及时间值,

当然,还要开启两个外部中断,其一为紧急情况处理中断,一旦信号有效,即K3键为低电平时进入中断服务子程序,东西南北路口的红灯全亮禁止全部通行,再按一下K3键,中断结束返回。

其二为通行时间调整中断,若K4按键有效,进入相应的中断子程序,对时间进行调整,此后再按K4键则中断结束返回。

其它硬件介绍及连接

八段LED数码管

LED显示屏作为大型显示设备的一种,具有亮度高、价格低、寿命长、维护简便等优点。

LED数码管的结构简单,分为七段和八段两种形式,也有共阳和共阴之分。

以八段共阳管为例,它有8个发光二极管(比七段多一个发光二极管,用来显示dP,即点),每个发光二极管的阳极连在一起,如图3.6所示。

这样,一个LED数码管就有I根位选线和8根段选线,要想显示一个数值,就要分别对它们的高低电平来加以控制。

为方便起见,本文主要讨论共阳八段LED数码显示管,其他类形的显示管与其类似。

图6LED数码管

LED灯的显示原理:

通过同名管脚上所加电平的高低来控制发光二极管是否点亮而显示不同的字形,如dp,g,f,e,d,c,b,a全亮显示为8,采用共阳极连接驱动代码,代码表如下表5所示。

表5驱动代码表

相应在程序软件上,可以通过调用程序给定的秒值经过特定计算算出需要显示的个位和十位,然后有DPTR调取LEDMAP的代码。

LED8段数码管的设置为每个方位上的一对2为显示器。

四个方位上总共用8个LED接在单片机的IO口上。

虽然路口不一样,但是显示的时间在数字上是一样的,所以两边连接的IO口是对称的。

如图3.7所示,其中A,B分别是P0,P1的网络标号。

图7LED连接图

发光二极管

根据本设计的特点,红绿灯的显示不可少,红绿灯的显示采用普通的发光二极管。

每个方向上设置红绿黄灯,总共4组。

如果东西红灯亮,那南北方向就是绿灯亮,反之亦然,所以在硬件上连接图上也是对称分布的,如下图8所示。

图8信号灯的连接

按键控制

本设计设置了有5个键:

K1键P3.0,K2键P3.1,K3键P3.2,K4键P3.3,K5键P3.4,每个按键一端接地,另一端接对应的P3端口。

低电平有效,当按键

按下端口接地,单片机捕获到低电平,从而知道相应的输入信息。

四,实验设计分析

程序主体设计流程

全部控制程序实际上分为若干模块:

键盘设置处理程序,状态灯控制程序,LED显示程序紧停程序,中断服务子程序,红绿灯时间调整程序等。

整个软件程序方面主要分两大部分:

主程序部分和中断处理程序。

流程图如图9所示。

图9系统总流程图

设计说明:

该智能交通灯控制系统的软件设计采用的是顺序执行并反复循环的方法。

智能交通灯控制系统在正常工作的情况下,每20s循环变化一次。

每个循环周期在还剩5s时,正在通行路口的黄灯同时点亮并开始闪烁,以提醒路人上的行人及车辆,交通灯即将发生变化。

在此期间若中断按键按下则转入中断服务子程序进行相关操作。

定时器原理

定时器工作的基本原理其实就是给初值,让它不断加1直至减完为模值,这个初值是送到TH和TL中的。

它是以加法记数的,并能从全1到全0时自动产生溢出中断请求。

因此,我们可以把计数器记满为零所需的计数值,即所要求的计数值设定为C,把计数初值设定为TC可得到如下计算通式:

TC=M-C

式中,M为计数器模值。

计数值并不是目的,目的是时间值,设计1次的时间,即定时器计数脉冲的周期为T0,它是单片机系统主频周期的12倍,设要求的时间值为T,则有C=T/T0。

计算通式变为:

T=(M-TC)T0

模值和计数器工作方式有关。

在方式0时M为8192;在方式1时M的值为65536;在方式2和3为256。

就此可以算出各种方式的最大延时。

如单片机的主脉冲频率为12MHZ,经过12分频后,若采用方式0最大延时只有8.129毫秒,采用方式1最大延时也只有65.536毫秒。

这就是为什么扫描周期为50ms的原因,

若使用软件则会耽搁程序流程,显然不可行。

相反,时间计时方面却不可能只用计数器,因为显然1秒钟已经超过了计数器的最大定时间,所以我们还必须采用定时器和软件相结合的办法才能解决这个问题。

软件延时原理

的工作频率为12MHZ,机器周期与主频有关,机器周期是主频的12倍,所以一个机器周期的时间为12*(1/12MHZ)=1us。

我们可以知道具体每条指令的周期数,这样我们就可以通过指令的执行条数来确定1秒的时间,但同时由于单片机的运行速度很快其他的指令执行时间可以忽略不计。

中断原理

本系统主要使用了外部中断,中断信号有引脚INT0和INT1输入,低电平有效,CPU每个时钟周期都会检测INT0和INT1上的信号,8051允许外部中断以电平方式或负边沿方式两种中断方式输入中断请求信号,可由用户通过设置TCON中IT0和IT1位的状态来实现。

以IT0为例,IT0=0,为电平触发方式,IT0=1,为负边沿触发方式,本设计采用电平方式,IE0为其中断标志位,有中断信号则置位,中断服务子程序响应后,IE0自动清零。

IE中的EA为允许中断的总控制位,为1开启,EX0为外部中断允许控制位,为1开启。

在优先级的允许下,一旦有外部中断信号产生,单片机CPU首先保护断点,PC值进栈,然后执行相应的中断服务子程序,执行完后,用RETI指令返回,此时CPU会从堆栈中取保存的断点地址,送回PC,程序再正常执行。

主程序

#include

#defineuintunsignedint

#defineucharunsignedchar

uintcodetable1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};

//uintcodetable2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

uinta,b,c,num0,num1,temp0,temp1,t,temp2,temp3;

staticuintnum;

uintd[2];

uintk=-1;

//函数的声明

voiddelay();

voidkeyscan();

voiddisplay0();

voiddisplay1(uint,uint);

voidinit();

 

//*********************************主函数*********************************************

voidmain(){

init();

temp2=0;

b=temp1=8;

a=temp0=6;

P1=0x00;

c=b-a;

while

(1){

keyscan();

while(num0==1){

keyscan();

display0();

if(num1==1){

temp1=b=num;

num1=2;

}

if(num1==2){

temp0=a=num;

}

c=b-a;

t=0;

}

 

if((t==20)&&(temp2==0)){

t=0;

if((temp1-temp0)!

=0)

P1=0x7d;

temp0--;

temp1--;

if((temp0==0)&&(temp1!

=0)){

temp0=c;

P1=0x7b;

}

if((temp0==0)&&(temp1==0)){

temp2=b;

temp3=a;

}

}

if(temp2==0){

display1(temp0,temp1);

//P1=0x7d;

}

if((t==20)&&(temp1==0)){

t=0;

if((temp2-temp3)!

=0)

P1=0xd7;

temp2--;

temp3--;

if((temp2!

=0)&&(temp3==0)){

temp3=c;

P1=0xb7;

}

if((temp2==0)&&(temp3==0)){

temp1=b;

temp0=a;

}

}

if(temp1==0){

display1(temp2,temp3);

}

}

}

//***********************函数定义********************************

 

voiddelay(){//延时函数

uinti,j;

for(i=0;i<10;i++)

for(j=0;j<10;j++);

}

voidinit(){//初始化函数

TMOD=0x01;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

EA=1;

ET0=1;

TR0=1;

}

 

voidtimer()interrupt1{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

t++;

}

voiddisplay0(){

if(k==0){

P0=table1[d[k]];

P2=0xfe;

delay();

num=d[0];

}

if(k==1){

P0=table1[d[0]];

P2=0xfd;

delay();

P2=0xff;

P0=table1[d[1]];

P2=0xfe;

delay();

P2=0xff;

num=d[0]*10+d[1];

}

}

voiddisplay1(uinth0,uinth1){//显示函数

uintshi0,ge0,shi1,ge1;

shi0=h0/10;

ge0=h0%10;

shi1=h1/10;

ge1=h1%10;

P0=table1[ge0];

P2=0xfe;

delay();

P2=0xff;

P0=table1[shi0];

P2=0xfd;

delay();

P2=0xff;

P0=table1[ge1];

P2=0xbf;

delay();

P2=0xff;

P0=table1[shi1];

P2=0x7f;

delay();

P2=0xff;

}

voidkeyscan(){//键盘扫描函数

uchartemp;

P3=0xfe;

temp=P3;

temp=temp&0xf0;

while(temp!

=0xf0){

delay();

temp=P3&0xf0;

while(temp!

=0xf0){

temp=P3;

switch(temp){

case0xee:

//[4,4]

num0=0;

break;

case0xde:

//[4,3]

//num=1;

break;

case0xbe:

//[4,2]

//num=2;

break;

case0x7e:

//[4,1]

k++;

d[k]=0;

break;

}

while(temp!

=0xf0){

temp=P3;

temp=temp&0xf0;

}

}

}

P3=0xfd;

temp=P3;

temp=temp&0xf0;

while(temp!

=0xf0){

delay();

temp=P3&0xf0;

while(temp!

=0xf0){

temp=P3;

switch(temp){

case0xed:

//[3,4]//设定为绿灯时间

num1=2;

k=-1;

break;

case0xdd:

//[3,3]

k++;

d[k]=9;

break;

case0xbd:

//[3,2]

k++;

d[k]=8;

break;

case0x7d:

//[3,1]

k++;

d[k]=7;

break;

}

while(temp!

=0xf0){

temp=P3;

temp=temp&0xf0;

}

}

}

P3=0xfb;

temp=P3;

temp=temp&0xf0;

while(temp!

=0xf0){

delay();

temp=P3&0xf0;

while(temp!

=0xf0){

temp=P3;

switch(temp){

case0xeb:

//[2,4]//设定为黄灯时间

num1=1;

k=-1;

break;

case0xdb:

//[2,3]

k++;

d[k]=6;

break;

case0xbb:

//[2,2]

k++;

d[k]=5;

break;

case0x7b:

//[2,1]

k++;

d[k]=4;

break;

}

while(temp!

=0xf0){

temp=P3;

temp=temp&0xf0;

}

}

}

P3=0xf7;

temp=P3;

temp=temp&0xf0;

while(temp!

=0xf0){

delay();

temp=P3&0xf0;

while(temp!

=0xf0){

temp=P3;

switch(temp){

case0xe7:

//[1,4]//开启时间设定

num0=1;

break;

case0xd7:

//[1,3]

k++;

d[k]=3;

break;

case0xb7:

//[1,2]

k++;

d[k]=2;

break;

case0x77:

//[1,1]

k++;

d[k]=1;

break;

}

while(temp!

=0xf0){

temp=P3;

temp=temp&0xf0;

}

}

}

}

状态灯显示及判断

在本设计中,实际控制的灯只有6个,即:

东西红灯,东西绿灯,东西黄灯,南北红灯,南北绿灯,南北黄灯。

定义IO端口如下,其中均是低电平有效。

共有4钟状态:

东西红灯亮,南北绿灯亮(0F3H);东西红灯亮,南北黄灯亮(0F5H);东西绿灯亮,南北红灯亮(0DEH);东西黄灯亮,南北红灯亮(0EEH)。

括号中是P1端口8个引脚值对应的十六进制码。

LED倒计时显示

LED计时每1秒都要刷新1次,采用的是动态显示,首先将R4除以10H,整数即十位放在50H中,余数即个位放在51H中,设置7段LED显示数据的数

紧停及调整时间中断子程序

紧停按键连接到外部中断引脚P3.2,即INT0捕获到一个低电平,则进入该中断进行相关处理。

红绿灯时间调整程序

时间调整按键连接到外部中断引脚P3.3,即INT1捕获到一个低电平,则进入该中断进行相关处理。

(1)分析目前交通路口的基本控制技术以及各种通行方案,并以此为基础提出自己的交通控制的初步方案。

(2)确定系统交通控制的总体设计,包括,十字路口具体的通行禁行方案设计以及系统应拥有的各项功能,在这里,本设计除了有信号灯状态控制能实现基本的交通功能,还增加了倒计时显示提示,基于实际情况,又增加了紧急状况处理和通行时间可调这两项特特殊功能。

(3)进行显示电路,灯状态电路,按键电路的设计和对各器件的选择及连接,大体分配各个器件及模块的基本功能要求。

(4)进行软件系统的设计,对于本系统,本人采用单片机汇编语言编写,对单片机内部结构和工作情况做了充足的研究,了解定时器,中断以及延时原理,总体上完成了软件的编写。

单片机交通控制系统的通行方案设计

设在十字路口,分为东西向和南北向,在任一时刻只有一个方向通行,另一方向禁行,持续一定时间,经过短暂的过渡时间,将通行禁行方向对换。

其具体状态如下图所示。

说明:

黑色表示亮,白色表示灭。

交通状态从状态1开始变换,直至状态6然后循环至状态通过具体的路口交通灯状态的演示分析我们可以把这四个状态归纳如下:

◆东西方向红灯灭,同时绿灯亮,南北方向黄灯灭,同时红灯亮,倒计时20秒。

此状态下,东西向禁止通行,南北向允许通行。

◆东西方向绿灯灭,同时黄灯亮,南北方向红灯亮,倒计时5秒。

此状态下,除了已经正在通行中的其他所以车辆都需等待状态转换。

◆南北方向红灯灭,同时绿灯亮,东西方向黄灯灭,同时红灯亮,倒计时20秒。

此状态下,东西向允许通行,南北向禁止通行。

◆南北方向绿灯灭,同时黄灯亮,东西方向红灯亮,倒计时5秒。

此状态下,除了已经正在通行中的其他所以车辆都需等待状态转换。

下面我们可以用图表表示灯状态和行止状态的关系如下:

表1交通状态及红绿灯状态

状态1

状态3

状态4

状态6

东西向

禁行

等待变换

通行

等待变换

南北向

通行

等待变换

禁行

等待变换

东西红灯

1

1

0

0

东西黄灯

0

0

0

1

东西绿灯

0

0

1

0

南北红灯

0

0

1

1

南北绿灯

1

0

0

0

南北黄灯

0

1

0

0

东西南北四个路口均有红绿黄3灯和数码显示管2个,在任一个路口,遇红灯禁止通行,转绿灯允许通行,之后黄灯亮警告行止状态将变换。

状态及红绿灯状态如表1所示。

说明:

0表示灭,1表示亮。

3.2单片机交通控制系统的功能要求

本设计能模拟基本的交通控制系统,用红绿黄灯表示禁行,通行和等待的

信号发生,还能进行倒计时显示,通行时间调整和紧急处理等功能。

(1)倒计时显示

倒计时显示可以提醒驾驶员在信号灯灯色发生改变的时间、在“停止”和“通过”两者间作出合适的选择。

驾驶员和行人普遍都愿意选择有倒计时显示的信号控制方式,并且认为有倒计时显示的路口更安全。

倒计时显示是用来减少驾驶员在信号灯色改变的关键时刻做出复杂判断的1种方法,它可以提醒驾驶员灯色发生改变的时间,帮助驾驶员在“停止”和“通过”两者间作出合适的选择。

(2)时间的设置

本设计中可通过键盘对时间进行手动设置,增加了人为的可控性,避免自动故障和意外发生,并再紧急状态下,可设置所有灯变为红灯。

键盘是单片机系统中最常用的人机接口,一般情况下有独立式和行列式两种。

前者软件编写简单,但在按键数量较多时特别浪费I/0口资源,一般用于按键数量少的系统。

后者适用于按键数量较多的场合,但是在单片机I/0口资源相对较少而需要较多按键时,此方法仍不能满足设计要求。

本系统要求的按键控制不多,且I/0口足够,可直接采用独立式。

(3)紧急处理

交通路口出现紧急状况在所难免,如特大事件发生,救护车等急行车通过等,我们都必须尽量允许其畅通无阻,毕竟在这种情况下是分秒必争的,时时刻刻关系着公共财产安全,个人生死攸关等。

由此在交通控制中增设禁停按键,就可达到想此目的。

3.3单片机交通控制系统的基本构成及原理

单片机设计交通灯控

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 哲学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1