单片机交通灯,流水灯设计,源代码
共分为两部分,一份是交通灯,一份是心形流水灯。 1.背景
1.1交通灯现在交通灯已经在我们社会上普遍使用,它在当今社会发挥着很大的作用。交通灯的出现直接或者间接挽救了无数人的生命,并且使得社会更加有秩序。并且我国是一个人口大国,汽车工业的发展处于快速增长的阶段,城市现代化程度不断提升,汽车需求与交通量也迅速增长,但交通运输带来的交通拥堵、交通事故和环境污染等负面影响也日益突出,交通问题已经成为全球性的难题。为了解决汽车和道路的矛盾,又不影响经济的发展,最有力的方法便是健全道路交通,采用交通灯控制系统。 交通灯控制系统最早可以追溯到19世纪,1895年以燃气为光源用以指挥车马流通的交通灯就已经出现在伦敦的主要街头了,它是红蓝两色机械扳手式交通灯,这是世界上最早出现的交通信号灯。随后又在英国出现了以煤气为光源的红绿灯,但不久后由于煤气爆炸的缘故,这种红绿灯便被取消了,但它以红绿为交通灯的颜色,并规定红色代表“停止”,绿色代表“注意”,所以这能够算上世界上最早出现的红绿灯。而最早出现的电气启动交通灯是在美国,这种红绿灯有红黄绿三色圆形投光器组成,这个时候才有了现在所熟知的红灯亮代表停止,绿灯亮代表通行。 1.2心形流水灯大街上随处可见的流水霓虹灯都是处于单片机的控制,这说明单片机在生活中的应用也是随处可见的。我所设计的这个心形流水灯闪烁起来先是如星星般闪烁,然后是按照红绿交替流水。流水灯可用于酒店,KTV等娱乐场所。 2.两个软件介绍交通灯控制系统的设计中,在仿真方面我主要用到Keil uVision4和Proteus两个仿真软件,先采用Keil 对C语言进行编译调试,调试成功之后生成HEX文件,再在Proteus中绘制出交通灯仿真实验图,将生成的HEX文件烧写进实验图的单片机中,之后进行仿真测试,在此之前我们先了解一下Keil uVision4和Proteus这两个仿真软件。 2.1Keil uVision4简介随着单片机技术的不断发展,单片机的开发应用也越来越多,相对应的出现了很多单片机语言的开发软件,KEIL软件是目前最通用的MCS-51系列单片机的编程开发软件,KEIL是一个集C编译器、宏汇编、连接器、库管理和仿真调试器在内的系统开发软件。本次设计使用的是Keil uVision4,其操作界面如图4-1所示。它具有灵活的窗口管理系统,方便了开发人员的使用。能够完全控制窗口位置的任何地方。有效地利用屏幕空间组织多个窗口,提供一个高效的开发环境 2.2 Proteus简介Proteus是目前较好用的仿真单片机和外围器件的工具软件,受到大多数单片机开发应用的爱好者的青睐,它能将电路仿真、PCB设计及虚拟模型仿真软件三合一的仿真平台。Proteus的功能非常强大,它支持各种系列的处理器模型,这对于硬件设计者来说是一个福音,若是直接做成硬件不提前进行仿真的话,非常浪费材料,而且浪费时间,但有了仿真,就可以提高制作硬件的效率,不需要在硬件做出之后才来验证正误。Proteus的操作方式相对来说没有那么的难,其操作界面如图 3.仿真实现
设计选择在keil中进行软件编程,在Proteus中绘制电路图,现在简单的介绍keil和Proteus相结合的仿真步骤: (1) 安装好Keil和Proteus软件。 (2) 进入keil的开发界面,创建一个新工程Project,并为该项目选择合适的单片机元件,本次设计选择的是AT89C51,新建文件,将程序编写进此文件,并将文件加入工程中。 (3) 程序编写成功之后,进行工程编译,检查的结果会出现在操作界面的Build Output窗口中,根据提示的错误修改程序,直至程序无错误,单击Options for Target选项,在弹出的窗口选项栏中选择Output这一栏,在create HEX file前打上勾表示创建,创建成功后结果会在Build Output窗口中显示。 (4) 进入Proteus的ISIS操作界面。 (5) 在Pick devices中选择电路所需的元件,将其端口连接起来,组成完整的仿真电路图。 (6) 确保电路图无误之后,将HEX文件烧写进单片机中。 (7) 运行仿真图,检查是否达到要求。 4.交通灯的设计思路要设计并制作一个交通灯控制系统,就必须了解到城市的交通规则以及道路口中交通灯是如何设计并运作的。交通路口模型如图1-1所示。 图4-1交通路口模型
如图1-1所示,一个十字路口分为东南西北四个方向,在任一时刻只有其中一个方向可以通行,如果南北方向红灯亮即禁止通行时,东西方向上表示能够通行的绿灯便亮了,为了给在红灯灭、绿灯亮的那一瞬间还在道路中间行驶的汽车一个缓冲的时间,避免交通事故的发生,我国学者胡汝鼎提出在红灯与绿灯之间加一个表警示作用的黄灯。于是,便出现了红灯停,绿灯行,黄灯等一等这种说法。从一个方向通行至另一个方向通行,中间需要经过短暂的缓冲时间,所以需要把交通状态分为4种: (1) 东西方向红灯灭,同时绿灯亮;南北方向黄灯灭,同时红灯亮,倒计时25秒。此时东西方向允许通行,南北方向禁止通行。 (2) 南北方向红灯灭,同时绿灯亮;东西方向黄灯灭,同时红灯亮,倒计时30秒。此时南北方向允许通信,东西方向禁止通行。 (3) 东西方向绿灯灭,同时黄灯亮,倒计时5秒;此时南北方向依旧是红灯亮,倒计时5秒。此时东西方向除了驶出停车线的车辆均处于等待状态。 (4) 南北方向绿灯灭,同时黄灯亮,倒计时5秒;东西方向依旧是红灯亮,倒计时5秒。此时南北方向除了已经驶出停车线的车辆均处于等待状态。 表1-1表示灯状态和行止状态的关系: 表4-1 交通状态及红绿灯状态 4.1 交通系统的功能要求
本设计是以AT89C51单片机为控制核心的交通灯控制系统,能够模拟一般的交通道路口通行情况,分别用红灯表示禁止,黄灯表示等待,绿灯表示通行,用数码显示管进行倒计时显示,同时还能模仿交通中的一些紧急情况,如:黄灯常亮的夜间模式,紧急车辆通行模式,当有紧急的车辆需要通行时,交通员按下紧急通行的按键,东西南北方向上皆亮红灯,让紧急车辆先通过。东西南北方向上的显示倒计时也是不一样的,比如,东西方向上红灯的倒计时要比南北方向上绿灯的倒计时多5秒,正好空出黄灯的计数时间。 4.2 单片机的功能要求本设计共有四个二位阴极数码管,用来显示东西南北四个方向上的时间,单片机P0口接上拉电阻,同时接74HC245以起到驱动放大的作用,四个共阴极数码管的阳极接到74HC245的另一端,即单片机通过74HC245对数码管进行控制。数码管的阴极接到51单片机的P1口上。一共有12个LED发光二极管,红黄绿三种颜色各4个。每个路口分别接红,黄,绿三种颜色的灯各一个,再将它们接到单片机的P2口上,表示控制的按键接在单片机的P3口。这样就构成了交通灯控制系统的基本构架。
4.3 显示模块功能本设计的显示模块分为数码管显示和LED发光二极管显示两种,数码显示管主要用来显示数字倒计时,因为若只有红绿灯显示,驾驶员没有办法知道此时还有多久交通灯的状态会切换,结合数码管倒计时显示,方便驾驶员判断是否通过马路或者是等待直到下次可通行时。大量的数据显示,数码管和LED发光二极管相结合的方式更受驾驶员和行人的欢迎,所以现在普遍的交通灯控制系统都是采用两者相结合的方式,这样增加了道路的安全系数,便于驾驶员和行人面对的情况作出判断,而仅仅通过LED显示是没办法达到这种效果的,目前的交通灯控制系统采用两种显示结合的方式,使道路通行更安全可靠。
4.4按键模块功能按键模块是用来设置交通灯控制系统的运行状态的,按键依次功能为:深夜模式的黄灯闪烁;禁行模式的红灯常亮;东西通行;南北通行;确定按键是配合时间加减按键使用的,当调到了所需要的时间按下确认按键系统就可以运行了;时间加键按键,默认的状态下时间加减都指的是东西方向上的时间加减,此时东西方向是绿灯亮,将时间调节好之后南北方向红灯时间会比东西方向绿灯时间多出5秒的黄灯时间;切换调试方向,默认状态下时间加减按键指的是东西方向上时间加减,但若是想调节南北方向上时间加减,必须按下切换调试方向按键,这时候南北方向亮绿灯,东西方向上红灯亮的时间比南北方向上绿灯亮的时间多5秒,作为黄灯闪烁的时间;复位键可以将整个系统复位到初始的默认状态。 5.单片机引脚的介绍单片机分为51和52两个系列。它们的基本结构大致相同,区别仅在存储器、计数器、中断源的配置方面。本次设计中,我采用的是AT89C51单片机,它的内部资源主要包括: 一个8位的CPU。 一个片内振荡器及时钟电路。 4K字节的ROM程序存储器。 128字节的RAM数据存储器。 两个16位定时/计数器。 64K的可寻址外部数据存储器和64K外部程序存储器。 32个可编程的I/O端口。 一个可编程全双工串行端口。 五个中断源、两个优先级嵌套中断结构。 AT89C51的单片机有40个引脚,电源和振荡引脚占4位,表示控制的引脚占4个,剩下的便是输入输出接口引脚,4个并行I/O口,一共占用32个引脚。单片机的引脚图如图2-1所示。
5.1单片机的最小系统单片机的最小系统是指让单片机能够正常运行所需的最基本的硬件配置,包括电源,晶体振荡电路和复位电路。如果单片机内部程序的大小不超过4KB,那么单片机内部的程序存储器足够存储,这个时候单片机不需要外扩程序存储器,单片机的最小系统就能够使它运行。单片机的最小系统如图2-2所示。 图5-1AT89C51单片机引脚图 5.2晶体振荡电路单片机的内部时钟信号便是通过芯片的内部振荡电路来实现的。由于51单片机的晶体振荡频率大致在6MHz~40MHz之间,所以通常选用6MHz或12MHz的石英晶体。晶体振荡频率越高,单片机的时钟频率也越高,单片机的运行速度也就越快。所以把振荡电路比作单片机的心脏。 复位电路 在此次交通灯控制系统的设计中,专门有一个复位按键,用来将交通灯系统的显示值复位到默认状态。通常的单片机的仿真中是不需要将复位电路画出来的,但本此设计用到了复位按键,所以就将其表示出来了。在单片机通电之后,其内部的各种寄存器都处在随机状态,只有当单片机的复位信号持续两个以上的机器周期时,它才能够完成复位的初始化操作。复位一边有两种形式,第一是上电复位;第二是上电与按键均有效的复位。本此设计选择的是第二种复位方式,即上电与按键均有效的复位方式。 图5-2 单片机的最小系统 5.3 显示装置
在此次交通灯控制系统的设计中,采用了三种颜色的LED发光二极管模仿红、黄、绿三种颜色的交通灯,用LED数码显示管模仿交通灯的倒计时装置。发光二极管是一种能够将电能转化为光能的半导体元件,与普通的半导体二极管一样它具有单向导电性,在发光二极管的负向加上电压,它不会发光。同时它还具有环保节能,低耗寿命长等特点。 LED数码显示管是由发光二极管组成,常见的LED数码管是“8”字形的,本此设计也是在各个方向上采用两位8字形的二极管作为信号灯的倒计时显示装置,8字形的数码管共分为8段,每一段都由一个发光二极管组成。数码管有共阴极和共阳极之分,顾名思义共阴极就是把各段发光二极管的阴极连在一起,当数码显示管公共的阴极接地时,如果将发光二极管的阳极接在高电平上,那么发光二极管就会发光。共阳极就是把各段发光二极管的阳极连接起来接上高电平,此时若时二极管的阴极接上低电平,它便发光显示相应的段。数码管就是通过发光二极管不同的暗亮组合来显示不同的数字。八段发光二极管中有一个圆点型发光二极管,用于显示小数点,用DP表示。8段LED数码管的结构及外形如图2-3所示。 其中,共阴极和共阳极的段码相加为FFH,所以我们只要记住共阴极的段码,对其段码进行按位取反就能得到共阳极段码。为了方便,本此设计我选择的是共阴极的数码管。 图5-3 八段数码管的结构示意图
6.系统的软件设计
6.1整体程序设计
交通灯控制系统除了硬件设计部分,还需要软件编程来控制单片机运行,目前最常用的单片机编程语言主要有汇编语言和C语言,本此设计采用了C语言来编写程序,能够直接访问物理地址,可以进行位操作。编写程序时我把整个程序分为了几个模块,然后用主函数调用的形式将他们联系成一个整体,这样是程序写起来稍微简单一点,全部控制程序实际上分这几个模块:消抖动延时程序,中断服务子程序,状态灯控制程序,LED显示程序,键盘设置处理程序,紧停或违规判断程序,红绿灯时间调整程序等。整体程序的框图如图3-1所示:
图6-1 整体程序框图 6.2 子程序模块设计
6.2.1 按键扫描子程序交通灯控制系统需要处理多变的状况,这些都是操作者通过按键来实现的,那么交通等控制系统是如何判断现在应该运行那种情况呢,这时候按键扫描子程序是非常重要的,首先判断按键是否按下,此时我们调用显示来消除抖动,确定按键按下才会进行下一步程序,按键的一端接在单片机的P3口,另一端接地。初始状态是单片机的P3端口是置1的,即为高电平,无按键按下时也是高电平,在这样的情况下,它们其中一个按键被按下后,对应的I/O接口就成了低电平。若按键释放对应的I/O口还是恢复成高电平,那么在程序编写中,只需要查询电平的状态就可以知道是否有按键按下,是哪个按键按下,对应的便知道需要执行那个程序。程序框图如图3-2所示。
图6-2 按键扫描子程序框图 6.2.2显示子程序此次设计采用了共阴极数码管,在开始编程时便对数码管的字型码进行了赋值,两位共阴极数码管除了有段位码之外还有两位位选线,数码管的共阴极连接在一起引出位选,为了使数码管能够正常工作,需要给选位线接低电平。初始的时候P1口置高电平,P0口为低电平,数码管无显示。将东西南北时间分别除以10取商,取模得到东西秒十位、东西秒个位、南北秒十位、南北秒个位,再将它们赋值给P0口的字型码中,此时P1口赋不同的值来控制片选,便可以将东西南北个位和十位的时间送到数码管中。 6.2.3 外部中断子程序此次设计中,使用了外部中断0与外部中断1,外部中断0只允许东西通行,外部中断1只允许南北通行。其程序框图如图3-4所示:
6.2.4定时器中断子程序
此次设计采用了2个16位的定时器T0、T1,定时方式采用方式1。单片机定时器是通过对机器周期脉冲进行计数,每个机器周期定时器加1,而一个机器周期等于12个振荡脉冲周期,那么定时器的计算公式为: 定时时间=计数值*机器周期 计数值=216-初值 其中,时间单位为us,本次单片机选用的是12MHz的晶体振荡频率,所以机器周期为1us。 在初值为零的情况下,计数器的最大计数时间是65.536ms,而程序需要的定时时间为50ms,所以需要对计数器赋初值。初值为15.536ms,即令THn=0x3C;TRn=0xB0。此时定时器在此基础上计数器再记50000个数后,脉冲计数器溢出,单片机向CPU申请中断。我们只需要让定时器中断的次数为20次得到的时间就是1秒。这样就可以精确的控制数码管显示时间,也可以切换处理各个状态。中断程序的流程图如图3-3所示。
图3-3 中断程序流程图 6.2.5 显示子程序此次设计采用了共阴极数码管,在开始编程时便对数码管的字型码进行了赋值,两位共阴极数码管除了有段位码之外还有两位位选线,数码管的共阴极连接在一起引出位选,为了使数码管能够正常工作,需要给选位线接低电平。初始的时候P1口置高电平,P0口为低电平,数码管无显示。将东西南北时间分别除以10取商,取模得到东西秒十位、东西秒个位、南北秒十位、南北秒个位,再将它们赋值给P0口的字型码中,此时P1口赋不同的值来控制片选,便可以将东西南北个位和十位的时间送到数码管中。
6.2.6 外部中断子程序此次设计中,使用了外部中断0与外部中断1,外部中断0只允许东西通行,外部中断1只允许南北通行。其程序框图如图3-4所示:
7.交通灯结果展示
7.1交通灯部分代码展示图7-1部分代码1 图7-2部分代码展示2 7.2交通灯部分结果展示 图7-3夜间模式
图7-4禁止模式 图7-5东西可行,南北禁止
8.心形流水灯8.1心形流水灯的设计思路大街上随处可见的流水霓虹灯都是处于单片机的控制,这说明单片机在生活中的应用也是随处可见的。我所设计的这个心形流水灯闪烁起来先是如星星般闪烁,然后是按照红绿交替流水。 8.2部分代码展示 图8-1流水灯部分代码展示1 图8-2流水灯部分代码展示2 8.3心形流水灯结果展示 图8-3流水灯闪烁展示
图8-4流水灯左边渐变展示 8.4 心形流水灯测试图8.5结果分析根据仿真结果可知,本次设计能够准确并彻底的完成设计要求,完成了心形流水灯的设计,实现了LED灯的循环点亮、依次熄灭等基本功能,并且还实现了对角闪亮、间隔闪亮、顺时针闪亮,逆时针闪亮等多种功能。 9总结通过这次设计,使得我更加了解了实验所使用的两个软件,并且了解了仿真过程中的一些问题。 首先是软件仿真时的一些马虎问题,如引脚标错等等。 其次是对自己所学习过的内容更加了解了。如中断,包括那些中断,在什么情况下会用到什么中断。还学会了一些简单的代码。因为之前仿真过很多的实验,所以两个软件用起来算是得心应手。
全部资料51hei下载地址:
51hei设计.rar
(1.06 MB, 下载次数: 100)
|