当前位置:文档之家› AT89C52单片机控制交通灯系统

AT89C52单片机控制交通灯系统

AT89C52单片机控制交通灯系统
AT89C52单片机控制交通灯系统

目录

1 交通信号灯控制系统设计任务和性能指标 (1)

设计任务 (1)

性能指标 (1)

2 交通信号灯控制系统设计方案 (1)

设计思路 (1)

设计思路 (1)

功能设计 (2)

总体设计 (2)

通行方案设计 (2)

}

硬件设计方案 (4)

软件设计方案 (4)

3 交通信号灯控制系统硬件设计 (5)

系统硬件框图 (5)

单元电路设计 (5)

单片机最小系统 (5)

信号灯显示电路 (7)

倒计时显示电路 (8)

按键操作电路 (8)

4 交通信号灯控制系统程序设计 (8)

-

理论基础知识 (8)

定时器原理 (8)

软件延时原理 (9)

中断原理 (9)

主程序框图 (9)

5 调试分析及所用器件 (10)

调试环境 (10)

所用芯片 (11)

6 心得体会 (11)

7 参考文献 (12)

|

8 附录 (13)

附件1 程序清单 (13)

附件2 系统仿真图 (16)

摘要

交通在人们的日常生活中占有重要的地位,随着人们社会活动的日益频繁,这点更是体现的淋漓尽致。交通信号灯的出现,使交通得以有效管制,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。

近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构软硬件结合,加以完善。

本系统采用单片机AT89C52为中心器件来设计交通信号灯控制器,系统实用性强、操作简单、扩展性强。本设计系统就是由单片机最小系统、交通灯状态显示系统、LED 数码显示系统、复位电路和按键操作电路等几大部分组成。系统除具有基本的交通信号灯功能外,还具有倒计时、时间调整和紧急情况处理等功能,较好的模拟实现了十字路口可能出现的状况。

\

软件上采用KEIL C 编程,主要编写了主程序,LED数码管显示程序,中断程序,延时程序等。经过整机调试,实现了对十字路口交通灯的模拟。

关键字:AT89C52 交通灯PROTUES 中断程序

1 交通信号灯控制系统设计任务和性能指标

设计任务

利用单片机设计一个十字路口交通信号灯控制系统,该交通信号灯控制器由一条主干道和一条支干道汇合成十字路口,在每个入口处设置红、绿、黄三色信号灯,红灯亮禁止通行,绿灯亮允许通行,黄灯亮则给行驶中的车辆有时间停在禁行线外,并有倒计时系统显示信号灯转换时间。用红、绿、黄发光二极管作信号灯,两位八段数码管显示时间来控制交通信号灯的变化。模拟框图如图1所示。

图1 交通信号灯模拟图

性能指标

-

(1)东西和南北方向的车辆交替通行,任意时刻只有一个方向通行,以黄灯闪烁来转换。

(2)系统开始运行时设置每次放行10秒,其中有2秒是黄灯闪烁提醒行人和车辆禁止通行。

(3)通行时间可在0~99秒内任意设置。

(4)有紧急情况处理功能,比如:有急救车辆通行时,暂时禁止其他车辆通行。

2 交通信号灯控制系统设计方案

设计思路

设计思路

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

(2)确定系统交通控制的总体设计,包括,十字路口具体的通行禁行方案设计以

及系统应拥有的各项功能,在这里,本设计除了有基本的交通功能,还增加了倒计时显示提示,基于实际情况,又增加了紧急状况处理和通行时间可调这两项特殊功能。

(3)选择器件,大体分配各个器件及模块的基本功能要求,设计主控电路、显示电路,信号灯状态电路,按键电路等。

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

功能设计

本设计能模拟基本的交通控制系统,用红绿黄灯表示禁行,通行和等待的信号发生,还能进行倒计时显示,通行时间调整和紧急情况处理等功能。

(1)基本功能

采用红绿黄三种颜色的LED灯的亮灭来模拟信号灯,从而达到控制车辆的通行。

(2)倒计时显示功能

采用两位八段数码管来显示时间,来告知行人和车辆通行时间和要等待的时间。

(3)时间可调功能

通过键盘对时间进行手动设置,增加了人为的可控性,避免车少长等和减缓车多交通堵塞的麻烦。

(4)紧急处理

<

交通路口出现紧急状况在所难免,如特大事件发生,救护车等急行车通过等,我们都必须尽量允许其畅通无阻,由此在交通控制中增设禁停按键。

总体设计

单片机设计交通灯控制系统,可用单片机直接控制信号灯的状态变化,基本上可以指挥交通的具体通行,接入LED数码管就可以显示倒计时以提醒行使者,更具人性化。本系统在此基础上,加入了紧急情况处理与时间调整功能。

通行方案设计

十字路口分为东西向和南北向,在任一时刻只有一个方向通行,另一方向禁行,持续一定时间,经过短暂的过渡时间,将通行禁行方向对换。其具体状态如图2所示。说明:黑色表示亮,白色表示灭。交通状态从状态1开始变换,直至状态4然后循环

至状态1,周而复始。

S1 东西通行S2 东西禁行过渡状态

S3 南北通行S4 南北禁行过渡状态

图2 交通信号灯状态

@

通过对具体的十字路口交通信号灯状态的演示分析,可以把这四个状态归纳如下:状态S1:东西方向绿灯亮,允许通行,南北方向红灯亮,禁止通行;

状态S2:东西方向绿灯转黄灯闪烁,允许通行,南北方向红灯亮,禁止通行;

状态S3:东西方向红灯亮,禁止通行,南北方向绿灯亮,允许通行;

状态S4:东西方向红灯亮,禁止通行,南北方向绿灯转黄灯闪烁,允许通行;

依据上述分析,东西的通行时间为状态S1和状态S2的时间之和,南北的通行时间为状态S3和状态S4的时间之和,因此可以列出各个路口灯的状态转换如表1所示(其中逻辑值“1”代表执行通行,逻辑值“0”代表禁止通行,逻辑值“L”代表绿灯转黄灯):

表1 交通灯状态转换表

状态时间东西,

南北

硬件设计方案

本系统选用Atmel 公司的AT 系列单片机AT89C51为中心器件设计交通信号灯控制器,实现了红绿灯循环点亮,绿灯变红灯中间为黄灯闪烁警示的功能。每个方向采用红绿黄三色的LED 灯的亮灭来模拟信号灯,采用两位八段共阳数码管,显示十字路口通行或禁止的剩余时间,通过键盘对时间进行手动设置,增加了人为的可控性,避免车少长等和减缓车多交通堵塞的麻烦,同时增设了紧急情况处理按键,因为交通路口出现紧急状况在所难免,如特大事件发生,救护车等急行车通过等,我们都必须尽量允许其畅通无阻。

所设计的系统硬件框图如图3所示。

图3 系统硬件框图

软件设计方案

-

STC80C51单片机

最小系统

}

LED 数码管显示 数码管 显示

按键控制电路

设计要求为:首先南北方向红灯、东西方向绿灯亮,南北方向红灯10秒、东西方向绿灯8秒,相应的数码管显示对应的数字并读秒,同时南北方向红色的二极管和东西方向的绿色二极管接通点亮显示,当东西方向的绿灯时间到,则东西方向的绿灯转为黄灯,同时数码管显示黄灯的时间2秒,东西方向的黄色二极管接通点亮,此时南北方向的红灯不变。南北方向的红灯和东西方向的黄灯时间同时到,此时南北方向的红灯跳转为绿灯,时间同样为8秒,东西方向有黄灯跳转为红灯,时间为10秒。当南北方向的绿灯时间到,南北绿灯跳转为黄灯,东西方向的红灯不变,当南北方向的黄灯和东西方向的红灯时间到,南北方向的黄灯跳转为红灯,东西方向的红灯跳转为绿灯。进入开始的状态,循环执行。此外还利用单片机的中断设计了紧急情况处理和时间调整的功能。

根据设计要求,程序框图如图4所示。软件采用KEIL C语言完成。软件设计可以分为以下几个功能模块:

图4 程序结构框图

3 交通信号灯控制系统硬件设计

系统硬件框图

根据设计的要求,单片机选用AT89C52,其内部带有8KB的FLASH ROM,设计时无需外接程序存储器,为设计和调试带来极大的方便。四个方向各采用三个不同色的LED 灯和1个两位的数码管显示,来实现该方向的指示灯的点亮时间倒计时。按键可以根

据系统的需要进行操作。

*

图5 系统硬件框图

单元电路设计

单片机最小系统

?

对51系列单片机来说,单片机要正常工作,必须具有五个基本电路,也称五个工作条件:1、电源电路,2、时钟电路,3、复位电路,4、程序存储器选择电路,5、外围电路。因此,单片机最小系统一般应该包括单片机、晶振电路、复位电路、外围电路等,如下面的框图所示:

图6单片机最小系统框图

(1)电源电路设计

单片机芯片的第40脚为正电源引脚VCC,一般外接+5V电压。第20脚为接地引脚GND,常见电源电路设计如下图7所示:

图7 电源设计

(2)时钟电路设计

单片机是一种时序电路,必须要有时钟信号才能正常工作。单片机芯片的18脚(XTAL2)、19脚(XTAL1)分别为片内反向放大器的输出端和输入端,只要在18脚(XTAL2)和19脚(XTAL1)之间接上一个晶振,再加上2个20PF的瓷片电容即可构成单片机所需的时钟电路,本设计就采用图8所示时钟电路。

图8 时钟电路

%

此外,当采用外部时钟时,19脚(XTAL1)接地,18脚(XTAL2)接外部时钟信号。

(3)复位电路设计

单片机芯片的第9脚RST(Reset)是复位信号输入端。单片机系统在开机时或在工作中因干扰而使程序失控,或工作中程序处于某种死循环状态等情况下都需要复位。复位的作用是使中央处理器CPU以及其他功能部件都恢复到一个确定的初始状态,并从这个状态开始工作。AT89C52单片机的复位靠外部电路实现,信号从RST引脚输入,高电平有效,只要保持RST引脚高电平2个机器周期,单片机就能正常复位。常见的复位电路有上电复位电路和按键复位电路二种,如图9所示。本设计采用手动复位电路。

A.上电复位

B.手动复位

图9 复位电路

(4)程序存储器选择电路

单片机芯片的第31脚(EA)为内部与外部程序存储器选择输入端。当EA引脚接

高电平时,CPU先访问片内8KB的程序存储器,执行内部程序存储器中的指令,当程序计数器超过0FFFH时,将自动转向片外程序存储器,既是从1000H地址单元开始执行指令;当EA引脚接低电平时,不管片内是否有程序存储器,CPU只访问片外程序存储器。

AT89S52内部有8KB的程序存储器,所以根据该脚的引脚功能,只要将该脚接上高电平,才能先从片内程序存储器开始取指令。

常见的程序存储器选择电路就是将第31脚直接接到正电源上。

(5)外围电路的设计

外围电路的设计主要依据项目要实现的功能,本项目要实现的功能是用单片机控制交通信号灯。

-

交通信号灯显示电路

本系统采用LED作为信号灯来使用,单片机的I/O口直接与LED连接。在十字路口的四组红、黄、绿三色交通灯中,东西方向的同色灯连接在一起,南北方向的同色灯也彼此连接,受单片机AT89C52的—控制。12个LED指示灯采用共阳极的连接方式,因此I/O口输出低电平时,与之相连的LED会亮,输出高电平时,LED熄灭。

倒计时显示电路

该交通信号灯控制系统在正常工作情况下,为方便提示路上行人及车辆交通灯转换的剩余时间,专门为控制系统提供了一个倒计时的显示装置。该装置采用2位八段数码管来显示,每个路口需要1个,共4个,在设计电路时,本系统采用用共阳数码管,直接和P2口连接,作为段选,来控制每个数码管数字的显示,再通过—进行位选,来选择要显示的数码管。

按键操作电路

该系统最大的好处就是可以实现时间的调整和紧急停车功能,通过六个按键来达到对路面通行状态的实时控制。

4 交通信号灯控制系统程序设计

理论基础知识

定时器原理

{

定时器工作的基本原理其实就是给初值,让它不断加1直至减完为模值,这个初值是送到TH和TL中的。它是以加法记数的,并能从全1到全0时自动产生溢出中断请求。因此,我们可以把计数器记满为零所需的计数值,即所要求的计数值设定为C,把计数初值设定为TC 可得到如下计算公式:

TC=M-C

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

T=(M-TC)T0

模值和计数器工作方式有关,本系统选用方式1计数。在方式1时M的值为65536,单片机的主脉冲频率为12MHZ,经过12分频后,采用方式1最大延时是毫秒。所以选择扫描周期为50ms。若使用软件则会耽搁程序流程,显然不可行。相反,时间计时方面却不可能只用计数器,因为显然1秒钟已经超过了计数器的最大定时间,所以我们还必须采用定时器和软件相结合的办法才能解决这个问题。

软件延时原理

AT89C52单片机的工作频率为12MHZ,机器周期与主频有关,机器周期是主频的12倍,所以一个机器周期的时间为12*(1/12MHZ)=1us。我们可以知道具体每条指令的周期数,这样我们就可以通过指令的执行条数来确定1秒的时间,但同时由于单片机的运行速度很快其他的指令执行时间可以忽略不计。

中断原理

本系统主要使用了定时器中断和外部中断,中断信号由引脚T0、INT0和INT1输入,低电平有效,CPU每个时钟周期都会检测INT0和INT1上的信号,单片机允许外部中断以电平方式或负边沿方式两种中断方式输入中断请求信号,可由用户通过设置TCON中IT0和IT1位的状态来实现。以IT0为例,IT0=0,为电平触发方式,IT0=1,为负边沿触发方式,本设计采用电平方式,IE0为其中断标志位,有中断信号则置位,中断服务子程序响应后,IE0自动清零。IE中的EA为允许中断的总控制位,为1开启,EX0为外部中断允许控制位,为1开启。

使用proteus软件进行电路仿真,芯片AT89C52还需要载入代码文件来支持其正常工作以实现预期功能要求。程序代码编写是整块设计的核心内容,本系统中利用一

切换有

采用C

? Array

单片微型计算机原理及应用,西安电子科技大学出版社1998

[2]夏继强. 单片机实验与实践教程. 北京:北京航空航天大学出版社, 2001

\

[3]彭伟. 单片机C语言程序设计100例.北京:电子工业出版社, 2009

[5]雷丽文. 微机原理与接口技术.北京:电子工业出版社, 2001

[6]于永. 51单片机C语言常用模块与综合系统设计.北京:电子工业出版社, 2007

[7]谭浩强. C语言程序设计.北京:清华大学出版社, 2005

[8]于永. 51单片机C语言常用模块与综合系统设计.北京:电子工业出版社, 2007

8附录附件1 程序代码

#include <>

#include <>

#define uchar unsigned char

#define uint unsigned int

sbit yellowled_nb=P0^3; //南北黄灯

sbit yellowled_dx=P0^0; //东西黄灯

sbit greenled_nb=P0^4; //南北绿灯

sbit greenled_dx=P0^1;//东西绿灯

sbit K1=P3^0; //时间加1调整

sbit K2=P3^1;//时间减1调整

sbit K3=P3^6;//功能键

uchar code

table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0 xf8,0x80,0x90,0xff};//共阳数码管

uchar code weixuan[]={0x01,0x02,0x04,0x08}; uchar data buf[4]; //显示缓冲区

uchar max_dx=10;//东西绿灯通行时间uchar max_nb=10;//南北绿灯通行时间uchar sec_nb;//南北数码指示值

uchar sec_dx;//东西数码管指示值

uchar flag_nb;

uchar flag_dx;//黄灯控制

uchar flag_all;//全部禁止黄灯控制标志uchar t;//控制禁止时的黄灯闪烁时长

uchar flag1,flag2;//flag1为1s定时标志,flag2为黄灯闪烁标志

uchar data time,time1;//time控制1s定时,time1控制黄灯闪烁时间

bit set=0;//交通灯方向切换标志

int adjust_flag=-1;//功能选择位

//毫秒延时函数

void delayms(uint ms)

{ uint j,k;

for(j=0;j

for(k=0;k<110;k++);}

//调刷新计时数据缓冲

void adjust_BUFFER()

{buf[1]=sec_nb/10; //第1位东西秒十位

if(buf[1]==0)

{ buf[1]=10;}

buf[0]=sec_nb%10; //第2位东西秒个位buf[3]=sec_dx/10; //第3位南北秒十位if(buf[3]==0)

{ buf[3]=10; }

buf[2]=sec_dx%10; //第4位南北秒个位}

//刷新调整南北时间缓冲

void adjust_BUFFER1()

{buf[1]=max_nb/10; //第1位东西秒十位if(buf[1]==0)

{ buf[1]=10; }

buf[0]=max_nb%10; //第2位东西秒个位buf[3]=max_dx/10; //第3位南北秒十位

if(buf[3]==0)

{ buf[3]=10; }

buf[2]=max_dx%10; //第4位南北秒个位}

void key1()//调整时间(+1)

{//调整对象标志位

if(adjust_flag==0&&flag_all!=1)

{ max_nb++; //南北加1S

if(max_nb==100)

max_nb=5;//最小为5

}

else if(adjust_flag==1&&flag_all!=1)

{ max_dx++;//东西加1S

if( max_dx==100)

max_dx=5;

}

if(adjust_flag!=-1&&flag_all!=1)

{adjust_BUFFER1();}

}

void key2()//调整时间(-1)

{//调整对象标志位

if(adjust_flag==0&&flag_all!=1)

{ max_nb--; //南北减1S

if(max_nb==4)

max_nb=99;//最大为120

}

else if(adjust_flag==1&&flag_all!=1)

{ max_dx--; //东西减1S

if(max_dx==4 )

max_dx=99;

}

if(adjust_flag!=-1&&flag_all==0)

{adjust_BUFFER1();}

}

void key3()//功能键判断

{adjust_flag++;

if(adjust_flag>=2)

{adjust_flag=-1;

}

if(adjust_flag==-1)

{ if(flag_all==1)

{ flag_all=0; }

sec_nb=max_nb-2;

sec_dx=max_nb;

TR0=1;

P0=0xeb;

adjust_BUFFER();

}

else

{

if(flag_all!=1)

adjust_BUFFER1();

}}

void key() //按键扫描

{

if(K1==0)//扫描按键1 (+1){ delayms(10);

if(K1==0)

{ key1();

while(!K1); } }

if(K2==0)//扫描按键2 (-1){ delayms(10);

if(K2==0)

{ key2();

while(!K2);

} }

if(K3==0)//扫描按键2 (-1){ delayms(10);

if(K3==0)

{ TR0=0;

key3();

while(!K3);

}

}}

void display()//显示数据

{ uchar i;

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

{

P1=0x00;

delayms(2);

P2=table[buf[i]];

P1=weixuan[i];

delayms(4);

}

}

//控制黄灯闪烁

void yellowled()

{

if(flag_nb==1)

{

yellowled_nb=~yellowled_nb;

}

else if(flag_dx==1)

{

yellowled_dx=~yellowled_dx;

}

if(flag_all==1)

{

yellowled_nb=~yellowled_nb;

yellowled_dx=~yellowled_dx;

t++;//一次闪烁时间为250ms

if(t>=12)

{

t=0;TR0=0; P0=0xdb;

} }}

void adjust_Time()

{ sec_dx--; sec_nb--;

if(set==0)//如果是南北方向通行时

{ if(sec_nb==0)

{ if(flag_nb==0)

{ sec_nb=2;

flag_nb=1;//南北黄灯控制

greenled_nb=1; //关绿灯

yellowled_nb=0;//南北黄灯亮}

else

{ flag_nb=0;//南北黄灯控制位清零

set=1;

sec_dx=max_dx-2;

sec_nb=max_dx;

P0=0xdd;

} } }

else

{ if(sec_dx==0)//如果东西方向通行时

{if(flag_dx==0)

{ sec_dx=2;

flag_dx=1;//东西黄灯控制

greenled_dx=1; //关绿灯

yellowled_dx=0;//东西黄灯亮}

else

{flag_dx=0;//南北黄灯控制位清零

set=0;

sec_dx=max_nb;

sec_nb=max_nb-2;

P0=0xeb;

}}}

adjust_BUFFER();//刷新显示区

}

void Init()//中断初始化

{ TMOD=0X61;

TH0=0X3C;TL0=0XB0;

TH1=0xff;TL1=0xff;

ET0=1; ET1=1;

EX0=1; IT0=1;

EX1=1; IT1=1;

TR0=1; TR1=1;

EA=1;

flag_nb=0; flag_dx=0;

set=0;//南北通行

P0=0xeb;

sec_nb=max_nb-2;

sec_dx=max_nb;

adjust_BUFFER();

}

void main()

{ Init();

while(1)

{ key();

if(flag1==1&&flag_all!=1) //不在全部通行的模式下时正常刷新计数

{ adjust_Time(); flag1=0; }

if(flag2==1)

{ yellowled();

flag2=0; }

display(); }}

void time0( ) interrupt 1 using 1

{ TH0=0X3C; TL0=0XB0;

time++; time1++;

//控制黄灯闪烁

if(time1==5)

{ time1=0; flag2=1; }

if(time==20)

{ time=0;flag1=1;}}

//东西强行按键

void int0(void) interrupt 0 using 1 //外部中断0

{ //定时器停止计时,数码管不显示,且东西方向亮绿灯,南北方向亮红灯

uchar i; TR0=0;

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

{buf[i]=10; }

P0=0xdd;}

//南北强行按键

void int1(void)interrupt 2 using1

//外部中断1

{ //定时器停止计时,数码管不显示,且南北亮绿灯,东西亮红灯

uchar i; TR0=0;

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

{ b uf[i]=10; }

P0=0xeb;}

//全部禁止

void time2() interrupt 3

{ //定时器停止计时,数码管不显示,且南北亮红灯,东西亮红灯

uchar i; TR0=1;

flag_all=1;

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

{ b uf[i]=10; }

P0=0xf6;}

附件2系统原理图

附图1 PROTUES仿真交通信号灯电路图

附图2 PROTUES仿真电路图(正常通行)

16%

相关主题
文本预览
相关文档 最新文档