基于单片机的交通灯控制系统设计 - 图文

更新时间:2024-06-14 22:05:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基于单片机的交通灯控制系统设计

摘 要:对基于单片机的交通灯控制系统进行了设计。系统功能以MCS-51系列单片机作为控制核心,设计并制作交通灯控制系统,东西南北四个方向具有左拐、右拐、直行及行人四种通行指示灯,用计时器显示路口通行转换剩余时间,在特种车辆如119、120通过路口时,系统可转为特种车辆放行,其他车辆禁止通行状态,即特殊情况;在交通高峰期系统可以转为繁忙情况。

在对系统功能分析的基础上,提出了三种设计方案,经比较,选择性能较优的LED动态循环显示方案进行了设计。设计包括硬件和软件两大部分。硬件部分包括单片机最小系统、时间显示、交通灯显示三部分。选用宏晶公司的STC89C52单片机作为控制核心,东西南北四个方向设置了LED时间显示和交通灯显示,时间显示采用两位LED显示器,交通灯显示则采用红、黄、绿色高亮发光二极管来模拟。软件采用了模块化的设计方法,主要分为主程序、定时器中断服务子程序、倒计时显示子程序、交通灯模拟显示子程序四部分。

关键词:交通灯;单片机;LED;

Design of traffic light control system based on SCM

Abstract:自己翻译

1 概述 1.1 交通灯的介绍

1918年诞生的第一盏交通灯只有红绿两色,它是圆形四面投影器,被安装在纽约市五号街的一座高塔上,它的诞生,使城市交通大为改善。

1925年,留学美国的中国电机专家胡汝鼎提出在绿灯之后加个黄灯的设想被采纳,于是诞生了真正意义上的三色交通灯。

传统的交通灯主要由单片机来控制,它主要由红黄绿三色灯组成。工作原理是设置好南北向和东西向的各色灯的亮灭顺序和持续时间来指挥车辆通行,交通灯的发明和使用极大地保障了人民的生命安全。 1.2 课题研究背景与意义

随着经济的增长和人口的增加,人们生活方式不断变化,人们对交通的需求不断增加。城市中交通拥挤、堵塞现象日趋严重,由此造成巨大的经济与时间损失。资料显示,对日本东京268个主要交叉路口的调查估计表明:每年在交叉路口的时间延误,折成经济报失为20亿美元;而在我国北京市,当早晚交通高峰时,交叉路口处的排队长度竟达1000多米,有的阻车车队从一个交叉路口延伸到另一个交叉路口,这时一辆车为通过一交叉路口,往往需要半个小时以上,时间损失相当可观。

我国是一个历史悠久、人口众多的国家,城市数量随着社会的发展不断增多。随着城市化进程的大大加快,诱发的交通需求急剧增长,供需矛盾不断激化,严重的交通问题也随之而来。人、车、路三者关系的协调,已成为交通管理部门需要解决的重要问题之一。城市交通控制系统是用于城市交通数据监测、交通信号灯控制与交通疏导的计算机综合管理系统,它是现代城市交通监控指挥系统中最重要的组成部分。

十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊,这一切要归功于城市交通控制系统中的交通灯控制系统。交通灯控制系统对于疏导交通流

量、提高道路通行能力,减少交通事故有明显效果,使城市交通得以有效管理。

交通灯可以采用PLC、单片机等控制方法。利用单片机实现对交通信号灯的实时控制,只要采用一块单片机,加上简单的接口与驱动放大电路,即可实现,具有成本低,可靠性高的特点。 1.3 课题设计内容

本课题对基于单片机的交通灯控制系统进行设计。以MCS-51系列单片机为控制核心,设计并制作交通灯控制系统,用于十字路口的车辆及行人的交通管理。东西南北四个路口具有左拐、右拐、直行及行人4种通行指示灯,并分别用计时器显示路口通行转换剩余时间,在特种车辆如119、120通过路口时,系统可转为特种车辆放行,其他车辆禁止通行状态;还可以在高峰期还可以转换为繁忙状态。

设计交通灯控制系统硬件电路与软件控制程序,对硬件电路与软件程序分别进行调试,并进行软硬件联调,要求获得调试成功的仿真图。

2 整体设计

2.1方案的选择与论证

根据设计内容要求,提出了如下三种方案:

方案一:采用STC89C52单片机作为控制核心,采用四组高亮红色、黄色、绿色二极管作为东西南北四个路口的通行指示灯;采用四组两位LED数码管作为四个路口的通行倒计时显示器,另外一组两位LED数码管作为特殊情况下的倒计时显示,LED显示采用动态扫描方式,以节省端口数。按以上系统构架设计,单片机端口资源刚好满足要求。方案一设计框图如图2-1所示:

上电复位 P0口 2位LED显示(5组) STC89C52 P2口 手动键盘;东、南、西、北人行道指示灯 P3口 P1口 东南西北主干道指示灯 分组扫描

图2-1 方案一:采用LED动态扫描的交通灯控制系统

方案二:采用STC89C52单片机作为控制器,通行倒计时显示采用16×16点阵LED发光管,左拐、右拐、直行及行人4种通行指示也采用16×16点阵双色LED发光管。方案二设计框图如图2-2所示,LED点阵的列驱动采用74HC595,用串行端口扩展实现,行驱动采用1/16译码器74HC154动态扫描,译码器74HC154生成16条行选通信号线,再经过驱动器驱动对应的行线。每条行线上

需要较大的驱动电流,应选用大功率三极管作为驱动管;方案二设计框图如图2-2所示:

RXD TXD 单片机 I/O口 双色LED点阵显示 (每个路口七个) 列驱动74HC595 电源 行 驱 动 74HC154 图2-2 方案二:采用16×16点阵LED发光管设计的交通灯控制系统

方案三:采用AT89C2051单片机作为控制器,通行倒计时及左拐、右拐、直行、行人通行指示采用单块LCD液晶点阵显示器。

三种方案的特点比较如下:方案一具有电路简单,设计方便,显示亮度高,耗电较少,可靠性高等特点;方案二的图案显示逼真,单片机占用端口资源少,缺点是需要大量的硬件,电路复杂,耗电量大,不太适合于模型制作;方案三设计占用单片机的端口最少,硬件也少,耗电也最少;虽然显示图案也很精美,但由于亮度太暗,晚上还得开背光灯,不够实用。可见方案一优于其他两种方案,因此本设计选用方案一,采用LED动态扫描的方案进行设计。 2.2总体方案 2.2.1工作原理

本设计采用STC89C52RC单片机作为本系统的控制模块,采用单片机内部定时器计时,采用红、黄、绿色高亮发光二极管模拟交通信号指示灯,通过单片机内部程序执行控制红绿灯的亮灭以及数码管倒计时的显示,从而实现十字路口的交通的控制。 2.2.2总体设计框图

复位电路 LED倒计时显示模块 51单片机 按键设 置模块 红绿灯 指示模块 电源 模块

图2-3 交通灯系统总体设计框图

3 仿真软件介绍

本设计用到了Proteus和Keil C51两种软件,两者能完美的结合在一起,实现虚拟的实物效果,为以后的实物焊接提供了保障。 3.1 Proteus简介

Proteus软件是英国Labcenter electronics公司出版的EDA工具软件。Proteus软件除了其具有和其它EDA工具软件的一样的原理布图,还可以电路仿真。不止是对单片机的仿真还对其外围器件进行仿真。其特点是:

实现了单片机仿真和SPICE电路仿真相结合。具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD 系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。支持主流单片机系统的仿真。如68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。

提供软件调试功能。在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在改软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如Keil C51 uVision2等软件。支持大量的外围芯片和存储器,具有强大的原理图绘制功能。总之,该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大。运行Proteus软件出现以下窗口。如图3.1所示

图3.1 Proteus原理图编辑窗口

点击P(元件选择按键),填写元件名称,选择所需要的元件,对于本电路我先添加主电路元件,然后在添加子电路元件,完成后连线,对于不便连接的元件节点,可以采用总线和网络标号的形式。完成后保存,电路图如图3.2所示

图3.2仿真电路图

3.2 KEIL C51 编译器简介

Keil C51软件是Keil Software公司推出的uVision3,是一款可用于多种8051 MCU的集成开发环境(IDE),该IDE同时也是PK51及其它开发套件的一个重要组件。除增加了源代码、功能导航器、模板编辑以及改进的搜索功能外,提供了一个配置向导功能,加速了启动代码和配置文件的生成。此外其内置的仿真器可模拟目标MCU,包括指令集、片上外围设备及外部信号等。其提供逻辑分析器,可监控基于MCU I/O引脚和外设状态变化下的程序变量。编辑的C或汇编文件,分别由C51及A51编译器编译生成目标文件(.OBJ)。目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。ABS文件由OH51转换成标准的HEX文件,以供调试器使用进行源代码调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。

注意晶振的频率,默认的是11.0592MHz,可以根据需要修改。调试时注意PC机与仿真器之间始终保持通信联络,导致独立Keil仿真器上一个指示数据接收的LED不断闪亮。

使用Keil C51时,打开界面,并非即刻能够编辑程序的窗口,需要新建文件和设置,其步骤如下:

打开Keil的操作界面,在“Project”中选择“New uVision Project…”新建一个文件,并命名(注意此时命名时不需要加后缀),如“温湿度”即可,确定后会弹出选择单片机的窗口。在相应的产品里选择所需要的单片机型号,本设计所用的单片机是Atmel AT89S52,则在相应的栏目里选中。然后接下来的窗口选择“是”,然后新建,在页面里面编辑程序,命名,要注意的是这次命名需要加后缀,如“温湿度.c”。

在主窗口侧边栏找到“Target 1”,右击其子标题栏“Source Group 1”选择“Add Files to Group ?Source Group 1?”。选择保存的“温湿度.c”文件添加,并在下拉单点击打开,此时,编译开始,指示灯亮。顺序编译,若出现错误,编译窗口下会出现错误提示,双击错误提示,则插入符号将出现在有错的地方,根据提示对程序进行修改,保存,再编译至无错,否则无法生成“HEX”格式。

在主菜单栏里选择“Project”按出下拉单,选择“Options for Target ?Target 1?”,在该窗口下,将晶振的频率(Xtel (MHz))设置为12MHz,然后选择“Output”在“Create HEX File”前面打钩,OK。在继续编译后出现“create hex file from…”,编译完成,此时文件就可以被单片机识别应用,导入即可。

图3.3 Keil C51软件新建工程界面

4 PROTEL99软件简介

4.1 Protel 99 SE的发展历史

Protel是Protel Technology公司在20世纪80年代末推出的EDA软件,在电子行业中,它当之无愧地排在众多EDA软件的前面,是电子设计者的首选软件。

20世纪90年代中期,Protel推出基于Windows 95的3.X版本,采用了新颖的主从式结构,但在自动布线方面却没有出众的表现,而且是16位与32位的混合型软件,运行不太稳定。

1998年,Protel公司推出了新版本的Protel 98,极大地增强了自动布线能力,从而获得了业内人士的一致好评。1999年,Protel公司又推出了更新一代的电子线路设计系统——Protel 99。

Protel 99 SE是Protel 99的增强版本,在文件组织方面既可以采用传统的Windows文件格式也可以采用Access数据库文件格式,同时具有更强大的功能和良好的操作性,给设计者的工作带来了更大的便利。 4.2 Protel 99 SE的主要特点

Protel 99 SE是一个Client/Server型的应用程序,它提供了一个基本的框架窗口和相应的Protel 99 SE组件之间的用户接口,在运行主程序时各服务器程序可在需要的时间调用,从而加快了主程序的启动速度,而且极大地提高了软件本身的可扩展性。Protel 99 SE中的这些服务程序基本上可以分为5大组件,即原理图设计组件、PCB设计组件、布线组件、可编程逻辑器件组件和仿真

组件。其中原理图设计组件和PCB设计组件是一般设计工作中的重点,而其他组件可以说是为这两个组件服务的。

图2-1 Protel99SE打开界面

4.2.1 原理图设计组件

包括电路图编辑器、电路图元件库编辑器和各种文本编辑器。为用户提供了智能化的高速原理图编辑方法,能够准确地生成原理图设计输出,具有自动化的连线工具,同时具有强大的电气规则检测(ERC)功能。其主要特点归纳如下。

1.模块化的原理图设计

2.具有强大的原理图编辑功能 3.功能强大的电气检测

4.完善的库元件编辑和管理功能 5.同步设计功能 4.2.2 PCB设计组件

进行电路设计最终是要设计出一个高质量的可加工的PCB,这是一个电子产品的基础。因而PCB设计系统的功能往往是用户在选用EDA软件时最关心的,而Protel 99 SE在这方面做出了突出的表现。

1.具有32位高精度设计系统 2.丰富而灵活的编辑功能

3.功能完善的元件封装编辑和管理器 4.强大的布线功能

5.完备的设计规则检查(DRC)功能

4 系统设计

4.1 硬件设计部分

采用LED动态扫描的交通灯控制系统电路原理图见附录。系统由控制模块、通行灯显示模块、时间显示模块、电源模块四部分组成。 4.2芯片介绍

4.1.1单片机——STC89C51

STC89C52是一种低功耗、高性能CMOS八位微控制器,具有8K在系统可编程Flash存储器,使用ATMEL公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。片上Flash允许ROM在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使其为众多嵌入式控制应用系统提供灵活的解决方案。

1 主要特性

(1) 与MCS-51单片机产品兼容;

(2) 8K字节在系统可编程Flash ROM存储器; (3)256字节RAM; (4) 1000次擦写周期;

(5) 全静态操作:0Hz~33Hz; (6) 三级加密程序存储器; (7) 32个可编程I/O口线; (8) 三个16位定时器/计数器; (9) 八个中断源;

(10) 全双工UART串行通道; (11) 低功耗空闲和掉电模式; (12) 掉电后中断可唤醒;

(13) 看门狗定时器T0、T1、T2; (14) 双数据指针; (15) 掉电标识符。

如图4.1所示STC89C52芯片的引脚图

图4.1 STC89C52引脚

VCC:电源 GND:地

P0口:8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下,P0具有内部上拉电阻。在Flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。

P1口:具有内部上拉电阻的8位双向I/O口,P1输出缓冲器能驱动4个TTL逻辑电平。对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流。此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和定时器/计数器2的触发输入(P1.1/T2EX),具体如表3-1所示。在Flash编程和校验时,P1口接收低8位地址字节。

P2口:具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动四个TTL逻辑电平。对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流。在方位外部程序存储器或用16位地址读取外部数据存储器时,P2口送出高八位地址。在Flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。

P3口:P3口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动四个TTL逻辑电平。对P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流。

P3口亦作为STC89C52特殊功能(第二功能)使用,如下表所示。

引脚号 P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7 第二功能 RXD(串行输入) TXD(串行输出) INT0(外部中断0) INT1(外部中断1) T0(定时器0外部输入) T1(定时器1外部输入) WR(外部数据存储器写选通) RD(外部数据存储器读选通) 表4.1 P3口的特殊功能

图4.2 单片机IO口

RST:复位输入。晶振工作时,RST脚持续2个机器周期高电平将使单片机复位。DISRTO默认状态下,复位高电平有效。

ALE/PROG:控制信号(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。在Flash编程时,此引脚(PROG)也用作编程输入脉冲。 在一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。然而,特别强调,在每次访问外部数据存储器时, ALE脉冲将会跳过。如果需要,通过将地址为8EH的SFR的第0位置“1”,ALE操作将无效。这一位置“1”,ALE仅在执行MOVX或MOVC指令时有效。否则,ALE将被微弱拉高。这个ALE使能标志位(地址为8EH的SFR的第0位)的设置对微控制器处于外部执行模式下无效。

PSEN:外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。当STC89C52从外部程序存储器执行外部代码时,PSEN在每个机器周期被激活

两次,而在访问外部数据存储器时,PSEN将不被激活。

EA/VPP:访问外部程序存储器控制信号。为使能从0000H到FFFFH的外

部程序存储器读取指令,EA必须接地。

为执行内部程序指令,EA应该接VCC。 在Flash编程期间,EA也接收12伏VPP电压。

XTAL1:振荡器反相放大器和内部时钟发生电路的输入端。 XTAL2:振荡器反相放大器的输出端。 4.1.2 数码管

数码管有共阳和共阴之分,根据单片机连接电路,可以计算出数码管的真值表,在编程时调用数码管真值表就可以控制数码管显示相应的信息。

图4-2 数码管引脚图

4.2 模块功能介绍 4.2.1 控制模块

控制模块电路如图4-4所示。主控制器采用STC89C52。STC89C52是宏晶公司生产的一款性能稳定的8位单片机,具有1个8KB的Flash程序存储器,1个512字节的RAM,3个16位的定时/计数器,4个8位的双向可位寻址I/O端口, 1个串行口,6个中断源,两个中断优先级。

STC89C52的P1口用于控制东西南北通行灯,P2口用于控制通行灯,P0口用于2位LED显示器的段码控制,P2口用于,2位LED显示器的位码控制,手动/自动转换采用P3.7扳键。EA/VPP接+5V电源端。晶振及复位按典型电路设计,元器件参数如图2-3中所示。晶振频率为12MHz。

图2-3 控制模块原理图

4.2.2 通行灯显示模块

通行灯显示模块如图2-4所示。通行灯指示采用高亮度共阴红、黄、绿色发光二极管,左拐、直行、右拐及行人各一组。发光二极管的共阴极通过电阻接地,阳极接P1口或P3口(东西南北为P1口,人行道为P2口)。

图2-4 通行灯和时间显示模块

4.2.3 时间显示模块

通行剩余时间显示模块如图2-4所示(以北路口为例)。

路口通行剩余时间采用高亮红色共阴LED发光数码管显示,采用共阴数码管,如用单片机吸收电流驱动,列扫描驱动使用三级管,按每段6mA电流算,全显示字型“8”时,每个数码管需6mA×8=48mA。由于时间显示每个路口相同,4组需192mA,因此设计中采用反相器以保护单片机的端口。 4.2.4 复位电路模块

单片机复位电路采用按键复位电路,当按键S1按下电容C3充电,RES端口持续两个机器周期后单片机实现复位,其复位电路如下图所示:

图3.5 按键复位电路

4.2.5 电源电路

电源电路如图2-5所示。整个系统采用的电源电压只需+5V电压,将交流电经变压器变换为15V交流电,再用整流桥得到13.5V左右的直流电,采用不可调的3端稳压器件LM7805将电源稳定在5V直流输出。

图2-5 系统电源电路

4.3原理图与PCB电路图

图4-4 交通灯系统原理图

图4-5 交通灯PCB图

图4-6 交通灯PCB三维视图

5 软件设计部分

软件介绍

编程软件采用的是keil uvision2软件,程序采用C语言编程。

软件部分经本人调试可以运行,能够正确显示结果。具体模块由一个C(kellen.C)主函数文件和一个h文件构成。

H文件如下所示:

reg51.h;(8051的相关参数初始化) 5.3 软件设计算法模拟

本系统主要实现由51单片机对交通灯模组进行控制,交通灯模组模拟实际的十字路口情况,分析其规律如下:

图1 模拟交通灯控制板布局示意图

图中:

—— 表示2位7段的LED数码管(用作倒计时显示); —— 表示双色LED(用作红黄绿灯);

—— 表示小按键(用来模拟车流)。

这是一个典型的十字路口,分别用1、2、3、4表明四个流向的主车道,用L、S、R、P分别表示各主车道的左行车道、直行车道、右行车道以及人行横道。通过分析得知,除了四个右行车道外,在同一时间,最多只能有两个车道通行,如1L、1S通行时,其它车道都会被阻断。所以在设计红绿灯时,可以两两组合,共有四组(如lL-1S、2L-2S、3L-3S、4L-4S);而各车道的红灯时间和人行横道通停时间都由这四个组合的绿灯时间决定。通行顺序如下图所示。

图2-2 交通通行顺序

5.2主程序框图

开始 系统初始化 1L、1S、3R、4R、2P通信 各路口倒计时开始 2L、2S、4R、1R、3P通信 各路口倒计时开始 3L、3S、1R、2R、4P通信 各路口倒计时开始 4L、4S、2R、3R、1P通信 各路口倒计时开始 结束

图5-1 主程序流程图

5.3主函数解析 void main(void) {

Busy_LED=0; Special_LED=0; timer0_init(); int0_init(); ext_init();

while(1) {

/*******S0状态**********/ SN_ManRed=0;

SN_ManGreen=1; //SN人行道通行 EW_ManRed=1; //EW人行道禁止 EW_ManGreen=0;

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开黄灯信号位 P1=P1|0x08; //保持EW红灯 Display(); } /*******S2状态**********/ SN_ManRed=1; //SN人行道禁止 SN_ManGreen=0; EW_ManRed=1; //EW人行道禁止 EW_ManGreen=0; 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开黄灯信号位 P1=P1|0x08; //保持EW红灯 Display(); } /***********赋值*********/ EW=EW1; SN=SN1; EWL=EWL1; SNL=SNL1;

/*******S4状态**********/ SN_ManRed=1; //SN人行道禁止 SN_ManGreen=0; EW_ManRed=0;

EW_ManGreen=1; //EW人行道通行 Flag_SN_Yellow=0; //SN关黄灯显示信号 Time_EW=SN; Time_SN=EW; while(Time_EW>=5) { P1=S[4]; //EW通行,SN红灯 Display(); } /*******S5状态**********/ P1=0X00; while(Time_EW>=0) { Flag_EW_Yellow=1;//EW开黄灯信号位 P1=P1|0x80; //保持SN红灯 Display(); } /*******S6状态**********/ SN_ManRed=1; //SN人行道禁止 SN_ManGreen=0; EW_ManRed=1; //EW人行道禁止 EW_ManGreen=0; Flag_EW_Yellow=0;//EW关黄灯显示信号 Time_EW=EWL; while(Time_EW>=5) { P1=S[6]; //EW左拐绿灯亮,SN红灯 Display(); } /*******S7状态**********/ P1=0X00; while(Time_EW>=0) { Flag_EW_Yellow=1; //EN开黄灯信号位 P1=P1|0x80; //保持SN红灯 Display(); } /***********赋值********/

EW=EW1; SN=SN1; EWL=EWL1; SNL=SNL1; } }

6 仿真与调试

打开用Proteus软件编辑好的电路图,双击单片机导入程序,如图6-1所示。

图6-1 程序导入界面

导入程序仿真后,如图6-2所示,其结果显示编辑的程序,以及电路图符合设计要求。

图6-2 仿真结果图

图6-3 稳压电源仿真电路

7 总结

本次专业课程设计:基于单片机的交通灯控制系统,已经基本完成。通过这次毕业设计,我掌握了一些实践性质的设计的基本步骤:首先,明确设计任务,并且要对市场上控制器要有初步了解,还要知道前人做了哪些工作,本设计方案的可利用程度等等。其次,要对整个设计系统做深入的方案论证、计算并且结合现有实际条件,确立自己的设计方案,进而,就是对自己确立的方案进行硬件实现,包括所用原器件选型,以及控制部分整个单片机系统的硬件选型与设计,并用Protel绘制出整个系统总体电路图。接着我们就进入到软件编程设计了,要画出各部分的大体流程图,弄清楚各个部分实现的功能,最后对整个系统进行软件编程实现。到此为止,这个系统的设计基本上已经完成了,最后就是要经过生产实践的检验,确定我们的设计是否符合实际要求,具有可利用价值。

本系统采用的单片机控制,实现对交通灯信号以及时间的显示,用单片机C语言编程,尽可能多的利用程序实现功能,以减少硬件电路,提高了系统的可靠性和可扩展性。整个设计过程同时也是一个很好的学习机会,例如运用Protel绘制电路图,经过这次设计后自己在这方面有很大地进步,画图的熟练度有了明显的提高;在查找资料方面,认识到:图书资料、网络资料和期刊等都很有价值,以后做设计的时候要注意查找完整的资料,不要只偏重一个方面。当然整个设计过程学到的知识和经验远远比运用Protel、学会查找多方资料多得多,这些对于自己以后的学习和工作将受益匪浅。但必须认识到的是,在设计中也存在着不足之处,例如单片机控制系统在可靠性方面相对于可编程控制器(PLC)控制系统略为欠缺,并且自己深入实践不够,所做的系统也不是很完善。但是我想通过以后的学习和努力一定会有所提高,能够做出更好的设计。

虽然到现在为止,有些东西我还是不懂和不理解,但我学会了面对问题,自己尽量解决,先分析,然后解决,一条道通不过然后尝试着其它的方法,最终把问题克服掉。最重要的是锻炼了和同学的协作完成任务,提高了合作能力。我感觉这是这次设计过程中收获最大的,这将是我未来的工作中用之不尽宝贵的经验。

总体来说,经过这次课程设计,我受益良多,也得到了很多经验。我明白了

只有自己真正接触尝试了,才知道自己的真实水平。也使我看清了自己的知识水平与各种综合能力,找出了自己的不足和差距。我将明确自己在今后要奋斗的目标与方向,勇往直前。 致谢

感谢老师、学校、同学、父母等。自己写

参考文献

1.周润景,张丽娜.基于PROTEUS的电路及单片机系统设计与仿真.北京航空航天大学出版社,2006

2.李朝青.单片机原理及接口技术.北京航空航天大学出版社.2009

3.沈德金,陈粤初.MCS-51系列单片机接口电路与应用程序实例.北京航空航天大学出版社.1990

4.数字电子技术基础.高等教育出版社.2001.

8.胡汉才.单片机原理及接口技术.清华大学出版社.1996.

9.何利民.MCS-51系列单片机应用系统设计系统配置与接口技术[M].北京:北京航空航天大学出版社,2001

10.百度、谷歌、电子发烧友、VeryCD互联网共享等网站。

附录 源程序

/*********************************************************** 十字路口交通灯控制 C 程序

***********************************************************/ #include

typedef unsigned char uint8; typedef unsigned int uint16;

/*****定义控制位*******************************************/

sbit Time_Show_LED2 = P2^5; //Time_Show_LED2(直行时间显示)控制位 sbit Time_Show_LED1 = P2^4; //Time_Show_LED1(直行时间显示)控制位

sbit EW_LED2 = P2^3; //东西数码管个位控制

sbit EW_LED1 = P2^2; //东西数码管十位控制 sbit SN_LED2 = P2^1; //南北数码管个位控制 sbit SN_LED1 = P2^0; //南北数码管十位控制 sbit SN_Yellow = P1^6; //SN黄灯 sbit EW_Yellow = P1^2; //EW黄灯

sbit Nomor_Button = P3^5; //交通正常按键 sbit Busy_Btton = P3^6; //交通繁忙按键 sbit Special_Btton = P3^7; //交通特殊按键 sbit Special_LED = P2^6; //交通特殊指示灯 sbit Busy_LED = P2^7; //交通繁忙指示灯

sbit EW_ManGreen = P3^0; //EW人行道绿灯 sbit SN_ManGreen = P3^1; //SN人行道绿灯 sbit EW_ManRed = P3^3; //EW人行道红灯 sbit SN_ManRed = P3^4; //SN人行道红灯

bit Flag_SN_Yellow; //SN黄灯标志位 bit Flag_EW_Yellow; //EW黄灯标志位 char Time_EW; //东西方向倒计时单元 char Time_SN; //南北方向倒计时单元

uint8 EW = 60,SN = 40,EWL = 19,SNL = 19; //程序初始化赋值,正常模式 uint8 EW1 = 60,SN1 = 40,EWL1 = 19,SNL1 = 19; //用于存放修改值的变量

code uint8 table[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //1~~~~9段选码

code uint8 S[8] = {0x28,0x48,0x18,0x48,0x82,0x84,0x81,0x84}; //交通信号灯控制代码

/**********************延时子程序**************************/ void Delay(uint8 a) {

uint8 i; i = a;

while(i--); }

/*****************显示子函数******************************/ void Display(void) {

uint8 h,l;

h = Time_EW/10; l = Time_EW; P0 = table[l];

EW_LED2 = 1; //点亮EW_LED2

Delay(2);

EW_LED2 = 0; //熄灭EW_LED2 P0 = table[h];

EW_LED1 = 1; //点亮EW_LED1 Delay(2);

EW_LED1 = 0;

h = Time_SN/10; l = Time_SN; P0 = table[l];

SN_LED2 = 1; //点亮SN_LED2 Delay(2);

SN_LED2 = 0; P0 = table[h]; SN_LED1 = 1; //点亮SN_LED1 Delay(2);

SN_LED1 = 0;

h = EW1/10; l = EW1; P0 = table[l];

Time_Show_LED1 = 1; //点亮Time_Show_LED1 Delay(2);

Time_Show_LED1 = 0; P0 = table[h];

Time_Show_LED2 = 1; //点亮Time_Show_LED2 Delay(2);

Time_Show_LED2 = 0; }

/**********************外部0中断服务程序******************/

void ineterrupt_extern0(void) interrupt 0 {

EX0=0; //关中断

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 uint8 counter; TH0 = 0x3C;

TL0 = 0xB0; //定时器定时20ms重新装入初值 counter++;

if (counter == 10) {

if (Flag_SN_Yellow == 1) //测试南北黄灯标志位 { SN_Yellow = ~SN_Yellow; }

if (Flag_EW_Yellow == 1) //测试东西黄灯标志位 { EW_Yellow = ~EW_Yellow; } }

if (counter == 20) {

Time_EW--;

Time_SN--;

if (Flag_SN_Yellow == 1) //测试南北黄灯标志位 {SN_Yellow = ~SN_Yellow;}

if (Flag_EW_Yellow==1) //测试东西黄灯标志位 {EW_Yellow = ~EW_Yellow;} counter = 0; } }

void timer0_init() {

TMOD |= 0x01;

TMOD &= 0x01; //定时器0工作方式设置 TH0 = 0x3C;

TL0 = 0xB0; //定时器定时20ms装初值 TR0 = 1; //打开定时器0 }

void int0_init() //定时器0初始化子函数 {

ET0 = 1; //定时器0中断使能打开 EA = 1; //CPU总中断使能打开 }

void ext_init() //外部中断初始化子函数 {

IT0=1; //INT0负跳变触发 EX0=1; //开外部INTO中断 }

/*********************主程序开始***********************/ void main(void) {

Busy_LED=0; Special_LED=0; timer0_init(); int0_init(); ext_init();

while(1) {

/*******S0状态**********/ SN_ManRed=0;

SN_ManGreen=1; //SN人行道通行 EW_ManRed=1; //EW人行道禁止 EW_ManGreen=0;

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开黄灯信号位 P1=P1|0x08; //保持EW红灯 Display(); }

/*******S2状态**********/ SN_ManRed=1; //SN人行道禁止 SN_ManGreen=0; EW_ManRed=1; //EW人行道禁止 EW_ManGreen=0; 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开黄灯信号位 P1=P1|0x08; //保持EW红灯 Display(); }

/***********赋值*********/ EW=EW1; SN=SN1; EWL=EWL1; SNL=SNL1;

/*******S4状态**********/ SN_ManRed=1; //SN人行道禁止 SN_ManGreen=0; EW_ManRed=0;

EW_ManGreen=1; //EW人行道通行 Flag_SN_Yellow=0; //SN关黄灯显示信号 Time_EW=SN; Time_SN=EW; while(Time_EW>=5) { P1=S[4]; //EW通行,SN红灯 Display(); }

/*******S5状态**********/ P1=0X00;

while(Time_EW>=0) {

Flag_EW_Yellow=1;//EW开黄灯信号位 P1=P1|0x80; //保持SN红灯 Display(); }

/*******S6状态**********/ SN_ManRed=1; //SN人行道禁止 SN_ManGreen=0; EW_ManRed=1; //EW人行道禁止 EW_ManGreen=0; Flag_EW_Yellow=0;//EW关黄灯显示信号 Time_EW=EWL; while(Time_EW>=5) { P1=S[6]; //EW左拐绿灯亮,SN红灯 Display(); }

/*******S7状态**********/ P1=0X00;

while(Time_EW>=0) {

Flag_EW_Yellow=1; //EN开黄灯信号位 P1=P1|0x80; //保持SN红灯 Display();

}

}

}

/***********赋值********/ EW=EW1; SN=SN1; EWL=EWL1; SNL=SNL1;

本文来源:https://www.bwwdw.com/article/x5y3.html

Top