毕业论文
题目:基于单片机的交通灯设计系别:姓名:
指导教师:
单片机交通灯设计
摘要:
近年来随着科技的飞速发展,一个以微电子技术、计算机技术和通信技术为先导的信息革命正在蓬勃发展。计算机技术作为三者之一,怎样与实际应用更有效的结合并发挥其作用。单片机作为计算机技术的一个分支,正在不断的应用到实际生活中,同时带动传统控制检测的更新。在实时检测和自动控制的应用系统中,单片机往往是作为一个核心部件使用,针对具体应用对象的特点,配以其它器件来加以完善。
十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊。那么靠什么来实现交通的井然秩序呢?靠的是交通信号灯的自动指挥系统,来实现交通的井然有序。交通信号灯控制方式很多。本系统采用美国ATMEL公司生产的单片机AT89S51,以及其它芯片来设计交通灯控制。实现了通过AT89S51芯片的P1口设置红、绿灯点亮的功能,通过AT89S51芯片的RXD、TXD输入、输出设置显示时间。交通灯的点亮采用发光二极管实现,时间的显示采用七段数码管实现。单片机系统采用的直流供电。为了系统稳定可靠,系统内集成了“看门狗”芯片,避免了系统因为死机而停止工作的情况发生。系统实用性强、操作简单、扩展性好。
目录
1引言.......................................................................................................................................12交通管理方案论证...............................................................................................................2
2.1设计任务......................................................................................................................2
2.2方案介绍......................................................................................................................23交通灯系统硬件设计...........................................................................................................4
3.1单片机概述..................................................................................................................4
3.2系统构成......................................................................................................................5
3.3芯片选择与介绍...........................................................................................................6
3.3.1AT89S51芯片..................................................................................................6
3.3.274HC164芯片介绍..........................................................................................8
3.3.374LS04输出信号与信号灯............................................................................9
3.3.4交通灯控制线路图.......................................................................................104交通灯软件设计.................................................................................................................11
4.1程序设计流程图........................................................................................................11
4.2延时的设定.................................................................................................................13
4.2.1计数器初值计算...........................................................................................13
4.2.2相应程序代码...............................................................................................13
4.3程序的主控制循环调用............................................................................................14
4.4对现有程序的扩充....................................................................................................155实验平台..............................................................................................................................16
5.1实验平台.....................................................................................................................16
5.2实验步骤.....................................................................................................................16
5.2.1编写程序代码.................................................................................................16
5.2.2按照系统硬件连线图连接好系统并调试.....................................................16结论.........................................................................................................................................18致谢.........................................................................................................................................18参考文献.................................................................................................................................19程序实现代码.........................................................................................................................20
1引言
今天,红绿灯安装在各个道口上,已经成为疏导交通车辆最常见和最有效的手段。但这一技术在19世纪就已出现了。
1858年,在英国伦敦主要街头安装了以燃煤气为光源的红,蓝两色的机械扳手式信号灯,用以指挥马车通行。这是世界上最早的交通信号灯。1868年,英国机械工程师纳伊特在伦敦威斯敏斯特区的议会大厦前的广场上,安装了世界上最早的煤气红绿灯。它由红绿两块以旋转式方形玻璃提灯组成,红色表示“停止”,绿色表示“注意”。1869年1月2日,煤气灯爆炸,使警察受伤,遂被取消。
1914年,电气启动的红绿灯出现在美国。这种红绿灯由红绿黄三色圆形的投光器组成,安装在纽约市5号大街的一座高塔上。红灯亮表示“停止”,绿灯亮表示“通行”。
1918年,又出现了带控制的红绿灯和红外线红绿灯。带控制的红绿灯,一种是把压力探测器安在地下,当车辆接近时,红灯便变为绿灯;另一种是用扩音器来启动红绿灯,司机遇红灯时按一下喇叭,就使红灯变为绿灯。红外线红绿灯当行人踏上对压力敏感的路面时,它就能察觉到有人要过马路。红外光束能把信号灯的红灯延长一段时间,推迟汽车放行,以免发生交通事故。
信号灯的出现,使交通得以有效管制,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。1968年,联合国《道路交通和道路标志信号协定》对各种信号灯的含义作了规定。绿灯是通行信号,面对绿灯的车辆可以直行,左转弯和右转弯,除非另一种标志禁止某一种转向。左右转弯车辆都必须让合法地正在路口内行驶的车辆和过人行横道的行人优先通行。红灯是禁行信号,面对红灯的车辆必须在交叉路口的停车线后停车。黄灯是警告信号,面对黄灯的车辆不能越过停车线,但车辆已十分接近停车线而不能安全停车时可以进入交叉路口。
随着经济的发展,交通运输中出现了一些传统方法难以解决的问题。道路拥挤现象日趋严重,造成的经济损失越来越大,并一直保持大比例的增长。现在交通系统已不能满足经济发展的需求。由于生活水平的提高,人们对交通运输的安全性及服务水平提出了更高的要求。在交通中管理引入单片机交通灯控制代替交管人员在交叉路口服务,有助于提高交通运输的安全性、提高交通管理的服务质量。并在一定程度上尽可能的降低由道路拥挤造成的经济损失,同时也减小了工作人员的劳动强度。
中国车辆数量不断增加,交通控制在未来的交通管理中起着越来越重要的作用。智能交通灯的管理比重修一条马路无论在经济、交通运行速率上都有很好的效益、更加节约资源。使交管人员有更多的精力投入到管理整个城市交通控制,带来更大的经济和社会效益,为创造美好的城市交通形象发挥更多的作用。
-1-
2交通管理方案论证
2.1设计任务
东西(A)、南北(B)两干道交于一个十字路口,各干道有一组红、左转绿、绿三个指示灯,指挥车辆和行人安全通行。红灯亮禁止通行,绿灯亮允许通行。红灯的设计时间为40秒,绿灯及左转绿灯各为20秒。设A道和B道的车流量相同。
2.2方案介绍
把设计任务细化为四个状态,其对应状态:如图1
A道为40秒红灯,B道绿灯20秒
A道为20秒红灯,B道左转20秒绿灯
A道为20秒绿灯,B道为40秒红灯
A道左转20秒绿灯,B道为20秒红灯
图1状态转换图
整个交通灯控制由四个状态组成,可以用程序设计实现,也可用时序逻辑实现.以下方案就是分别用了这两种方法。
方案1设计思想:
采用分模块设计的思想,程序设计实现的基本思想是一个计数器,选择一个单片机,其内部为一个计数,是十六进制计数器,模块化后,通过设置或程序清除来实现状态的转换,由于每一个模块的计数多不是相同,这里的各模块是以预置数和计数器计-2-
数共同来实现的,所以要考虑增加一个置数模块,其主要功能细分为,对不同的状态输入要产生相应状态的下一个状态的预置数,如图中A道和B道,分别为次干道的置数选择和主干道的置数选择。以主干道为例,简述其设计思想。如前分析,已经确定该系统有四个状态,而置数子模块可定要将下一状态的预置数准备好,所以很容易得到主干道的置数表如:表1状态
00
01
10
11主干道预置数40202020(左转)
表1置数表次干道预置数2020(左转)4020
由该表,就可以通过程序循环的方法设计该模块,主要思想是通过数据判断指令、跳转指令实现,由主控制器计时和中断产生的四个状态去译码,从而得到不同的输出,即预置数,由上分析可用一个计数器和跳转指令去完成的预置数。
而红绿灯的显示也是一样,由状态分析可以得出红绿灯的变化表如:表2状态
00
01
10
11主干道灯显示红灯红灯绿灯左转绿灯
表2红绿灯变化表次干道灯显示绿灯左转绿灯红灯红灯
通过这张表就可以用组合电路实现该功能了,可以用数据选择器的思想,在本系统中,直接通过门电路的译码,接下来就是计数模块了,其主要的功能细分为,要从预置数开始递减计数,一个状态结束,通过判断,通知主控制模块,使之进入下一模块。还有一个必须考虑到的就是,预置数必须在下一个状态来之前准备好,而红绿灯的状态变化,必须和计数状态同步,于是引起预置数变化的程序要超前于系统本身的状态变化,所以,系统中的两个状态转换时,在上一状态结束时设置预置数,而控制红绿灯的是随着系统本身状态的变化而变化,体现在本子电路中就是有两组电路去判断符合的状态。方案2设计思想:
状态转换表如:表3状态
00(15S)
01(05S)
10(15S)
11(05S)主干道灯显示红灯红灯绿灯黄灯次干道灯显示绿灯黄灯红灯红灯
-3-
表3状态转换表
本方案分三步:
(1)要建立三路信号灯的控制系统,本设计采用7408芯片通过组合逻辑控制三路灯的显示关系。
(2)建立显示控制系统,本设计采用74190芯片倒计时控制,每个方向用两片相连实现,另外用74153芯片,因为分析中设置的时间末位均为5,所以只要用一片74153对高位置位,将低位的初值预置锁定为5,而高位则根据需要由反馈部分提供预置值。
(3)建立反馈和细节连接部分,本部分主要解决显示和灯控的同步问题本系统采用倒计时系统减为0,如当系统减为0时通过两个D触发器得到两个变量,即为开头分析中的状态,通过它的变化得到不同的逻辑关系,驱动74153控制哪组灯亮(对应关系如表所示),另外他还要同步反馈到显示系统的置数环节。
注意:本实验中若采用更复杂的四片74190控制主干道的两组灯,再用八片74153分别对74190置数可实现任意数值的交通灯系统。另外对7408片子的控制红灯的端口用一个与门将一端再接一个频率一定的方波,使一边为黄灯时,另一边的红灯在闪烁。方案比较:
方案1(以下称1)用了模块设计,而方案2(以下称2)采用的是一般设计,相比之下1有较强的可读性和较强的可修改性,而2则在设计上显得较简单,设计纯朴,便于测试,它的优势则在于提供了一条较为便捷的解决方案。2首先将许多逻辑关系简化到极点,而后将其一起集成用较少的芯片去完成所需功能。
我们从中可以得出的是,我们最终的设计应该尽量使用模块化设计。对工程设计人员来说,将来的产品无论从修改还是升级考虑对有好处,但另外我们又需将设计简单化,因此我觉得在设计初期尽可能的简单化设计,而一旦设计的各项测试通过了,在有可能的条件下将设计模块化,所以本设计以第一方案为主进行。
3交通灯系统硬件设计
3.1单片机概述
单片机是由运算器、控制器、存储器、输入设备以及输出设备共五个基本部分组成的。单片机是把包括运算器、控制器、少量的存储器、最基本的输入输出口电路、串行口电路、中断和定时电路等都集成在一个尺寸有限的芯片上。
通常,单片机由单个集成电路芯片构成,内部包含有计算机的基本功能部件:中央处理器、存储器和I/O接口电路等。因此,单片机只需要和适当的软件及外部设备相结合,便可成为一个单片机控制系统。
单片机经过1、2、3、3代的发展,目前单片机正朝着高性能和多品种方向发展,它们的CPU功能在增强,内部资源在增多,引脚的多功能化,以及低电压、低功耗。
可以说,二十世纪跨越了三个“电”的时代,即电气时代、电子时代和现已进入的电脑时代。不过,这种电脑,通常是指个人计算机,简称PC机。它由主机、键盘、显示器等组成。还有一类计算机,大多数人却不怎么熟悉。这种计算机就是把智能赋予各种机械的单片机。顾名思义,这种计算机的最小系统只用了一片集成电路,即可进行简单运算和控制。因为它体积小,通常都藏在被控机械的“肚子”里。它在整个装置中,起着有如人类头脑的作用,它出了毛病,整个装置就瘫痪了。现在,这种单片机的使用领域已十分广-4-
泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。各种产品一旦用上了单片机,就能起到使产品升级换代的功效,常在产品名称前冠以形容词——“智能型”,如智能型洗衣机等。现在有些工厂的技术人员或其它业余电子开发者搞出来的某些产品,不是电路太复杂,就是功能太简单且极易被仿制。究其原因,可能就卡在产品未使用单片机或其它可编程逻辑器件上。
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。更不用说自动控制领域的机器人、智能仪表、医疗器械了。它主要是作为控制部分的核心部件。因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。
3.2系统构成
电路板一块,AT89S51单片机一片,74HC164芯片八片,七段数码管八个。74LS04反向器一片,发光二极管13个(8个绿的,4个红的用于交通控制,1个用于标识电源),7805三端稳压电源一个,一个按键,一条数据下载线。
系统结构框图如:图2
键盘
控制AT89S51单片机
系
统74HC164LCD显示与LED倒计时接
口
电
路
图2系统结构框图模块
系统各部分工作:
(1)程序设置初始时间,通过AT89S51单片机内部相应寄存器来实现。
(2)由AT89S51单片机的定时器每秒钟通过P3.0口向74HC164的数据端口送信息,由74HC164的输出口显示红、绿、黄灯的点亮时间情况;由AT89S51的P1.0、P1.1、P1.2、P1.3口显示每个灯的点亮情况。
(3)AT89S51通过程序设置各个信号灯的点亮时间,通过程序设置左转绿、绿、红时间依次为20秒、20秒、40秒循环,由AT89S51的P3口向74HC164的数据口输出。
(4)通过AT89S51单片机的P3口来控制系统是工作。
(5)74HC164的A、B口用于串行输出时间位,经过串并转换送到七段数码管的八的引脚。而P1口用于输出控制信号.而通过74LS04反向器实现控制各个灯的情况.它采用5V的直流电来驱动二极管。-5-
(6)AT89S51本身集成了看门狗指令,当系统出现异常看门狗将发出溢出中断。通过专用端口输出,引起RESET复位信号复位系统。
3.3芯片选择与介绍
3.3.1AT89S51芯片
选用的AT89S51与同系列的AT89C51在功能上有明显的提高,最突出是的可以实现在线的编程。用于实现系统的总的控制。其主要功能列举如下:
1、为一般控制应用的8位单片机
2、晶片内部具有时钟振荡器(传统最高工作频率可至33MHz)
3、内部程式存储器(ROM)为4KB
4、内部数据存储器(RAM)为128B
5、外部程序存储器可扩充至64KB
6、外部数据存储器可扩充至64KB
7、32条双向输入输出线,且每条均可以单独做I/O的控制
8、5个中断向量源
9、2组独立的16位定时器
10、1个全双工串行通信端口
11、8751及8752单芯片具有数据保密的功能
12、单芯片提供位逻辑运算指令
AT89S51各引脚功能介绍:如图3
-6-
图3AT89S51
VCC:ATAT89S51电源正端输入,接+5V。VSS:电源地端。
XTAL1:单芯片系统时钟的反向放大器输入端。
XTAL2:系统时钟的反向放大器输出端,一般在设计上只要在XTAL1和XTAL2上接上一只石英振荡晶体系统就可以动作了,此外可以在两个引脚与地之间加入一个20PF的小电容,可以使系统更稳定,避免噪声干扰而死机。
RESET:AT89S51的重置引脚,高电平动作,当要对晶片重置时,只要对此引脚电平提升至高电平并保持两个机器周期以上的时间,AT89S51便能完成系统重置的各项动作,使得内部特殊功能寄存器之内容均被设成已知状态,并且至地址0000H处开始读入程序代码而执行程序。
EA/Vpp:"EA"为英文"ExternalAccess"的缩写,表示存取外部程序代码之意,低电平动作,也就是说当此引脚接低电平后,系统会取用外部的程序代码(存于外部EPROM中)来执行程序。因此在8031及8032中,EA引脚必须接低电平,因为其内部无程序存储器空间。如果是使用8751内部程序空间时,此引脚要接成高电平。此外,在将程序代码烧录至8751内部EPROM时,可以利用此引脚来输入21V的烧录高压(Vpp)。
ALE/PROG:ALE是英文"AddressLatchEnable"的缩写,表示地址锁存器启用信号。ATAT89S51可以利用这个引脚来触发外部的8位锁存器(如74LS373),将端口0的地址总线(A0~A7)锁进锁存器中,因为ATAT89S51是以多工的方式送出地址及数据。平时在程序执行时ALE引脚的输出频率约是系统工作频率的1/6,因此可以用来驱动其他周边晶片的时基输入。此外在烧录8751程序代码时,此引脚会被当成程序规划的特殊功能来使用。PSEN:此为"ProgramStoreEnable"的缩写,其意为程序储存启用,当8051被设成为读取外部程序代码工作模式时(EA=0),会送出此信号以便取得程序代码,通常这支脚是接到EPROM的OE脚。ATAT89S51可以利用PSEN及RD引脚分别启用存在外部的RAM与EPROM,使得数据存储器与程序存储器可以合并在一起而共用64K
的定址范围。
-7-
PORT0(P0.0~P0.7):端口0是一个8位宽的开路电极(OpenDrain)双向输出入端口,共有8个位,P0.0表示位0,P0.1表示位1,依此类推。其他三个I/O端口(P1、P2、P3)则不具有此电路组态,而是内部有一提升电路,P0在当作I/O用时可以推动8个LS的TTL负载。如果当EA引脚为低电平时(即取用外部程序代码或数据存储器),P0就以多工方式提供地址总线(A0~A7)及数据总线(D0~D7)。设计者必须外加一个锁存器将端口0送出的地址锁住成为A0~A7,再配合端口2所送出的A8~A15合成一组完整的16位地址总线,而定位地址到64K的外部存储器空间。PORT2(P2.0~P2.7):端口2是具有内部提升电路的双向I/O端口,每一个引脚可以推动4个LS的TTL负载,若将端口2的输出设为高电平时,此端口便能当成输入端口来使用。P2除了当作一般I/O端口使用外,若是在ATAT89S51扩充外接程序存储器或数据存储器时,也提供地址总线的高字节A8~A15,这个时候P2便不能当作I/O来使用了。PORT1(P1.0~P1.7):端口1也是具有内部提升电路的双向I/O端口,其输出缓冲器可以推动4个LSTTL负载,同样地,若将端口1的输出设为高电平,便是由此端口来输入数据。如果是使用8052或是8032的话,P1.0又当作定时器2的外部脉冲输入脚,而P1.1可以有T2EX功能,可以做外部中断输入的触发引脚。PORT3(P3.0~P3.7):端口3也具有内部提升电路的双向I/O端口,其输出缓冲器可以推动4个TTL负载,同时还多工具有其他的额外特殊功能,包括串行通信、外部中断控制、计时计数控制及外部数据存储器内容的读取或写入控制等功能。其引脚分配如下:
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,外部数据存储器的读取信号。3.3.2
74HC164芯片介绍
74HC164为串行输入、并行输出移位寄存器,74HC164为单向总线驱动器。
在串行口为方式0状态,即工作在移位寄存器方式,波特率为振荡频率的十二分之一。器件执行任何一条将SBUF作为目的寄存器的命令时,数据便开始从RXD端发送。在写信号有效时,相隔一个机器周期后发送控制端SEND有效,即允许RXD发送数据,同时,允许从TXD端输出移位脉冲。第一帧(8位)数据发送完毕时,各控制信号均恢复原状态,只有TI保持高电平,呈中断申请状态。第一个74HC164把第一帧数据并行输出,LED1显示该数据。然后,用软件将TI清0,发送第二帧数据。第二帧数据发送完毕,LED1显示第二帧数据,第一帧数据串行输入给第二个74HC164,LED2显示第一帧数据。依此类推,直到把数据区内所有数据发送出去。应该注意,数据全部发送完后,第一帧数据在最后一个LED显示。由于TXD端最多可以驱动8个TTL门。
注意:当LED显示器超过8个时,我们采用74HC244芯片驱动。每个74HC244有8路驱动,每一路可驱动8个LED,即每增加一个74HC244,可增加64个LED驱动。七段数码管,用于显示0—9的数字。
-8-
3.3.374LS04输出信号与信号灯
要使行人能看见信号灯的情况,必须把P1口输出的信号进行放大,这里我们用74LS04反向器,当极性为高电平时晶闸管导通,该支路指示灯亮;当极性为低电平时关断,该支路指示灯灭。
LED灯的显示原理:通过同名管脚上所加电平的高低来控制发光二极管是否点亮。七段数码管的显示及与74HC164的连接显示不同的数字如SP,g,f,e,d,c,b,a管角上加上0FEH所以SP上为0伏,不亮其余为TTL高电平,全亮则显示为8。
数字0-9与16进制的转换驱动代码表:如表5显示数值0123456789
abcdefgdop[***********][***********][***********][***********]11110110
表5
驱动代码表
驱动代码(16进制)0FCH60H0DAH0F2H66H0B6H0BEH0E0H0FEH0F6H
74LS04(6反向器)主要对信号起了反向作用。其它器件的功能如:
7805的功能,既提供稳定的+5V电压。
-9-
3.3.4
交通灯控制线路图
-10-
4交通灯软件设计
4.1程序设计流程图
(1)程序设计总框图:如图4
开始
初始化
等待键盘事件
键盘事件显示程序处理处理
图4程序设计框图
(2)程序详细流程图:如图5
-11-
开始
设置定时器开中断
赋初值
F0=1
R0,R1分别送A。调用计时程序并调用延时
R1,R0分别送A。调用计时程序并调用延时
R2=01Flag0=1
R2=02
R2=03
Flag1=1
跳到SEC
跳到THR,F0=1
Flag1=1
跳到FOU
R2=04
标志位清0,跳到FIR
R0=00
R2加1,跳到DIAOY
图5程序详细流程图
流程图说明:
图中定时器在每50ms中断一下,设置为循环20次(此时为1秒),每1秒以后,R0,R1自动减1。
程序中的判断在相等情况下从右边出,不相同的情况往下走。
-12-
4.2延时的设定
延时方法可以有两种一种是利用AT89S51内部定时器的溢出中断来确定1秒的时间,另一种是采用软件延时的方法。4.2.1
计数器初值计算
定时器工作时必须给计数器送计数器初值,这个值是送到TH和TL中的。他是以加法记数的,并能从全1到全0时自动产生溢出中断请求。因此,我们可以把计数器记满为零所需的计数值设定为C和计数初值设定为TC可得到如下计算通式:
TC=M-C
式中,M为计数器模值,该值和计数器工作方式有关。在方式0时M为213;在方式1时M的值为216;在方式2和3为28;算法公式:
T=(M-TC)T计数或TC=M-T/T计数
T计数是单片机时钟周期TCLK的12倍;TC为定时初值如单片机的主脉冲频率为TCLK12MHZ,经过12分频方式0TMAX=213×1微秒=8.192毫秒方式1TMAX=216×1微秒=65.536毫秒
显然1秒钟已经超过了计数器的最大定时间,所以我们只有采用定时器和软件相结合的办法才能解决这个问题.实现1秒的方法:
我们采用在主程序中设定一个初值为20的软件计数器和使T1定时50毫秒。这样每当T1到50毫秒时CPU就响应它的溢出中断请求,进入他的中断服务子程序。在中断服务子程序中,CPU先使软件计数器减1,然后判断它是否为零。为0表示1秒已到可以返回到输出时间显示程序。4.2.2
相应程序代码
(1)定时器的设置
定时器需定时50毫秒,故T1工作于方式1。
初值计算:TC=M-T/T计数=216-50ms/1us=15536=3CBOH
START:MOVTMOD,#10H;令TO为定时器方式1
MOVTH0,#3CH;装入定时器初值MOVTL0,#0BOHSETBEA;打开总中断SETBET1;开T1中断SETBER;启动T1计数器CLRFLAG1CLRFLAG2CLRFLAG3MOVR3,#20H;软件计数器赋初值
(2)相应中断服务子程序
ORG001BH
-13-
LJMPDSDORG0030H
DSD:INCR3
MOVTH0,#3CH;重装入定时器初值MOVTL0,#BOHCJNER3,#20,FHDECR0DECR1
MOVR3,#00H
FH:RETI程序的软件延时:
AT89S51的工作频率为0—33MHZ,我们选用的AT89S51单片机的工作频率为12MHZ。机器周期与主频有关,机器周期是主频的12倍,所以一个机器周期的时间为12*(1/12M)=1us。我们可以知道具体每条指令的周期数,这样我们就可以通过指令的执行条数来确定1秒的时间。
具体的延时程序分析:DELAY:MOVR4,#08H延时1秒主程序DE2:LCALLDELAY1
DJNZR4,DE2RET
DELAY1:MOVR4,#00H;延时125us子程序D1:MOVR5,#00HD2:DJNER5,DL2
DJNER4,D1RET
DELAY1为一个双重循坏循环次数为256*256=65536所以延时时间=65536*2=131072us约为125us
DELAYR4设置的初值为8主延时程序循环8次,所以125us*8=1秒由于单片机的运行速度很快其他的指令执行时间可以忽略不计。
4.3程序的主控制循环调用
用来实现四个状态之间的转换,代码如下:DIAOY:
CJNER2,#01H,AAJBFLAG1,AALJMPSEC
AA:CJNER2,#02H,AAA
JBFLAG2,AAASETBF0LJMPTHR
AAA:CJNER2,#03H,BB
-14-
;循环控制子程序;判断不相等刚跳转;FLAG1为1则跳转;跳转到SEC
JBFLAG3,BBLJMPFOU
BB:CJNER2,#04H,BBB
CLRF0CLRFLAG1CLRFLAG2CLRFLAG3LJMPFIR
BBB:CJNER0,#00H,SGL
INCR2
LJMPDIAOY
;判断不相等则跳转;F0位清0
;R2加1
4.4对现有程序的扩充
当由于紧急需要对道路进行长时间通行时,就要保持该道路更长时间的通行。下面以东西方向为例进行紧急通行为例。
紧急通行是平常通行的特例,只要将相应的代码去掉就可以实现延长本车道的通行时间。设置通行时间为20秒。核心代码如下:FIR:MOVP1,#00H
SETBP1.0CLRP1.1CLRP1.2CLRP1.3MOVR0,#20MOVR1,#20SGL:;与原程序类同
……
CJNER0,#00H,SGL
LJMPFIR
要实现东西方向的左转通行时,只需要修改FIR中的代码就可以了。时间显示只要修改R0和R1就可以了。要实现南北方及左转,只要把SGL换成SGL1、把FIR中代码进行相应的修改就可以了。由于时间紧张,程序有不完善的地方。
原程序见程序实现代码。
-15-
5实验平台
5.1实验平台
我们采用的是KeilSoftware生产的Cx51编译器。运行在WindowsXP操作平台下。开启计算机进入KeilC51编译器介面。如图
6
图6KeilC51编译器介面
5.2实验步骤
5.2.1编写程序代码
程序代码分为3个模块:中断模块,循环模块,算法模块。(见程序实现代码)5.2.2按照系统硬件连线图连接好系统并调试1.调试程序
⑴打开Keil软件,新建工程;
-16-
⑵选择芯片;
⑶新建文档,把编写好代码写入文档并保存了ASM文件;
⑷把保存的文档加载到SourceGroup;
⑸编译程序;
⑹设置转换成16进制;
⑺运行程序的结果;
2.把编译好的16进制文件(jtd.hex)输入单片机AT89S51仿真器和对其进行初始化。
3.给实验板进行通电,观察运行结果,不一致则跳到第一步进行反复调试,直到与预定目的一致。
以下是在程序调试过程中出现在情况:通电以后,把程序装好,数码管是的数字不变,按复位键后重新开始还是如此。经过和同组人的共同分析后,发现是中断系统在计时到了1秒以后,赋的初值R0,R1没有减1,修改如下:
DSD:INCR3
MOVTH1,#3CH
MOVTL1,#0B0H
CJNER3,#20,FH;判断是否够1秒
DECR0
DECR1
MOVR3,#00H;R3清0
FH:RETI;中断返回
通电以后,东西、南北方向的时间均递减,20秒以后,东西方向的20秒用完,变成东西左转、南北各20秒,此后,时间显示和红绿灯不再变化,一直保持这一状态。
经过老师和同组人的共同努力,终于找到原因,问题出在循环控制过程中,当经过第一次20秒判断后,寄存器R2加1,当再次运行到循环控制处时,判断R2与#01H相同,程序跳到SEC处执行,此后一直如此。解决方法如下:
设置3个标记位:
FLAG1BIT00H;标记00H位
FLAG2BIT01H
FLAG3BIT02H
在循环控制中加入判断如:
DIAOY:CJNER2,#01H,AA;判断不相等刚跳转JBFLAG1,AA;FLAG1为1则跳转
LJMPSEC;跳到SEC
在跳到SEC后,在运行到该程序后加给FLAG1置数,程序如下:
SEC:CLRP1.0
SETBP1.1
CLRP1.2
CLRP1.3
MOVR0,#20
MOVR1,#20
SETBFLAG1
LJMPSGL
其它几部分与之相同的处理。
-17-
结论
本系统就是利用了AT89S51芯片的I/O引脚。系统采用美国ATMEL公司生产的单片机AT89S51,以及其它芯片(如:74HC164、74LS04六位反向器、L7805三端稳压电源)来设计交通灯控制器,实现了红灯亮40秒,绿灯和左转绿灯各亮20秒。并通过AT89S51来控制74LS04芯片的输出口设置红、绿灯燃亮的功能和控制74HC164来实现在七段数码管上的时间显示;为了系统稳定可靠系统内集成了“看门狗”芯片,避免了系统因为死机而停止工作的情况发生。系统设计简便、实用性强、操作简单、程序设计简便。
系统不足:时间设定中没有黄灯的等待闪烁时间,以及自动根据车流改变红绿灯时间,此外,还没有充分考虑的把现代管理、人工智能运用到交通的控制中,来计算交通控制点之间的距离,来更合理的安排红、绿灯的持续时间,使城市的交通管理更加人性化。使人们远离目前的交通拥塞的现象。
致谢
通过本次毕业设计,我在指导老师赵润林副教授的精心指导和严格要求下,获得了丰富的理论知识,极大地提高了实践能力,并对当前电子领域的研究状况和发展方向有了一定的了解,单片机领域这对我今后进一步学习计算机方面的知识有极大的帮助。另外,此次毕业设计还获得了计科系各位领导和老师的大力支持。在此,我忠心感谢单片机组的其它同学以及计科系各位老师的指导和支持。在未来的工作和学习中,我将以更好的成绩来回报各位领导、老师和同学。
-18-
参考文献
[1]胡汉才单片机原理及其接口技术[M]清华大学出版,1996
[2]蔡美琴MCS-51系列单片机系统及其应用高等教育出版社2004.2
[3]付家才单片机控制工程实践技术[M]化学工业出版社,2004.5
[4]潘新民微型计算机控制技术[M]人民邮电出版社,1999.9
[5]余锡存单片机原理及接口技术[M]西安电子科技大学出版社,2000.7
[6]雷丽文等.微机原理与接口技术[M]电子工业出版社,1997.2
[7]蒋万君在论循环时序电路的简便设计[J]机电一体化,2005第5期
[8]周立功增强型80C51单片机速成与实战北京航空航天大学出版社2004.5
[9]何立民单片机应用技术选编⑩北京航空航天大学出版社2004.3
[10]何立民单片机应用技术选编⑨北京航空航天大学出版社2004.3
[11]何立民MCS-51系列单片机应用系统设计北京航空航天大学出版社,1995.
[12]李华MCS-51系列单片机实用接口技术[M]北京航空航天大学出版社,1993
[13]周航慈单片机应用程序设计技术[M]北京航空航天大学出版社,1991.
[14]张志良等单片机原理与控制技术[M]机械工业出版社,2001年7月第1版
[15]陆坤电子设计技术1电子科技大学出版社,1997
[16]梁文海单片机AT89C2051构成的智能型频率计[J]现代电子技术,2002
[17]谢自美电子线路设计·实验·测试[M]华中理工大学出版社,2001
[18]吴金戎,沈庆阳8051单片机实践与应用[M]清华大学出版社,2003.
-19-
程序实现代码
;此程序分为四个部分,循环运行。东西方向通行20S(南北方向、东西南北左拐弯停)一部分SETBP1.0;
;东西左拐弯20S(东西南北方向、南北左拐弯停)一部分SETBP1.1;
;南北通行20S(东西方向、东西南北左拐弯停)一部分11111;
;南北左转弯20S(东西南北方向、东西左拐弯停)一部分SETBP1.3。
;共设计12个发光二极管,4个红的,8个绿的。
;P1.0控制东西方向的2个红灯和2个绿灯;
;P1.2控制南北方向的2个红灯和2个绿灯;
;P1.1和P1.3控制东西南北左拐弯的4个绿灯。
FLAG1BIT00H;标记00H位
FLAG2BIT01H
FLAG3BIT02H
ORG0000H;程序执行起始处
LJMPSTART;跳转到标号START执行
ORG001BH;定时器1中断程序入口地址
LJMPDSD
ORG0030H
START:MOVTMOD,#10H;定时器1的选择
MOVTH1,#3CH;给定时器预置数
MOVTL1,#0B0H
SETBEA;打开总中断
SETBET1;定时器1溢出中断允许
SETBTR1;启动定时器
CLRFLAG1;标记位清0
CLRFLAG2
CLRFLAG3
MOVR3,#00H;1秒定时器的初值
FIR:MOVP1,#00H;P1口清0
MOVR2,#00H;给R2初值
SETBP1.0;给P1.0口置1
CLRP1.1;给P1.0口置0
CLRP1.2
CLRP1.3
MOVR0,#20;给R0赋初值
MOVR1,#40
SGL:JBF0,SGL1;F0为1财转移到SGL1
-20-
MOVA,R1
LCALLDY1
MOVA,R0
LCALLDY1
MOVA,R1
LCALLDY1
LCALLDELAY
SJMPDIAOY
SGL1:MOVA,R1
LCALLDY1
MOVA,R0
LCALLDY1
MOVA,R1
LCALLDY1
MOVA,R0
LCALLDY1
LCALLDELAY
DIAOY:
CJNER2,#01H,AA
JBFLAG1,AA
LJMPSEC
AA:CJNER2,#02H,AAA
JBFLAG2,AAA
SETBF0
LJMPTHR
AAA:CJNER2,#03H,BB
JBFLAG3,BB
LJMPFOU
BB:CJNER2,#04H,BBB
CLRF0
CLRFLAG1
CLRFLAG2;调用DELAY延时子程序;跳转到DIAOY循环控制子程序;循环控制子程序;判断不相等刚跳转;FLAG1为1则跳转;跳转到SEC;判断不相等则跳转;F0位清0
-21-
BBB:CJNER0,#00H,SGL
INCR2
LJMPDIAOY
;控制东西左转的绿灯亮
SEC:CLRP1.0
SETBP1.1
CLRP1.2
CLRP1.3
MOVR0,#20
MOVR1,#20
SETBFLAG1
LJMPSGL
;控制南北红、绿灯亮
THR:CLRP1.0
CLRP1.1
SETBP1.2
CLRP1.3
MOVR1,#40
MOVR0,#20
SETBFLAG2
LJMPSGL
控制南北左转的绿亮
FOU:CLRP1.0;R2加1
CLRP1.1
CLRP1.2
SETBP1.3
MOVR1,#20
MOVR0,#20
SETBFLAG3
LJMPSGL
;显示数字处理子程序(算法模块)
DY1:
MOVB,#10;把#10送到专用寄存器BDIVAB;进行除法运算
MOVDPTR,#TAB;把TAB的地址的指针送到DPTR
MOVCA,@A+DPTR;指针相加后单元内容送到寄存器A中LCALLDY;调用发送子程序
MOVA,B;把除法的余数送到A中
-22-
MOVDPTR,#TAB
MOVCA,@A+DPTR
LCALLDY
RET
;延时发送程序
DY:MOVSBUF,A;把A中的数送到缓冲区
MOVR7,#0FH;给R7置数
DJNZR7,$;循环跳转
RET
;延时子程序
DELAY:
MOVR4,#00H
D1:MOVR5,#00H
DJNZR5,$
DJNZR4,D1
RET
;中断子程序
DSD:INCR3
MOVTH1,#3CH
MOVTL1,#0B0H
CJNER3,#20,FH;判断是否够1秒
DECR0
DECR1
MOVR3,#00H;R3清0
FH:RETI;中断返回
TAB:DB0fch,60h,0dah,0f2h,66h,0b6h,0beh
DB0e0h,0feh,0f6h
END
-23-
毕业论文
题目:基于单片机的交通灯设计系别:姓名:
指导教师:
单片机交通灯设计
摘要:
近年来随着科技的飞速发展,一个以微电子技术、计算机技术和通信技术为先导的信息革命正在蓬勃发展。计算机技术作为三者之一,怎样与实际应用更有效的结合并发挥其作用。单片机作为计算机技术的一个分支,正在不断的应用到实际生活中,同时带动传统控制检测的更新。在实时检测和自动控制的应用系统中,单片机往往是作为一个核心部件使用,针对具体应用对象的特点,配以其它器件来加以完善。
十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊。那么靠什么来实现交通的井然秩序呢?靠的是交通信号灯的自动指挥系统,来实现交通的井然有序。交通信号灯控制方式很多。本系统采用美国ATMEL公司生产的单片机AT89S51,以及其它芯片来设计交通灯控制。实现了通过AT89S51芯片的P1口设置红、绿灯点亮的功能,通过AT89S51芯片的RXD、TXD输入、输出设置显示时间。交通灯的点亮采用发光二极管实现,时间的显示采用七段数码管实现。单片机系统采用的直流供电。为了系统稳定可靠,系统内集成了“看门狗”芯片,避免了系统因为死机而停止工作的情况发生。系统实用性强、操作简单、扩展性好。
目录
1引言.......................................................................................................................................12交通管理方案论证...............................................................................................................2
2.1设计任务......................................................................................................................2
2.2方案介绍......................................................................................................................23交通灯系统硬件设计...........................................................................................................4
3.1单片机概述..................................................................................................................4
3.2系统构成......................................................................................................................5
3.3芯片选择与介绍...........................................................................................................6
3.3.1AT89S51芯片..................................................................................................6
3.3.274HC164芯片介绍..........................................................................................8
3.3.374LS04输出信号与信号灯............................................................................9
3.3.4交通灯控制线路图.......................................................................................104交通灯软件设计.................................................................................................................11
4.1程序设计流程图........................................................................................................11
4.2延时的设定.................................................................................................................13
4.2.1计数器初值计算...........................................................................................13
4.2.2相应程序代码...............................................................................................13
4.3程序的主控制循环调用............................................................................................14
4.4对现有程序的扩充....................................................................................................155实验平台..............................................................................................................................16
5.1实验平台.....................................................................................................................16
5.2实验步骤.....................................................................................................................16
5.2.1编写程序代码.................................................................................................16
5.2.2按照系统硬件连线图连接好系统并调试.....................................................16结论.........................................................................................................................................18致谢.........................................................................................................................................18参考文献.................................................................................................................................19程序实现代码.........................................................................................................................20
1引言
今天,红绿灯安装在各个道口上,已经成为疏导交通车辆最常见和最有效的手段。但这一技术在19世纪就已出现了。
1858年,在英国伦敦主要街头安装了以燃煤气为光源的红,蓝两色的机械扳手式信号灯,用以指挥马车通行。这是世界上最早的交通信号灯。1868年,英国机械工程师纳伊特在伦敦威斯敏斯特区的议会大厦前的广场上,安装了世界上最早的煤气红绿灯。它由红绿两块以旋转式方形玻璃提灯组成,红色表示“停止”,绿色表示“注意”。1869年1月2日,煤气灯爆炸,使警察受伤,遂被取消。
1914年,电气启动的红绿灯出现在美国。这种红绿灯由红绿黄三色圆形的投光器组成,安装在纽约市5号大街的一座高塔上。红灯亮表示“停止”,绿灯亮表示“通行”。
1918年,又出现了带控制的红绿灯和红外线红绿灯。带控制的红绿灯,一种是把压力探测器安在地下,当车辆接近时,红灯便变为绿灯;另一种是用扩音器来启动红绿灯,司机遇红灯时按一下喇叭,就使红灯变为绿灯。红外线红绿灯当行人踏上对压力敏感的路面时,它就能察觉到有人要过马路。红外光束能把信号灯的红灯延长一段时间,推迟汽车放行,以免发生交通事故。
信号灯的出现,使交通得以有效管制,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。1968年,联合国《道路交通和道路标志信号协定》对各种信号灯的含义作了规定。绿灯是通行信号,面对绿灯的车辆可以直行,左转弯和右转弯,除非另一种标志禁止某一种转向。左右转弯车辆都必须让合法地正在路口内行驶的车辆和过人行横道的行人优先通行。红灯是禁行信号,面对红灯的车辆必须在交叉路口的停车线后停车。黄灯是警告信号,面对黄灯的车辆不能越过停车线,但车辆已十分接近停车线而不能安全停车时可以进入交叉路口。
随着经济的发展,交通运输中出现了一些传统方法难以解决的问题。道路拥挤现象日趋严重,造成的经济损失越来越大,并一直保持大比例的增长。现在交通系统已不能满足经济发展的需求。由于生活水平的提高,人们对交通运输的安全性及服务水平提出了更高的要求。在交通中管理引入单片机交通灯控制代替交管人员在交叉路口服务,有助于提高交通运输的安全性、提高交通管理的服务质量。并在一定程度上尽可能的降低由道路拥挤造成的经济损失,同时也减小了工作人员的劳动强度。
中国车辆数量不断增加,交通控制在未来的交通管理中起着越来越重要的作用。智能交通灯的管理比重修一条马路无论在经济、交通运行速率上都有很好的效益、更加节约资源。使交管人员有更多的精力投入到管理整个城市交通控制,带来更大的经济和社会效益,为创造美好的城市交通形象发挥更多的作用。
-1-
2交通管理方案论证
2.1设计任务
东西(A)、南北(B)两干道交于一个十字路口,各干道有一组红、左转绿、绿三个指示灯,指挥车辆和行人安全通行。红灯亮禁止通行,绿灯亮允许通行。红灯的设计时间为40秒,绿灯及左转绿灯各为20秒。设A道和B道的车流量相同。
2.2方案介绍
把设计任务细化为四个状态,其对应状态:如图1
A道为40秒红灯,B道绿灯20秒
A道为20秒红灯,B道左转20秒绿灯
A道为20秒绿灯,B道为40秒红灯
A道左转20秒绿灯,B道为20秒红灯
图1状态转换图
整个交通灯控制由四个状态组成,可以用程序设计实现,也可用时序逻辑实现.以下方案就是分别用了这两种方法。
方案1设计思想:
采用分模块设计的思想,程序设计实现的基本思想是一个计数器,选择一个单片机,其内部为一个计数,是十六进制计数器,模块化后,通过设置或程序清除来实现状态的转换,由于每一个模块的计数多不是相同,这里的各模块是以预置数和计数器计-2-
数共同来实现的,所以要考虑增加一个置数模块,其主要功能细分为,对不同的状态输入要产生相应状态的下一个状态的预置数,如图中A道和B道,分别为次干道的置数选择和主干道的置数选择。以主干道为例,简述其设计思想。如前分析,已经确定该系统有四个状态,而置数子模块可定要将下一状态的预置数准备好,所以很容易得到主干道的置数表如:表1状态
00
01
10
11主干道预置数40202020(左转)
表1置数表次干道预置数2020(左转)4020
由该表,就可以通过程序循环的方法设计该模块,主要思想是通过数据判断指令、跳转指令实现,由主控制器计时和中断产生的四个状态去译码,从而得到不同的输出,即预置数,由上分析可用一个计数器和跳转指令去完成的预置数。
而红绿灯的显示也是一样,由状态分析可以得出红绿灯的变化表如:表2状态
00
01
10
11主干道灯显示红灯红灯绿灯左转绿灯
表2红绿灯变化表次干道灯显示绿灯左转绿灯红灯红灯
通过这张表就可以用组合电路实现该功能了,可以用数据选择器的思想,在本系统中,直接通过门电路的译码,接下来就是计数模块了,其主要的功能细分为,要从预置数开始递减计数,一个状态结束,通过判断,通知主控制模块,使之进入下一模块。还有一个必须考虑到的就是,预置数必须在下一个状态来之前准备好,而红绿灯的状态变化,必须和计数状态同步,于是引起预置数变化的程序要超前于系统本身的状态变化,所以,系统中的两个状态转换时,在上一状态结束时设置预置数,而控制红绿灯的是随着系统本身状态的变化而变化,体现在本子电路中就是有两组电路去判断符合的状态。方案2设计思想:
状态转换表如:表3状态
00(15S)
01(05S)
10(15S)
11(05S)主干道灯显示红灯红灯绿灯黄灯次干道灯显示绿灯黄灯红灯红灯
-3-
表3状态转换表
本方案分三步:
(1)要建立三路信号灯的控制系统,本设计采用7408芯片通过组合逻辑控制三路灯的显示关系。
(2)建立显示控制系统,本设计采用74190芯片倒计时控制,每个方向用两片相连实现,另外用74153芯片,因为分析中设置的时间末位均为5,所以只要用一片74153对高位置位,将低位的初值预置锁定为5,而高位则根据需要由反馈部分提供预置值。
(3)建立反馈和细节连接部分,本部分主要解决显示和灯控的同步问题本系统采用倒计时系统减为0,如当系统减为0时通过两个D触发器得到两个变量,即为开头分析中的状态,通过它的变化得到不同的逻辑关系,驱动74153控制哪组灯亮(对应关系如表所示),另外他还要同步反馈到显示系统的置数环节。
注意:本实验中若采用更复杂的四片74190控制主干道的两组灯,再用八片74153分别对74190置数可实现任意数值的交通灯系统。另外对7408片子的控制红灯的端口用一个与门将一端再接一个频率一定的方波,使一边为黄灯时,另一边的红灯在闪烁。方案比较:
方案1(以下称1)用了模块设计,而方案2(以下称2)采用的是一般设计,相比之下1有较强的可读性和较强的可修改性,而2则在设计上显得较简单,设计纯朴,便于测试,它的优势则在于提供了一条较为便捷的解决方案。2首先将许多逻辑关系简化到极点,而后将其一起集成用较少的芯片去完成所需功能。
我们从中可以得出的是,我们最终的设计应该尽量使用模块化设计。对工程设计人员来说,将来的产品无论从修改还是升级考虑对有好处,但另外我们又需将设计简单化,因此我觉得在设计初期尽可能的简单化设计,而一旦设计的各项测试通过了,在有可能的条件下将设计模块化,所以本设计以第一方案为主进行。
3交通灯系统硬件设计
3.1单片机概述
单片机是由运算器、控制器、存储器、输入设备以及输出设备共五个基本部分组成的。单片机是把包括运算器、控制器、少量的存储器、最基本的输入输出口电路、串行口电路、中断和定时电路等都集成在一个尺寸有限的芯片上。
通常,单片机由单个集成电路芯片构成,内部包含有计算机的基本功能部件:中央处理器、存储器和I/O接口电路等。因此,单片机只需要和适当的软件及外部设备相结合,便可成为一个单片机控制系统。
单片机经过1、2、3、3代的发展,目前单片机正朝着高性能和多品种方向发展,它们的CPU功能在增强,内部资源在增多,引脚的多功能化,以及低电压、低功耗。
可以说,二十世纪跨越了三个“电”的时代,即电气时代、电子时代和现已进入的电脑时代。不过,这种电脑,通常是指个人计算机,简称PC机。它由主机、键盘、显示器等组成。还有一类计算机,大多数人却不怎么熟悉。这种计算机就是把智能赋予各种机械的单片机。顾名思义,这种计算机的最小系统只用了一片集成电路,即可进行简单运算和控制。因为它体积小,通常都藏在被控机械的“肚子”里。它在整个装置中,起着有如人类头脑的作用,它出了毛病,整个装置就瘫痪了。现在,这种单片机的使用领域已十分广-4-
泛,如智能仪表、实时工控、通讯设备、导航系统、家用电器等。各种产品一旦用上了单片机,就能起到使产品升级换代的功效,常在产品名称前冠以形容词——“智能型”,如智能型洗衣机等。现在有些工厂的技术人员或其它业余电子开发者搞出来的某些产品,不是电路太复杂,就是功能太简单且极易被仿制。究其原因,可能就卡在产品未使用单片机或其它可编程逻辑器件上。
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。更不用说自动控制领域的机器人、智能仪表、医疗器械了。它主要是作为控制部分的核心部件。因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。
3.2系统构成
电路板一块,AT89S51单片机一片,74HC164芯片八片,七段数码管八个。74LS04反向器一片,发光二极管13个(8个绿的,4个红的用于交通控制,1个用于标识电源),7805三端稳压电源一个,一个按键,一条数据下载线。
系统结构框图如:图2
键盘
控制AT89S51单片机
系
统74HC164LCD显示与LED倒计时接
口
电
路
图2系统结构框图模块
系统各部分工作:
(1)程序设置初始时间,通过AT89S51单片机内部相应寄存器来实现。
(2)由AT89S51单片机的定时器每秒钟通过P3.0口向74HC164的数据端口送信息,由74HC164的输出口显示红、绿、黄灯的点亮时间情况;由AT89S51的P1.0、P1.1、P1.2、P1.3口显示每个灯的点亮情况。
(3)AT89S51通过程序设置各个信号灯的点亮时间,通过程序设置左转绿、绿、红时间依次为20秒、20秒、40秒循环,由AT89S51的P3口向74HC164的数据口输出。
(4)通过AT89S51单片机的P3口来控制系统是工作。
(5)74HC164的A、B口用于串行输出时间位,经过串并转换送到七段数码管的八的引脚。而P1口用于输出控制信号.而通过74LS04反向器实现控制各个灯的情况.它采用5V的直流电来驱动二极管。-5-
(6)AT89S51本身集成了看门狗指令,当系统出现异常看门狗将发出溢出中断。通过专用端口输出,引起RESET复位信号复位系统。
3.3芯片选择与介绍
3.3.1AT89S51芯片
选用的AT89S51与同系列的AT89C51在功能上有明显的提高,最突出是的可以实现在线的编程。用于实现系统的总的控制。其主要功能列举如下:
1、为一般控制应用的8位单片机
2、晶片内部具有时钟振荡器(传统最高工作频率可至33MHz)
3、内部程式存储器(ROM)为4KB
4、内部数据存储器(RAM)为128B
5、外部程序存储器可扩充至64KB
6、外部数据存储器可扩充至64KB
7、32条双向输入输出线,且每条均可以单独做I/O的控制
8、5个中断向量源
9、2组独立的16位定时器
10、1个全双工串行通信端口
11、8751及8752单芯片具有数据保密的功能
12、单芯片提供位逻辑运算指令
AT89S51各引脚功能介绍:如图3
-6-
图3AT89S51
VCC:ATAT89S51电源正端输入,接+5V。VSS:电源地端。
XTAL1:单芯片系统时钟的反向放大器输入端。
XTAL2:系统时钟的反向放大器输出端,一般在设计上只要在XTAL1和XTAL2上接上一只石英振荡晶体系统就可以动作了,此外可以在两个引脚与地之间加入一个20PF的小电容,可以使系统更稳定,避免噪声干扰而死机。
RESET:AT89S51的重置引脚,高电平动作,当要对晶片重置时,只要对此引脚电平提升至高电平并保持两个机器周期以上的时间,AT89S51便能完成系统重置的各项动作,使得内部特殊功能寄存器之内容均被设成已知状态,并且至地址0000H处开始读入程序代码而执行程序。
EA/Vpp:"EA"为英文"ExternalAccess"的缩写,表示存取外部程序代码之意,低电平动作,也就是说当此引脚接低电平后,系统会取用外部的程序代码(存于外部EPROM中)来执行程序。因此在8031及8032中,EA引脚必须接低电平,因为其内部无程序存储器空间。如果是使用8751内部程序空间时,此引脚要接成高电平。此外,在将程序代码烧录至8751内部EPROM时,可以利用此引脚来输入21V的烧录高压(Vpp)。
ALE/PROG:ALE是英文"AddressLatchEnable"的缩写,表示地址锁存器启用信号。ATAT89S51可以利用这个引脚来触发外部的8位锁存器(如74LS373),将端口0的地址总线(A0~A7)锁进锁存器中,因为ATAT89S51是以多工的方式送出地址及数据。平时在程序执行时ALE引脚的输出频率约是系统工作频率的1/6,因此可以用来驱动其他周边晶片的时基输入。此外在烧录8751程序代码时,此引脚会被当成程序规划的特殊功能来使用。PSEN:此为"ProgramStoreEnable"的缩写,其意为程序储存启用,当8051被设成为读取外部程序代码工作模式时(EA=0),会送出此信号以便取得程序代码,通常这支脚是接到EPROM的OE脚。ATAT89S51可以利用PSEN及RD引脚分别启用存在外部的RAM与EPROM,使得数据存储器与程序存储器可以合并在一起而共用64K
的定址范围。
-7-
PORT0(P0.0~P0.7):端口0是一个8位宽的开路电极(OpenDrain)双向输出入端口,共有8个位,P0.0表示位0,P0.1表示位1,依此类推。其他三个I/O端口(P1、P2、P3)则不具有此电路组态,而是内部有一提升电路,P0在当作I/O用时可以推动8个LS的TTL负载。如果当EA引脚为低电平时(即取用外部程序代码或数据存储器),P0就以多工方式提供地址总线(A0~A7)及数据总线(D0~D7)。设计者必须外加一个锁存器将端口0送出的地址锁住成为A0~A7,再配合端口2所送出的A8~A15合成一组完整的16位地址总线,而定位地址到64K的外部存储器空间。PORT2(P2.0~P2.7):端口2是具有内部提升电路的双向I/O端口,每一个引脚可以推动4个LS的TTL负载,若将端口2的输出设为高电平时,此端口便能当成输入端口来使用。P2除了当作一般I/O端口使用外,若是在ATAT89S51扩充外接程序存储器或数据存储器时,也提供地址总线的高字节A8~A15,这个时候P2便不能当作I/O来使用了。PORT1(P1.0~P1.7):端口1也是具有内部提升电路的双向I/O端口,其输出缓冲器可以推动4个LSTTL负载,同样地,若将端口1的输出设为高电平,便是由此端口来输入数据。如果是使用8052或是8032的话,P1.0又当作定时器2的外部脉冲输入脚,而P1.1可以有T2EX功能,可以做外部中断输入的触发引脚。PORT3(P3.0~P3.7):端口3也具有内部提升电路的双向I/O端口,其输出缓冲器可以推动4个TTL负载,同时还多工具有其他的额外特殊功能,包括串行通信、外部中断控制、计时计数控制及外部数据存储器内容的读取或写入控制等功能。其引脚分配如下:
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,外部数据存储器的读取信号。3.3.2
74HC164芯片介绍
74HC164为串行输入、并行输出移位寄存器,74HC164为单向总线驱动器。
在串行口为方式0状态,即工作在移位寄存器方式,波特率为振荡频率的十二分之一。器件执行任何一条将SBUF作为目的寄存器的命令时,数据便开始从RXD端发送。在写信号有效时,相隔一个机器周期后发送控制端SEND有效,即允许RXD发送数据,同时,允许从TXD端输出移位脉冲。第一帧(8位)数据发送完毕时,各控制信号均恢复原状态,只有TI保持高电平,呈中断申请状态。第一个74HC164把第一帧数据并行输出,LED1显示该数据。然后,用软件将TI清0,发送第二帧数据。第二帧数据发送完毕,LED1显示第二帧数据,第一帧数据串行输入给第二个74HC164,LED2显示第一帧数据。依此类推,直到把数据区内所有数据发送出去。应该注意,数据全部发送完后,第一帧数据在最后一个LED显示。由于TXD端最多可以驱动8个TTL门。
注意:当LED显示器超过8个时,我们采用74HC244芯片驱动。每个74HC244有8路驱动,每一路可驱动8个LED,即每增加一个74HC244,可增加64个LED驱动。七段数码管,用于显示0—9的数字。
-8-
3.3.374LS04输出信号与信号灯
要使行人能看见信号灯的情况,必须把P1口输出的信号进行放大,这里我们用74LS04反向器,当极性为高电平时晶闸管导通,该支路指示灯亮;当极性为低电平时关断,该支路指示灯灭。
LED灯的显示原理:通过同名管脚上所加电平的高低来控制发光二极管是否点亮。七段数码管的显示及与74HC164的连接显示不同的数字如SP,g,f,e,d,c,b,a管角上加上0FEH所以SP上为0伏,不亮其余为TTL高电平,全亮则显示为8。
数字0-9与16进制的转换驱动代码表:如表5显示数值0123456789
abcdefgdop[***********][***********][***********][***********]11110110
表5
驱动代码表
驱动代码(16进制)0FCH60H0DAH0F2H66H0B6H0BEH0E0H0FEH0F6H
74LS04(6反向器)主要对信号起了反向作用。其它器件的功能如:
7805的功能,既提供稳定的+5V电压。
-9-
3.3.4
交通灯控制线路图
-10-
4交通灯软件设计
4.1程序设计流程图
(1)程序设计总框图:如图4
开始
初始化
等待键盘事件
键盘事件显示程序处理处理
图4程序设计框图
(2)程序详细流程图:如图5
-11-
开始
设置定时器开中断
赋初值
F0=1
R0,R1分别送A。调用计时程序并调用延时
R1,R0分别送A。调用计时程序并调用延时
R2=01Flag0=1
R2=02
R2=03
Flag1=1
跳到SEC
跳到THR,F0=1
Flag1=1
跳到FOU
R2=04
标志位清0,跳到FIR
R0=00
R2加1,跳到DIAOY
图5程序详细流程图
流程图说明:
图中定时器在每50ms中断一下,设置为循环20次(此时为1秒),每1秒以后,R0,R1自动减1。
程序中的判断在相等情况下从右边出,不相同的情况往下走。
-12-
4.2延时的设定
延时方法可以有两种一种是利用AT89S51内部定时器的溢出中断来确定1秒的时间,另一种是采用软件延时的方法。4.2.1
计数器初值计算
定时器工作时必须给计数器送计数器初值,这个值是送到TH和TL中的。他是以加法记数的,并能从全1到全0时自动产生溢出中断请求。因此,我们可以把计数器记满为零所需的计数值设定为C和计数初值设定为TC可得到如下计算通式:
TC=M-C
式中,M为计数器模值,该值和计数器工作方式有关。在方式0时M为213;在方式1时M的值为216;在方式2和3为28;算法公式:
T=(M-TC)T计数或TC=M-T/T计数
T计数是单片机时钟周期TCLK的12倍;TC为定时初值如单片机的主脉冲频率为TCLK12MHZ,经过12分频方式0TMAX=213×1微秒=8.192毫秒方式1TMAX=216×1微秒=65.536毫秒
显然1秒钟已经超过了计数器的最大定时间,所以我们只有采用定时器和软件相结合的办法才能解决这个问题.实现1秒的方法:
我们采用在主程序中设定一个初值为20的软件计数器和使T1定时50毫秒。这样每当T1到50毫秒时CPU就响应它的溢出中断请求,进入他的中断服务子程序。在中断服务子程序中,CPU先使软件计数器减1,然后判断它是否为零。为0表示1秒已到可以返回到输出时间显示程序。4.2.2
相应程序代码
(1)定时器的设置
定时器需定时50毫秒,故T1工作于方式1。
初值计算:TC=M-T/T计数=216-50ms/1us=15536=3CBOH
START:MOVTMOD,#10H;令TO为定时器方式1
MOVTH0,#3CH;装入定时器初值MOVTL0,#0BOHSETBEA;打开总中断SETBET1;开T1中断SETBER;启动T1计数器CLRFLAG1CLRFLAG2CLRFLAG3MOVR3,#20H;软件计数器赋初值
(2)相应中断服务子程序
ORG001BH
-13-
LJMPDSDORG0030H
DSD:INCR3
MOVTH0,#3CH;重装入定时器初值MOVTL0,#BOHCJNER3,#20,FHDECR0DECR1
MOVR3,#00H
FH:RETI程序的软件延时:
AT89S51的工作频率为0—33MHZ,我们选用的AT89S51单片机的工作频率为12MHZ。机器周期与主频有关,机器周期是主频的12倍,所以一个机器周期的时间为12*(1/12M)=1us。我们可以知道具体每条指令的周期数,这样我们就可以通过指令的执行条数来确定1秒的时间。
具体的延时程序分析:DELAY:MOVR4,#08H延时1秒主程序DE2:LCALLDELAY1
DJNZR4,DE2RET
DELAY1:MOVR4,#00H;延时125us子程序D1:MOVR5,#00HD2:DJNER5,DL2
DJNER4,D1RET
DELAY1为一个双重循坏循环次数为256*256=65536所以延时时间=65536*2=131072us约为125us
DELAYR4设置的初值为8主延时程序循环8次,所以125us*8=1秒由于单片机的运行速度很快其他的指令执行时间可以忽略不计。
4.3程序的主控制循环调用
用来实现四个状态之间的转换,代码如下:DIAOY:
CJNER2,#01H,AAJBFLAG1,AALJMPSEC
AA:CJNER2,#02H,AAA
JBFLAG2,AAASETBF0LJMPTHR
AAA:CJNER2,#03H,BB
-14-
;循环控制子程序;判断不相等刚跳转;FLAG1为1则跳转;跳转到SEC
JBFLAG3,BBLJMPFOU
BB:CJNER2,#04H,BBB
CLRF0CLRFLAG1CLRFLAG2CLRFLAG3LJMPFIR
BBB:CJNER0,#00H,SGL
INCR2
LJMPDIAOY
;判断不相等则跳转;F0位清0
;R2加1
4.4对现有程序的扩充
当由于紧急需要对道路进行长时间通行时,就要保持该道路更长时间的通行。下面以东西方向为例进行紧急通行为例。
紧急通行是平常通行的特例,只要将相应的代码去掉就可以实现延长本车道的通行时间。设置通行时间为20秒。核心代码如下:FIR:MOVP1,#00H
SETBP1.0CLRP1.1CLRP1.2CLRP1.3MOVR0,#20MOVR1,#20SGL:;与原程序类同
……
CJNER0,#00H,SGL
LJMPFIR
要实现东西方向的左转通行时,只需要修改FIR中的代码就可以了。时间显示只要修改R0和R1就可以了。要实现南北方及左转,只要把SGL换成SGL1、把FIR中代码进行相应的修改就可以了。由于时间紧张,程序有不完善的地方。
原程序见程序实现代码。
-15-
5实验平台
5.1实验平台
我们采用的是KeilSoftware生产的Cx51编译器。运行在WindowsXP操作平台下。开启计算机进入KeilC51编译器介面。如图
6
图6KeilC51编译器介面
5.2实验步骤
5.2.1编写程序代码
程序代码分为3个模块:中断模块,循环模块,算法模块。(见程序实现代码)5.2.2按照系统硬件连线图连接好系统并调试1.调试程序
⑴打开Keil软件,新建工程;
-16-
⑵选择芯片;
⑶新建文档,把编写好代码写入文档并保存了ASM文件;
⑷把保存的文档加载到SourceGroup;
⑸编译程序;
⑹设置转换成16进制;
⑺运行程序的结果;
2.把编译好的16进制文件(jtd.hex)输入单片机AT89S51仿真器和对其进行初始化。
3.给实验板进行通电,观察运行结果,不一致则跳到第一步进行反复调试,直到与预定目的一致。
以下是在程序调试过程中出现在情况:通电以后,把程序装好,数码管是的数字不变,按复位键后重新开始还是如此。经过和同组人的共同分析后,发现是中断系统在计时到了1秒以后,赋的初值R0,R1没有减1,修改如下:
DSD:INCR3
MOVTH1,#3CH
MOVTL1,#0B0H
CJNER3,#20,FH;判断是否够1秒
DECR0
DECR1
MOVR3,#00H;R3清0
FH:RETI;中断返回
通电以后,东西、南北方向的时间均递减,20秒以后,东西方向的20秒用完,变成东西左转、南北各20秒,此后,时间显示和红绿灯不再变化,一直保持这一状态。
经过老师和同组人的共同努力,终于找到原因,问题出在循环控制过程中,当经过第一次20秒判断后,寄存器R2加1,当再次运行到循环控制处时,判断R2与#01H相同,程序跳到SEC处执行,此后一直如此。解决方法如下:
设置3个标记位:
FLAG1BIT00H;标记00H位
FLAG2BIT01H
FLAG3BIT02H
在循环控制中加入判断如:
DIAOY:CJNER2,#01H,AA;判断不相等刚跳转JBFLAG1,AA;FLAG1为1则跳转
LJMPSEC;跳到SEC
在跳到SEC后,在运行到该程序后加给FLAG1置数,程序如下:
SEC:CLRP1.0
SETBP1.1
CLRP1.2
CLRP1.3
MOVR0,#20
MOVR1,#20
SETBFLAG1
LJMPSGL
其它几部分与之相同的处理。
-17-
结论
本系统就是利用了AT89S51芯片的I/O引脚。系统采用美国ATMEL公司生产的单片机AT89S51,以及其它芯片(如:74HC164、74LS04六位反向器、L7805三端稳压电源)来设计交通灯控制器,实现了红灯亮40秒,绿灯和左转绿灯各亮20秒。并通过AT89S51来控制74LS04芯片的输出口设置红、绿灯燃亮的功能和控制74HC164来实现在七段数码管上的时间显示;为了系统稳定可靠系统内集成了“看门狗”芯片,避免了系统因为死机而停止工作的情况发生。系统设计简便、实用性强、操作简单、程序设计简便。
系统不足:时间设定中没有黄灯的等待闪烁时间,以及自动根据车流改变红绿灯时间,此外,还没有充分考虑的把现代管理、人工智能运用到交通的控制中,来计算交通控制点之间的距离,来更合理的安排红、绿灯的持续时间,使城市的交通管理更加人性化。使人们远离目前的交通拥塞的现象。
致谢
通过本次毕业设计,我在指导老师赵润林副教授的精心指导和严格要求下,获得了丰富的理论知识,极大地提高了实践能力,并对当前电子领域的研究状况和发展方向有了一定的了解,单片机领域这对我今后进一步学习计算机方面的知识有极大的帮助。另外,此次毕业设计还获得了计科系各位领导和老师的大力支持。在此,我忠心感谢单片机组的其它同学以及计科系各位老师的指导和支持。在未来的工作和学习中,我将以更好的成绩来回报各位领导、老师和同学。
-18-
参考文献
[1]胡汉才单片机原理及其接口技术[M]清华大学出版,1996
[2]蔡美琴MCS-51系列单片机系统及其应用高等教育出版社2004.2
[3]付家才单片机控制工程实践技术[M]化学工业出版社,2004.5
[4]潘新民微型计算机控制技术[M]人民邮电出版社,1999.9
[5]余锡存单片机原理及接口技术[M]西安电子科技大学出版社,2000.7
[6]雷丽文等.微机原理与接口技术[M]电子工业出版社,1997.2
[7]蒋万君在论循环时序电路的简便设计[J]机电一体化,2005第5期
[8]周立功增强型80C51单片机速成与实战北京航空航天大学出版社2004.5
[9]何立民单片机应用技术选编⑩北京航空航天大学出版社2004.3
[10]何立民单片机应用技术选编⑨北京航空航天大学出版社2004.3
[11]何立民MCS-51系列单片机应用系统设计北京航空航天大学出版社,1995.
[12]李华MCS-51系列单片机实用接口技术[M]北京航空航天大学出版社,1993
[13]周航慈单片机应用程序设计技术[M]北京航空航天大学出版社,1991.
[14]张志良等单片机原理与控制技术[M]机械工业出版社,2001年7月第1版
[15]陆坤电子设计技术1电子科技大学出版社,1997
[16]梁文海单片机AT89C2051构成的智能型频率计[J]现代电子技术,2002
[17]谢自美电子线路设计·实验·测试[M]华中理工大学出版社,2001
[18]吴金戎,沈庆阳8051单片机实践与应用[M]清华大学出版社,2003.
-19-
程序实现代码
;此程序分为四个部分,循环运行。东西方向通行20S(南北方向、东西南北左拐弯停)一部分SETBP1.0;
;东西左拐弯20S(东西南北方向、南北左拐弯停)一部分SETBP1.1;
;南北通行20S(东西方向、东西南北左拐弯停)一部分11111;
;南北左转弯20S(东西南北方向、东西左拐弯停)一部分SETBP1.3。
;共设计12个发光二极管,4个红的,8个绿的。
;P1.0控制东西方向的2个红灯和2个绿灯;
;P1.2控制南北方向的2个红灯和2个绿灯;
;P1.1和P1.3控制东西南北左拐弯的4个绿灯。
FLAG1BIT00H;标记00H位
FLAG2BIT01H
FLAG3BIT02H
ORG0000H;程序执行起始处
LJMPSTART;跳转到标号START执行
ORG001BH;定时器1中断程序入口地址
LJMPDSD
ORG0030H
START:MOVTMOD,#10H;定时器1的选择
MOVTH1,#3CH;给定时器预置数
MOVTL1,#0B0H
SETBEA;打开总中断
SETBET1;定时器1溢出中断允许
SETBTR1;启动定时器
CLRFLAG1;标记位清0
CLRFLAG2
CLRFLAG3
MOVR3,#00H;1秒定时器的初值
FIR:MOVP1,#00H;P1口清0
MOVR2,#00H;给R2初值
SETBP1.0;给P1.0口置1
CLRP1.1;给P1.0口置0
CLRP1.2
CLRP1.3
MOVR0,#20;给R0赋初值
MOVR1,#40
SGL:JBF0,SGL1;F0为1财转移到SGL1
-20-
MOVA,R1
LCALLDY1
MOVA,R0
LCALLDY1
MOVA,R1
LCALLDY1
LCALLDELAY
SJMPDIAOY
SGL1:MOVA,R1
LCALLDY1
MOVA,R0
LCALLDY1
MOVA,R1
LCALLDY1
MOVA,R0
LCALLDY1
LCALLDELAY
DIAOY:
CJNER2,#01H,AA
JBFLAG1,AA
LJMPSEC
AA:CJNER2,#02H,AAA
JBFLAG2,AAA
SETBF0
LJMPTHR
AAA:CJNER2,#03H,BB
JBFLAG3,BB
LJMPFOU
BB:CJNER2,#04H,BBB
CLRF0
CLRFLAG1
CLRFLAG2;调用DELAY延时子程序;跳转到DIAOY循环控制子程序;循环控制子程序;判断不相等刚跳转;FLAG1为1则跳转;跳转到SEC;判断不相等则跳转;F0位清0
-21-
BBB:CJNER0,#00H,SGL
INCR2
LJMPDIAOY
;控制东西左转的绿灯亮
SEC:CLRP1.0
SETBP1.1
CLRP1.2
CLRP1.3
MOVR0,#20
MOVR1,#20
SETBFLAG1
LJMPSGL
;控制南北红、绿灯亮
THR:CLRP1.0
CLRP1.1
SETBP1.2
CLRP1.3
MOVR1,#40
MOVR0,#20
SETBFLAG2
LJMPSGL
控制南北左转的绿亮
FOU:CLRP1.0;R2加1
CLRP1.1
CLRP1.2
SETBP1.3
MOVR1,#20
MOVR0,#20
SETBFLAG3
LJMPSGL
;显示数字处理子程序(算法模块)
DY1:
MOVB,#10;把#10送到专用寄存器BDIVAB;进行除法运算
MOVDPTR,#TAB;把TAB的地址的指针送到DPTR
MOVCA,@A+DPTR;指针相加后单元内容送到寄存器A中LCALLDY;调用发送子程序
MOVA,B;把除法的余数送到A中
-22-
MOVDPTR,#TAB
MOVCA,@A+DPTR
LCALLDY
RET
;延时发送程序
DY:MOVSBUF,A;把A中的数送到缓冲区
MOVR7,#0FH;给R7置数
DJNZR7,$;循环跳转
RET
;延时子程序
DELAY:
MOVR4,#00H
D1:MOVR5,#00H
DJNZR5,$
DJNZR4,D1
RET
;中断子程序
DSD:INCR3
MOVTH1,#3CH
MOVTL1,#0B0H
CJNER3,#20,FH;判断是否够1秒
DECR0
DECR1
MOVR3,#00H;R3清0
FH:RETI;中断返回
TAB:DB0fch,60h,0dah,0f2h,66h,0b6h,0beh
DB0e0h,0feh,0f6h
END
-23-