资源描述
十字路口交通灯控制系统
摘要:本设计以单片机AT89S52为控制核心,以红、绿、黄三种LED发光管作为直行和左右拐弯以及行人通行的指示,以LED数码管作为倒计时指示,完成了题目要求的所有功能。在此基础上增设了LED灯和数码管实时显示系统各种状态,还可根据交通拥挤情况分别设置主干道和次干道的通行时间以及紧急情况时可根据需要手动设置某干道车辆通行状态,紧急情况结束后再转成自动状态,并对系统机械结构进行了优化设计,整体性好,人性化强、可靠性高。
关键字:单片机AT89S52;LED数码管;通行模式
引 言
随着社会和城市交通的快速发展, 近几年机动车辆数字急剧增加,道路超负荷承载道路现象严重,致使交通事故逐年增加。交通灯是城市交通有序、安全、快速运行的重要保障,因此解决好公路交通信号灯控制问题也成了保障交通有序、安全、快速运行的重要环节。本设计是一款基于单片机AT89C52为控制核心的交通控制系统,它可以实现对车辆、行人的有效导引。
设计中我们选用红、绿、黄三种不同LED发光管作为车辆和行人的指示,简化了设计,形象直观;采用LED数码管作为倒计时显示,可靠性高、抗干扰能力强。该系统还可根据交通拥挤情况分别设置主干道和次干道的通行时间,以提高效率,缓减交通拥挤;当出现紧急情况时,交警可将系统设置成手动:全路口车辆、行人禁行,紧急情况结束后再转成自动状态。本设计并对系统物理结构进行了优化,很有城市交通道口的“模型”味。
第1章 方案设计与论证
题目要求要实现交通灯基本信息指示功能的基础上,还要实现倒计时时间和工作状态显示、紧急情况处理等功能,如何选择有效方案至关重要!
1.1 总体方案设计思想
根据传统十字路口交通灯的设计,可将本系统分为四个模块,第一个模块是控制模块,主要负责整个系统工作的控制和运算,从而使各模块正常工作;第二个模块为显示模块,主要是对车辆和行人应该遵守交通规则的指导性的直观显示,它主要包括倒计时显示和红、绿、黄灯两大部分;第三个模块是输入模块,它的主要作用是辅助控制模块,相当于输入装置,利用它可以对交通灯各路口通行时间的设置以及出现紧急情况时,进行不同工作方式的切换设置;第四个模块是电源模块,它是整个系统的“心脏”,负责给各模块提供合适的电压,让各模块能稳定工作。其系统设计结构如图1所示:
电源模块
控
制
模
块
显示模块
显示模块
显示模块
显示模块
输入模块
东
西
南
北
十字路口
工作状态显示
图1系统设计结构图
1.2 系统方案选择与比较
1.2.1 控制模块选择方案
方案一:由计数器74LS161级联组成,配合译码器和秒脉冲信号发生器等器件组成交通灯系统,整个系统简单,控制简单,调试容易等优点。
方案二:采用ATC公司的单片机ATC89C52作为控制器。单片机运算能力强,软件编程灵活,自由度大。它是MCS-51系列单片机的派生产品,在指令系统、硬件结构和片内资源上与标准8052单片机完全兼容,使用时容易掌握;采用ATC89C52单片机稳定可靠、应用广泛、通用性强,在系统/在应用可编程。
方案比较:采用方案一来实现十字路口交通灯控制系统非常方便,电路结构简单,控制单一,但整个系统性能不是很高,倒计时不是非常精确,如果要求系统能设置不同工作时间不容易,因而对于完成题目较困难,而方案二完全能实现设计要求,容易掌握,利用编程,易控制,I/O接口很多,易于扩展外围电路,价格便宜,故选择方案二。
1.2.2 显示模块选择方案
该系统要求完成倒计时、状态灯等功能。基于上述原因,考虑了三种方案。
方案一:完全采用数码管显示。这种方案只显示有限的符号和数码字苻,无法胜任题目要求。
方案二:完全采用点阵式LED 显示。这种方案实现复杂,且须完成大量的软件工作;但功能强大,可方便的显示各种英文字符,汉字,图形等。
方案三:用七段LED数码管完成倒计时显示,用LED灯作为状态灯指示功能。
方案比较:方案一和方案二都不符合设计要求,实现较复杂,而方案三采用数码管与LED灯相结合的方法因为设计既要求倒计时数字输出,又要求有状态灯输出等,为方便观看并考虑到现实情况,用数码管与LED灯分别显示时间与提示信息。这种方案既满足系统功能要求,又减少了系统实现的复杂度。权衡利弊,选择方案三。
1.2.3 输入模块方案选择
方案一:采用8155扩展I/O 口及键盘,显示等。该方案的优点是:使用灵活可编程,并且有RAM,及计数器。若用该方案,可提供较多I/O 口,但操作起来稍显复杂。
方案二: 直接在IO口线上接上按键开关。因为设计时精简和优化了电路,所以剩余的口资源还比较多,我们使用四个按键,分别是K1、K2、K3、K4。由于该系统对于交通灯及数码管的控制,只用单片机本身的I/O 口就可实现,且本身的计数器及RAM已经够用,故选择方案二。
1.2.4 电源模块方案选择
电源是整个系统的“心脏”,它是系统稳定工作的保障,为使各个模块稳定工作,须有可靠电源。下面考虑了两种电源方案。
方案一:采用单片机控制模块提供电源。该方案的优点是系统简明扼要,节约成本;缺点是输出功率不高,不能驱动数码管。
方案二:采用独立的稳压电源,采用开关电源作为整个系统的供电,它具有多路电源输出,此方案的优点是稳定可靠,且有各种成熟电路可供选用;缺点是各模块都采用独立电源,
方案比较:方案一只采用单片机自身的I/O来驱动数码管显示是不行的,而方案二虽然要给各模块供电,但却能给各模块提供稳定可靠的电压从而达到显示明亮的程度。故选择第二种方案。
1.3系统总体方案论证
经上述各模块的方案选择与论证,十字路口交通灯控制系统的控制芯片选用单片机AT89S52作为整个系统的核心控制器件,主要负责整个系统工作的控制和运算,从而使各模块正常工作;采用七段LED数码管和LED灯作为显示器件,用七段LED数码管完成倒计时显示,用LED灯作为状态灯指示功能;用触发按键构成系统的输入部分,它可以对系统进行状态设置,结合数码管,可根据交通情况对整个系统进行直观的控制;以开关电源作为系统电源部分,它有+12V、-12V、+5V、-5V电压输出,可方便对各个模块供电。系统设计方框总图如图2所示:
开关电源
单片机
AT89S52
LED数码管
显示模块
按键输入
东
西
南
北
十字路口
LED数码管
工作状态显示
LED数码管
显示模块
LED数码管
显示模块
LED数码管
显示模块
红、绿、黄
LED状态指示灯
图2 系统设计方框总图
第2章系统硬件设计
硬件设计是整个系统的基础,要考虑的方方面面很多,除了实现交通灯基本功能以外,主要还要考虑如下几个因素:①系统稳定度;;②器件的通用性或易选购性;③ 软件编程的易实现性;④系统其它功能及性能指标;因此硬件设计至关重要。现从各功能模块的实现逐个进行分析探讨。
2.1 总体设计及功能描述
本设计以单片机AT89S52为控制核心,采用模块化设计,共分以下几个功能模块:单片机控制系统、键盘及状态显示、行车方向指示、行人通行指示和倒计时模块等。
u 单片机作为整个硬件系统的核心,它既是协调整机工作的控制器,又是数据处理器。它由单片机、时钟电路、复位电路等组成。
u 行车方向指示采用红、绿、黄LED发光管,用三种颜色指示车辆放行、暂停、禁止,形象直观。
u 行人通行指示采用两支红、绿LED发光管,用两种颜色指示放行与禁止,形象直观,简洁明了。
u 键盘及状态显示,键盘采用四只触发按键组成,电路简洁可靠;显示器采用七段LCD数码管,可实时显示系统运行状态,可供交警在室内实时监视交通状况。通过键盘可设置:紧急情况发生时的交通灯状态控制、主干道通行时间等,人机界面非常友好。
u 系统采用双数码管倒计时计数功能,最大显示数字99。
其交通口模拟仿真结果如图3所示
图 3交通口模拟仿真图
友好的人机界面、灵活的控制方式、优化的物理结构以及丰富的功能是本设计的亮点。系统总体设计原理图见附录。
2.1.1交通灯四种通行模式及行车方向指示
按交通灯控制规则,每个街口有转弯、直行及行人三种指示灯。主要指示灯有红、绿、黄三种颜色。交道口模型如图4所示:
图4 交道口模型图
4组LED数码管按照设置的通行时间(各路口默认的通行时间均为1分钟)进行倒计时,并各自进行红、绿、黄灯显示,共有四种通行状态,分别为:
图4-1 通行状态一示意图图4-2 通行状态二示意图
图4-3 通行状态三示意图图4-4 通行状态四示意图
直行默认时间为40秒,转弯默认时间为20秒,系统设置了任意更改功能,可以根据实际情况进行倒计时调整,以提高车辆通过率,缓减交通压力。在直行状态变为转弯状态时结束前5秒钟,黄灯闪烁直至结束。
本设计选用两只绿色LED发光管来指示转弯、直行等交通指示信息。绿灯1亮表示直行,绿灯2亮表示允许转弯行驶,红色则表示禁止通行。所有指示信息一目了然。
2.1.2 行人通行指示及其实现
行人通行时间为1分钟,行人通行指示选用红、绿LED发光管,用两种颜色指示放行与禁止,形象直观。红色LED亮时禁止通行标志,绿色LED灯亮时表示此时禁止通行,提醒行人站在原地等候。
2.1.3 主干道单独时间设置功能
当主干道方向的车辆过多发生堵塞,正常的信号灯时序将会使交通状况更加恶化。本设计添加了主次干道单独时间设置功能,交警可按需求设置绿灯的点亮时间,该措施可在一定程度缓减短暂的交通压力。
2.1.4 紧急情况处理功能及其实现
在十字交通路口常出现的紧急情况,若不及时处理将形成不良隐患。比如,交道口的行人有紧急情况发生,那么交警可以对信号灯进行手动控制,按下紧急情况处理键,通过软件使所有红灯亮,路口车辆禁行,行人通行,直至紧急情况结束后再转成常规的自动状态。
2.1.5 倒计时计数功能及其实现
本系统使用数码管完成倒计时显示功能。以南北方向为例,数码管显示的数值从绿灯的设置时间最大值往下减,每秒钟减1,一直减到0。然后又从红灯的设置时间最大值往下减,一直减到0。接下来又显示绿灯时间,如此循环。
系统共有4 个两位的LED 数码管,分别放置在模拟交通灯控制板上的四个路口。因为四个方向的数码管应该显示同样的内容,所以可以把它们同样对待。也就是说各个方向的数码管个位(把数码管第二位定义为个位,第一位定义为十位)用一根信号线控制,十位用另一根信号线控制。这里采用动态显示。
2.2 各功能模块硬件设计及实现
2.2.1单片机控制模块的设计
单片微机(Single-Chip Microcomputer)简称为单片机。它在一块芯片上集中成了中央处理单元CPU、随机存储器RAM、只读存储器ROM、定时/计数和多功能输入/输出I/O口,如并行口I/O、串行口I/O和转换A/D等。
MCS-51系列单片机在我国得到了广泛的应用,是单片机的主流系列,软硬件应用设计资料丰富齐全。为了提高指令的执行速度和效率,采用了面向控制的结构和指令系统的独立CPU。
因此本设计采用AT89S52单片机作为系统的控制器件,这是因为AT89S52是目前应用比较广泛的MCS-51系列兼容单片机作为主控制器。
AT89S52单片机的主要性能特点:
u 与MCS-51系列单片机产品兼容。
u 8K字节在系统可编程Flash存储器,1000次擦写周期。
u 全静态操作:0~33Hz。
u 三级加密程序存储器。
u 32个可编程I/O口线,3个16位定时器/定时器,8个中断源。
u 全双工UART串行通道,低功耗空闲和掉电模式。
u 掉电后中端可唤醒,看门狗定时器。
u 双数据指针和掉电标识符。
电源、时钟信号以及复位电路时单片机工作的基本条件,缺一不可。AT89S52单片机系统的基本工作电路包括电源电路、时钟电路、复位电路。其组成方框图如图5:
单
片
机
AT89
S52
电源电路
时钟电路
复位电路
图 5 单片机控制系统基本硬件组成方框图
(1)、电源电路
电源电路模块为系统板上的其他模块提供+5V电源。供电电源可由开关电源提供,即能满足。
(2)、时钟电路模块的设计
单片机的时钟信号用来为单片机芯片内部的各种操作提供时间基准。
时钟电路为单片机产生时钟脉冲序列,作为单片机工作的时间基准,典型的晶体振荡频率为12MHz。
MCS-51系列单片的时钟信号可以由两种方式产生:一种是内部时钟方式,利用芯片内部的振荡电路;另一种方式为外部时钟方式。
由于AT89S52单片机芯片内有时钟振荡电路,因此本系统单片机采用内部时钟方式,只要在单片机的XTAL1和XTAL2引脚外接石英晶体和微调电容,就构成了自激振荡器并在单片机内部产生时钟信号脉冲信号,具体电路设计如图6所示。
图6 单片机系统硬件电路原理图
图中电容C1、C2的作用的是稳定频率和快速起振,其值为5~30pF,在此选择30pF;晶振X1的振荡频率范围在1.2~12MHz之间选择,本设计中选择12MHz。
(3)、复位电路模块设计
复位电路使单片机或系统中的其他部件处于某种确定的状态。
当在MCS-51系列单片的RST引脚处引入高电平并保持2个机器周期,单片机内部就执行复位操作。复位操作有两种基本形式:一种是上电复位,另一位是按键复位。本设计采用按键复位方式。
2.2.2倒计时显示及状态指示模块的设计
A、七段数码显示器:
七段发光线段分别用a、b、c、d、e、f、g七个小写字母表示。
七段显示组合与数字对照表
(表中“L”表示低电位,“H”表示高电位)
B、LED数码管:
半导体数码管又称LED数码管,是一种广泛使用的显示器件。LED有两种:共阳极型和共阴极型。
LED优点:亮度高、字形清晰,工作电压低(1.5~3V)、体积小、可靠性高、寿命长,响应速度极快。
C、液晶分段数码显示器:利用液态晶体的光学特性做成的显示器;
优点:工作电压低、耗电省和成本低廉等。
2.2.3键盘及状态显示模块的设计
2.2.4开关电源模块
第3章 系统软件设计
硬件平台结构一旦确定,大的功能框架即形成。软件在硬件平台上构筑,完成各部分硬件的控制和协调。系统功能是由软硬件共同实现的,由于软件的可伸缩性,最终实现的系统功能可强可弱,差别可能很大。因此,软件是本系统的灵魂。软件采用模块化设计方法,不仅易于编程和调试,也可减小软件故障率和提高软件的可靠性。同时,对软件进行全面测试也是检验错误排除故障的重要手段。由于编程多涉及到数值运算,比较复杂,还有LCD的菜单界面设计都是需要多重选择判断,用我们平时常用的汇编语言编程是很难实现的,这里我们选用了移值性好、结构清晰、能进行复杂运算的C语言来实现编程。
3.1 软件总体流程图
软件总体设计及流程图见图3-1,主要完成各部分的软件控制和协调。本系统主程序模块主要完成的工作是对系统的初始化,包括对HD7279、1302和液晶的初始化,启动无线接收模块,发送显示数据,同时对键盘进行扫描,等待外部中断,以及根据所需要的功能进行相应的操作。其流程图如图3-1所示。
图3-1 软件总体流程图
主程序比较简单,初始化完成后,调用按键扫描程序,取得键值,并根据当前系统状态调用相应的子程序。这里有六个基本的子程序供调用,分别对应系统的各种功能状态。分别是语音提示子程序、特种车检测子程序、紧急状态子程序、设置子程序和时钟显示子程序,倒计时子程序等。
3.2 软件主要子程序流程
3.2.1紧急状态子程序
图3-2 紧急状态子程序
在紧急状态下,只有紧急状态手动控制按键采可以使所有的LED 都被置为红灯,车辆禁行、行人通行。紧急情况结束后再转成自动状态。
3.2.2 设置状态子程序
图3-3 设置状态子程序
在设置状态,按下Key1 开始设置南北的红灯时间,按下Key2 设置南北的绿灯时间,按下Key3 返回正常运行状态。红灯和绿灯的时间最大可以设为99,超出99 的时候会从20 开始重新计数。
它包含倒计时调整和紧急状态两个状态。主程序中放了一个按键的判断指
令,当有按键按下的时候,程序就自动的跳转到按键子程序处理。当检测到K2键按下的时候就自动返回到主程序。当出现紧急的情况的时候,按下K3或者K4 就切换到紧急状态,当紧急事件处理完毕的时候,按下K2,就可以返回正常状态。
3.2.3 键盘模块程序流程
键盘是人机进行交互的重要接口之一。用户通过按键对仪器下达命令,仪器对按键译码获得相应的键值,并执行相应的命令程序。键盘部分的软件实现主要是指对键盘管理芯片HD7279A进行编程,从而成功地读取键盘值,实现相应的功能。HD7279A的工作流程图如图3-4所示。
图3-4 HD7279的工作流程图
第4章 系统调试与测试结果分析
因本设计本身要求有稳定性高、免维护、抗干扰能力强等功能,系统调试除了验证数据处理的精度,确保判断的准确性外,同时必须确认各项的功能的正常运行。
4.1 系统操作说明
本设计采用4x5键盘,共20个键。键盘显示接口选用专用芯片7279,键盘分为数字键和功能菜单选择键两种,其中数字键十个,分别为数字0—9,用来输入年月日、倒计时时间等数字信息;功能菜单选择键则用于年月日及时钟设置、特种车放行设置、紧急按键、主次干道通行时间分别设置、确定、取消等功能,功能选择后的所有信息都将在高分辨率LCD液晶屏上实时显示。
系统分为两个状态:设置状态和显示状态。利用键盘可以进行两个状态间的切换;开机时,系统为显示状态,此时显示四个路口数码管从默认的倒计时时间(60S)开始倒计时;LED双色发光管拼成的箭头开始有规律工作,作行车方向指示;LED双色点阵人形画面及温馨语音提示均进入正常工作设置状态时利用键盘可以设置各路口通行倒计时时间和年月日,主次干道的通行时间可以不相等,这里我们增添了分开分别设置功能;显示状态时,交通灯模组的四个LED数码管进行倒计时;双色LED发光管各组的红绿箭头轮流交替指示;如果双色LED箭头指示板上中间的绿灯亮,两边红灯亮,则显示的是通行时间;否则,数码管显示的是等待时间;显示过程中按键可以重新进入设置状态。同时以上所有交通状态指示信息都在液晶显示屏上清晰显示,交警可在室内进行实时监测控制。
4.2 调试
根据系统设计方案,本系统的调试共分为三大部分:硬件调试,软件调试和软硬件联调。由于在系统设计中采用模块化设计,所以方便了对各电路功能模块的逐级测试,包括对:交通灯演示功能调试,行人通行指示功能调试,倒计时功能调试,主次干道分开设置功能调试,紧急情况手动控制功能调试,特种车通行功能调试,时钟和语音功能调试,液晶显示屏实时显示功能调试等。单片机软件先在最小系统板上调试,确保工作正常之后,再与硬件系统联调。最后将各模块组合后在交道口模型上进行整体测试,使系统的所有功能得以实现。
1. 硬件调试
城市交道口交通灯控制系统的PCB电路板焊接工作量非常大,电路安装完成后,首先进行检查,即确认电路无虚焊,无短路,无断路,集成元件安装是否正确,之后进行电路功能模块的分级调试,根据电路功能逐级进行:
1) 通行方式功能调试:包括对四种通行方式控制调试,行人和行车方向指示灯亮度和驱动电路调试;
2) 倒计时功能调试:数码管亮度调试;
3) 紧急情况手动控制功能调试:包括按键功能调试及显示器件的亮度和规则调试;
4) 特种车通行功能调试:包括无线发送和接收电路调试。
5) 时钟和语音功能调试:包括时钟模块电路硬件调试,语音电路硬件调试,以及录放音功能的实现调试等。
2. 软件调试
本系统的软件系统很大,全部用C51来编写,选用一般的伟福仿真器对C51进行调试。除了语法差错外,当确认程序没问题时,通过直接下载到单片机来调试。采取的是自下到上的调试方法,即单独调试好每一个模块,然后再连接成一个完整的系统,最后完成一个完整的系统调试。主要是液晶显示屏实时显示功能的调试。
3. 软硬联调
系统做好后,进行系统的完整调试。主要任务是检验实现的功能及其效果并校正数值。根据实测数据,逐步校正数据,使测量结果更准确。单片机软件先在最小系统板上调试,确保工作正常之后,再与硬件系统联调。
4.3 指标测试
4.3.1 测试仪器
表4—1 测试仪器清单
编 号
名 称
型 号
1
2
3
4
5
测试仪器见表4—1,所采用的仪器都必须满足一定的测量精度要求,否则
将使测量结果失去实用价值。通常要求测量仪器的精度高于被测量仪器精度一个数量级,至少应高于3倍。根据系统设计任务书的要求逐一测试各项性能指标,并进行记录,给出测试结论。
第5章 设计总结
本设计以单片机AT89S52为核心,采用主从双MCU结构,以双色LED发光管箭头作为直行和左右拐弯指示,以LED数码管作为倒计时指示,以双色LED点阵作为行人通行的指示,以数字编码无线传输模式实现特种车辆检测,完成了题目要求的所有功能。在此基础上,增设了可根据交通拥挤情况分别设置主干道和次干道的通行时间,并对系统机械结构进行了优化设计。该设计很好地完成了题目的各项要求,并扩展了多项功能,主要体现如下:
1. 出现紧急情况时系统可设置成手动控制,紧急情况结束后再转成自动,控制十分灵活;
2. 巧妙使用无线传输模块,用模型车演示,当有警车通过时系统自动转为特种车放行,其它车辆禁止通行状态,特定时间后系统自动恢复;
3. 紧急情况功能,使交通灯控制系统更加人性化;
4. 人行道指示标志使用LED显示,一目了然。
5. 主干道和次干道可以分开设置时间功能,使控制更加灵活;
以上所有功能均在城市交道口模型上得到很好地实现,该设计在确保功能实现的基础上,充分考虑了控制系统操作方便、人性化、抗干扰能力强、可靠性高、稳定性好等要求。
本设计虽然结束了,但由于时间、设备、条件和水平等各方面因素有限,系统还存在一些不足,一个新系统最终走向成熟和完善还需要我们在以后的学习和工作中作不懈的努力!
第6章 参考文献
[1] 欧伟民. 基于单片机的交通信号控制系统[J].湖南大学学报(自然科学版) ,2002,(S2) .
[2] 沈鸿星. LED交通信号灯系统的硬件设计[J].电子工程师 ,2004,(03) .
[3] 罗亚非.凌阳16 位单片机应用基础[M]. 北京:北京航空航天大学出版社,2003
[4] 方志烈. 第三代L ED 交通信号灯[A] . 第七届全国L ED 产业研讨与学术会议论文集[ C] . 中国光学光电子行业协会光电器件专业分会,2000. 30232.
[5] 查振亚,叶向阳.智能交通灯控制系统[J]. 华中理工大学学报, 1997, 25(2): 63~65
[6] 谭浩强.C 程序设计[M].清华大学出版社,1999 年12 月第2 版
[7] 白炳良. 单片机自动控制交通信号灯[J].漳州师范学院学报(自然科学版) ,1997,(02) . [8] 何立民.单片机应用技术大全[M].北京:北京航空航天大学出版社,1994.
[9] 李广弟.单片机基础[M].北京:北京航空航天大学出版社,1992.
[10] 张云龙. 交通信号控制器的设计[J].兵工自动化 ,2003,(04) .
[11] 李朝青.单片机原理及接口技术(修订版)[M].北京:北京航空航天大学出版社,1998.
[12] 阎石. 数字电子技术基础(第四版)[M].高等教育出版社,2000年5月第一版.
[13] 胡汉才. 单片机原理及其接口技术[M].清华大学出版社,2000年5月第一版.
[14] 何立民. 单片机高级教程[M].北京航空航天大学出版社,2000年5月第一版.
[15] 陈汝全. 电子技术常用器件应用手册[M].第二版,机械工业出版社,2002年5月第一版.
源程序:
/*****************************************************
十字路口交通灯控制 C 程序
******************************************************/
#define uchar unsigned char
#define uint unsigned int
#include <reg52.h>
/*****定义控制位**********************/
sbit Time_Show_LED2=P2^5;//Time_Show_LED2控制位
sbit Time_Show_LED1=P2^4;//Time_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控制位
sbit SN_Yellow=P1^6;//SN黄灯
sbit EW_Yellow=P1^2;//EW黄灯
sbit EW_Red=P1^3;//EW红灯
sbit SN_Red=P1^7;//SN红灯
sbit EW_ManGreen=P3^0;//EW人行道绿灯
sbit SN_ManGreen=P3^1;//SN人行道绿灯
sbit Special_LED=P2^6;//交通正常指示灯
sbit Busy_LED=P2^7;//交通繁忙指示灯
sbit Nomor_Button=P3^5;//交通正常按键
sbit Busy_Btton=P3^6;//交通繁忙按键
sbit Special_Btton=P3^7;//交通特殊按键
sbit Add_Button=P3^3;//时间加
sbit Reduc
es_Button=P3^4;//时间减
//sbit NBGZ=
//sbit DXGZ=
bit Flag_SN_Yellow; //SN黄灯标志位
bit Flag_EW_Yellow;//EW黄灯标志位
char Time_EW;//东西方向倒计时单元
char Time_SN;//南北方向倒计时单元
uchar EW=60,SN=40,EWL=19,SNL=19; //程序初始化赋值,正常模式
uchar EW1=60,SN1=40,EWL1=19,SNL1=19;//用于存放修改值的变量
uchar code table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//1~~~~9段选码
uchar code S[8]={0X28,0X48,0X18,0X48,0X82,0X84,0X81,0X84};//交通信号灯控制代码
/**********************延时子程序************************/
void Delay(uchar a)
{
uchar i;
i=a;
while(i--){;}
}
/*****************显示子函数**************************/
void Display(void)
{
char h,l;
h=Time_EW/10;
l=Time_EW%10;
P0=table[l];
EW_LED2=1;
Delay(2);
EW_LED2=0;
P0=table[h];
EW_LED1=1;
Delay(2);
EW_LED1=0;
h=Time_SN/10;
l=Time_SN%10;
P0=table[l];
SN_LED2=1;
Delay(2);
SN_LED2=0;
P0=table[h];
SN_LED1=1;
Delay(2);
SN_LED1=0;
h= EW1/10;
l= EW1%10;
P0=table[l];
Time_Show_LED1=1;
Delay(2);
Time_Show_LED1=0;
P0=table[h];
Time_Show_LED2=1;
Delay(2);
Time_Show_LED2=0;
}
/**********************外部0中断服务程序************************/
void EXINT0(void)interrupt 0 using 1
{
EX0=0; //关中断
if(Add_Button==0) //时间加
{
EW1+=5;
SN1+=5;
if(EW1>=100)
{
EW1=99;
SN1=79;
}
}
if(Reduces_Button==0) //时间减
{
EW1-=5;
SN1-=5;
if(EW1<=40)
{
EW1=40;
SN1=20;
}
}
if(Nomor_Button==0)//测试按键是否按下,按下为正常状态
{
EW1=60;
SN1=40;
EWL1=19;
SNL1=19;
Busy_LED=0;//关繁忙信号灯
Special_LED =0;//关特殊信号灯
}
if(Busy_Btton==0) //测试按键是否按下,按下为繁忙状态
{
EW1=45;
SN1=30;
EWL1=14;
SNL1=14;
Special_LED=0;//关特殊信号灯
Busy_LED=1;//开繁忙信号灯
}
if(Special_Btton==0)//测试按键是否按下,按下为特殊状态
{
EW1=75;
SN1=55;
EWL1=19;
SNL1=19;
Busy_LED=0;//关繁忙信号灯
Special_LED =1;//开特殊信号灯
}
EX0=1;//开中断
}
/**********************T0中断服务程序*******************/
void timer0(void)interrupt 1 using 1
{
static uchar count;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==10)
{
if(Flag_SN_Yellow==1) //测试南北黄灯标志位
{SN_Yellow=~SN_Yellow;}
if(Flag_EW_Yellow==1) //测试东西黄灯标志位
{EW_Yellow=~EW_Yellow;}
}
if(count==20)
{
Time_EW--;
Time_SN--;
if(Flag_SN_Yellow==1)//测试南北黄灯标志位
{SN_Yellow=~SN_Yellow;}
if(Flag_EW_Yellow==1)//测试东西黄灯标志位
{EW_Yellow=~EW_Yellow;}
count=0;
}
}
/*********************主程序开始**********************/
void main(void)
{
Busy_LED=0;
Special_LED=0;
IT0=1; //INT0负跳变触发
TMOD=0x01;//定时器工作于方式1
TH0=(65536-50000)/256;//定时器赋初值
TL0=(65536-50000)%256;
EA=1; //CPU开中断总允许
ET0=1;//开定时中断
EX0=1;//开外部INTO中断
TR0=1;//启动定时
while(1)
{ /*******S0状态**********/
EW_ManGreen=0; //EW人行道禁止
SN_ManGreen=1;//SN人行道通行
Flag_EW_Yellow=0; //EW关黄灯显示信号
Time_EW=EW;
Time_SN=SN;
while(Time_SN>=5)
{P1=S[0]; //SN通行,EW红灯
Display();}
/*******S1状态**********/
P1=0x00;
while(Time_SN>=0)
{Flag_SN_Yellow=1; //SN开黄灯信号位
EW_Red=1; //SN黄灯亮,等待左拐信号,EW红灯
Display();
}
/*******S2状态**********/
Flag_SN_Yellow=0; //SN关黄灯显示信号
Time_SN=SNL;
while(Time_SN>=5)
{P1=S[2];//SN左拐绿灯亮,EW红灯
Display();}
/*******S3状态**********/
P1=0x00;
while(Time_SN>=0)
{Flag_SN_Yellow=1; //SN开黄灯信号位
EW_Red=1; //SN黄灯亮,等待停止信号,EW红灯
Display();}
/***********赋值**********/
EW=EW1;
SN=SN1;
EWL=EWL1;
SNL=SNL1;
展开阅读全文