摘要
本系统由单片机系统、键盘、LED 显示、交通灯演示系统组成。系统包括人行道、左转、右转、以及基本的交通灯的功能。系统除基本交通灯功能外,还具有倒计时、时间设置、紧急情况处理、分时段调整信号灯的点亮时间以及根据具体情况手动控制等功能。随着社会经济的发展,城市交通问题越来越引起人们的关注。人、车、路三者关系的协调,已成为交通管理部门需要解决的重要问题之一。城市交通控制系统是用于城市交通数据监测、交通信号灯控制与交通疏导的计算机综合管理系统,它是现代城市交通监控指挥系统中最重要的组成部分。
关键词单片机;交通灯;控制器
1 课程设计的目的
1.1设计目的
了解交通灯管理的基本工作原理,熟练掌握 STC89C51 的工作原理和应用编程,熟悉 STC89C51 单片机并行接口的各种工作方式和应用,并了解计数器/定时器的工作方式和应用编程外部中断的方法,掌握多位 LED 显示问题的解决。
1.1设计思路
1 分析目前交通路口的基本控制技术以及各种通行方案,并以此为基础提出自己的交通控制的初步方案。
2 确定系统交通控制的总体设计,包括,十字路口具体的通行方案设计以及系统应拥有的各项功能,在这里,本设计除了有信号灯状态控制能实现基本的交通功能,还增加了倒计时显示提示。
3 进行显示电路,灯状态电路的设计和对各器件的选择及连接,大体分配各个器件及模块的基本功能要求。
4 进行软件系统的设计,对于本系统,本人采用语言编写程序,对单片机内部结构和工作情况做了充足的研究,了解定时器,中断以及延时原理,总体上完成了软件的编写。
1.3设计任务
利用单片机设计了简单的红绿交通信号灯模型,该模型可以模拟实现交通信号灯的红绿黄灯变换,达到引导交通的效果。控制器由一条支干道路和一条主干道路汇合成十字路口,在每个入口处设置红、绿、黄三色信号灯,红灯亮禁止通行,绿灯亮允许通行,黄灯亮则给行驶中的车辆有时间停在禁行线外(每次黄灯闪烁 5 次给车辆行人足够的时间停在禁止线外,而不至于违反交通规则)。用红、绿、黄发光二极管作信号灯,其中东西南北四个方向各自有红、绿、黄三个灯指示禁止通行、允许通行、等待通行。
图 1.1 红绿灯实景图
1.4 性能指标
(1)处于常允许通行的状态,支干道有车来时才允许通行。主干道亮绿灯时,支干道亮红灯;支干道亮绿灯时,主干道亮红灯。
(2)绿灯亮到红灯亮的转换过程中,要亮 5 秒黄灯作为过渡。黄灯亮时,原红灯按 1Hz 的频率闪烁。
2设计方案与论证
2.1 任务分析
模拟交通灯控制器就是使用单片机来控制一些 LED 和数码管,模拟真实交通灯的功能。当南北方向通车时绿灯亮,而东西方向红灯亮;当通车的时间到后,南北方向绿灯熄灭,而黄灯亮,黄灯亮后由南北方向切换到东西方向通车。
此时南北方向黄灯熄灭,而红灯亮,东西方向红灯熄灭,而绿灯亮,东西方向开始通车,通车的时间到后,东西方向的绿灯熄灭,而黄灯亮,黄灯亮后由东西方向切换到南北方向,东西方向黄灯熄灭,红灯亮;而南北方向红灯熄灭,绿灯亮,如此不断循环。红、黄、绿交替闪亮,利用数码管倒计数显示间隔等,用于管理十字路口的车辆及行人交通。如表2-1
| S1 | S2 | S3 | S4 |
| 20s | 5s | 20s | 5s |
东西道 | 红灯亮 | 红灯亮 | 绿灯亮 | 黄灯亮 |
南北道 | 绿灯亮 | 黄灯亮 | 红灯亮 | 红灯亮 |
表2-1 十字路口指示灯燃亮方案
2.2 方案设计
设计以单片机为核心部件的模拟交通灯,利用 8051 系列单片机作为主控制芯片,用发光二极管指示交通的通行,使两个方向都亮红灯,绿灯亮通行,红灯亮停止通行。本设计利用定时器进行定时,调用中断程序使定时器定,达到定时 5S 的目的,同时调用显示程序,实现了交通灯的控制,显示时间直接通过 89C51 的 P0 口输出;交通灯信号通过 P0口输出, 本交通灯系统简单,实用性强,成本低,使用维护方便,软件功能强,运行稳定可靠等优点。
3硬件总体设计
硬件设计是整个系统的基础,要考虑的方方面面很多,除了实现交通灯基本 功能以外,主要还要考虑如下几个因素:①系统稳定度;②器件的通用性或易选 购性;③软件编程的易实现性;④系统其它功能及性能指标;因此硬件设计至关 重要。现从各功能模块的实现逐个进行分析探讨。
3.1 总体设计
本设计以单片机为控制核心,采用模块化设计,共分以下几个功能模块:单片机控制系统、键盘及状态显示、倒计时模块等。单片机作为整个硬件系统的核心,它既是协调整机工作的控制器,又是数据处理器。它由单片机振荡电路、复位电路等组成。键盘及状态显示,开关键盘输入交通灯初始时间,通过单片机 P1 输入到系统。系统采用双数码管倒计时计数功能,最大显示数字 99。友好的人机界面、灵活的控制方式、优化的物理结构是本设计的亮点。
3.2 单片机的选择
单片机微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。单片机微型计算机简称单片机,特别适用于控制领域,故又称为微控制器。通常,单片机由单块集成电路芯片构成,内部包含有计算机的基本功能部件:中央处理器、存储器和 I/O 接口电路等。因此,单片机只需要和适当的软件及外部设备相结合,便可成为一个单片机控制系统。
目前,我国生产很多型号的单片机,在此,我们采用型号为 STC89C52 的单片机。因为: STC89C52 是一个低电压,高性能 CMOS 8 位单片机,片内含 4k bytes 的可反复擦写的 Flash 只读程序存储器和 128 bytes 的随机存取数据存储器(RAM),器件采用 ATMEL 公司的高密度、非易失性存储技术生产,兼容标准 MCS-52 指令系统,片内置通用 8 位中央处理器和 Flash 存储单元,内置功能强大的微型计算机的 AT89C52 提供了高性价比的解决方案。 STC89C52 是一个低功耗高性能单片机,40 个引脚,v32 个外部双向输入/ 输出(I/O)端口,同时内含 2 个外中断口,2 个 16 位可编程定时计数器,2 个全双工串行通信口,STC89C51 可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和 Flash 存储器结合在一起,特别是可反复擦写的 Flash 存储器可有效地降低开发成本。
3.3系统原理方框图
本设计以单片机为核心,以 LED 数码管作为倒计时指示,根据设计的要求我们考虑了各功能模块的几种设计方案,以求最佳方案,实现实时显示系统各种状态,系统还增设了根据交通拥挤情况可分别设置主干道和次干道的通行时间,以提高效率,缓减交通拥挤。系统总体设计框图如图所示。交通灯控制的框图如下图所示,主要有控制电路、按键电路、晶振电路、复位电路、显示电路、电源电路等电路组成。
单 片 机 |
电源电路 |
显示电路 |
复位电路 |
时钟电路 |
按键控制电路 |
交通灯控制电路 |
图3.1交通灯总设计图
3.4单片机的基本结构
8052 单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时 /计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线,现在我们分别加以说明:
中央处理器:
中央处理器(CPU)是整个单片机的核心部件,是8 位数据宽度的处理器,能处理 8 位二进制数据或代码,CPU 负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。
数据存储器(RAM)
8052 内部有 128 个 8 位用户数据存储单元和 128 个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的RAM 只有 128 个,可存放读写的数据,运算的中间结果或用户定义的字型表。
程序存储器(ROM):
8052 共有 4096 个 8 位掩膜 ROM,用于存放用户程序,原始数据或表格。
定时/计数器:
8052 有两个 16 位的可编程定时/计数器,以实现定时或计数产生中断用于第页四川信息职业技术学院毕业设计说明书(论文) 控制程序转向。
并行输入输出(I/O)口:
8052 共有 4 组 8 位 I/O 口(P0、 P1、P2 或 P3),用于对外部数据的传输。
全双工串行口:
8052 内置一个全双工串行通信口,用于与其它设备间的串行数据传送,该串行口既可以用作异步通信收发器,也可以当同步移位器使用。
中断系统:
8052 具备较完善的中断功能,有两个外中断、两个定时/计数器中断和一个串行中断,可满足不同的控制要求,并具有 2 级的优先级别选择。
时钟电路:
8052 内置最高频率达 12MHz 的时钟电路,用于产生整个单片机运行的脉冲时序,但 8051 单片机需外置振荡电容。
引脚说明:
MCS-52 系列单片机中的 8031、8051 及 8751 均采用 40Pin 封装的双列直接 DIP 结构, 40 个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4 组 8 位共 32 个 I/O 口,中断口线与 P3 口线复用。
Pin9:RESET/V pd 复位信号复用脚,当 8052 通电,时钟电路开始工作,在 RESET 引脚上出现 24 个时钟周期以上的高电平,系统即初始复位。初始化后,程序计数器 PC 指向 0000H,P0-P3 输出口全部为高电平,堆栈指针写入 07H,其它专用寄存器被清“0”。RESET 由高电平下降为低电平后,系统即从 0000H 地址开始执行程序。然而,初始复位不改变 RAM(包括工作寄存器 R0-R7)的状态,
8052 的初始态。 8052 的复位方式可以是自动复位,也可以是手动复位,见下图 4。此外, RESET/V pd 还是一复用脚,V cc 掉电其间,此脚可接上备用电源,以保证单片机内部 RAM 的数据不丢失。
Pin30:ALE/prog 当访问外部程序器时,ALE(地址锁存)的输出用于锁存地址的低位字节。而访问内部程序存储器时,ALE 端将有一个 1/6 时钟频率的正脉冲信号,这个信号可以用于识别单片机是否工作,也可以当作一个时钟向外输出。更有一个特点,当访问外部程序存储器,ALE 会跳过一个脉冲。
如果单片机是 EPROM,在编程其间, pro将用于输入编程脉冲。
Pin29:prog当访问外部程序存储器时,此脚输出负脉冲选通信号,PC 的 16 位地址数据将出现在 P0 和 P2 口上,外部程序存储器则把指令数据放到 P0 口上,由 CPU 读入并执行。第页四川信息职业技术学院毕业设计说明书(论文)
Pin31:EA/V pp 程序存储器的内外部选通线,8051 和 8751 单片机,内置有 4kB 的程序存储器,当 EA 为高电平并且程序地址小于 4kB 时,读取内部程序存储器指令数据,而超过 4kB 地址则读取外部指令数据。如EA 为低电平,则不管地址大小,一律读取外部程序存储器指令。显然,对内部无程序存储器的 8031,EA 端必须接地。
3.5 单片机最小系统
单片机最小应用系统,是指用最少的原件组成的单片机可以工作的系统。对 51 系列单片机来说,最小系统应包括单片机、晶振电路、复位电路。
单片机的最小系统是由电源、复位、时钟,下面介绍一下每一个组成部分。
电源引脚
Vcc 40 电源端
GND 20
接地端工作电压为 5V,另有 AT89LV51 工作电压则是 2.7-6V, 引脚功能一样。
复位电路
在振荡器运行时,有两个机器周期(24 个振荡周期)以上的高电平出现在此引腿时,将使单片机复位,只要这个脚保持高电平,51 芯片便循环复位。复位后 P0-P3 口均置 1 引脚表现为高电平,程序计数器和特殊功能寄存器 SFR 全部清零。当复位脚由高电平变为低电平时,芯片为 ROM 的 00H 处开始运行程序。复位是由外部的复位电路来实现的。片内复位电路是复位引脚 RST 通过一个斯密特触发器与复位电路相连,斯密特触发器用来抑制噪声,它的输出在每个机器周期的 S5P2,由复位电路采样一次。复位电路通常采用上电自动复位第页四川信息职业技术学院毕业设计说明书(论文) 和按钮复位两种方式,此电路系统采用的是上电与按钮复位电路。当时钟频率选用 6MHz 时,C 取 22μF,Rs 约为 200Ω,Rk 约为 1K。复位操作不会对内部 RAM有所影响。
时钟电路
XTAL1 是片内振荡器的反相放大器输入端,XTAL2 则是输出端,使用外部振荡器时,外部振荡信号应直接加到 XTAL1,而 XTAL2 悬空。内部方式时,时钟发生器对振荡脉冲二分频,如晶振为12MHz,时钟频率就为6MHz。晶振的频率可以在 1MHz-24MHz 内选择。电容取 30PF 左右。系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路。AT89 单片机内部有一个用于构成振荡器的高增益反相放大器。引脚 XTAL1 和 XTAL2 分别是此放大器的输入端和输出端。这个放大器与作为反馈元件的片外晶体谐振器一起构成一个自激振荡器。外接晶体谐振器以及电容 C1 和 C2 构成并联谐振电路,接在放大器的反馈回路中。对外接电容的值虽然没有严格的要求,但电容的大小会影响震荡器频率的高低、震荡器的稳定性、起振的快速性和温度的稳定性。因此,此系统电路的晶体振荡器的值为 12MHz,电容应尽可能的选择陶瓷电容,电容值约为 22 μF。在焊接刷电路板时,晶体振荡器和电容应尽可能安装得与单片机芯片靠近,以减少寄生电容,更好地保证震荡器稳定和可靠地工作。
输入输出引脚
(1) P0 端口[P0.0-P0.7] P0 是一个 8 位漏极开路型双向 I/O 端口,端口置 1(对端口写 1)时作高阻抗输入端。作为输出口时能驱动 8 个 TTL。对内部 Flash 程序存储器编程时,接收指令字节;校验程序时输出指令字节,要求外接上拉电阻。在访问外部程序和外部数据存储器时,P0 口是分时转换的地址(低 8 位)/ 数据总线,访问期间内部的上拉电阻起作用。
(2) P1 端口[P1.0-P1.7] P1 是一个带有内部上拉电阻的 8 位双向 I/0 端口。输出时可驱动 4 个 TTL。端口置 1 时,内部上拉电阻将端口拉到高电平,作输入用。对内部 Flash 程序存储器编程时,接收低 8 位地址信息。
(3) P2 端口[P2.0-P2.7] P2 是一个带有内部上拉电阻的 8 位双向 I/0 端口。输出时可驱动 4 个 TTL。端口置 1 时,内部上拉电阻将端口拉到高电平,作输入用。对内部Flash 程序存储器编程时,接收高8 位地址和控制信息。在访问外部程序和 16 位外部数据存储器时,P2 口送出高 8 位地址。而在访问 8 位地址的外部数据存储器时其引脚上的内容在此期间不会改变。 (4) P3 端口[P3.0-P3.7] P2 是一个带有内部上拉电阻的 8 位双向 I/0 端口。输出时可驱动 4 个 TTL。端口置 1 时,内部上拉电阻将端口拉到高电平,作输入用。
LED 显示电路
显示器普遍地用于直观地显示数字系统的运行状态和工作数据,按照材料及产品工艺,单片机应用系统中常用的显示器有:发光二极管 LED 显示器、液晶 LCD 显示器、CRT 显示器等。LED 显示器是现在最常用的显示器之一,发光二极管(LED)由特殊的半导体材料砷化镓、磷砷化镓等制成,可以单独使用,也可以组装成分段式或点阵式 LED 显示器件(半导体显示器)。分段式显示器(LED 数码管)由 7 条线段围成 8 字型,每一段包含一个发光二极管。外加正向电压时二极管导通,发出清晰的光。只要按规律控制各发光段亮、灭,就可以显示各种字形或符号。LED 数码管有共阳、共阴之分。图是共阳式、共阴式LED 数码管的原理图和符号.
4软件总体设计
软件在硬件平台上构筑,完成各部分硬件的控制和协调。系统功能是由软件共同实现的,由于软件的可伸缩性,最终实现的系统功能可强可弱,差别可能很大。因此,软件是本系统的灵魂。软件采用模块化设计方法,不仅易于编程和调试,也可减小软件故障率和提高软件的可靠性。同时,对软件进行全面测试也是检验错误排除故障的重要手段。
完整代码见附录2
5调试与功能说明
单片机应用系统的调试包括硬件和软件两部分,但是他们并不能完全分开。一般的方法是排除明显的硬件故障,再进行综合调试,排除可能的软/硬件故障。
5.1 硬件调试
拿到电路板后,首先要检查加工质量,并确保没有任何方面的错误,如短路和断路,尤其要避免电源短路;元器件在安装前要逐一检查,用万用表测其数值,看是否与所用相同;完成焊接后,应先空载上电(芯片座上不插芯片),并检查各引脚的电位是否正确。若一切正常,方可在断电的情况下将芯片插入,再次检查各引脚的电位及其逻辑关系。将万用表的探针放到单片机接电源的引脚上检测一下,看是否符合要求。
5.2 软件调试问题及解决
软件程序的调试一般可以将重点放在分模块调试上,统调是最后一环。软件调试可以采取离线调试和在线调试两种方式。前者不需要硬件仿真器,可借助于软件仿真器即可;后者一般需要仿真系统的支持。本次课题,Keil 软件来调试程序,通过各个模块程序的单步或跟踪调试,使程序逐渐趋于正确,最后统调程序。仿真部分采用 protus 6 professional 软件,此软件功能强大且操作较为简单,可以很容易的实现各种系统的仿真。首先打开 protus 6 professional 软件,在元件库中找到要选用的所有元件,然后进行原理图的绘制;绘制好后再选择 wave6000 已经编译好的*.hex 文件,选择运行,观察显示结果,根据显示的结果和课题的要求再修改程序,再运行查,直到满足要求。
设计心得
在本次课程设计中,重新巩固了单片机理论课时,感觉到的内容很多,知识点很杂、很繁琐。通过自己的努力也更进一步掌握了单片机的内容构造和工作原理,以及接外部电路的情况。当然光有理论知识那只是“纸上谈兵”,还需实际动手去实践。真正把所学的用到日常生活中,理论联系实际,做出实物模型。这次单片机课程设计,我们设计的是简易十字路口交通灯设计,通过这次课程设计我感觉到要想做成功,必须花时间多做准备,查阅大量资料,每个过程都很繁琐,都要认真地分析每一步每一个模块要实现大的功能,然后分步进行编写调试,最后整合成在一起。在这次课程设计中,让我感到过程决定结果,细节觉得成败。过程很艰难,每个细节都要认真的分析。
通过本次课程设计,我们要对所做的事情有耐性,在编程的时候有困难,也可能变得不一定成功,所以要经过多次调试,分析,改正,反复去做;认真虚心求教老师和同学。在本次课程设计中,遇到最难的问题是倒计时这个模块。从一位静态 LED 显示开始调试,到 2 位动态 LED 显示调试,遇到很多困难。一位一位9 的静态显示,都可以,用动态显示方法的时候,就出现乱码,之后一条一条指令的测试,知道没出错为止。这时又有问题了,十位先显示个位要显示的数再显示十位要显示的数,经过反复的调试和老师的帮助下,发现我们把段选和位选分开了(有两个子程序来写)。程序经过更改后,继续调试,又发现 2 个数码管只是移位的在显示,可且间隔时间很长(这是由延时时间太长引起的)。设置延时时间很短的时候,就发现显示很快(很容易会发生交通意外),经过同学的帮助下,查处我们的定时有问题,在同学的帮助下,重新编写和调试定时,最后成功了。在本次课程设计中,我们用汇编语言编写,觉得汇编语言很复杂很麻烦,能用的寄存器少,每个参数都要放在寄存器里,很繁琐,而且格式是固定的,编写出来的程序很长。在这次课程设计中,经历了多次失败的洗礼,我明白在以后学习和实践中,我要努力掌握知识,多动手,多思考,以免在以后的学习工作中犯同样的错误。
回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,虽然说时间只有一周,而且很忙碌,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。一次次的讨论学习与修改,对实验数据的更正,不断调整实验方案,对每一个细节的认真把握,最终焊接的电路图与仿真模拟都是一次性完成,非常让人高兴。合作的力量是巨大的,上网查资料,与身边的学霸们相互请教,纵然有困难,相信也是没有什么问题是不能解决的,感谢他们的帮助。
参考文献
[1] 李海滨.片春媛.许瑞雪编.《单片机技术课程设计与项目实例》,中国电力出版社,2009
[2] 王静霞主编.《单片机应用技术》.电子工业出版社,2009
[3] 雄建云主编《. Protel99 se EDA 技术及应用》.北京机械工业出版社, 2007 。
[4] 曹天汉主编.《单片机原理与接口技术》,电子工业出版社,2009
[5]何立民主编.《单片机高等教程》.北京航空航天大学出版社,2000
[6] 何立民主编.《单片机应用系统设计系统配置与接口技术》,北京航空航天大学出版社,2000
[7] 杨宝清,宋文贵主编.《实用电路手册》.机械工业出版社 2002
[8] 张存礼,韩爱娟主编.《电子技术综合实训》.北京师范大学出版
附录1:总体电路原理图
附录2:源程序
#include<reg51.h>
#define uchar unsignedchar
#define uint unsignedint
sbit P17=P1^7;
unsigned char codetable[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
uchar Flash_Count =0,i,
j,tt=30,num,shi,ge;
Operation_Type = 1;
uint aa;
void DelayMS(uint x)
{
uchar t;
while(x--)
{
for(t=120;t>0;t--);
}
}
void Delay(uint z)
{
uchar t;
while(z--)
{
for(t=10;t>0;t--);
}
}
void Traffic_lignt()
{
switch(Operation_Type)
{
case 1:P1=~0x21;break;
case 2:
{
P1=~0x11;
DelayMS(200);
P1=~0x01;
DelayMS(200);
}
break;
case 3:P1=~0x0c;break;
case 4:
{
P1=~0x0a;
DelayMS(200);
P1=~0x08;
DelayMS(200);
} break;
}
}
void main()
{
EA=1;
EX0=1;
IT0=1;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;
TR0=1;
while(1)
{
Traffic_lignt();
}
}
void jinji_light() interrupt 0
{
P1=~0x09;
P2=0x00;
P0=0x73;
DelayMS(2000);
DelayMS(2000);
}
void time0() interrupt 1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
aa++;
if(aa==200)
{
aa=0;
P17=~P17;
tt--;
if(tt==3)
{
if(Operation_Type==5)
{
Operation_Type=1;
}
Operation_Type++;
If
(
Operation_Type==4)
{
tt=3;
}
if(Operation_Type==2)
{
tt=3;
}
}
if(tt==0)
{
Operation_Type++;
if(Operation_Type==5)
{
Operation_Type=1;
}
if(Operation_Type==3)
{
tt=30;
}
if(Operation_Type==1)
{
tt=30;
}
}
}
shi=tt/10;
ge=tt%10;
num++;
if(num==3)
{
num=1;
}
switch(num)
{
case1:{P2=0x02;P0=table[shi];}
break;
case 2:
{
P2=0x01;
P0=table[ge];
}
break;
default:break;
}
Delay(10); }
附录3:元器件清单
序号 | 名称 | 型号 | 数量 |
1 | 单片机 | STC89C52 | 1 |
2 | 双位数码管 | 共阳极 | 1 |
3 | LED灯 | 红黄绿 | 12 |
4 | 电阻 | 220欧 | 8 |
5 | 电阻 | 4.7K | 2 |
6 | 电阻 | 1k | 12 |
7 | 三极管 | PNP | 2 |
8 | 电容 | 22pf | 2 |
9 | 晶振 | 11.0592 | 1 |
10 | 电解电容 | 10uf | 1 |
11 | 按键 | 普通 | 1 |