资源描述
成绩
课程设计报告
题 目 十字路口交通灯控制系统设计
课 程 名 称 单片机原理及应用课程设计
院 部 名 称 信息技术学院
专 业 电子信息工程
班 级
学 生 姓 名 X X X
学 号 XXXXXXXXXX
指 导 教 师
目录
一、设计题目…………………………………………………………………2
二、设计目的…………………………………………………………………2
三、设计任务…………………………………………………………………2
四、设计思路…………………………………………………………………3
4.1设计思路………………………………………………………………3
4.2系统总体框图…………………………………………………………3
4.3资源分配………………………………………………………………3
五、硬件原理图和连接图……………………………………………………9
六、程序流程图………………………………………………………………13
七、设计心得…………………………………………………………………14
八、参考文献…………………………………………………………………15
九、附录………………………………………………………………………15
一、 设计题目
十字路口交通灯控制系统设计
二、 设计目的
系统功能要求:本设计能模拟基本的交通控制系统,用红绿黄灯表示禁行,通行和等待的信号发生,还能进行倒计时显示,通行时间调整和紧急处理等功能。
此十字路口交通灯控制系统,分东西道和南北道,设南北道为A道,东西道为B道。规定:首先,东西路口红灯亮,南北路口绿灯亮,同时开始30s倒计时,以7段数码管显示时间。25s倒计时结束后开始5s倒计时,南北路口的绿灯闪烁,计时到最后2s时,南北路口黄灯亮。完成1次这样的循环需要30s。30s结束后,南北路口红灯亮,东西路口绿灯亮,并重新30s倒计时,依次循环。若有紧急车辆要求通过时,此系统应能禁止普通车辆,而让紧急车辆通过。
(1)倒计时显示
倒计时显示可以提醒驾驶员在信号灯灯色发生改变的时间、在“停止”和“通过”两者间作出合适的选择。驾驶员和行人普遍都愿意选择有倒计时显示的信号控制方式,并且认为有倒计时显示的路口更安全。倒计时显示是用来减少驾驶员在信号灯色改变的关键时刻做出复杂判断的1种方法,它可以提醒驾驶员灯色发生改变的时间,帮助驾驶员在“停止”和“通过”两者间作出合适的选择 。
(2)时间的设置
本设计中可通过键盘对时间进行手动设置,增加了人为的可控性,避免自动故障和意外发生,并再紧急状态下,可设置所有灯变为红灯。键盘是单片机系统中最常用的人机接口,一般情况下有独立式和行列式两种。前者软件编写简单,但在按键数量较多时特别浪费I/0口资源,一般用于按键数量少的系统。后者适用于按键数量较多的场合,但是在单片机I/0 口资源相对较少而需要较多按键时,此方法仍不能满足设计要求。本系统要求的按键控制不多,且I/0口足够,可直接采用独立式。
(3)紧急处理
交通路口出现紧急状况在所难免,如特大事件发生,救护车等急行车通过等,我们都必须尽量允许其畅通无阻,毕竟在这种情况下是分秒必争的,时时刻刻关系着公共财产安全,个人生死攸关等。由此在交通控制中增设禁停按键,就可达到想此目的。
三、 设计任务
本系统需要采用MSC-51系列单片机AT89C51作为中心器件来设计交通灯控制器,实现以下功能:
①初始南北方向绿灯亮,东西方向红灯亮,东西方向通车。
②延时28s,南北路口绿灯熄灭,绿灯闪烁3秒后黄灯亮2秒。
③黄灯熄灭后,东西路口绿灯亮同时南北路口红灯亮,南北方向开始通车。
④延时28s,东西方向绿灯灭,绿灯闪烁3秒后黄灯亮2秒,然后又切换成东西方向通车,如此重复。
⑤当发生交通意外(中断产生)时,全部亮红灯,进行交通事故的处理。当事故处理完毕(再次按中断键),重新按上述方式工作。
⑥当南北路口的流量大时,可以增加南北路口亮绿灯的时间,当东西路口的流量大时,可以增加东西路口亮绿灯的时间,结束后调回正常状态。
四、 设计思路(原理组成框图、资源分配)
4.1设计思路
(1)分析目前交通路口的基本控制技术以及各种通行方案,并以此为基础提出自己的交通控制的初步方案。
(2)确定系统交通控制的总体设计,包括,十字路口具体的通行禁行方案设计以及系统应拥有的各项功能,在这里,本设计除了有信号灯状态控制能实现基本的交通功能,还增加了倒计时显示提示,基于实际情况,又增加了紧急状况处理和通行时间可调这两项特特殊功能。
(3)进行显示电路,灯状态电路,按键电路的设计和对各器件的选择及连接,大体分配各个器件及模块的基本功能要求。
(4)进行软件系统的设计,对于本系统,本人采用单片机汇编语言编写,对单片机内部结构和工作情况做了充足的研究,了解定时器,中断以及延时原理,总体上完成了软件的编写
4.2系统的总体框图
单片机
最小系统
外围接口电路
LED数码管显示
红黄绿信号灯
按键
控制电路
图1系统的总体框图
据此,本设计系统以单片机为控制核心,连接成最小系统,由按键设置模块产生输入,信号灯状态模块,LED倒计时模块模块接受输出。系统的总体框图如上所示。
单片机上电后,系统进入正常工作状态,执行交通灯状态显示控制,同时将时间数据倒计时输入到LED数码管上实时显示。在此过程中随时调用急停按键和时间调节中断。
4.3资源分配
①红色八段LED数码管(显示的是红灯的倒计时)和蓝色八段LED数码管(显示的是绿灯和黄灯的倒计时)
图2
a.LED简介
LED显示屏作为大型显示设备的一种,具有亮度高、价格低、寿命长、维护简便等优点。LED数码管的结构简单,分为七段和八段两种形式,也有共阳和共阴之分。以八段共阳管为例,它有8个发光二极管(比七段多一个发光二极管,用来显示dP,即点),每个发光二极管的阳极连在一起,如图3.6所示。这样,一个LED数码管就有I根位选线和8根段选线,要想显示一个数值,就要分别对它们的高低电平来加以控制。为方便起见,本文主要讨论共阳八段LED数码显示管,其他类形的显示管与其类似。
b.LED 灯的显示原理
通过同名管脚上所加电平的高低来控制发光二极管是否点亮而显示不同的字形,如 dp,g,f,e,d,c,b,a全亮显示为8,采用共阳极连接驱动代码,代码表如下表5所示。
表5 驱动代码表
显示数值
dp,g,f,e,d,c,b,a
驱动代码
0
11010000
C0H
1
11111001
F9H
2
10100100
A4H
3
10110000
B0H
4
10011001
99H
5
10010010
92H
6
10000010
82H
7
11111000
F8H
8
10000000
80H
9
10010000
90H
相应在程序软件上,可以通过调用程序给定的秒值经过特定计算算出需要显示的个位和十位,然后有DPTR调取LEDMAP的代码。
LED8段数码管的设置为每个方位上的一对2为显示器。四个方位上总共用8个LED接在单片机的IO口上。虽然路口不一样,但是显示的时间在数字上是一样的,所以两边连接的IO口是对称的。如图3.7所示,其中A,B分别是P0,P1的网络标号。
图3 LED连接图
②南北方向发光二极管(从左到右依次为红黄绿)
图4
东西方向发光二极管(从上到下依次为红黄绿)
图5
根据本设计的特点,红绿灯的显示不可少,红绿灯的显示采用普通的发光二极管。每条道上设置红绿黄灯,总共2组。如果东西红灯亮,那南北方向就是绿灯亮,反之亦然,所以在硬件上连接图上也是对称分布的,如上图所示。
③ AT89C51芯片
图6
a.AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
单片机的主要特性
与MCS-51 兼容 ,4K字节可编程闪烁存储器 ,寿命:1000写/擦循环,数据保留时间:10年,全静态工作:0Hz-24Hz,三级程序存储器锁定,128*8位内部RAM,32可编程I/O线,两个16位定时器/计数器,5个中断源(两个外部中断源和3个内部中断源) ,可编程串行通道,低功耗的闲置和掉电模式,片内振荡器和时钟电路。
·时钟电路:
时钟电路的作用是产生单片机工作所需要的时钟脉冲序列。
·中断系统:
中断系统的作用主要是对外部或内部的终端请求进行管理与处理。AT89S51共有5个中断源,其中又2个外部中断源和3个内部中断源。
图7 AT89C51系列单片机的内部结构示意图
·VCC:电源电压
·GND:接地
·P0口:P0口是一组8位双向I/0口。P0口即可作地址/数据总线使用,又可以作为通用的I/O口使用。当CPU访问片外存储器时,P0口分时先作低8位地址总线,后作双向数据总线,此时,P0口就不能再作I/O口使用了。在访问期间激活要使用上拉电阻。
·P1口:Pl 是一个带内部上拉电阻的8准位双向I/O口,P1作为通用的I/O口使用。
·P2 口:P2 是一个带有内部上拉电阻的8 位准双向I/O 口,P2即可作为通用的I/O口使用,也可以作为片外存储器的高8位地址总线,与P0口配合,组成16位片外存储器单元地址。
·P3 口:P3 口是一组带有内部上拉电阻的8 位准双向I/0 口。P3 口除了作为通用的I/O口使用之外,每个引脚还具有第二功能,具体分配如表2
表2 具有第二功能的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(外部数据存储器写选通)
P3.7
/ RD外部数据存储器读选通)
·RST:复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。WDT 溢出将使该引脚输出高电平,设置SFR AUXR的DISRT0 位(地址8EH)可打开或关闭该功能。DISRT0位缺省为RESET输出高电平打开状态。
·ALE/PROG(————):当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。即使不访问外部存储器,ALE 仍以时钟振荡频率的1/6 输出固定的正脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲。对F1ash存储器编程期间,该引脚还用于输入编程脉冲(PROG)。如有必要,可通过对特殊功能寄存器(SFR)区中的8EH 单元的D0 位置位,可禁止ALE 操作。该位置位后,只有一条M0VX和M0VC指令ALE才会被激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE无效。
·PSEN(————)程序储存允许(PSEN(————))输出是外部程序存储器的读选通信号,当AT89S51 由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN(————)有效,即输出两个脉冲。当访问外部数据存储器,没有两次有效的PSEN(————)信号。
·EA(——)/VPP:外部访问允许。欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA端必须保持低电平(接地)。需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。如EA端为高电平(接VCC端),CPU则执行内部程序存储器中的指令。F1ash存储器编程时,该引脚加上+12V的编程电压Vcc。
·XTAL1:振荡器反相放大器及内部时钟发生器的输入端。
d.MCS—51的中断源
8051有5个中断源,它们是两个外中断INT0(P3.2)和INT1(P3.3)、两个片内定时/计数器溢出中断TF0和TF1,一个是片内串行口中断TI或RI,这几个中断源由TCON和SCON两个特殊功能寄存器进行控制,其中5个中断源的程序入口地址如表4所示:
表3中断源程序入口
中断源的服务程序入口地址
中断源
入口地址
外中断0
0003H
定时/计数器0
000BH
外中断1
0013H
定时/计数器0
001BH
串行口中断
0023H
e.交通灯中的中断处理流程
(1)现场保护和现场恢复:
有特殊车辆要通过时就要进行中断,在中断之前,先将交通灯中断前情况保护好,当中断执行后再恢复现场,包括信号灯和时间显示电路。
(2)中断打开和中断关闭:
为了使特殊车辆通行按一下打开中断开关就可以打开中断,关闭中断开关就关闭中断。
(3)中断服务程序:
有中断产生,就必然有其具体的需执行的任务,中断服务程序就是执行中断处理的具体内容:即如果南北方向有特殊车辆要求通过,南北方向转换为绿灯,东西方向为红灯;如果东西方向有特殊车辆要求通过,东西方向转换为绿灯,南北方向为红灯。
(4) 中断返回:
执行完中断服务程序后,必然要返回,即回交通灯信号回到中断前状态,显示时间也和中断前一样。
④上拉电阻RX8
图8
上拉电阻:
1、当TTL电路驱动COMS电路时,如果TTL电路输出的高电平低于COMS电路的最低高电平(一般为3.5V),这时就需要在TTL的输出端接上拉电阻,以提高输出高电平的值。
2、OC门电路必须加上拉电阻,才能使用。
3、为加大输出引脚的驱动能力,有的单片机管脚上也常使用上拉电阻。
4、在COMS芯片上,为了防止静电造成损坏,不用的管脚不能悬空,一般接上拉电阻产生降低输入阻抗,提供泄荷通路。
5、芯片的管脚加上拉电阻来提高输出电平,从而提高芯片输入信号的噪声容限增强抗干扰能力。
6、提高总线的抗电磁干扰能力。管脚悬空就比较容易接受外界的电磁干扰。
7、长线传输中电阻不匹配容易引起反射波干扰,加上下拉电阻是电阻匹配,有效的抑制反射波干扰。
上拉电阻阻值的选择原则包括:
1、从节约功耗及芯片的灌电流能力考虑应当足够大;电阻大,电流小。
2、从确保足够的驱动电流考虑应当足够小;电阻小,电流大。
3、对于高速电路,过大的上拉电阻可能边沿变平缓。综合考虑以上三点,通常在1k到10k之间选取。
⑤紧急通道控制开关(南北方向R7对应k1,东西方向R8对应k2)
图9
⑥复位电路
图10
五、 硬件原理图和连接图
①总仿真电路图
图11
②南北方向绿灯东西方向红灯
图12
③南北方向绿灯闪烁(红色数码管显示屏到五秒蓝色数码管显示屏到三秒开始闪烁,每秒闪烁4次),东西方向红灯亮
图13
④南北方向黄灯东西方向红灯
图14
⑤南北方向红灯东西方向绿灯
图15
⑥南北方向红灯亮,东西方向绿灯闪烁(红色数码管显示屏到五秒蓝色数码管显示屏到三秒开始闪烁,每秒闪烁4次)
图16
⑦南北方向红灯东西方向黄灯
图17
⑧点击复位键后计数复位
图18
六、 程序流程图
七、 设计心得
经过六十个课时的努力,终于完成了自己的单片机课程设计。虽说忙碌了点,但我觉得这样的生活充实且有成就感,当然,也获益匪浅。
通过这次交通灯的课程设计,让我提高了用专业知识、专业技能分析和解决现实问题的能力。使我在单片机的基本原理、单片机应用学习过程中,以及在常用编程设计思路技巧的掌握方面都能向前迈了一大步,课程设计让我把以前学习到的知识得到巩固和进一步的提高认识,并且对已有知识有了更深层次的理解和认识。可以说在整个软件设计过程中,我不仅学会了延时的两种方法,即软件延时和硬件延时,还掌握数码管的两种显示方式(即动态显示与静态显示)及其如何选择。当然,通过几次反复调试过程,使得我对汇编指令有了更深刻的理解,为日后成为一名合格的应用型人才打下良好的基础。
在整个课程设计过程我还掌握了一下几点:
(1)掌握了电子系统设计的流程,熟悉了各种硬件电路以及软件编程方法。
(2)理解了最单片机的各部分组成及特性。
(3)熟练使用了各种计算机辅助设计工具完成设计,充分掌握了这些工具的使用。
(4)学会了利用Keil uVision3对汇编语言进行编译过程.更进一步加深了对PROTEUS软件的学习。
通过本次的课程设计,充分意识到自己所学的东西还是非常有限的,不过通过设计,还是学到了一些书本上没有学到的东西,为自己以后的学习起了很大的帮助。就我个人而言,很深刻地体会到一点,那就是我们在设计过程中一定要有一个整体的清晰的思路,知道自己的设计的对象的基本功能和核心器件的适用及其作用,只要把握住这些主要方面,一些小问题都将围绕着这些主要问题而逐步得到解决。同时我也懂得,在整个设计过程中,生活中也一样,一定要意志坚定,克服自己的畏难情绪,这样才能将事情做好,才能干出一番成就。
最后,对在这个课程设计过程中帮助我的所有同学和各位指导老师再次表示衷心的感谢!
八、 参考文献
1. 李朝青.单片机原理及接口技术(第3版).北京:北京航空航天大学出版社,2005
2. 何立民.单片机高级教程. 北京:北京航空航天大学出版社,1999
3. 钱逸秋.单片机原理及应用.北京:电子工业出版社,2002
4. 周润景.基于proteus的电路及单片机系统设计与仿真.北京:北京航空航天大学出版社,2006.5
5. 潘永雄.电子线路CAD实用教程.西安:西安电子科技大学出版社,2006.5
6. 周润景.Proteus在MCS-51&ARM7系统中的应用百例.北京:电子工业出版社,2006
九、附录
#include <reg51.h>
//数码管高电平有效,共阳极
unsigned char code DisplayCode[] = {0x03, 0x9f, 0x25, 0x0d, 0x99,
0x49, 0x41, 0x1f, 0x01, 0x09
};
#define DELAY 5000 //时钟时间uS
#define DISPLAY P0
sbit NSEMERGENCY = P3^0;
sbit EWEMERGENCY = P3^1;
static unsigned int count = 0;
sbit nsRed = P1^0;
sbit nsYellow = P1^1;
sbit nsGreen = P1^2;
sbit ewRed = P1^4;
sbit ewYellow = P1^5;
sbit ewGreen = P1^6;
unsigned int time=30;
unsigned int state=0;
unsigned int flag=0;
void delay(unsigned int del) //延时del mS
{
int i;
for(; del > 0; del--)
for(i = 99; i > 0; i--);
}
void timeDisplay_Red()
{
unsigned char High,Low;
Low = time % 10;
High = time / 10;
DISPLAY = DisplayCode[Low];
P2 = 0xf2;
delay(1);
P2 = 0xf0;
DISPLAY = DisplayCode[High];
P2 = 0xf1;
delay(1);
P2 = 0xf0;
}
void timeDisplay_Blue()
{
unsigned int time0;
unsigned char High,Low;
if(time>2)
time0=time-2;
else time0=time;
Low = time0 % 10;
High = time0 / 10;
DISPLAY = DisplayCode[Low];
P2 = 0xf8;
delay(1);
P2 = 0xf0;
DISPLAY = DisplayCode[High];
P2 = 0xf4;
delay(1);
P2 = 0xf0;
}
void lightDisplay()
{
if(state==0)
{
ewRed=1;
nsGreen=1;
}
else if(state==2)
{
ewRed=1;
nsYellow=1;
}
else if(state==3)
{
nsRed=1;
ewGreen=1;
}
else if(state==5)
{
nsRed=1;
ewYellow=1;
}
}
void stateChange_Glint()
{
if(state==1)
{
if(count<50||count>=100&&count<150)
{
P1=0x00; ewRed=1; }
else
{
ewRed=1;
nsGreen=1;
}
}
else if(state==4)
{
if(count<50||count>=100&&count<150)
{ P1=0x00; nsRed=1; }
else
{
nsRed=1;
ewGreen=1;
}
}
}
void stateChange()
{
if(time==5)
{
if(state>=5) state=0;
else state++;
P1=0x00;
lightDisplay();
}
else if(time==2)
{
if(state>=5) state=0;
else state++;
P1=0x00;
lightDisplay();
}
else if(time==30)
{
if(state>=5) state=0;
else state++;
P1=0x00;
lightDisplay();
}
flag=0;
}
void main()
{
unsigned char STATE[]={0,0,0,0,0,0};
//设置定时器为中断工作模式
TMOD = 0x01;
TH0 = (65536 - DELAY) / 256;
TL0 = (65536 - DELAY) % 256;
EA = 1;
ET0 = 1;
TR0 = 1;
P0=0xff;
P1=0x00;
lightDisplay();
while(1)
{
while(NSEMERGENCY&&EWEMERGENCY)
{
timeDisplay_Blue();
timeDisplay_Red();
if(flag)
stateChange();
stateChange_Glint();
}
if(!NSEMERGENCY)
{
STATE[0]=nsRed; STATE[1]=nsYellow ;STATE[2]=nsGreen ;STATE[3]=ewRed ;STATE[4]=ewYellow ;STATE[5]=ewGreen;
while(!NSEMERGENCY)
{
ewRed=1;nsGreen=0;ewYellow=0; ewGreen=0; nsYellow=0;
if(count<100)
{
P1=P1&0xf0;
P2=0xf0;
}
else
{
nsRed=1;
timeDisplay_Blue();
timeDisplay_Red();
}
}
nsRed=STATE[0];nsYellow =STATE[1];nsGreen=STATE[2];ewRed=STATE[3];ewYellow=STATE[4];ewGreen=STATE[5];
}
if(!EWEMERGENCY)
{
STATE[0]=nsRed; STATE[1]=nsYellow ;STATE[2]=nsGreen ;STATE[3]=ewRed ;STATE[4]=ewYellow ;STATE[5]=ewGreen;
while(!EWEMERGENCY)
{
nsRed=1;nsGreen=0;ewYellow=0; ewGreen=0; nsYellow=0;
if(count<100)
{
P1=P1&0x0f;
P2=0xf0;
}
else
{
ewRed=1;
timeDisplay_Blue();
timeDisplay_Red();
}
}
nsRed=STATE[0];nsYellow =STATE[1];nsGreen=STATE[2];ewRed=STATE[3];ewYellow=STATE[4];ewGreen=STATE[5];
}
}
}
void clock1()
{
if(count >= 200)
{
count=count-200;
if(NSEMERGENCY&&EWEMERGENCY)
{
time--;
flag=1;
if(time==0)
time=30;
}
}
}
void clock() interrupt 1 //计时
{
TH0 = (65536 - DELAY) / 256;
TL0 = (65536 - DELAY) % 256;
count++;
clock1();
}
展开阅读全文