
毕业设计(论文)
论文题目:多功能交通灯控制系统
系 别: 电子工程系
专 业: 电子信息工程技术
班 级:
学 号:
学生姓名:
指导教师:
1 前言..................................................................1
交通灯的历史和现状..................................................1
单片机相关介绍......................................................1
课题意义............................................................2
2 课题内容..............................................................3
3 方案比较、设计和论证..................................................3
供电方案............................................................3
显示界面方案........................................................4
输入方案............................................................4
4 系统设计..............................................................4
交通灯规则方案......................................................4
相位的概念........................................................4
交通灯状态........................................................5
高低峰分时管理机制................................................8
软件编程............................................................9
硬件设计部分.......................................................11
单片机系统.......................................................11
交通灯演示系统...................................................13
双电源供电电路...................................................14
中断系统.........................................................15
5 系统调试.............................................................15
断电调试...........................................................15
通电调试...........................................................15
基本要求部分的测试与分析...........................................16
6 仿真调试问题与解决方案...............................................16
7 硬件调试问题与解决方案...............................................17
8 组织分工.............................................................18
9 结论.................................................................19
致谢...................................................................20
附录 ..................................................................21参 考 文 献............................................................32
摘 要
交通灯是现代交通非常重要的一个组成部分,一套好的交通灯系统往往对提升城市交通运输效率,降低事故发生率有至关重要的影响。
本系统由单片机系统、双电源供电系统、交通灯演示系统、中断系统组成。
选用单片机作为此次设计的控制系统主要是考虑到单片机的通用性和廉价性。通用性是指单片机的电路以及编程语言相对比其他控制模块来说更加简单和通用,这个对于往后功能的添加以及系统的维护来说更加简便和易行。廉价性是单片机相对于其他的控制模块来说成本更低,一块成熟的12C5A60S52的成本不过10元,加上其他的外围电路成本也不超过100元,无论是开发成本和维护成本都能够得到很好的控制。本设计选用12C5A60S52主要也就是基于上述的两个原因。
本交通灯系统选用了LED灯和双位数码管来模拟显示的交通灯切换状态。双电源供电系统采用的是主电源和后备电源供电的方案。双电源供电方案主要是为了应对市电突然掉电或者出现故障的情况,对于持续的保持整体系统的正常工作具有重要意义,其原理主要是利用二极管单向导通性来实现双电源瞬时的切换。中断系统所实现的功能是在有特定需要的情况下实现对交通灯状态的控制。这些状态包括全红灯和高低峰即时控制。
本系统除了实现最基本的交通灯功能以外,还可实现高低峰分时段控制方案以应对不同时段的不同交通状况,城市的交通早晚时段的流量往往能够达到最大,分时控制对于提高城市交通效率有非常重要的作用。
关键词: 单片机 12C5A60S52 交通灯 分时控制 双电源
1. 前言
交通灯的历史和现状
当今,红绿灯安装在各个道口上,已经成为疏导交通车辆最常见和最有效的手段。但这一技术在19世纪就已出现了。1858年,在英国伦敦主要街头安装了以燃煤气为光源的红,蓝两色的机械扳手式信号灯,用以指挥马车通行。这是世界上最早的交通信号灯。1868年,英国机械工程师纳伊特在伦敦威斯敏斯特区的议会大厦前的广场上,安装了世界上最早的煤气红绿灯。它由红绿两色旋转式方形玻璃提灯组成,红色表示“停止”,绿色表示“注意”。1869年1月2日,煤气灯爆炸,使受伤,遂被取消。
电气启动的红绿灯出现在美国,这种红绿灯由红绿黄三色圆形的投光器组成,1914年始安装于纽约市5号大街的一座高塔上。红灯亮表示“停止”,绿灯亮表示“通行”。
1918年,又出现了带控制的红绿灯和红外线红绿灯。带控制的红绿灯,一种是把压力探测器安在地下,车辆一接近红灯便变为绿灯;另一种是用扩音器来启动红绿灯,司机遇红灯时按一下嗽叭,就使红灯变为绿灯。红外线红绿灯当行人踏上对压力敏感的路面时,它就能察觉到有人要过马路。红外光束能把信号灯的红灯延长一段时间,推迟汽车放行,以免发生交通事故。
信号灯的出现,使交通得以有效管制,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。1968年,联合国《道路交通和道路标志信号协定》对各种信号灯的含义作了规定。绿灯是通行信号,面对绿灯的车辆可以直行,左转弯和右转弯,除非另一种标志禁止某一种转向。左右转弯车辆都必须让合法地正在路口内行驶的车辆和过人行横道的行人优先通行。红灯是禁行信号,面对红灯的车辆必须在交叉路口的停车线后停车。黄灯是警告信号,面对黄灯的车辆不能越过停车线,但车辆已十分接近停车线而不能安全停车时可以进入交叉路口。本设计的单片机控制交通灯就是基于信号灯。
单片机相关介绍
单片机微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。单片机微型计算机简称单片机,特别适用于控制领域,故又称为微控制器。
通常,单片机由单块集成电路芯片构成,内部包含有计算机的基本功能部件:处理器、存储器和I/O接口电路等。因此,单片机只需要和适当的软件及外部设备相结合,便可成为一个单片机控制系统。
单片机经过1、2、3代的发展,目前单片机正朝着高性能和多品种方向发展,它们的CPU功能在增强,内部资源在增多,引脚的多功能化,以及低电压低功耗。
本设计选用了市面上较为常见的12C5A60S52单片机,12C5A60S52 是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。使用高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在线系统可编程Flash,使得12C5A60S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
12C5A60S52的管脚图如图1所示。
图1 12C5A60S52管脚图
课题意义
使用单片机作为本设计的控制方案主要是考虑到其低廉的成本和易学易用的特性,相较于类似ARM这类性能更为强大的控制方案,单片机的性能并非其优势所在。
但是如何充分利用单片机已有的功能进行最大化的开发才是本设计的重点。
总的来说,本设计意义有如下4个方面:
(a). 对单片机这一成熟的解决方案在交通灯领域的应用进行研究和开发;
(b). 探究分时管理系统在交通灯系统中的应用,对分时管理系统的C语言算法进行开发。举一反三,延伸到其他类似领域的应用。
(c). 探究全新的交通灯管理系统;
(d). 建立不间断电源在实际应用领域的具体模型和电路结构。
2 课题内容
本课题的主要内容包括如下几个方面:
(a). 设计交通灯状态的管理方案;
(b). 设计单片机最小系统和周边电路;
(c). 设计交通灯系统、不间断供电系统以及中断系统的电路结构;
(d). 设计整个系统的电路分布和接线;
(e). 使用C语言编写整个系统运行所需要的程序,重点是分时管理系统和紧急中断系统的程序。
3 方案比较、设计和论证
供电方案
为使模块稳定工作,须有可靠电源。本设计考虑了两种电源方案:
方案一:采用USB给单片机控制模块提供电源。本方案的优点是系统简明扼要,节约成本;缺点是输出功率不高。
方案二:采用的稳压电源。此方案的优点是稳定可靠,且有各种成熟电路可供选用;缺点是可能影响电路电平,成本高。
考虑到实际情况,本设计采用了第二套方案,同时在考虑到突发断电的情况,还增加了一个后备电源,在打开后备电源的时候,如果主电源断电,后备电源瞬间接通继续供电,这里会利用到二极管的单向导通性。
显示界面方案
本设计涉及到倒计时、状态灯等功能。基于功能需求,本设计考虑如下两个方案:
方案一:采用点阵式LED或液晶 显示。这种方案实现复杂,且须完成大量的软件工作;但功能强大,可方便的显示各种英文字符,汉字,图形等。
方案二:完全采用数码管显示。这种方案可以显示基本的符号和数码字符,数码管显示更加清晰,电路简洁。
考虑到实际情况和电路的简洁,本设计采用了第二套方案,数码管显示更加清晰。液晶极其省电,但是使用有温度范围,且因是反光式的,在外界光线很明亮的情况下很容易看不清楚。
输入方案
考虑到紧急情况和具体现场的情况,本设计考虑两种方案:
方案一: 直接在I/O口线上接上按键开关。该方案优点是:编程更加简洁,使用更加简单,且成本更低。缺点就是功能有限。
方案二:采用无线控制模块24L01代替按键开关。进行若用该方案,比较灵活方便控制,但稳定性比较差,实施困难。
综合考虑本设计的实际需要,在使用输入的时候不需要过于复杂的功能,故采用方案一。
4 系统设计
交通灯规则方案
本设计的交通灯以十字路口为模型,在实现基本的功能前提下增加了高低峰分时管理机制和人工干预机制。
相位的概念
为保证交通系统的严谨性和公平性,本设计规定“相位”概念。
相位的定义如下:在单个十字路口,整个状态周期每个绿灯亮起的时间为一个固定值。
相位的意义在于在一个循环状态周期内,根据每个路口车流量大小可以分配适时适当的绿灯时间以保证时间的充分利用,保证车流大的干道可以通过足够多的车辆,车流小的干道不用浪费时间。从总体上提升系统的效率。
交通灯状态
为方便说明交通灯状态,交通灯系统的示意图如图2所示。交通道路系统是由常见的双车道加人行道组成,由南向北行驶的车辆所看的交通灯是北路口的车行道交通灯,由北向南的车辆所看的交通灯是南路口的车行道交通灯,由西向东行驶的车辆所看的交通灯是东路口的车行道交通灯,由东向西行驶的车辆所看的交通灯是西路口的车行道交通灯。
图2 交通灯示意图
现规定如下状态:
S1:南北方向车辆通行,东西方向、南左转到西、北左转到东、西左转北、东左转南禁行,东西方向人行道通行、南北方向人行道禁行。S1状态如图3所示。
图3 S1状态示意图
S2:南左转西、北左转东车辆通行,南北方向、东西方向、西左转北、东左转南车辆禁行,南北方向、东西方向人行道禁行。S2状态如图4所示。
图4 S2状态示意图
S3:东西方向车辆通行,南北方向、南左转到西、北左转到东、西左转北、东左转南禁行,南北方向人行道通行、东西方向人行道禁行。S3状态如图5所示。
图5 S3状态示意图
S4:西左转北、东左转南车辆通行,南北方向、东西方向、南左转西、北左转东车辆禁行,南北方向、东西方向人行道禁行。S4状态如图6所示。
图6 S4状态示意图
S5:全红灯,紧急事件状态。S5状态如图7所示。
图7 S5状态示意图
高低峰分时管理机制
本设计为提升交通灯系统效率,设置了高低峰分时管理机制。高低峰分时定义如下:
高峰时段:8点到10点,一般为上班上学出行的高峰期,18点到20点,一般为下班放学出行高峰期,此时主干道车流量高于次干道的车流量;
低峰时段:除高峰时段的其他时段。
在高峰时段,减少通行时间。
在低峰时段,增加通行时间。
高低峰时段状态如表1所示。
表1 高低峰时段状态表
| S1 | S2 | S3 | S4 | |
| 低峰时段 高峰时段 | 南北向车行道绿灯时长60s 南北向车行道绿灯时长45s | 南左转西,北转东绿灯时长20s 南左转西,北转东绿灯时长20s | 东西向车行道绿灯时长45s 东西向车行道绿灯时长25s | 东左转南,西左转北绿灯时长20s 东左转南,西左转北绿灯时长20s |
状态转换图如图8所示。
图8 状态转化图
软件设计
在本次设计中,采用了C语言作为程序编程的语言。
相较于C语言,汇编语言的机器代码生成效率很高但可读性却并不强,复杂一点的程序就更是难读懂,而C 语言在大多数情况下其机器代码生成效率和汇编语言相当,但可读性和可移植性却远远超过汇编语言,而且C 语言还可以嵌入汇编来解决高时效性的代码编写问题。对于开发周期来说,中大型的软件编写用C 语言的开发周期通常要小于汇编语言很多。综合以上C 语言的优点,本设计在编程的时候选择了C 语言。
本设计在编程环境上也选择了Keil μVision 。这款软件支持众多不同公司的MCS51架构芯片,它集编辑、编译、仿真为一体,同时还支持PLM、汇编和C语言的程序设计,界面友好、简单易学,在调试程序。软件仿真方面都有很强大的功能。在初期的软件调试阶段,Keil μVision会提供非常便利的环境。
在没有突发事件按钮和高低峰切换按钮都没有按下时交通灯的执行预定方案。预定程序执行方案流程图如图9。
图9 预定程序执行方案流程图
根据本设计交通灯的模型和实现的功能,程序流程图如图10所示。
图10 主程序流程图
硬件设计部分
根据本设计交通灯的模型和实现的功能,硬件部分可以分为以下两个大的系统:
单片机系统、交通灯演示系统、双电源供电系统、中断系统。整个系统的硬件架构图如图11。
图11 系统总架构图
单片机系统
本设计单片机主要是用于控制交通灯的演示系统,故只需要单片机最小系统即可完成。
单片机的最小系统是指能够驱动单片机工作的最小电路。此电路由单片机、时钟电路、电源、复位电路4个组成部分组成。图12为单片机最小电路的电路图。
其中,复位电路如图13。单片机复位电路原理是在单片机的复位引脚rst 上外接电阻和电容,实现上电复位,而复位时间是(时钟周期=12×振荡周期,振荡周期=1/f),这个时间只能大不能小,具体数值可以由rc电路计算出时间常数。
图12 12C5A60S52最小系统图
图13 复位电路图
时钟电路中最为重要的就是晶振,晶振的作用是为系统提供基本的时钟信号。晶振用一种能把电能和机械能相互转化的晶体在共振的状态下工作,以提供稳定,精确的单频振荡。在通常工作条件下,普通的晶振频率绝对精度可达百万分之五十。高级的精度更高。时钟电路如图14所示。
图14 时钟电路图
通常一个系统共用一个晶振,便于各部分保持同步。晶振结合单片机内部的电路,产生单片机所必须的时钟频率,单片机的一切指令的执行都是建立在这个基础上的,晶振的提供的时钟频率越高,那单片机的运行速度也就越快。
交通灯演示系统
根据功能,交通灯的演示系统从功能上则分为:倒计时电路、红绿灯功能电路。交通灯演示系统电路图如图15所示。
倒计时电路主要是由双位共阴数码管和74ls04反相器组成,控制信号通过单片机的端口P0口进行信号的传输。倒计时电路负责的是显示红绿灯持续显示的时间。当绿灯或者红灯持续显示时,数码管显示该状态的持续时间,在黄灯闪烁显示时,起到倒计时秒数的作用。
红绿灯功能电路主要是由各色的发光二极管和74ls04反相器组成,控制信号跟数码管一样都是通过P0口进行传输。红绿灯电路负责的是各个车行道和人行道通行状态的显示。
图15 交通灯演示系统电路图
双电源供电电路
供电电路由主电源和备用电源组成。主电源是由变压器、2A整流桥、1000uf、100uf、104×2电容以及7805三端稳压管组成。这部分为系统提供主要的供电,输出电压为5V直流。备用电源主要是由4位的5号电池盒组成。这个部分在主电源断电时能够几乎瞬时的为系统提供电源,输出电压也是6V直流。该电源直接接到单片机的电源端。
备用电源存在的意义就在于,如果主电源一旦断电的话能够及时的提供系统所需要的电力,以保证整个系统在主电源断电的时间内依然能够正常的工作。在实际的应用过程中,备用电源可以根据需要设置一个合适的容量,本设计出于演示的需要就只提供了4颗5号电池为载体的备用电源。
中断系统
中断系统主要是负责高低峰方案和紧急方案的切换。电路图如图16所示。
图16 中断系统
5 系统调试
断电调试
为安全起见,防止硬件烧坏,首先进行断电调试,用万用表检测系统是否有短路现象,再检查严原理是否正确,各个线路的电平是否正常。经检测,未出现短路现象以及各个电平都正常。
通电调试
(a). 关掉交流电源开关,用万用表直流电压档测量稳压输出电压,用12V电源直接接入7805输入端。经检查分析为稳压芯片7805输入端电容没有接入,输入电压变化太大,造成7805无法稳压。经处理问题解决。
(b). 检查系统时钟是否正常工作,用万用表直流电压档测量XTAL1与AXTAL2两端间的电压,则视为正常工作。
(c). 检查复位电路是否正常工作。
(d). 检查数码管显示和LED灯是否正常。
基本要求部分的测试与分析
(a). 系统上电后,显示交通灯基本状态,按中断按键,中断正常,直接进入S5状态,按复位按键,整个系统复位成功。
(b). 按高低峰切换按键,系统即时切换到高峰时段方案,再按下高低峰切换按键,系统即时切换到低峰时段方案,最后按下高低峰按键,系统重新进入预定流程。
(c). 在未进行任何的中断和复位操作时,交通灯按照预定流程进行,在高低峰两个设定时段内变化。
6 仿真调试问题与解决方案
本设计的目的是用 12C5A60S52单片机来模拟一个十字路口的交通灯,除了完成一般交通灯的功能,如红绿灯循环点亮,倒计时5S黄灯亮;还增加了一些拓展功能如全部禁行、南北方向通行、东西方向通行、高峰控制、各方向各时段通行时间自定义、手动复位等。 当然这样做增加了软件代码量,所以系统的程序繁多,软件设计是个难点。
数码管显示是交通灯要完成的一个很重要的功能,而数码管又可以分为一位,两位,和多位数码管。根据内部电路又可以分为共阴和共阳极。根据输入信号又可以分为7段码的和BCD码,因此,根据不同的数码管软件编程也要发生相应变化,通过软件编程,仿真看效果,再来修改程序,改变数码管类型,所以,这次数码管显示是这次的难点。
首先用Proteus软件进行了仿真,绘制出了仿真电路图,然后烧录程序进去。在实现整个系统功能的时候,出现了一个问题,就是当切换到紧急状态时,该状态结束后,人行道显示出现错误。比如,当出现紧急状态时,我控制按键,切换到全部红灯的状态,在紧急状态停止后,人行道绿灯的那部分显示不能返回到中断前的状态。经过分析,该问题出现的原因在于,中断之前就把数据送去缓存,导致紧急中断过后人行道的绿灯显示不正常。解决方法为,在中断前将数据进行缓存,并设置标志位,中断后判断标志位送回缓存数据。通过程序的修改,最终得以解决这一问题。
7 硬件调试问题与解决方案
在连接万用板的时候,首先把各个部件焊接好,并连接线路,之后用万用表检查每项线路的连接状态,然后把程序刷人单片机中,检测运行情况,接入+5V电源后,在硬件上进行调试。主要出现了以下几点问题:
1.连接后数码管显示个位显示不正常 在连接完毕后,数码管个位的E段码一直显示,经检查由于E段码和其它引脚短接,之后重新焊接后正常。
2.连接后交通灯南北通行的红灯极易受到干扰,稍微碰触就会发亮,由于交通灯信号是由单片机输出信号,之后接到电阻上后,再接到LED数码管上,经过万用表检测后,发现其中一个电阻引脚出现问题,通过更换新的电阻后,显示正常。
3. 复位按钮不起作用,由于轻触式开关并不容易测量其是否坏掉,故最终解决办法是换掉了开关,但最终并不理想,检查线路并没有问题,所以应该是电容问题,当检测后,发现电容损坏,更换了一个电容之后,复位按钮正常工作。
4直接用单片机供电,导致LED灯电压不够,亮度太低。利用单片机控制给LED灯低电平,提高了LED灯的亮度,显示清晰。
5刚开始我们为了调试和实现功能,结果连线的时候连得很乱,电路容易受到干扰不稳定,出现问题的时候不方便检测。功能实现后,我们对照着仿真图开始一个个模块进行改造,每一条线都用胶布标注,然后分区走线包装,然后汇总到出口端接上单片机。最后调试和检测都变得更清晰方便准确。
8 组织分工
前期:程小龙同学负责收集查阅相关资料,确定交通灯控制方案和需要完成的功能。然后通过小组讨论选择合适的方案。接下去就依照方案一起去选购需要的器件和工具。
中期:根据单片机交通灯控制需要设计硬件电路并编制控制程序。程小龙同学对系统进行仿真并检验其工作的可靠性,陈佳威同学根据仿真的结果制作硬件电路模型。
后期:程小龙根据调试出来的结果再来修改程序,从软件和硬件一起来提高系统的性能。陈佳威同学将最终的结果通过毕业设计论文和毕业论文PPT展示交通灯毕业设计。
9结论
本文探究了单片机在当今智能交通方面的应用。相对于其他解决方案来说,单片机具有成本低廉,通用性高,维护简单,软件灵活,成熟度高等优势。但是,单片机发展到现在也有存储空间较小、下游方案较少等局限性。
本设计在实现相应功能的时候主要是考虑到现有的条件,采用成熟度高的12C5A60S52作为CPU的解决方案,同时用双位数码管作为显示模块,软件则使用了移植性好的C语言。从功能需求上来看,已经能够满足实际需要。供电方案也采用了现在热门的双电源供电,电路结构简单,可靠性高,从一定程度上解决了实际中可能出现的由于电源引发的问题。高低峰分时管理方案作为灵活的交通灯状态方案,对提高交通运输系统的运行效率也有很大的帮助。
单片机作为已经发展了30年的成熟产品,很多优势正在逐渐失去,让位于更加先进的芯片解决方案。但是作为成熟方案还是在很多领域能够发挥作用。
致 谢
首先,要感谢伟大的国家,如果没有国家的稳定,我们也没有机会在大学三年安然度过。感谢学校三年来对我们的培养。为我们营造了一个良好的学习氛围,建设一流的教学设施,使我们身心愉快的投入到学习中。
其次,感谢各位教过我们指导过我们的老师,没有他们授予的知识,我们是不可能完成这次设计的。严谨治学的汤老师、理论扎实的胡老师、尽职尽责的张老师、幽默风趣的乐老师、平易近人的黄老师……。他们那种踏实负责的工作态度使我们受益匪浅。再次,感谢moumoumou三位同学。有了他们的帮助和指导,才使本论文的前期准备以及整个研究过程顺利完成。在本次毕业设计的过程中,我们进一步的巩固了如下所学知识:模拟电路、数字电路、单片机、C语言程序设计。与此同时,我们自身的专业知识、动手能力和文档撰写能力也得到了很大程度的提升。这也让我们感受到“理论联系实践”这个硬道理,对于我们未来的工作和人生都有很大的帮助。
最后,向moumoumou同学表示深切的感谢和崇高的敬意,同时也对那些默默奉献的网友们,有了他们提供的书本上没有的资料、丰富例程表示感激。
附录 程序清单
主函数
/******************************************************/
/* 多功能交通灯控制系统 C 程序 */
/*****************************************************/
#include <>
#include <>
#include <>
#include <>
/****************标志位位证明*******************/
#define uchar unsigned char //宏定义
#define uint unsigned int
uchar code S[6]={0Xd7,0Xb7,0Xe7,0X7d,0X7b,0X7e};//交通信号灯控制代码
/*********************主程序开始**********************/
void main(void)
{
ino();//函数初始化
while(1)
{ /*******S1状态:SN通行,EW禁止,EW人行道禁止,SN人行道通行**********/
EW_ManGreen=1; //EW人行道禁止
SN_ManGreen=0;//SN人行道通行
bz_EW_Yellow=1; //EW关黄灯显示信号
djs_EW=EW; //给计时显示赋值
djs_SN=SN;
while(djs_SN>=5) //设定在倒计时5S时,SN通行,EW红灯
{P1=S[0]; //SN通行,EW红灯
Display();}
P1=0xff; //P1口清零 对信号灯初始化
while(djs_SN>=0) // 0<=Time_SN<=5
{ bz_SN_Yellow=0; //SN开黄灯信号位
EW_Red=0; //SN黄灯亮,等待左拐信号,EW红灯
Display();
}
/*******S2状态:SN左拐通行,EW禁止,EW人行道禁止,SN人行道通行**********/
bz_SN_Yellow=1; //SN关黄灯显示信号
djs_SN=SNL; //写入左拐定时初值19
while(djs_SN>=5) //判断时间是否还有5S
{P1=S[2];//SN左拐绿灯亮,EW红灯
Display();}
P1=0xff;
while(djs_SN>=0)
{bz_SN_Yellow=0; //SN开黄灯信号位
EW_Red=0; //SN黄灯亮,等待停止信号,EW红灯
Display();}
/*******S3状态:SN禁止,EW通行,EW人行道通行,SN人行道禁止**********/
EW_ManGreen=~EW_ManGreen;//EW人行道通行
SN_ManGreen=~SN_ManGreen;//SN人行道禁止
bz_SN_Yellow=1; //SN关黄灯显示信号
djs_EW=SN;
djs_SN=EW;
while(djs_EW>=5)
{P1=S[3]; //EW通行,SN红灯
Display();}
P1=0Xff;
while(djs_EW>=0)
{bz_EW_Yellow=0;//EW开黄灯信号位
SN_Red=0;//EW黄灯亮,等待左拐信号,SN红灯
Display();}
/*******S4状态:EW左拐通行,SN禁止,EW人行道通行,SN人行道禁止**********/
bz_EW_Yellow=1; //EW关黄灯显示信号
djs_EW=EWL;
while(djs_EW>=5)
{P1=S[5];//EW左拐绿灯亮,SN红灯
Display();}
P1=0Xff;
while(djs_EW>=0)
{bz_EW_Yellow=0; //EN开黄灯信号位
SN_Red=0;//EW黄灯亮,等待停止信号,SN红灯
Display();}
/***********赋值**********/
EW=EW1;
SN=SN1;
EWL=EWL1;
SNL=SNL1;
}//while
}
数码显示函数
/*********************************************/
/* 显示程序 */
/*********************************************/
#include ""
extern char EW,SN,EWL,SNL; //程序初始化赋值,正常模式
extern char EW1,SN1,EWL1,SNL1;//用于存放修改值的变量
extern char djs_EW;//东西方向倒计时单元
extern char djs_SN;//南北方向倒计时单元
char code table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//0~~~~9段选码
/**********************延时子程序************************/
void Delay(void)
{
int i,j;
for(i=0;i<20;i++)
{
for(j=0;j<20;j++)
{
;
}
}
}
/*****************显示子函数**************************/
void Display(void)
{
char shi,ge;
shi=djs_EW/10; //十位取整
ge=djs_EW%10; //个位取余
P0=table[ge]; //装入个位的段码
EW_LED2=1; //打开东西方向的个位
Delay(); //快速延时
EW_LED2=0; //关 位
P0=table[shi]; //装入十位的段码
EW_LED1=1; //开位
Delay();
EW_LED1=0; //关位
shi=djs_SN/10;
ge=djs_SN%10;
P0=table[ge];
SN_LED2=1;
Delay();
SN_LED2=0;
P0=table[shi];
SN_LED1=1;
Delay();
SN_LED1=0;
shi= EW1/10; // 修改值的位段写入
ge= EW1%10;
P0=table[ge];
shuma_LED1=1;
Delay();
shuma_LED1=0;
P0=table[shi];
shuma_LED2=1;
Delay();
shuma_LED2=0;
}
外部中断函数
/*********************************************/
/* 功能按键控制 */
/*********************************************/
#include <>
char djs_EW;//东西方向倒计时单元
char djs_SN;//南北方向倒计时单元
//uchar EW_ManGreen ;EW_ManGreen
uchar SN_ManGree;
void delay1ms(unsigned char x)
{
unsigned char y,z;
for(y=x;y>0;y--)
for(z=110;z>0;z--);}
/**********************外部0中断服务程序************************/
void EXINT0(void)interrupt 0 using 1
{
uchar c; // 定义一个标志位
uchar aa=EW_ManGreen; //把数据送给缓存
uchar bb=SN_ManGreen;
c=0; //置初值
EX0=0; //关中断
if(Add_Button==0) //时间加
{
delay1ms(10); //延时消抖
if(Add_Button==0) //再判断
{
EW1+=5; //每次加5S
SN1+=5;
if(EW1>=100) //以东西为基准当加到小于等于100时赋东西为99S南北为79S
{
EW1=99;
SN1=79;
}
Busy_LED=1;//关繁忙信号灯
ts_LED =1;//关特殊信号灯
}//if
}
if(Reduces_Button==0) //时间减
{
delay1ms(10);
if(Reduces_Button==0)
{
EW1-=5; //每次减5S
SN1-=5;
if(EW1<=40) //以东西为基准当加到小于等于40时赋东西为40S南北为20S
{
EW1=40;
SN1=20;
} //if
Busy_LED=1;//关繁忙信号灯
ts_LED =1;//关特殊信号灯
} //if
}
if(zc_Button==0)//测试按键是否按下,按下为正常状态
{
delay1ms(10);
if(zc_Button==0)
{
EW1=60; //装入东西绿灯显示的初值
SN1=40; //装入南北绿灯显示的初值
EWL1=19;
SNL1=19;
Busy_LED=1;//关繁忙信号灯
ts_LED =1;//关特殊信号灯
}
}
if(fm_Btton==0) //测试按键是否按下,按下为繁忙状态
{
delay1ms(10);
if(fm_Btton==0)
{
EW1=45;
SN1=25;
EWL1=19;
SNL1=19;
ts_LED=1;//关特殊信号灯
Busy_LED=0;//开繁忙信号灯
}
}
/*******S5状态:全红灯,紧急事件状态。**********/
if(ts_Btton==0)//测试按键是否按下,按下为特殊状态
{
while(ts_Btton==0)
{
P1= 0x77; // 全部亮红灯
c=1; //标志位
EW_ManGreen=1;
SN_ManGreen=1;
Busy_LED=1;//关繁忙信号灯
ts_LED =0;//开特殊信号灯
} //while
} //if
ts_LED =1;//关特殊信号灯
if(c==1)
{
EW_ManGreen=aa;
SN_ManGreen=bb; //返回人行道指示灯
}
EX0=1;//开中断
}
定时中断函数
/*****************************************/
/* T0中断服务程序 */
/*****************************************/
#include ""
#include <>
#define uchar unsigned char //宏定义
extern char djs_EW;//东西方向倒计时单元
extern char djs_SN;//南北方向倒计时单元
bit bz_SN_Yellow; //SN黄灯标志位
bit bz_EW_Yellow;//EW黄灯标志位
char EW,SN,EWL,SNL; //程序初始化赋值,正常模式
char EW1,SN1,EWL1,SNL1;//用于存放修改值的变量
void timer(void) interrupt 1 using 1
{
char count; //定义count为静态存储变量
TH0=0x3C;
TL0=0xB0;
count++;
if(count==10)// 实现黄灯闪烁
{
if(bz_SN_Yellow==0) //测试南北黄灯标志位
{
SN_Yellow=~SN_Yellow; ///利用取反实现闪烁
}
if(bz_EW_Yellow==0) //测试东西黄灯标志位
{
EW_Yellow=~EW_Yellow;
}//if
}//if
if(count==20) //定时1S
{
djs_EW--;
djs_SN--;
if(bz_SN_Yellow==0)//测试南北黄灯标志位
{
SN_Yellow=~SN_Yellow;
}
if(bz_EW_Yellow==0)//测试东西黄灯标志位
{
EW_Yellow=~EW_Yellow;
}
count=0;
}
}
/*********************初始化**************************/
void ino()
{
EW=60;SN=40;EWL=19;SNL=19;
EW1=60;SN1=40;EWL1=19;SNL1=19;
Busy_LED=1; //繁忙交通灯清零
ts_LED=1; //特殊交通灯清零
IT0=1; //INT0负跳变触发
TMOD=0x01;//定时器工作于方式1
TH0=0x3C;//定时器赋初值
TL0=0xB0;
EA=1; //CPU开中断总允许
ET0=1;//开定时中断
EX0=1;//开外部INTO中断
TR0=1;//启动定时
}
外部中断驱动
#ifndef _EXINT0_H_
#define _EXINT0_H_
#define uchar unsigned char //宏定义
#define uint unsigned int
#include <>
/********按键位声明*******************************/
sbit Add_Button=P3^3;//时间加
sbit Reduces_Button=P3^4;//时间减
sbit zc_Button=P3^5;//交通正常按键
sbit fm_Btton=P3^6;//交通繁忙按键
sbit ts_Btton=P3^7;//交通特殊按键
sbit ts_LED=P2^6;//交通特殊指示灯
sbit Busy_LED=P2^7;//交通繁忙指示灯
sbit EW_Red=P1^3;//EW红灯
sbit SN_Red=P1^7;//SN红灯
sbit EW_ManGreen=P3^0;//EW人行道绿灯
sbit SN_ManGreen=P3^1;//SN人行道绿灯
/****************标志位位证明*******************/
extern char EW,SN,EWL,SNL; //程序初始化赋值,正常模式
extern char EW1,SN1,EWL1,SNL1;//用于存放修改值的变量
extern char djs_EW;//东西方向倒计时单元
extern char djs_SN;//南北方向倒计时单元
extern bit bz_SN_Yellow; //SN黄灯标志位
extern bit bz_EW_Yellow;//EW黄灯标志位
void EXINT0(void);
#endif
定时中断驱动
#ifndef _Timer_H
#define _Timer_H
#include <>
/**********指示灯位声明**********************/
sbit SN_Yellow=P1^6;//SN黄灯
sbit EW_Yellow=P1^2;//EW黄灯
void timer(void);
void ino();
#endif
显示驱动
#ifndef _Display_H
#define _Display_H
#include <>
sbit shuma_LED2=P2^5;//shuma_LED2控制位
sbit shuma_LED1=P2^4;//shuma_Show_LED1控制位
sbit EW_LED2=P2^3; //EW_LED2控制位
sbit EW_LED1=P2^2; //EW_LED1控制位
sbit SN_LED2=P2^1; //SN_LED2控制位
sbit SN_LED1=P2^0; //SN_LED1控制位
void Display(void);
#endif
附录 实物图
参 考 文 献
[1] :机械工业出版社.
[2] (第三版).北京:高等教育出版社.
[3] :机械工业出版社.
[4] :机械工业出版社.
[5] :高等教育出版社.
