第一篇:基于单片机AT89C51的交通灯控制器的设计
2014届本科生毕业设计
分类号:TP368.1
题目:基于单片机AT89C51的交通灯控制器的设计
姓 名: 张建猛 学 号 : 2010080870 学 院: 机械与电子工程学院 专 业: 自动化 指导教师职称: 胡波 刘明
指导教师职称: 助教(硕士)工程师
2014-05-11
摘 要
本文采用AT89C51单片机芯片为核心控制器件设计的交通灯控制器,该系统主要包括单片机最小系统,按键,数码管显示,交通灯演示系统。系统主要具有有人行道,交通灯的基本功能,倒计时,紧急情况处理,根据具体情况手动控制等功能。通过AT89C51并接数码管和发光二极管来实现交通灯的变化规律,P1口设置红,绿灯点亮时间功能的实现;红绿灯循环点亮,倒计时剩余10秒时黄灯闪烁警示。本系统的研发周期短,可靠性高,实用性,操作简单,维护方便,扩展功能强大。本系统软硬件相结合,通过Proteus软件仿真,基本实现了交通信号灯的模拟。
关键词:AT89C51;数码管;交通灯控制器
ABSTRACT In this paper, AT89C51 chip as the core control device design traffic light controller, the system includes smallest single-chip system, keyboard, digital display, traffic lights demonstration system.System mainly has a sidewalk, the basic functions of traffic lights, countdown, emergency treatment, according to the specific circumstances of manual control and other functions.And connected via AT89C51 LED digital tube and realized traffic lights change, P1 port settings of red, green lighting time function is implemented;traffic light cycle light, countdown 10 seconds remaining yellow flashing warning.The system development cycle is short, high reliability, practicality, simple operation, easy maintenance, expansion and powerful.This system combines hardware and software, Through the Proteus Software Simulation,the basic realization of traffic lights simulation.Keywords: AT89C51;System;Digital pipe;Traffic light controller
目录
绪
论...........................................................................................................................1 1.整体方案设计...........................................................................................................2 1.1 方案分析.........................................................................................................2 1.2 方案确立.........................................................................................................3 2.系统的硬件设计.......................................................................................................3
2.1设计原理及方法..............................................................................................3 2.2 AT89C51单片机最小系统..............................................................................4 2.2.1 复位电路..............................................................................................4 2.2.2 时钟电路..............................................................................................5 2.2.2 EA脚的功能及接法.............................................................................6 2.3其它硬件模块介绍及连接..............................................................................7
2.3.1 倒计时显示模块.................................................................................7
2.3.2 交通灯显示模块................................................................................8
2.3.3 按键控制模块......................................................................................9 2.3.4 电源模块............................................................................................10 3.系统的软件设计.....................................................................................................10
3.1系统相关参数计算........................................................................................10 3.1.1 T0的计数初值...................................................................................10 3.1.2 倒计时显示的理论分析....................................................................10 3.1.2 交通灯状态显示的理论分析............................................................11 3.2系统主程序设计............................................................................................11 4.系统的 Proteus软件仿真....................................................................................12 4.1 Proteus仿真图............................................................................................12 4.2 Proteus仿真的结果分析............................................................................12 结束语.........................................................................................................................14 参考文献.....................................................................................................................14 致 谢.........................................................................................................................15 附录:程序源代码.....................................................................................................16
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
绪 论
随着人口的迅速增长,道路资源的有限性和交通工具爆炸性的发展,城市交通正面临着严峻考验,因此造成日益严重的交通问题,每天的交通拥堵成了家常便饭但又不得不忍受。在这种情况下,与我国城市道路交通的实际情况相结合,开发出适合我们自身特点的智能信号灯控制系统已成为一个主要的任务。一个好的交通灯控制系统,将给道路拥堵,违章行驶等方面给予技术创新。随着电子技术的发展,采用单片机技术,能够智能管理交通灯,已成为目前广泛使用的方法。
在人类的生活,工作环境中,交通扮演着极其重要的角色,人们的出行与交通时时刻刻打着交道。城市交通控制系统是基于城市交通信号控制技术为主导的发展,与汽车行业的发展并行。在其发展的不同阶段,由于交通出现的各种矛盾,人们总是试图把各个历史阶段的最新科技成果应用到交通自动控制中,从而促进交通自动控制技术不断发展。
早在1850年,城市交叉路口处安全和拥堵问题引起人们的关注,全球第一个自动交通灯诞生,打开城市交通控制的序幕。在1868年,英国工程师娜奕特在伦敦西部威斯敏斯特街口安装一个红色和绿色煤气照明灯,用来控制交叉路口的马车通行,但一次煤气爆炸事故致使交通信号灯消失了近半个世纪。1914年,美国克利夫兰,纽约和芝加哥重新出现的交通信号灯,他们使用电动驱动,与现在意义的交通信号灯几乎是一样的。随着时代的发展,各种运输方式和交通管制的需要,第一光名副其实的三色灯(红,黄,绿)出生于1918年。它的周围是三色圆形投影机被安装在纽约市五号街一座高塔上,由于它的诞生,城市交通大大改善。
在近一个世纪的发展,道路交通信号控制系统经历了一个手动到自动,从固定到灵活配时,从无感应控制到有感应控制,从单点控制到干线控制,从区域控制到网络控制的长期过程。
交通网络是城市的动脉,是一个城市的生活经济水平,工业文明的象征。交通关系到人民对财产,安全和时间相关的利益。凭借优良科学的交通控制技术对资源物流和人们出行是非常有价值的,确保交通安全线的畅通,才能确保舒适的出行,物流按时到位,甚至是生命通道延伸。为了确保安全,高效的交通秩序,除了制定一系列的交通规则,而且还必须通过一定的技术手段来实现。随着单片机和传感器技术的迅速发展,自动检测领域发生了翻天覆地的变化,交通自动检测控制研究已经取得了显着的进步,必将以其优良的性能价格比,逐步取代传统的交通控制措施。
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
1.整体方案设计
1.1 方案分析
交通灯一般设在城市道路的十字路口,可以分为东西方向(主干道)和南北方向(次干道),东西南北四个路口均设有有红绿黄3种灯和1个二位数码显示管。在某一时刻规定只有一个方向可以通行,另一方向被禁行,状态经过一定的过渡时间,将通行方向和禁行方向相互对换。其具体状态如下图所示。(白色表示灭)。通过具体的路口交通灯状态的演示分析我们可以把这四个状态归纳如图1:
图1 交通灯状态图
·东西方向(主干道)红灯灭,同时绿灯亮,南北方向(次干道)黄灯灭,同时红灯亮,倒计时显示60秒。在此种状态下,东西方向(主干道)允许通行,南北方向(次干道)禁止通行。
·东西方向(主干道)绿灯灭,同时黄灯闪烁,南北方向(次干道)红灯亮,倒计时显示10秒。在此种状态下,除了正在通行中的车辆外,其他所有的车辆都应该等待状态转换。
·南北方向(次干道)红灯灭,同时绿灯亮,东西方向(主干道)黄灯灭,同时红灯亮,倒计时50秒。在此种状态下,东西方向(主干道)禁止通行,南北向允许通行。
·南北方向(次干道)绿灯灭,同时黄灯闪烁,东西方向(主干道)红灯亮,倒计时10秒。在此种状态下,除了正在通行中的车辆外,其他所有车辆都应该等待状态转换。
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
1.2 方案确立
本设计系统以AT89C51单片机为控制核心,连接成最小系统,由倒计时显示模块、交通灯显示模块、按键开关控制模块组成。软件部分使用的是C 语言编程,由软件设置交通灯的初始时间,东西方向(主干道)通行60秒,南北方向(支干道)通行50秒,数码管采用动态显示,P0口送字形码,P2口送字位选通信号,通过单片机的P1口控制各种信号灯的点亮与熄灭,采用中断方式实现各按键的功能。
2.系统的硬件设计
2.1 设计原理及方法
本设计采用模块化的分层次设计方法,以单片机AT 89C 51为控制核心,连接成最小系统,由倒计时显示模块、交通灯显示模块、按键开关控制模块等组成。系统的总体框图如下所示。
图2 交通灯控制器框图
本系统采用AT89C51单片机及外围器件构成最小控制系统,12个发光二极管分成4组红绿黄三色灯构成信号灯指示模块,4个数码管东西南北方向各一个构成倒计时显示模块,通过四个按键K0、K1、K2、K3模拟控制交通灯东西通行,南北通行,返回,紧急情况各个交通灯工作情况之间相互转化。
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
2.2 AT89C51单片机最小系统
单片机最小系统一般有晶振、复位、电源、系统的输入控制、输出显示,以及其他外围模块(如通信、数据采集等)等模块组成。2.2.1 复位电路
单片机复位电路原理是在单片机的复位引脚RST上外接电阻和电容,实现上电复位。当复位电平持续两个机器周期以上时复位有效。复位电平的持续时间必须大于单片机的两个机器周期。具体数值可以由RC电路计算出时间常数。复位电路由手动复位和上电复位两部分组成。
(1)上电复位电路要求接通电源后,通过外部电容充电来实现单片机自动复位操作。上电瞬间RESET引脚获得高电平,随着电容的充电,RERST引脚的高电平将逐渐下降。RERST引脚的高电平只要能保持足够的时间(2个机器周期),单片机就可以进行复位操作。
(2)手动复位:手动复位就是在复位电容上并联一个开关,当开关按下时电容被放电、RST也被拉到高电平,而且由于电容的充电,会保持一段时间的高电平来使单片机复位。单片机复位期间不产生ALE和PSEN信号,即ALE=1和PSEN=1。这表明单片机复位期间不会有任何取指操作。
图3 单片机手动复位电路
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
2.2.2 时钟电路
单片机系统里都有晶振,在单片机系统里晶振作用非常大,全称叫晶体振荡器,它结合单片机内部电路产生单片机所需的时钟频率,单片机晶振提供的时钟频率越高,那么单片机运行速度就越快,单片机的一切指令的执行都是建立在单片机晶振提供的时钟频率。单片机晶振的作用是为系统提供基本的时钟信号。单片机的时钟电路由外接的一只晶振和两只起振电容,以及单片机内部的时钟电路组成,晶振的频率越高,单片机处理数据的速度越快,系统功耗也会相应增加,稳定性也会下降。
单片机的时钟电路设计有两种方式,一种是内部时钟方式,一种是外部时钟方式。
在内部时钟方式下单片机内部的高增益、反相放大器通过XTAL1、XTAL2外接作为反馈元件的外部晶体管振荡器与电容组成的并联谐振回路构成一个稳定的自激振荡器,向内部时钟电路提供振荡时钟。振荡器的频率主要取决于晶体的振荡频率。外部时钟方式是把外部已有的时钟信号引入到单片机内。此方式常用于多片单片机同时工作,以便于各单片机的同步。一般要求外部信号高电平的持续时间大于20μs,且为频率低于12MHz的方波。本设计采用内部时钟方式,单片机系统常用的晶振频率有6MHz、11.0592MHz、12MHz、本系统采用11.0592MHz晶振,电容选22pF或30pF均可。
图4 单片机时钟电路
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
2.2.2 EA脚的功能及接法
AT89C51 单片机的EA/VPP(31 脚)是内部和外部程序存储器的选择管脚。当EA 保持高电平时,单片机访问内部程序存储器;当EA 保持低电平时,则不管是否有内部程序存储器,只访问外部存储器。由于现在单片机内部的flash容量都很大,因此基本都是从内部的存储器读取程序,即不需要外接ROM来存储程序,因此,EA脚必须接高电平。
图5 单片机最小系统
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
2.3 其它硬件模块介绍及连接 2.3.1 倒计时显示模块
系统要求南北和东西方向的信号灯时间不一样,所以就利用单片机的P0口送出数据的段码,位选信号用P2口送出,用动态扫描的方法显示东西、南北的倒计时间。7段数码管一般由8个发光二极管组成,其中由7个细长的发光二极管组成数字显示,另外一个圆形的发光二极管显示小数点。当发光二极管导通时,相应的一个点或一个笔画发光。控制相应的二极管导通,就能显示出各种字符。本设计采用共阴数码管,需要接上470欧上拉电阻以提供足够大的电流来驱动数码管,数码管的每段的电流是约10毫安。
图6 数码管显示模块
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
2.3.2 交通灯显示模块
本系统利用单片机的P1口来驱动和控制各种信号灯的燃亮和燃亮时间,在实际中,交通灯的信号灯需要用高电压控制,在这里我们只是模拟一下它的控制信号,所以我们就只用单片机的信号引脚直接来控制发光二极管。发光二极管是半导体二极管的一种,可以把电能转化成光能,常简写为LED。发光二极管与普通二极管一样是由一个PN结组成,也具有单向导电性。当给发光二极管加上正向电压后,从P区注入到N区的空穴和由N区注入到P区的电子,在PN结附近数微米内分别与N区的电子和P区的空穴复合,产生自发辐射的荧光。不同的半导体材料中电子和空穴所处的能量状态不同。当电子和空穴复合时释放出的能量多少不同,释放出的能量越多,则发出的光的波长越短。常用的是发红光、绿光或黄光的二极管。发光二极管的反向击穿电压约5伏。它的正向伏安特性曲线
很陡,使用时必须串联限流电阻以控制通过管子的电流。
图7 交通灯模块
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
2.3.3 按键控制模块
本系统设置了有4个键:K0键,K1键,K2键,K3键。每个按键一端接地,另一端接上二极管。低电平有效,当按键按下端口接地,单片机捕获到低电平,从而得到相应的输入信息。本系统采用了二极管做开关,是为了防止有一按键被按下3根线同时被低,中断无效。二极管在正向电压作用下电阻很小,处于导通状态,相当于一只接通的开关;在反向电压作用下,电阻很大,处于截止状态,如同一只断开的开关。利用二极管的开关特性,可以组成各种逻辑电路。
程序开始运行先东西段通行、南北段禁止60s,后南北段通行、东西段禁止50s,依此循环。系统分三种工作模式:南北通行模式、东西通行模式、返回模式、紧急情况模式,并且通过四个按键K0、K1、K2、K3实现之间的相互转化。
图8 按键控制模块
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
2.3.4 电源模块
单片机工作时需要的+5V电压,所以在设计电源电路时,需要一个电子元件能提供+5V电压,由于78L05能够提供5V电压的三端稳压电源,78L05一脚为电源输入端,二脚为公共接地端,三脚即为我们所需要的+5V电压输出端.本系统采用典型的78L05提供电压的电路,即在78L05的1脚和公共接地端(即2脚)之间接入0.3μF的电容,在公共接地端和三脚+5V电压输出端之间接入0.1μF的电容.图9 电源模块
3.系统的软件设计
3.1 系统相关参数计算 3.1.1 T0的计数初值
T0的计数初值:X=216-12*50*1000/12=15536=3CB0H 3.1.2 倒计时显示的理论分析
倒计时显示的理论分析:利用定时器中断,设TH0=TH1=(65536-50000)/256,即每0.05秒中断一次。每到第20次中断即过了20*0.05秒=1秒时,使时间的计数值减1,便实现了倒计时的功能。
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
3.1.2 交通灯状态显示的理论分析
状态灯显示的理论分析:黄灯闪烁同样可以利用定时器中断。每到第10次中断即过了10*0.05秒=0.5秒时,使黄灯标志位反置,即可让黄灯1秒闪烁一次。
3.2 系统主程序设计
本系统采用AT89C51单片机实现交通灯的控制,程序的编写用C语言来完成。系统控制程序可以分为若干模块:初始化程序,按键开关控制程序,交通灯转换控制程序,LED数码管显示程序,按键消抖动程序,延时程序,中断服务子程序等。系统相应的程序流程如图所示。
图10 程序流程图
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
4.系统的 Proteus软件仿真
4.1 Proteus仿真图
交通灯控制系统的仿真是通过 proteus 软件实现的交通灯控制系统仿真效果,仿真如下图9所示:
图11 仿真图
4.2 Proteus仿真的结果分析
Proteus仿真实现东西方向和南北方向的十字路口的车辆相互交替通过,东西方向(主干道)每次通行时间设置为60秒、南北方向(次干道)通行时间设置为50秒。同时可以实现红灯、黄灯、绿灯各状态之间的相互转换,黄灯闪烁时间设置为10秒,数码管可以准确进行倒计时显示。按下东西放行键K0,东西方向(主干道)绿灯亮,南北方向(次干道)红灯亮;按下南北放行键K1,南北方向(次干道)绿灯亮,东西方向(主干道)红灯亮;无论在任何时候按下返回键K2,该控制系统都将返回到初始状态;若遇紧急情况,按下紧急情况按键K3,东西南北方向都亮红灯,实现主干道和支干道全部禁止通行;模拟了控制交通灯东西方向(主干道)通行,南北方向(次干道)通行,返回,紧急情况各个交通灯工作情况之间相互转化,实现了课程设计的要求。宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
结束语
通过这次毕业设计,使我受益匪浅。使我在软硬件结合的综合运用能力上有了进一步的提升,对课堂上所学的单片机知识有了进一步的加深和巩固,在C语言的掌握方面也向前迈了一大步,在老师和同学的帮助下,提高了个人分析解决实际问题的综合能力以及协同合作的能力,同时还锻炼了我查阅资料的能力、动手能力、发现问题、解决问题的能力。面对电脑搜索资料,一点点,一块块的电路慢慢拼成完整的电路经过一次次的反复修改终于设计出了属于自己的程序和电路,虽然还有诸多不足之处,不过使自己真正的体会到了探索事物的奥秘的快乐,同时自己也更深入的了解到了单片机的巨大的潜力,虽然有的时候可能遇到了一些困难,但是我最终解决了,我也会感觉到成功给我带来的喜悦,我知道我在专业知识上的掌握还是远远不够的,我还要更加努力的去学习,提高自己了实践能力。
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
参考文献
[1] 杨素行.模拟电子技术[M].北京:高等教育出版社.2006 [2] 余孟尝.数字电子技术[M].北京:高等教育出版社. 2006 [3] 邱关源,罗先觉.电路[M].北京:高等教育出版社.2011 [4] 张毅刚.单片机原理及应用[M].北京:高等教育出版社.2011 [5] 凌志浩.AT89C52单片机原理与接口技术[M].北京:高等教育出版社.2011 [6] 郭循钊,邝帆.基于单片机的多功能交通灯控制系统设计与仿真实现[J].公路交通技术.2010 [7] 刘日华,宋海.基于单片机的交通灯设计[J].科技致富向导.2012 [9] 高文庆,吕英英. 基于AT89C51单片机的数字秒表设计[J]. 电脑知识与技术.2012 [10] 谭浩强著,C程序设计 第三版[M].清华大学出版社.2006 [11] 彭虎,周佩玲. 微机原理与接口技术[M].电子工业出版社.2011 [12] GUO Haili.Design of Traffic Light Control System Based on Proteus and Single-chip Computer.Journal of Hengshui University[J].2012 [13] Tang Jing-nan, Qin Shen .Development and Examples of 51 Microcontroller's C Language [M].Posts & Telecom Press.2008
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
致 谢
本毕业设计在胡波和刘明老师的亲切关怀和悉心指导以及同学们的热心帮助下完成的。感谢他们在此次毕业设计过程中给予我的悉心指导与各方面的帮助,他们给了我许多非常有益的建议和意见,使我在思路上得到了很大的启发,从中认识到了自己存在的不足,并且学到了很多非常宝贵的知识。同时也要感谢系里其它同学和我的朋友在设计中给我提供的帮助和支持。总的来说,这次设计给了我一个很好的锻炼机会,让我学到了很多东西,让我将自己所掌握的理论知识切实运用于工作和生活实践中,这不仅有利于加深对书本知识的理解和巩固,而且在很大程度上提高了我们在理论知识的指导下观察、分析和解决问题的能力。最后,再次向所有帮助过我的老师、同学表示衷心的感谢!谢谢你们!宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
附录:程序源代码
/*#include
code 宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
{ uchar i;
while(ms--){ {} for(i=0;i<200;i++)}
} /*中断0处理程序*/ void int0(void)interrupt 0 { EA=0;/*CPU禁止响应一切中断*/ P1=0xF6,P0=duanma[0];/*东西南北方向均红灯亮,P0口输出0*/
{ P2=weima[0],P0=duanma[(SN_G+Y)%10];/*南北方向数码管显示可通行 while(1)/*无条件循环*/ 时间的个位*/ delayms(10);/*延时*/
P2=weima[1],P0=duanma[(SN_G+Y)/10];/*南北方向数码管显示可通行 delayms(10);/*延时*/ 时间的十位*/ P2=weima[2],P0=duanma[(WE_G+Y)%10];/*东西方向数码管显示可通行时间的个位*/ delayms(10);/*延时*/
P2=weima[3],P0=duanma[(WE_G+Y)/10];/*东西方向数码管显示可通行时间的十位*/
/*设置南北方向通行时间*/ if(K0==0)/*P3^7=0*/ { delayms(10);/*延时*/ 17 宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
delayms(20);/*延时,把抖动的时间抛掉*/ if(K0==0)*/ { } SN_G++;/*南北方向绿灯时间+1*/ if(SN_G==100)SN_G=0;/*由于使用的是两位数码管,当南北方向绿灯时间加到100后清零*/ }
} /*设置东西方向通行时间*/ if(K1==0)/*P3^6=0*/ { { while(K0==0)/*当松开K0开关时,跳出空循环,执行后面的程序 delayms(20);/*延时,把抖动的时间抛掉*/ if(K1==0){ while(K1==0)/*当松开K1开关时,跳出空循环,执行后面的程序*/ { } WE_G++;/*东西方向绿灯时间+1*/ if(WE_G==100)WE_G=0;/*由于使用的是两位数码管,当东西方向绿灯时间加到100后清零*/ }
} /*返回*/ if(K3==0)/*P3^5=0*/ delayms(20);/*延时,把抖动的时间抛掉*/ if(K3==0){ { 18 宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
while(K3==0)/*当松开K3开关时,跳出空循环,执行后面的程
{ } count=0;/*清零*/ k=0;/*南北方向通车,东西方向不通车*/ SN=SN_G,WE=SN_G+Y;/*南北方向显示时间为南北方向绿灯通行序*/ 时间,东西方向显示时间为南北方向绿灯通行时间加黄灯闪亮时间*/ light();/*调用交通灯函数*/
led();/*调用数码管函数*/ EA=1;/*CPU开放总中断*/
break;/*跳出*/ }
} } } /*中断1处理程序*/ {
P1=0xF6,P0=duanma[0];/*东西南北方向均红灯亮,P0口输出0*/ TR0=!TR0;/*计数器停止工作*/ {/*数码管扫描程序,*/ P2=weima[0];/*显示南北方向个位*/ delayms(10);/*延时*/ delayms(10);/*延时*/ P2=weima[2];/*显示东西方向个位*/ delayms(10);/*延时*/ P2=weima[3];/*显示东西方向十位*/ delayms(10);/*延时*/ /*返回*/ EA=0;/*CPU禁止响应一切中断*/ while(1)/*无条件循环*/
void int1(void)interrupt 2 P2=weima[1];/*显示南北方向十位*/ if(K3==0)/*P3^5=0*/ { 19 宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
delayms(20);/*延时,把抖动的时间抛掉*/
if(K3==0){ while(K3==0)/*当松开K3开关时,跳出空循环,执行后面的程序*/
{ } TR0=!TR0;/*启动计数器*/ EA=1;/*CPU开放总中断*/
break;/*跳出*/
}
} } } /*键盘程序*/ void key(){ /*南北有车而东西无车*/ if(K0==0)/*K0=0*/ { delayms(20);/*延时,把抖动的时间抛掉*/ if(K0==0){ while(K0==0)/*当松开K0开关时,跳出循环,执行后面的程序*/ { light();/*调用交通灯函数*/ led();/*调用数码管函数*/ } count=0;/*清零*/ k=0;/*南北方向通车,东西方向不通车*/ SN=SN_G,WE=SN_G+Y;/*南北方向显示时间为南北方向绿灯通行时间,东西方向显示时间为南北方向绿灯通行时间加黄灯闪亮时间*/ light();/*调用交通灯函数*/ led();/*调用数码管函数*/ } }
宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
/*南北无车而东西有车*/ if(K1==0)/*K1=0*/ { delayms(20);/*延时,把抖动的时间抛掉*/ if(K1==0){ while(K1==0)/*当松开K1开关时,跳出循环,执行后面的程序*/ { light();/*调用交通灯函数*/ led();/*调用数码管函数*/ } count=0;/*清零*/ k=1;/*南北方向不通车,东西方向通车*/ SN=WE_G+Y,WE=WE_G;/*南北方向显示时间为东西方向绿灯通行时间加黄灯闪亮时间,东西方向显示时间为东西方向绿灯通行时间*/ light();/*调用交通灯函数*/
} /*定时函数*/ void time1(void)interrupt 1 {
TH0=0x3c;TL0=0xb0;/*计50000个数,用时50ms*/ count++;/*自增运算*/ if(count>=20)/*当count大于或等于20时,历时1s,执行程序*/ { SN--;/*自减运算*/ WE--;/*自减运算*/ count=0;/*清零*/ if(SN==0||WE==0)/*当SN=0或者WE=0时,执行程序*/ { } led();/*调用数码管函数*/ } k++;/*自增运算*/ if(k>3)/*当k>3时,执行程序*/ 21 宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
k=0;/*清零*/ switch(k)/*switch 语句*/ { case 0:SN=SN_G,WE=SN_G+Y;break;/*南北方向显示时间为南北方向绿灯通行时间,东西方向显示时间为南北方向绿灯通行时间加黄灯闪亮时间*/ case 1:SN=Y,WE=Y;break;/*东西南北方向显示时间均为黄灯闪亮时间*/ case 2:SN=WE_G+Y,WE=WE_G;break;/*南北方向显示时间为东西方向绿灯通行时间加黄灯闪亮时间,东西方向显示时间为东西方向绿灯通行时间*/ case 3:SN=Y,WE=Y;break;/*东西南北方向显示时间均为黄灯闪亮时间*/ } } } /*交通灯函数*/ void light(){
P1=deng[k];/*交通灯对应着k的值变化*/ if(P1==deng[1]&&count==0)/*当南北方向亮黄灯且count=0时,执行程序*/
{ TH1=(65536-50000)/256;
} TL1=(65536-50000)%256;/*延时50ms*/
P1=0xDF;/*南北方向黄灯熄灭,东西方向亮红灯*/ } else if(P1==deng[3]&&count==0)/*当东西方向亮黄灯且count=0时,执行程序*/ { TH1=(65536-300000)/256;
TL1=(65536-300000)%256;/*延时50ms*/ P1=0xFB;/*南北方向亮红灯,东西方向黄灯熄灭*/ 22 宿州学院本科生毕业设计
基于单片机AT89C51的交通灯控制器的设计
} } /*数码管函数*/ void led(){
} /*主函数*/
void main(void){
init();/*调用程序初始化函数*/ { key();/*调用键盘程序*/ light();/*调用交通灯函数*/ led();/*调用数码管函数*/ } while(1)/*无条件循环*/ P2=weima[0],P0=duanma[SN%10];/*显示南北方向个位*/ P2=weima[1],P0=duanma[SN/10];/*显示南北方向十位*/ delayms(10);/*延时*/ P2=weima[2],P0=duanma[WE%10];/*显示东西方向个位*/ delayms(10);/*延时*/ P2=weima[3],P0=duanma[WE/10];/*显示东西方向十位*/ delayms(10);/*延时*/ delayms(10);/*延时*/ } 23
第二篇:交通灯控制器设计实验报告
设计性实验项目名称
交通灯控制器设计
实验项目学时:3学时
实验要求:■ 必修
□ 选修
一、实验目的
1、学习与日常生活相关且较复杂数字系统设计;
2、进一步熟悉EDA实验装置和QuartusⅡ软件的使用方法;
3、学习二进制码到BCD码的转换;
4、学习有限状态机的设计应用。
二、实验原理
交通灯的显示有很多方式,如十字路口、丁字路口等,而对于同一个路口又 有很多不同的显示要求,比如十字路口,车辆如果只要东西和南北方向通行就很 简单,而如果车子可以左右转弯的通行就比较复杂,本实验仅针对最简单的南北 和东西直行的情况。
要完成本实验,首先必须了解交通路灯的燃灭规律。本实验需要用到实验箱上交通灯模块中的发光二极管,即红、黄、绿各三个。依人们的交通常规,“红灯停,绿灯行,黄灯提醒”。其交通灯的燃灭规律为:初始态是两个路口的红灯全亮之后,主干道的绿灯亮,乡间道路的红灯亮,主干道方向通车,延时一段时间后,乡间公路来车,主干道绿灯灭,黄灯开始闪烁。闪烁若干次后,主干道红灯亮,而同时乡间公路的绿灯亮,延时一段时间后,乡间公路的绿灯灭,黄灯开始闪烁。闪烁若干次后,再切换到主干道方向,重复上述过程。
三、设计要求
完成设计、仿真、调试、下载、硬件测试等环节,在型EDA实验装置上实现一个由一条主干道和一条乡间公路的汇合点形成的十字交叉路口的交通灯控制器功能,具体要求如下:
1、有MR(主红)、MY(主黄)、MG(主绿)、CR(乡红)、CY(乡黄)、CG(乡绿)六盏交通灯需要控制;
2、交通灯由绿转红前有4秒亮黄灯的间隔时间,由红转绿没有间隔时间;
3、乡间公路右侧各埋有一个串连传感器,当有车辆准备通过乡间公路时,发出请求信号S=1,其余时间S=0;
4、平时系统停留在主干道通行(MGCR)状态,一旦S信号有效,经主道黄灯4秒(MYCR)状态后转入乡间公路通行(MRCG)状态,但要保证主干道通行大于一分钟后才能转换;
5、一旦S信号消失,系统脱离MRCG状态,即经乡道黄灯4秒(MRCY)状态进入MGCR状态,即使S信号一直有效,MRCG状态也不得长于20秒钟;
6、控制对象除红绿灯之外,还包括分别在主干道和乡间公路各有一个两位十进制倒计时数码管显示。
四、主要仪器设备
1、微机
1台
1套 1套
2、QuartusII集成开发软件
3、EDA实验装置
五、实验步骤
源程序:
0module traffic1(clk,s,rst,light,sel,SG);input clk,s,rst;output[5:0] light;
output [2:0]sel;output [7:0]SG;reg [5:0] light;reg clk1;reg [3:0] sc;
reg [7:0] count;reg [7:0] cnt,SG;reg [2:0] sel;reg [3:0]a;parameter s0=0,s1=1,s2=2,s3=3,s4=4;initial
begin
count<=8'b01100000;
light<=6'b001100;
sc=s0;
end
always @(posedge clk)begin
begin cnt=cnt+1;
if(cnt==100)begin clk1=1'b1;cnt=0;end
else clk1=1'b0;//100分频,CLK为数码管扫描频率,CLK1为计数频率
if(sel<7)sel=sel+1;else sel=6;
end //sel为数码管选择
begin
case(sel)
7: a=count[3:0];//0数码管为个位
6: a=count[7:4];//1数码管为十位
default: a=0;
endcase
case(a)
0:SG<=8'b00111111;1:SG<=8'b00000110;
2:SG<=8'b01011011;3:SG<=8'b01001111;
4:SG<=8'b01100110;5:SG<=8'b01101101;
6:SG<=8'b01111101;7:SG<=8'b00000111;
8:SG<=8'b01111111;9:SG<=8'b01101111;//8段译码值
default: SG=8'b11111111;
endcase
end end
always @(posedge clk1 or negedge rst)
begin
if(!rst)begin count = 0;sc=s3;end // count set nothing but else 0
else if(count == 0)
begin
case(sc)
s0: begin if(s)begin sc=s1;count = 8'b00000100;light=6'b010100;end else begin sc=s4;count = 8'b01100000;end end
s1: begin count = 8'b00100000;sc=s2;light=6'b100001;end
s2: begin count = 8'b00000100;sc=s3;light=6'b100010;end
s3: begin count = 8'b01100000;sc=s0;light=6'b001100;end
s4: begin if(s)begin sc=s1;count = 8'b00000100;light=6'b010100;end else begin sc = s4;count = 8'b01100000;light<=6'b001100;end end
default begin sc=s0;count =8'h60;end
endcase
end
else
if((sc==s2)&(s==0))begin sc=s3;count = 8'b00000100;light=6'b100010;end
else
if((sc==s4)&(s==1))begin sc=s1;count = 8'b00000100;light=6'b010100;end
else if(count[3:0] == 4'b0000)
begin count = count-7;end
else
begin count = count-1;end
end endmodule
管脚锁定
六、波形仿真
主干道60s倒计时
s信号为1时
七、实验心得
通过本次实验,让我进一步掌握了软件quartus的使用流程,一开始实验时波形仿真是正确的,但在电路上实现时主干道亮黄灯时,乡间道路亮的是绿灯,这显然是不对的,后面发现是管脚锁定时出现了问题,改回来之后就没问题了。管脚锁定时不能粗心,不然很容易出现问题。
曹军
生医121班
第三篇:单片机:交通灯控制系统设计
交通灯控制系统设计
摘要:本系统由单片机系统、键盘、LED 显示、交通灯演示系统组成。系统包括人行道、左转、右转、以及基本的交通灯的功能。系统除基本交通灯功能外,还具有倒计时、时间设置、紧急情况处理、分时段调整信号灯的点亮时间以及根据具体情况手动控制等功能。关键词:AT89S51,交通规则
一、方案比较、设计与论证 1 电源提供方案
为使模块稳定工作,须有可靠电源。我们考虑了两种电源方案
方案一:采用独立的稳压电源。此方案的优点是稳定可靠,且有各种成熟电路可供选用;缺点是各模块都采用独立电源,会使系统复杂,且可能影响电路电平。方案二:采用单片机控制模块提供电源。改方案的优点是系统简明扼要,节约成本;缺点是输出功率不高。综上所述,我们选择第二种方案。2 显示界面方案
该系统要求完成倒计时、状态灯等功能。基于上述原因,我们考虑了三种方案: 方案一:完全采用数码管显示。这种方案只显示有限的符号和数码字苻,无法胜任题目要求。
方案二:完全采用点阵式LED 显示。这种方案实现复杂,且须完成大量的软件工作;但功能强大,可方便的显示各种英文字符,汉字,图形等。
方案三:采用数码管与点阵LED 相结合的方法因为设计既要求倒计时数字输出,又要求有状态灯输出等,为方便观看并考虑到现实情况,用数码管与LED灯分别显示时间与提示信息。这种方案既满足系统功能要求,又减少了系统实现的复杂度。权衡利弊,第三种方案可互补一二方案的优缺,我们决定采用方案三以实现系统的显示功能。3 输入方案:
题目要求系统能手动设灯亮时间、紧急情况处理,我们讨论了两种方案: 方案一:采用8155扩展I/O 口及键盘,显示等。该方案的优点是:
使用灵活可编程,并且有RAM,及计数器。若用该方案,可提供较多I/O 口,但操作起来稍显复杂。
方案二: 直接在IO口线上接上按键开关。因为设计时精简和优化了电路,所以剩余的口资源还比较多,我们使用四个按键,分别是K1、K2、K3、K4。由于该系统对于交通灯及数码管的控制,只用单片机本身的I/O 口就可实现,且本身的计数器及RAM已经够用,故选择方案二。
二、理论分析与计算
1.交通灯显示时序的理论分析与计算
对于一个交通路口来说,能在最短的时间内达到最大的车流量,就算是达到了最佳的性能,我们称在单位时间内多能达到的最大车流为车流量,用公式:车流量= 车流 / 时间 来表示。
先设定一些标号如图2-1 所示。
说明:此图为直方图,上边为北路口灯,右边为东路口灯,下边为南路口灯,左边为西 路口灯。
图2-2 所示为一种红绿灯规则的状态图,分别设定为S1、S2、S3、S4,交通灯以这四 的状态为一个周期,循环执行(见图2-3)。
请注意图2-1b和图2-1d,它们在一个时间段中四个方向都可以通车,这种状态能在
一定的时间内达到较大的车流量,效率特别高。
依据上述的车辆行驶的状态图,可以列出各个路口灯的逻辑表,由于相向的灯的状态图
是一样的,所以只需写出相邻路口的灯的逻辑表;根据图2-3 可以看出,相邻路口的灯它
们的状态在相位上相差180°。因此最终只需写出一组S1、S2、S3、S4的逻辑状态表。
如表2-1 所示。
表中的“×”代表是红灯亮(也代表逻辑上的0),“√”是代表绿灯亮(也代表逻辑上 的1),依上表,就可以向相应的端口送逻辑值。2.交通灯显示时间的理论分析与计算
东西和南北方向的放行时间的长短是依据路口的各个方向平时的车流量来设定,并且
S1、S2、S3、S4各个状态保持的时间之有严格的对应关系,其公式如下所示。T-S1+T-S2=T-S3 T-S2=T-S4 T-S1=T-S3 我们可以依据上述的标准来改变车辆的放行时间。按照一般的规则,一个十字路口可分
为主干道和次干道,主干道的放行时间大于次干道的放行时间,我们设定值时也应以此为参 考。
三、电路图及设计文件 1.灯控制电路设计
由于32个LED 来实现红绿灯状态,若直接接在单片机的口线,路口倒计时的显示就不
能实现,所以本次设计中采用一种新型的电路如图3-1 所示。
图中74LS04的作用是倒相和驱动,它输出的电流大约48mA,实际测试发现足以满足要
求,而且发光管也能达到足够的亮度。
观察图可以看出:两组发光管(一组红、一组绿)由于反相器的作用,其逻辑状态恰恰 相反。
图中和电阻串联的二极管的作用是为了分压,防止因上下两组发光管分压不同导致逻辑 的错误。
共四组和上述相同的电路分别代表东西南北四个方向的红绿灯,使用两片74LS04 作为 驱动。
2.倒计时显示电路设计
前面已经分析过相向的灯的状态和倒计时都是相同的,所以为了节省,采用两组四个数码管
作为倒计时的显示;同时为了节省口资源,采用串口显示的方式驱动数码管。见图3-2 所 示。
四、程序设计思路与流程图 1.主程序流程图
主程序中主要是一个死循环,不停的循环四个状态,如图4-1 所示。
2.按键子程序流程图
它包含倒计时调整和紧急状态两个状态。
主程序中放了一个按键的判断指令,当有按键按下的时候,程序就自动的跳转到按键子
程序处理。当检测到K2键按下的时候就自动返回到主程序。当出现紧急的情况的时候,按下K3或者K4 就切换到紧急状态,当紧急事件处理完毕 的时候,按下K2,就可以返回正常状态。
五、测试、数据及结果分析 1.状态灯显示测试
当电路连接完毕后,将写好的测试程序刷写到芯片内,K1 和K2分别给端口送高电平和
低电平,通电即可检测。2.数码管的测试
将串口的和电路板上的接口连接,将写好的测试程序刷写到芯片内,开电源即可测试。
3.整体电路测试
系统上电,刷写好程序即可开始测试,观测一个周期(共计S1~S4四个状态,默认140 秒)灯的显示状态是否正常,同时观察倒计的计数是否正常。
六、总结
由于使用的是单片机作为核心的控制元件,使得电路的可靠性比较高,功能也比较强大,而且可以随时的更新系统,进行不同状态的组合。
但是在我们设计和调试的过程中,也发现了一些问题,譬如红灯和绿灯的切换还不够迅
速,红绿灯规则不效率还不是很高等等,这需要在实践中进一步完善。附录 系统总体电路图
1.满足南北向红绿灯亮,东西向红灯亮,占25秒——南北向黄灯亮,东西向红灯亮,占5秒——南北向红灯亮,东西向绿灯亮,占25秒——南北向红灯亮,东西向黄灯亮,占5秒。如此循环,周而复始。2.十字路口要有数字显示,提示行人把握时间:当某方向绿灯亮时,置显示器为24,然后以每秒减1计数方式工作,直到减为0,绿灯灭,黄灯亮。黄灯灭,红灯亮时,再次置显示器为29,并开始减计数,直到为0,十字路口红绿灯交换,完成一次工作循环。
3.可手动调整和自动调整,夜间为黄灯闪耀。下面是一个单片机交通灯程序 /*
****************************************************************************************** * *
* Keil C 89S51 交通信号控制程序 * *(C)版权所有 Dai_Weis@hotmail.com * * *
****************************************************************************************** */
#include “reg51.h” #define UINT unsigned int #define ULONG unsigned long #define UCHAR unsigned char /*
信号灯变量
南北方向绿灯
sbit n_bike_g = P1^0;//自行车
sbit n_right_g = P1^1;//右转
sbit n_up_g = P1^2;//直行
sbit n_left_g = P1^3;//左转 调头
南北方向红灯
sbit n_bike_r = P1^4;//自行车
sbit n_right_r = P1^5;//右转
sbit n_up_r = P1^6;//直行
sbit n_left_r = P1^7;//左转 调头 南北方向黄灯
sbit n_bike_y = P3^0;//自行车
sbit n_right_y = P3^1;//右转
sbit n_up_y = P3^2;//直行
sbit n_left_y = P3^3;//左转 调头
东西方向绿灯
sbit e_bike_g = P2^0;//自行车
sbit e_right_g = P2^1;//右转
sbit e_up_g = P2^2;//直行
东西方向红灯
sbit e_bike_r = P2^4;//自行车
sbit e_right_r = P2^5;//右转
sbit e_up_r = P2^6;//直行
东西方向黄灯
sbit e_bike_y = P3^4;//自行车
sbit e_right_y = P3^5;//右转
sbit e_up_y = P3^6;//直行
*/ //延时
void delay(UINT t, UINT s){ while(t){ UINT i;
for(i = 0;i < s;i++){ } t--;} }
//信号灯状态
void time_x(UCHAR P_P1, UCHAR P_P2, UCHAR P_P3){
P1 = P_P1;P2 = P_P2;P3 = P_P3;delay(150, 65535);}
void time_s(UCHAR P_P1, UCHAR P_P2, UCHAR P_P3, UCHAR P_P11, UCHAR P_P22){ UINT i;
for(i = 0;i < 3;i ++){
P1 = P_P1;P2 = P_P2;delay(5, 65535);P1 = P_P11;P2 = P_P22;delay(5, 65535);}
P1 = P_P1;P2 = P_P2;P3 = P_P3;delay(10, 65535);} //主程序
void main(){
P1 = P2 = P3 = 0x0;while(1){
time_x(0xA5, 0x38, 0x0);
time_s(0xA4, 0x38, 0x1, 0xA5, 0x38);time_x(0x96, 0x52, 0x0);
time_s(0x92, 0x52, 0x4, 0x96, 0x52);time_x(0x5A, 0x52, 0x0);
time_s(0x50, 0x50, 0x2A, 0x5A, 0x52);time_x(0xF0, 0x25, 0x0);
time_s(0xF0, 0x24, 0x20, 0xF0, 0x25);time_x(0xD2, 0x16, 0x0);
time_s(0xD0, 0x10, 0x62, 0xD2, 0x16);} }
给你一个定时控制的信号系统,我只做的简单的测试,至于延时我用的软件,你自己想办法。^_^
Dai_Weis 于 2005-5-4 13:43:23 重新给你说明
/*
*********************************************************************************** * *
* Keil C AT89S51 交通信号控制程序 * *(C)版权所有 Dai_Weis@hotmail.com * * *
*********************************************************************************** 开发说明:
固定时间信号变换,南北设置调头、左传、直行、右转、自行车。
东西设置左传、直行、右转、自行车。
时序状态:
红 绿 红 绿
序号 左 前 右 自 左 前 右 自 前 右 自 前 右 自1 0 1 0 0 1 0 1 1 1 1 0 0 0 2 1 0 0 1 0 1 1 0 1 0 1 0 1 0 3 0 1 0 1 1 0 1 0 1 0 1 0 1 0 4 1 1 1 1 0 0 0 0 0 1 0 1 0 1 5 1 1 0 1 0 0 1 0 0 0 1 1 1 0 */
另外修正个错误
while(1){
time_x(0xA5, 0x70, 0x0);time_s(0xA4, 0x70, 0x1, 0xA5, 0x70);
材料: 1、89S51 11.0592M 晶振
1K电阻、10UF电容
12个灯,红、黄、绿各四个,12个1K电阻
,十字路口嘛。蜂鸣器一个。
按键一个,按键复位
采用AT89s51型号的单片机,由于交通十字路口的对称性,所以一个引脚可以同时控制两个灯,将发光二极管分别接到P1各个引脚,在其中加入一个时振荡当电路,来控制时间,在P3.0引脚接入蜂鸣器只黄灯亮的时候发出声响,这里我们让每次黄灯亮的时候发出六声响,通过C程序的控制就可以实现,每次循环是10秒。2、9cm*15cm万用板 1片 单片机及IC座 1套 12M晶振 1只 22P电容 2只 10uF电容 1只 10K电阻 1只 1K排阻 1只 两位一体数码管 2只 DC座 1只 自锁开关 1只
发光二极管红绿黄
各4只 按键 7只 USB电源线 1条 导线
若干
1、基于51系列单片机(型号:STC89C52、AT89C51/C52、AT89S51/S52,随机选择,如有特
殊要求请与店主讨论)设计实现。(以上几种单片机全部为51系列单片机,除了名字不一样外,功能及应用完全一样,互相
兼容)
2、两个两位一体数码管显示东西、南北方向时间。
3、四方向各有红绿黄三颗灯。
4、七个按键操作,分别是:禁止通行、东西通行、南北通行、时间加、时间减、切换方向、确认。
第四篇:基于单片机的交通灯设计
基于单片机的交通灯设计
设计程序:
#include
//共阳极
uchar
code table1[5]={0xf3,0xf5,0xde,0xee,0xf6};/*各种状态下红绿灯段选码, 状态1:A绿灯,B红灯;状态2:A黄灯亮,B红灯;状态3:A红灯,B绿灯;状态4:A红灯,B黄灯亮;状态5:A红灯,B红灯;*/ uchar
code tab[4]={0x1E,0x2D,0x4E,0x8D};//数码管显示位选码 sbit key1=P1^0;//放行A sbit key2=P1^1;//放行B sbit key3=P1^2;//禁止通行
uchar EW=40,SN=30,K1_T=15,K2_T=15,K3_T=20;//初始化交通灯时间 uchar count;//计时中断次数 uchar i,j;//循环控制变量 char Timer;//子程序说明语句 void Process();void Display(uchar j);void Delay(uchar a);/**************************主程序**************************/ main(){ IP=0X02;//设置定时器中断为高优先级//成为中断嵌套
TMOD=0x01;//定时器工作方式
TH0=0x3C;//定时器初始化
TL0=0xB0;IT0=1;//中断触发方式为下降沿触发
EA=1;//CPU开中断
ET0=1;//开定时中断
TR0=1;//启动定时
EX0=1;//启动外部中断0 while(1)
{
Process();
} } /*************************交通灯显示子程序*************************/ void Display(uchar j)//j控制显示table中连续位的起始点 {
char h,l;
h=Timer/10;//EW通行时间十位
l=Timer%10;//EW通行时间个位
for(i=0;i<4;)//按位显示通行状况及时间 {
P0=table1[j];//通行状况显示
P3=tab[i];//位选显示
i++;
//j++;
if(i%2)//两位计时显示
{
P2=table[l];
Delay(400);
}
else
{
P2=table[h];
Delay(400);
} } Delay(5);
//设置扫描时间
} /*********键控*******/ void Keyboard()interrupt 0 using 0 {
if(key1==0)
{ Timer=K1_T;
while(Timer>0)
{
j=0;
Display(0);
//显示一次
}
if(key2==0)
{
Timer=K2_T;
while(Timer>0)
{
j=2;
Display(j);
}
if(key3==0)
{
Timer=K3_T;
while(Timer>0)
{
j=4;
Display(j);
}
} } /**************************延时子程序**************************/ void Delay(uchar a)//循环a次 { uchar x;x=a;while(x--){;} }
/************************TO计时中断服务程序************************/ void timer0(void)interrupt 1 using 1//T0中断 { TH0=0x3C;TL0=0xB0;//定时计数初值
count++;//中断溢出一次count+1 if(count==20){
Timer--;
count=0;//中断次计数,count回,倒计时时间
} } /**************************亮灯控制**************************/ void Process(){ Timer=EW;//初始化方向通行时间
while(Timer>3)//状态:A绿灯,B红灯;{
j=0;
Display(j);//调用显示函数
} while(Timer>0)//状态:A黄灯亮,B红灯;{
j=1;
Display(j);
} Timer=SN;while(Timer>3)//状态:A红灯,B绿灯;{
j=2;
Display(j);} while(Timer>0)//状态:A红灯,B黄灯亮;{
j=3;
Display(j);
}
}
电路图如下:
第五篇:基于Verilog_HDL的交通灯控制器设计
目
录
第一章
设计原理.......................................................................................................................................1
1.1设计要求..........................................................................................................................1
1.2设计思路和原理............................................................................................................................1 1.3实现方法..........................................................................................................................................1 第二章
Verilog 程序设计.........................................................................................................2
2.1整体设计...........................................................................................................................22.2 具体设计..........................................................................................................................3
第三章
仿真................................................................................................................................................7
3.1 波形仿真..........................................................................................................................7
第四章
设计总结.......................................................................................................................9
4.1 总结...................................................................................................................................9
4.2参考资料............................................................................................................................9
程序清单.....................................................................................................................................10
0
交通灯控制器设计
第一章
设计原理
1.1设计要求
设计一个交通控制器,用LED显示灯表示交通状态,并以7段数码显示器显示当前状态剩余秒数 主干道绿灯亮时,支干道红灯亮;反之亦然,二者交替允许通行,主干道每次放行35s,支干道每次放行25s。每次由绿灯变为红灯的过程中,亮光的黄灯作为过渡,黄灯的时间为5s。能进行特殊状态显示,特殊状态时东西、南北路口均显示红灯状态。用LED灯显示倒计时,并且能实现总体清零功能,计数器由初始状态开始计数,对应状态的显示灯亮。1.2设计思路和原理
本次设计是针对十字路口,进行南北和东西直行情况下交通灯控制。设定东西方向为主干道方向,根据交通灯的亮的规则,在初始状态下四个方向的都为红灯亮启,进入正常工作状态后,当主干道上绿灯亮时,支干道上红灯亮,持续35S后,主干道和支干道上的黄灯都亮启,持续5S后,主干道上红灯亮启,支干道上绿灯亮启持续25S,之后主干道和支干道上的黄灯都亮启5s,一个循环完成。循环往复的直行这个过程。其过程如下图所示:
0s主干道方向25s绿灯亮30s红灯亮黄灯亮65s支干道方向0s红灯亮35s绿灯亮黄灯亮60s65s
图1.交通灯点亮时间控制说明
1.3实现方法
本次采用文本编辑法,即利用Verilog 语言描述交通控制器,通过状态机计数法,实现设计所要求的交通灯控制及时间显示。设计中用两组红黄绿LED模拟两个方向上的交通灯,用4个7段数码管分别显示两个方向上的交通灯剩余时间,控制时钟由试验箱上频率信号提供。
第二章
Verilog 程序设计
2.1整体设计
根据上章设计原理,交通灯控制的关键是各个状态之间的转换和进行适当的时间延时,根据状态机的设计规范,本次设计了三个状态之间的循环转化,其真值表及状态转化图如下所示:
状状00状状00状状10状状11状状01状状01状状11状状10状状状状状状状状状状001状状状状状010状状状状状100状状状状状010状状状状状状状状状状100状状状状状010状状状状状001状状状状状010
图2.交通灯控制状态转化
说明:该状态图为交通灯在正常情况下的状态转化图,进入控制后,状态00时主干道绿灯及支干道红灯亮起,进入状态01后两路黄灯亮起,状态11时主干道红灯及支干道绿灯亮起。进入10状态两路黄灯亮起。结束一个循环,从00状态重新开始循环。
为实现控制与显示的功能,需要设计交通灯点亮顺序控制程序,倒数计时程序,七段数码管显示程序,数码管显示扫描程序,其系统结构图如下所示:
holdrst状状状状1Hz状状状状状状状状状状状状状状状状状状状clk1KHz状状状状状状状1Hz状状状状状状状状状状状状状状状状状状状状状 图3.交通灯控制系统结构图
其中rst为复位信号,clk为时钟信号,hold为特殊情况控制信号,输入hold时两个方向红灯无条件亮起。
2.2 具体设计
根据整体设计要求,编写各个功能部分Verilog 程序,设置各输入输出变量说明如下
clk: 为计数时钟; qclk:为扫描显示时钟;
en: 使能信号,为1 的话,则控制器开始工作; rst: 复位信号,为1的话,控制及技术回到初始状态;
hoid:特殊情况控制信号,为1的话,则两个方向无条件显示为红灯;
light1: 控制主干道方向四盏灯的亮灭;其中,light1[0]~light[2],分别控制主干道方向的 绿灯、黄灯和红灯;
light2: 控制支干道方向四盏灯的亮灭;其中,light2[0] ~ light2[2],分别控制支干道方向的 绿灯、黄灯和红灯;
num1: 用于主干道方向灯的时间显示,8 位,可驱动两个数码管; num2: 用于支干道方向灯的时间显示,8 位,可驱动两个数码管; counter:用于数码管的译码输出; st1,st2:数码管扫描信号。输入输出及中间变量设置如下:
module traffic(en,clk,qclk,rst,rst1,hold,num1,num2,light1,light2,counter,st1,st2);input en,clk,qclk,rst,hold,rst1;output st1,st2;output[7:0] num1,num2;output[6:0]counter;output[2:0] light1,light2;reg tim1,tim2,st1,st2;reg[1:0]state1,state2,ste;reg[2:0]light1,light2;reg[3:0]num;reg[6:0]counter;reg[7:0] num1,num2;reg[7:0] red1,red2,green1,green2,yellow1,yellow2;
1.二极管点亮控制
该部分程序的作用是根据计数器的计数值控制发光二极管的亮、灭,以及输出倒计时数值给七段数码管的译码电路。此外,当检测到特殊情况(hold=‘1’)发生时,无条件点亮红灯的二极管,当检测到复位信号,两个方向计数与控制回复到00状态。因为主、支干道两个方向二极管点亮的顺序与延迟时间不同,顾编写两个独立的部分来控制,具体程序如下:
1)主干道方向 always @(posedge clk)begin if(rst)//复位与特殊情况控制
begin light1<=3'b001;num1<=green1;end else if(hold)begin light1<=3'b100;num1<=green1;end else if(en)
begin //使能有效开始控制计数
if(!tim1)//
begin //主干道交通灯点亮控制
tim1<=1;
case(state1)
2'b00:begin num1<=green1;light1<=3'b001;state1<=2'b01;end
2'b01:begin num1<=yellow1;light1<=3'b010;state1<=2'b11;end
2'b11:begin num1<=red1;light1<=3'b100;state1<=2'b10;end
2'b10:begin num1<=yellow1;light1<=3'b010;state1<=2'b00;end
default:light1<=3'b100;
endcase
End
2)支干道方向
always @(posedge clk)begin
if(rst)//复位与特殊情况控制
begin
light2<=3'b100;
num2<=red2;
end
else if(hold)
begin
light2<=3'b100;
num2<=red2;
end
else if(en)
begin
if(!tim2)
begin
tim2<=1;
case(state1)
2'b00:begin num2<=red2;light2<=3'b100;state2<=2'b01;end
2'b01:begin num2<=yellow1;light2<=3'b010;state2<=2'b11;end
2'b11:begin num2<=green2;light2<=3'b001;state2<=2'b10;end
2'b10:begin num2<=yellow2;light2<=3'b010;state2<=2'b00;end
default:light2<=3'b100;
endcase
End
2.倒数计时
该部分程序完成二极管发光时延的计数,并将计数结果送到数码管显示电路,每切换到一个状态,计数器的初值都被重置,以实现不同颜色二极管不同的时延要求。本次设计直接用逻辑运算完成2位十进制数的计数,未采用分位器的设计。因为主、支干道上计数器的结构完全相同,顾只列出一路的程序,其具体程序如下所示:
always @(posedge clk)begin else begin //倒数计时
if(num1>0)
if(num1[3:0]==0)
begin
num1[3:0]<=4'b1001;
num1[7:4]<=num1[7:4]-1;
end
else num1[3:0]<=num1[3:0]-1;
if(num1==1)tim1<=0;
end
end
else
begin
light1<=3'b010;
num1=2'b00;
tim1<=0;
end
end
3.数码管的译码及扫描显示
该段程序主要完成4个7段数码管的译码显示及扫描,使系统能正常显示主、支干道两个方向上的剩余时间。译码的时钟频率要低,为Hz级。扫描的时钟频率要高,最低不得小于人眼分辨频率50Hz,具体程序如下所示:
always @(posedge qclk)begin //数码管扫描
if(rst1)
begin
st1=0;
st2=0;
end else
begin
case({st2,st1})
2'b00:begin num<=num1[3:0];{st2,st1}<=2'b01;end
2'b01:begin num<=num1[7:4];{st2,st1}<=2'b10;end
2'b10:begin num<=num2[3:0];{st2,st1}<=2'b11;end
2'b11:begin num<=num2[7:4];{st2,st1}<=2'b00;end
endcase
end end always @(posedge qclk)begin //数码管译码显示 case(num)4'b0000: counter<=7'b0111111;//0 4'b0001: counter<=7'b0000110;//1 4'b0010: counter<=7'b1011011;//2 4'b0011: counter<=7'b1001111;//3 4'b0100: counter<=7'b1100110;//4 4'b0101: counter<=7'b1101101;//5 4'b0110: counter<=7'b1111101;//6 4'b0111: counter<=7'b0000111;//7 4'b1000: counter<=7'b1111111;//8 4'b1001: counter<=7'b1101111;//9 default: counter<=7'b0111111;//0 endcase end endmodule 总体程序见程序清单所示 6
第三章
仿真 3.1 波形仿真
在QuartursⅡ软件下创建工程,新建编辑设计文件,将程序输入,整体编译后,新建波形仿真文件。设置仿真时间,时钟周期,输入输出端口,进行波形仿真。具体仿真波形图及说明如下所示: 仿真截止时间:100us; 时钟:clk 1us,qclk 0.1us 1.正常工作时波形仿真图
图4.正常工作时波形仿真图
图形说明
波形仿真主要完成了控制与计数以及数码管显示的波形图。en为低电品时,计数器置初值,高电平时开始正常控制与计数。控制发光二极管首次输出为“light1=001,light2=100”,表示主干道路绿灯亮,支杆道路红灯亮,计数器num1和num2从“00110101”开始递减计数,计数至“00000000”时,进入下一个状态,控制输出量为light=010,light2=010,表示主、支干道黄灯均亮起,计数器num1和num2从“00000101”开始计数递减,计数至”00000000”时进入下一个状态,light=100,light2=001,表示主干道路红灯亮,支杆道路绿灯亮。Counter根据num1,num2变化随时钟上升沿输出译码后的数据。由于屏幕显示大小有限,未仿真出一个完整周期。
2.特殊情况仿真波形
图5.特殊情况仿真波形
图形说明
当hold输入高电平时,在时钟上升沿的控制下,light 1与light2被强制置位为”100”,表示两路红灯均亮起
3.复位情况仿真波形
图6.复位情况仿真波形
图形说明
当rst输入高电平时,在时钟上升沿控制下,计数与控制都回到00状态,即light1=001,light2=100,计数器num1和num2从“00110101”开始递减计数。
第四章 设计总结
4.1 总结
在设计中采用V erilog HDL语言设计交通灯控制系统, 借助其功能强大的语言结构, 简明的代码描述复杂控制逻辑设计, 与工艺无关特性, 在提高工作效率的同时达到求解目的, 并可以通过V erilog HDL 语言的综合工具进行相应硬件电路生成, 具有传统逻辑设计方法所无法比拟的优越性。
在设计过程中,觉得最难的部分是波形仿真部分,虽然程序编译通过但仿真出不了正确的波形,不是计数器无法正常计数,就是控制输出无法进入到下一个状态,每次出现问题就必须返回重新修改程序。实践证明,在编写一个较复杂的程序时,一开始一定要画流程图,弄清楚各个功能及实现它们的逻辑算法,做到心中有数后在开始下笔写编写程序。在编写的时候要尤其要注意语言的规范,如本次设计中编写的V erilog在Quartus7.0中可以正常生成时序图,而在低版本的软件中却无法生成,原因就是语言使用不规范,在解决这个问题时我总结了一些经验,首先程序要逻辑清晰,简洁明了,避免不必要的嵌套与条用,其次要适当地给程序加上注解文字,提高可读性,以方便之后的程序出错时进行查找,最后充分利用仿真软件提供的各项编译工具与报错消息,按图索骥,有方向的完成程序调试。
完成仿真后进行,进行试验箱上的硬件调试,该步骤主要是要求细心,按照引脚清单,逐一完成连线,本次设计用到两个时钟输入,注意一定要选择合适频率的时钟,以便达到期望的效果。注意观察实物的现象,看是否满足设计要求,不满足时检查是硬件问题还是程序问题,如果是程序问题,在修改完之后必须要重新编译,重新烧入。不断排查错误,直至达到满意的效果。
通过这次课程设计,熟悉了简单EDA设计的整个流程,加深了对Verilog HDL硬件描述语言的理解,提高了动手能力,并且锻炼了自己的耐心,收获颇丰,我会把在本次课程设计中学到的东西应用到今后的工作学习中。最后感谢同学及老师提供的帮助与指导。4.2参考资料
[1] 夏宇闻.复杂数字电路与系统的V erilog HDL设计技术 [M ].北京: 北京航空航天大学出版社, 1998 [2] 郭梯云.移动通信[M ].西安: 西安电子科技大学出版社, 1995 [3] [法]M ichelMouly, M arie Bernadet te Pautet1GSM 数字移动通信系统[M ].骆健霞, 顾龙信, 徐云霄译.北京: 电子工业出版社, 1996 [4] 张毅刚, 乔立岩.虚拟仪器软件开发环境L abW indow söCV I 610 编程指南[M ].北京: 机械工业出版社, 2002 [5] 刘国权.GSM 手机的测试[J ].中国无线电管理, 2003 [6] 俞定玖, 刘湘慧.GSM 数字蜂窝移动交换系统测试[J ].电信科学, 2000 [7] 张明.V erilog HDL 实用教程[M ].成都: 电子科技大学出版社, 1999 [8] Hyde D C.Bucknell Handbook on V erilog HDL 1Computer Science Department, Bucknell U niversity L ew is burg, 1995 [9] 康华光.电子技术基础(数字部分)[M ].北京: 高等教育出版社, 1988
程序清单
module traffic(en,clk,qclk,rst,rst1,hold,num1,num2,light1,light2,counter,st1,st2);input en,clk,qclk,rst,hold,rst1;output st1,st2;output[7:0] num1,num2;output[6:0]counter;output[2:0] light1,light2;reg tim1,tim2,st1,st2;reg[1:0]state1,state2,ste;reg[2:0]light1,light2;reg[3:0]num;reg[6:0]counter;reg[7:0] num1,num2;reg[7:0] red1,red2,green1,green2,yellow1,yellow2;
always @(en)if(!en)begin //设置计数初值 green1<=8'b00110101;red1<=8'b00100101;yellow1<=8'b00000101;green2<=8'b00100101;red2<=8'b00110101;yellow2<=8'b00000101;end
always @(posedge clk)begin if(rst)//复位与特殊情况控制
begin
light1<=3'b001;num1<=green1;
end else if(hold)
begin
light1<=3'b100;
num1<=green1;
end else if(en)
begin //使能有效开始控制计数
if(!tim1)//开始控制
begin //主干道交通灯点亮控制
tim1<=1;
case(state1)
2'b00:begin num1<=green1;light1<=3'b001;state1<=2'b01;end
2'b01:begin num1<=yellow1;light1<=3'b010;state1<=2'b11;end
2'b11:begin num1<=red1;light1<=3'b100;state1<=2'b10;end
2'b10:begin num1<=yellow1;light1<=3'b010;state1<=2'b00;end
default:light1<=3'b100;
endcase
end
else
begin //倒数计时
if(num1>0)
if(num1[3:0]==0)
begin
num1[3:0]<=4'b1001;
num1[7:4]<=num1[7:4]-1;
end
else num1[3:0]<=num1[3:0]-1;
if(num1==1)tim1<=0;
end
end
else
begin
light1<=3'b010;
num1=2'b00;
tim1<=0;
end
end
always @(posedge clk)begin
if(rst)//复位与特殊情况控制
begin
light2<=3'b100;
num2<=red2;
end
else if(hold)
begin
light2<=3'b100;
num2<=red2;
end
else if(en)
begin
if(!tim2)
begin
tim2<=1;
case(state1)
2'b00:begin num2<=red2;light2<=3'b100;state2<=2'b01;end
2'b01:begin num2<=yellow1;light2<=3'b010;state2<=2'b11;end
2'b11:begin num2<=green2;light2<=3'b001;state2<=2'b10;end
2'b10:begin num2<=yellow2;light2<=3'b010;state2<=2'b00;end
default:light2<=3'b100;
endcase
end
else
begin //倒数计时
if(num2>0)
if(num2[3:0]==0)
begin
num2[3:0]<=4'b1001;
num2[7:4]<=num2[7:4]-1;
end
else num2[3:0]<=num2[3:0]-1;
if(num2==1)tim2<=0;
end
end
else
begin
tim2<=0;
state2<=2'b00;
light2<=3'b010;
end
end
always @(posedge qclk)begin //数码管扫描
if(rst1)
begin
st1=0;
st2=0;
end else
begin
case({st2,st1})
2'b00:begin num<=num1[3:0];{st2,st1}<=2'b01;end
2'b01:begin num<=num1[7:4];{st2,st1}<=2'b10;end
2'b10:begin num<=num2[3:0];{st2,st1}<=2'b11;end
2'b11:begin num<=num2[7:4];{st2,st1}<=2'b00;end
endcase
end end
always @(posedge qclk)begin //数码管译码显示 case(num)4'b0000: counter<=7'b0111111;//0 4'b0001: counter<=7'b0000110;//1 4'b0010: counter<=7'b1011011;//2 4'b0011: counter<=7'b1001111;//3 4'b0100: counter<=7'b1100110;//4 4'b0101: counter<=7'b1101101;//5 4'b0110: counter<=7'b1111101;//6 4'b0111: counter<=7'b0000111;//7 4'b1000: counter<=7'b1111111;//8 4'b1001: counter<=7'b1101111;//9 default: counter<=7'b0111111;//0 endcase end endmodule