基于单片机三路口红绿灯设计

目 录

摘要„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„
第一章 设计的目的
1.1 设计目的…
1.2 国内外的研究现状以及发展趋势…
1.3 设计方案 …
1.3.1 显示界面方案…
1.3.2车流量控制方案…
1.3.3交通信号灯
1.3.4 电压转换
1.3.5输入,输出设备
1.4 设计任务…

第二章 系统总体方案及硬件设计
2.1 交通管理的方案…
2.2 总体硬件设计…
2.3 显示电路设计…
2.3 车流量检测电路…
2.5 电压转换电路…

第三章 软件系统设计
3.1 设计思路及关键技术…
3.2 程序流程…
3.3 手动控制…
3.4 拥挤程序设计…
3.5 设置时间功能…
3.6 定时器…
第四章 Proteus软件仿真和keil软件编程的实现
4.1 Proteus的简介 …
4.2 Proteus软件仿真 …
4.3 信号灯调试 …
4.4 高峰期车流量拥挤时仿真…

摘要

交通信号灯的设计可以加大通行效率,可以减少交通中的事故的发生。从而有序合理的进行。车辆检测器的使用,可以有效的减少拥堵,更加合理的时间分配,从而有效的减少了拥堵带来给通行中的时间损失。而干线的控制,可以使一个干线上流通的时候,在路口与路口之间减少等待的时间。单个路口的车辆检测,和干线的通行时间的估算,将大大加大的通行效率。
而系统中用到的数码管,而内部就是发光二管组成,内部有七段组成。共阳数码管,在共阳端接入高电平,在段选段,接低电平。能可以正常的显示。信号的采用二极管。而中央控制采用单片机51系列,体检小,便宜,而具有强大的功能,可以完成需求的功能。
关键字 单片机 交通信号灯 车流检测

In this paper
The design of traffic lights can increase the traffic efficiency, can reduce in the traffic accident. The reasonable and orderly. The use of the vehicle detector, can effectively reduce congestion, more reasonable allocation of time, so as to effectively reduce the congestion loss brought to pass the time. And main control, can make a main circulation, reduce the waiting time between intersections and road. A single intersection of vehicle detection, and the estimation of arterial passage of time will greatly increase the traffic efficiency.
And the system used in the digital tube, and the internal is luminous tubes, two internal seven segments. Yang digital tube, in the total end connected to the high level in the section of the passage, the low level. Can the normal display. The signal using diode. And central control USES 51 series microcontroller, physical examination is small, cheap, and has powerful function, can complete the function of the demand.
The keyword The single chip microcomputer, traffic lights, traffic detection

第一章

1.1设计的目的
随着社会的进步,交通工具的越来越多样化,车成为陆地上交通最为重要的交通工具之一。随着车数量的不断增加。而今目前而言,常常会看到拥堵的现象。一方面是车的数量的本身比较多。而另一方面是管理不当。而一个很面现的例子。两个人同时要过一个单独的桥,如果两个人都不让行。都要在同一时间去通过。那么可能最终是两个人都无法过去。而车也一样。没有顺序的进行。大家都急忙的冲在路口。只会加剧路口的拥堵。而不会加快流通。有时候,一个路口。主干道会有更多的车流要通过,有时候两个方向的通过的车流都差不多。在不同的情况,如果用不同的方案去执行会得到一个意想不到的答案。
在这个时候或许就急需要一种方案来解局这种情况。智能交通灯应运而生。一个路口如果一直用人力在这里指挥 ,一天二十四个小时。每个城市有无数的路口,那么如果全部用人力去指挥。那么可能需要花费太大投入。而且可能还会在一定程度上有一定的危险。而如果用指示灯的现实,而且分时有序的交叉进行。用一个12v的指示灯。二十四小时的工作。成本也花费不了多少。
所以城市交通可以减少拥堵,使通行比较合理有序的进行,减少拥堵带。
1.2 国内外的研究现状以及发展趋势
城市交通是考虑因素多而又非常复杂,必须政治。必须从不同的方面方面着手解决,对于我国城市区域十分发展,车流,人流量的相当多。使得我国社会对交通设施的需要不断增加,因此对于当今社会是一个的挑战,国内对于大中城市的规划,在大量借签和吸收国外已有的先进事例的基础上。结合当前国情建立和完善符合国内的城市交通系统。而今,对于国外侧重于引进智能交通来对交通控制系统研究,让其在交通中自适应。尤其是美国,现有好几个大学或研究机构。正在研发让交通自适应交通信号控制系统,。这其中具有代表性的是美国亚利桑那大学研制的RHODES。在交通领域我国的发展起步相对比较晚,基本上从新中国成立以后才开始。随着国内各方面的条件成熟和我国社会发展,才慢慢建立以及健全交通系统。
20世纪30年代初期,最先开始使用车辆感应式信号控制器的是美国,英国紧跟其后,而英国使用的车辆检测器是气动橡皮管检测器。更加具有灵活性,使其通过交通路口时,大大节约了时间,这个交通领域带来一个不小的惊喜。该技术的使用,从已有的特点来看,极大的促进该项及时的发展。继这后问世的超声波,雷达、光电、地磁等检测器。而具有代表环形线圈车辆检测器是现今在城市道路交通信号自动控制、交通监测以及交通数据采集系统中应用最多的检测器。以日本为例的少数国家把这技术大力应用主要是超声波检测器。  1952年美国科罗拉多州丹佛市第一次利用模拟计算机和交通检测器实现了对交通信号机网的配时方案自动选择式信号灯控制。加拿大多伦多市于1964年完成了计算机控制信号灯的实用化建立了一套由IBM650型计算机控制的交通信号协调控制系统成为世界上第一个具有电子数字计算机城市交通控制系统的城市。把计算机融入交通控制技术,为交通控制系统注入了新的血液。实现了网络化的交通控制系统,可以实现对一个城市或一个区域或更大范围内的控制。计算机道路交通控制是交通技术发展的里程碑。道路交通信号控制系统在近一个世纪的不断发展历史银河里,可以看出它的发展,从最初的手动到自动。从固定给定时间到根据实际情况配时、从无传感器控制到有感应的传感器控制、从简单的单一控制到干线控制。从小范围的控制到网络的大范围控制的漫长艰辛过程。
目前世界大量的应用的的交通控制系统中,最具有代表性和最重要的城市道路交通信号控制系统是:英国的TRANSYT和SCOOTS交通控制系统以及和澳大利亚的SCATS系统。
1.3设计方案
1.3.1系统硬件选择
系统控制器的选择
在这里插入图片描述

51单片机作为系统部分的中央控制器,以上图中显示的为单片机内部结构图,
P0 内部不带上啦电阻(其余三个都增加带有上啦电阻),所以在使用的时候,需要增加添加,P0的可以作为数据接口和地址线的低八位。这时P2做为地址的高八位。P1时一个准双向通行的I/O。P3口有自己独立的功能。在上图中也可以内部结构图看出他们的不同
由单片机组成的中央控制器的红绿灯电路如下图所示
在这里插入图片描述

1.2.2显示电路选择数码管
在这里插入图片描述

DP在通常使用中作为小数位,共阳极数码管,在共阳极端加入高电平,其他每段二极管加入低电平的时候,对于的二极管导通,使二极管发亮。 数码管成本比较低!而使用起来比较简单,而内就采用的是七段数码管。这里选用两位的数码管,首先一个路口不可能只用几秒完成一次单方向的通行。也一般不至于大于100,所以这里采用两位数码管。这里用到九位。这里的小数点位对于路口通行用不到。不可能显示的豪秒。所以这里用到七段数码管的七段,加上两个片选信号。

1.3.2检测车流量
检测车流量用金属传感器,而系统中是基于Proteus下的仿真,这里采用按键的方式代替。而检测车辆的方案中一种可能的是计数车的数量,什么时候开始计数,一直,还是等是红灯的时候。这里用转弯的直行的,同时绿灯的时候肯定还有开走的。和堵在后面的是根本无法计算的。而把传感器按在靠路口远一点。前面可能有车辆已经开走。而假使直接用传感器按在离路口一定距离的地方,采用在一定的时间内,如果传感器一直被踩着,这里用金属传感器。埋在地里。说明车停在这里已经很久的,说明该路口比较拥堵了,的加快放行。这里采用减少周期时间。把次干到的时间减少。加快通行。

1.3.3 红绿灯信号灯
红绿灯信号灯红绿灯信号灯采用大灯,这里需要继电器的驱动,和电流的放大,后面会讲到继电器和放大电流电流。但每个大灯都需要一个继电器和电流放大器,会占用很大的空间,这里其中一个路口用大灯,而另外两个路口则将用Led灯代替
指示电路方案,每个路口中有四个方向,首先放行东西方的东向,把左右转直行一起放行,用一组红黄绿灯,实现一个单独方向的通行。其次到南北方向的南向通行,这时用一组灯,红黄绿,实现左右转同时放行,余下的两个方向同样采用一组灯完成。每个方向的都是同时放行。一个周期。完成四个方向,每个方向一次通行。
1.3.4电压的转换
现场不可能是用单片机输出的5v的电压来控制,所以这里的用到电压的转换,用继电器直接接通,也许很多人和我初次用继电器一样。接上去。直接用单片机驱动。无论如何也达不到自己想要的结果,而当直接接高低电平的时候。这时候继电器是可以正常工作。这里的说到继电器不是只要用电平就可以驱动的。也不是不可以用单片机进去驱动仿真。是因为直接用单片机驱动的时候,电流太小。达不到继电器工作的电流。所以在单片机与继电器之间应该要接入一个电流放大器,三极管。这里用pnp型电流放大器。如果单片机作为输出,其输出的IO口位低电平。,pnp放大器一个端口接高电平,另一端接入继电器,如果单片机的输入位是低电平输入,pnp导通。从而驱动继电器,使继电器的常闭打开,常开关闭。从而你可以在继电器输入自己想要的电压 一端作为输入,另一端作为输入。这里的继电器相当开关的作为,而用单片机进过电流放大。从而实现的可控的目的。
1.3.5具体到各自具体设计中,输入、输出设备、
1 输入设备有按键 控制红绿灯的停止 以及红绿灯的时间的增加建设
2 输出的设备有 led 分红 黄 绿 ,以及数码管 ,显示通行的时间和led的合作让各个方向的进行有序的通行
3 在每个路口的控制好下一路口的绿灯输出的亮的时间
4 黄灯需要闪烁,同时显示时间。
1.4设计过程的的工业描述
在本系统中了为了车辆在下一个路口能够在最短的时间被通过,采用了路程与大概时间的到达下一个路口的时间的估算,以节约过往车辆在最短时间内通过,通过红绿灯亮的时间从而来估量到达的时间差
以按键的方式来人工控制车辆的通行和调节红绿灯亮的时间长短
本设计主要做了以下几方面的工作
1确定系统交通控制的总体设计包括三路口具体的通行,禁止通行方案设计。系统应该达到的功能。设计需要对交通信号灯的控制。和通行时间的倒计时显示界面。而切换的时候需要黄灯的中间状态。从实际需要出发,车流的不确定因素,当拥堵的时候需要一种解决方案,即对车流量多时段。调整通行的时间配置。有时候往往需要人为的干预才可以达到,这时候可以调到手动控制状态。
2.系统中用到包括CPU、存储器、显示电路,信号指示电路等模块。各模块选择和和各个模块之间的连接,需要有力的分配,这样可以减少编程中地址的分配。
3.在软件系统设计方面,系统编写采用了c语言,通过对单片机内部结构。各个端口的工作模式和工作方式的了解。对定时器中断以及延时原理的学习加深。

1.6设计的任务
首先的让所做的系统能正常的一个周期里正常的工作.
其次是当路口出现拥堵的时候,采取方法,让主路口通行加快,减少次路口通行,从而减少拥堵
再次是能够实现路口时间的调整,当主路口的时间不够的时候。把主路口的时间调大,当主路口休闲的时候,可以减少时间,同时次干道也可以调整时间在必要的时候增加减少
最后是需要有手动的环节,可以手动切换的四个方向中的任何一个方向通行,手动完成后切换到自动环节能够

第二章 硬件的选择和交通灯的方案

2.1交通灯的管理方案
道路交通信号灯是交通安全产品中的一个类别,是为了加强道路交通管理,是为了使道路可以有序的通行,对交通道路更进一步的交通管理。可以减少道路中交通事故的发生,合理的通行,可以提高道路通行效率。从而可以改善道路交通状况。可以广泛的应用在十字口、丁字路口等交叉路口,由道路交通信号控制通行和禁止通行。引导车辆和人有序的通过路口。
从通行的种类分:可以分为机动车道信号灯和人行横道信号灯。非机动车道信号灯,方向指示信号灯,移动式交通信号灯,太阳能闪光警告信号灯,收费站天棚信号灯.
LED(发光二极管)是近些年来应用开发,以及应用最广发的器件,功耗低,能以很小的电流进行驱动。以其瘦小的躯体,而亮度高,而且使用寿命长的优点。如今已经慢慢取代白炽灯、低压卤钨灯作为道路交通信号灯。

2.2 总体硬件设计
由于单片机引脚的有限,需要更多的引脚来实现三路口的红绿信灯的设计,选择扩充I/O口,一种用外围电路来扩展I/O,另一种加一个单片机,同样可以达到扩展I/O口的效果,同时可以对两个单片机进行编程,数据的传达,在仿真中。系统用到了点对点的传送。两个单片机进行分工,第一个单片机实现输一个路口数码管管的显示,和信号灯的显示,带有手动环节。和仿真拥挤的按键。另一个单片机完成两个路口的红绿信号灯的显示,和手动环节以及一个拥挤按键的仿真(只在三个路口的一个方向的主路口起端)设置一个拥挤仿真。当接受到该信号后,三个路口同时进行拥挤的信号传递与仿真。
2.3 显示电路的设计
第一章中以及选择数码作为系统中的显示电路,而两位的数码管,需要两位的位选信号如图所示
在这里插入图片描述

图中的P0口中的0~5是段选信号,而P3口的0,1位选信号

第三章 软件调试

3.1 Keil 简介
C51是美国Keil Software公司的51系列中的一款。兼容C语言开发,执行Hex文件。C语言和汇编相比,C语言的从可读性,程序的逻辑的实现难易程度,以及结构上。以及在后期中对其维护都有明显的优势,而用过C语言和汇编的人会有更多的体会。
Keil C51软件提供了强大的调试工具,可以直接实现简单I/O的输入输出的调试。还为编写者提供了丰富的库函数。全Windows界面。在完成C语言编译后的文件中生成的汇编代码。会到Keil C51生成的目标代码的效率是非常高的,这其中大多数语句生成的汇编代码是很理想的结果的,容易理解。在大型开发中更能体现高级语言在编写中的优势。
在keil下可以进行I/O的仿真,中断的仿真,在调试界面下,使程序执行完全后,在自己的函数中定义的,作为输入的I/O位,可以手动的赋值高低电平,输入高低电平,可以看到自己编写函数执行的结果。

单片机有不同的型号,如果吧型号不同的程序烧入另一个型号的芯片中,单片机肯定是跑不起来的,比如说,你叫张三,他叫王麻子,别人叫张三的是,王麻子不可以答应。而叫一个学医的去做软件开发,这显示不很难的。这里面的内部结构和一些使用方法都不可能全相同所导致的。

所以接下来就是要选择单片机的型号。对于小型的系统,和处理简单的数据,我们用不到那些高达上的芯片比如arm
这里选择Atmel,打开下面具体的芯片的名称
选择AT89C51在我们的所修课程中也有专门的讲解这块芯片有有四个口。分别为P0,P1,P2,P3口而其中P3口有些特殊的功能,比如两个外部中断,采用低电平或下降沿来触发,两个定时器/计数器,分别T0,和T1 而为了方便与其他设备之间的读写,有读写各一位。一共使用
单片机 AT89C51内部带有4k的FLASH存储器。英文名称FPEROM—Flash Programmable and Erasable Read Only Memory在极低的电压工作,5V的工作电压,是具有性能比较高的CMOS 8位微处理器,。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器的使用次数高达1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,通时兼容着工业标准的MCS-51指令集和输出管脚。
选择好单片机信号后,在红绿灯中用到的输入有按键,和金属传感器,在仿真中用按键的方式代替。下面就先用一段简单的程序来调试下单片机的一个引脚输入,而另一个引脚输出,和改变数字的功能,为后面的红绿灯做一个铺垫
如图箭头所指的方向,file下面,点击建立一个文本域,按下CTRL+S这是快捷保存的方式,然后给文本域命名,这里要建立的是可执行的文件,所以在文件的后面以后.C的方式结束。
文件建立好好后,的吧刚才建立好的文件放在前面建立好的工程里面去
右键Source Group 1 然后弹出新的对话框
吧刚才建立的文件加入工程中
下面用keil软件来调试简单的按键输入输出功能的。
#include"at89x51.h"头文件的引用。
#include"at89x51.h"
void main()
{
while(1)
{
if(P2_0==0)
{
P2_5=0;
}
else
{
P2_5=1;
}
}
}
这里的p2_0是自己在文件自己定义的,所以这里这样写单片机就可以识别你是写的那位了,2代表端口号,0代表第一位,判断0位是否为低电平,当0为低电平的时候第六位输出低电平,当不为低电平的时候是高电平这里的while是让程序一直在主函数里跑。编译成功后,在单片机里面调试看是否可以达到想要的目的
在这里插入图片描述

点击该按键让该文件执行完成这时候我们需要看看是不是可以当按下的时候是不是可以达到另一口也同时为低电平的效果,需要在外面这个菜单里面拉出io口,该函数中用到P2口,吧P2拉出来
在这里插入图片描述

当输入位为高电平的时候,输出位也为高电平,
在这里插入图片描述

在吧第一位按下变成低电平的时候,第六位这时候也跟着变成了低电平。说明初步调试工作是可以进行的
这里的调试对后面的红绿灯编程是有很大的帮助的。

3.2总程序流程
在这里插入图片描述

程序开始,进入主程序,初始化端口,打开总中断端口,打开T0和T1定时器中断,手动是否按下,如果没有,继续执行,如果手动环节打开,则需要去执行手动部分。直到手动环节完成,回到自动环节的时候,用去顺序的执行
2.2 手动控制
在这里插入图片描述

接下来就是手动的控制环节,这里输入用按键的方式,所以和刚才上面的调试是很大的相似的地方 ,而这里要关闭定时器(在后面的环节中将会具体的讲到)在Proteus下用到的手动控制环节用到的是P1_7考虑到这里单片机引脚的问题,这里只用到一位。但考虑到要控制四个方向的手动控制。

while(P1_7== 0);
cntP1_7++; //标志设置键被按下的次数
在这里插入图片描述

这里用到了标志位,当该为被按的时候,标志位加一标志的数等于1,2,3,4的时候分别控制下面图中的1,2,3,4方向的车辆通行

这里的用的c语言中最常用到的一个函数switch()
TR0 = 0; TR0为关闭T0中断,1为打开定时器T0中断
这里的TR0=0是关闭定时器,如果不关闭定时,定时器是一个中断函数,会被一直执行,从而会改变手动环节中方向指示灯的转向,所以这里必须的关闭
switch(cntP3_4)
{
case 1:
P1 = 0xf7;
break;
case 2:
P1 = 0xef;
break;
case 3:
P1 = 0xfe;
break;
case 4:
P1 = 0xfd;
break;
case 5:
cntP1_7 = 0;
break;
}
标志位为不同的值的时候对于去执行 case 段的语句,break是执行完后跳出switch函数,等待下次的执行当第五次被按下的时候吧标志位赋值为0
刚才这里已经吧定时器关闭了,定时器不工作,则值在定时器里面改变的,这时候的吧定时器从新打开
TR0 = 1; //打开T0中断
刚才没有在手动环节中改变原值,所以再次回到自动环节中的时候会接着上次执行的执行
模式金属传感器器的环节,用到的是按键输入
if(P3_70)
{
greenSN=3;
}
else
{
greenSN=25;
}
3.3 按键仿真传感器
这里用到的是P3_7做为金属传感器的输入,按老师提的意见,这里是改变在周期内吧次路口的时间压缩,主路口的时间不变,这样可以增加主路口的通行时间,当P3_7
0的时候进行一次判断,吧次路口的时间直接赋值为更小的值,这里赋值为绿灯通行3秒,这里是仿真,在实际肯定是按实际所需调整,黄灯。一样完成一个周期的通行。
2.4 设置功能
作为智能交通灯,时间肯定是要可以调整的,调整时间用到输入分别为三个按键,分别为P3_4,P3_5,P3_6,P3_4作为设置键,P3_5作为增加键,P3_6作为减少键来改变主路口次路口的通行时间的调和主路口的时间调整
设置键的程序如下
//设置红绿黄灯秒数
void setSecond(void)
{
while(P3_4 == 0);
cntP3_4++; //标志设置键被按下的次数
switch(cntP3_4)
{
case 1:
cntEW = 5;
P1 = 0xf7;
break;
case 2:
cntEW = 1;
P1 = 0xef;
break;
case 3:
cntSN = 1;
P1 = 0xfe;
break;
case 4:
cntSN = 3;
P1 = 0xfd;
break;
case 5:
cntEW = 5;
cntSN = 5;
cnt_num = 0;
cntP3_4 = 0;
break;
}
}
这里也标志位赋值,每按一次,标志位加一次,然后对标志位进行判断
第一次按“设置键”时,东西向的通行,绿灯亮当这时候不再次按下的时候,
case 1:
if(keyMemory != greenEW + 10) //秒数加1
{
greenEW++;
}
if(greenEW == 90)
{
greenEW = 0;
}
这里吧一个东西向通行的时候赋值给一个变量,然后每次按下,则该数自加一次。同时数码管显示时间。不停的闪烁。

其次按下“设置键”时,这时候对起黄灯进行设置,考虑到有时候路口的距离,更能安全的通过。,这时候为黄灯调整状态,数码管显示当前东西向黄灯的通行的时间,而同时不停的闪烁。
再次按下“设置键”时,设置南北向的绿通行时间,按下加减键,可以对其时间的增加减少。
再次按下的设置的键的时候,这时候是对南北向的黄灯通行时间的调整,这时候也可以通过加减键来增加或减少时间
最后按下“设置键”时,系统退出设置状态,回到交通信号灯的正常通行状态,首先东西向先绿灯,再南北向绿灯,分别代表放行
3.5 定时器
程序的运行采用的是定时器,不可能采用延时的方法来完成该项工作,用延时在程序里面跑,首先执行每个语句的时候会要时间,程序中本来就有延时的程序,如果红绿灯再用延时来跑,那么会严重影响时间,不正确。
单片机内部提供了三个定时器
TMOD=0x02; 这里是对定时器T0的设置。定时器0为工作方式2。
而第二块单片机中TMOD=0x22;定时器T0和定时器T1都采用方式2

TL0 = 0x06; //初始化8位定时器 (256 - 6)*40000 = 1s
EA = 1; //总中断允许
ET0 = 1; //T0中断允许
TR0 = 1; //打开T0中断
这里用到的是定时器0 ,设置定时器0为工作方式2.让定时器设置为1s ,TR0=1为打打开T0定时器0中断,有的时候或许会考虑到用两个定时器两个调试,也许大多数会发现会出现意想不到的问题,比如工作不正常。单片机每次只能执行一个定时中断,所以定时中断发生了冲突,这里就会有定时优先级的问题,所以会出现定时器的程序问题,这里建议最好用一个定时器
1当要使用定时器的时候,选择使用的定时器,这时候就相当于需要叫谁个的时候,需要叫起名字,这时候相应的人才会答应。定时器也一样,需要通过对TMOD设置,而TMOD高低四位作用不一样。即高四位低四位用来设置的定时器分别为T1,T0。定时器的方式也有几种,这时候需要设置定时器的工作方式,M0,和M1是用来设置其工作方式的。对于GATE在通常情况下是不需要设置的。建议也不要设置,这时候还要对其进行选择是定时器模式还是计数器模式,这时候用C/T来进行设置。其中TMOD=0x02表示工作在方式2模式下选择定时器T0
2 选择好了定时器模式,还是计数器模式,这里选用定时器模式,用来对其定时(红绿灯定时用),下面的工作就是定时的时间里,这里是对红绿灯的定时,选择定时1ms,TH0 = 0x06;TL0 = 0x06;//初始化8位定时器 (256 - 6)*40000 = 1 这里和单片机的晶振有关,而我们这里不需要很大的定时时间,所以就不考虑其宽度,计数的位。但超过最大值会产生溢出。
3 下面吧时间和方式都选择好后,就是要中断在程序里运行了,EA = 1;总中断允许
ET0 = 1,T0中断允许。TR0 = 1;打开T0中断。吧该函数放在主函数循环以前。让其在主函数一直跑,因为只有ET0=0,这是会关闭定时器0.这时候,定时器已经打开,将会实现每毫秒的定时中断
if(cnt_num == 4000)
{
cnt_num = 0;
if(scdEW-- == 0)
{
cntEW++; //东西向秒数减至0,标志位加1
}
if(scdSN-- == 0)
{
cntSN++; //南北向秒数减至0,标志位加1
}
}
这里定时函中每次定时到后,都会进入定时函数,改变cnt_num。到4000,一秒的时间,吧通行的时间减少一秒,当每次单个方向的通行结束,依就是时间减少到0的时候,标志位增加去执行该红绿灯周期里的下环节。
工作原,D0 ~ D3四位的功能是用来定义定时器/计数器T0,D4 ~ D7高四位是用来定义定时器/计数器T1。
当TR0=1,启动定时器T0。当TR1=1,启动定时器T1。

2,M0、M1——方式选择功能

T0定时器,分别为,方式0,方式1,方式2,方式3。方式2。没有方式3。
M1 M0工作方式功能说明 ,0 0方式0, 13位定时器/计数器。0 1方式1 ,16位定时器/计数器
1 0: 方式2, 自动重载8位定时器/计数。1 1 方式3,T0分为2个8位独立计数器,T1停止计数。

四 Proteus的仿真以及调试

4.1 Proteus的简介
Proteus软件是来之英国Labcenter electronics公司出版的EDA工具软件(该软件中国总代理为广州风标电子技术有限公司)。不不仅有EDA工具的仿真功能,而且可以仿真单片机大多型号中的一些器件比如,继电器,电机,温度传感器DS18B20等等。面前而已它是仿真单片机最好的仿真软件之一。在国内的推广中还不是那么普及,而对于单片机的爱好者和从事单片机教学的老师以及从事单片机研发的工作人员的喜爱。Proteus来之世界上著名的EDA工具(仿真软件),从硬件器件的布图,吧生成的代码放入单片机进行单片机和外围电路的调试。让你从理论的到实际的路途缩短了距离。
4.2 Proteus的仿真软件的应用
首先正确的连接好线路,首先从简单的输入输出开始仿真,在keil的软件环节中,最初做的一个就是简单的输入输出的仿真,这里也根据前面的那个例子来初步尝试proteus,找出单片机,按键,低电平,按键的一端接在单片机的引脚p2.0上,另一端接在低电平上,按下执行键。这时候可以看到单片机没有低电平的输出,但当把按键按下的时候,会发现p2.5也会由高电平变成低电平。说明基本的按键功能已经完成,下面分别来调试数码管,继电器。
首先来调试继电器,不需要加入程序,这是把继电器线圈的一端接高电平,另一端接低电平,继电器可以导通,或许大多数人以为就完成了,但当吧继电器接入单片机,可能会发现这调试貌似就不咋合理了。继电器工作的状态是有电流限制的,所以直接接入肯定是不可能达到预期的目的!和想要的答案的,这是通过查看继电器的工作电流和电压会发现是有电流限制的,这时候想到的则是如何调到继电器想要的电流,proteus下提供测量电流的仿真,把电流芯片串接在在单片机和继电器之间。这时会发现电流小于了继电器的工作值实际值。,需要电流放大,这时候的在单片机和继电器之间加一个电流放大器,pnp电流放大器。这时候可以看到电流显示出来在继电器工作范围内。继电器这这时候可以正常的打开,通电后,常闭打开,常开关闭,从而驱动指示灯亮与不亮。
4.2 数码管的调试
数码管分共阴共阳。数码管内部就是由七段二级管组成当共阳节接上高电平的时候,这时候就像驱动二级管一样,在另一端接上高电平二级管就导通,从而发光,七段数码管放的位置不一样 从而显示0到9
下面来进行一步一步调试,共阳节接高电平,一位一位的调试,把数码管a接入到按键上,按键的另一端接低电平在靠近数码管的一端加上上啦电阻,把七位都接上,或许大多数不知道第八位的作用 ,这里出于调试,把第八位也接上,然后按下执行,发现数码管一位也没有亮,这时候从a,开始按下,发现对应的一位数码管亮了,第二按下b亮了。当把按键弹回来的时候发现又不亮了。第八位按下的时候,数码管旁边的点亮了。这一位是小数用的,在红绿灯控制中只用到了秒,不考虑接入。
4. 3信号灯调试
通过对数码管和继电器的调试,然后把硬件电路图连接完成。由于三个路口的逻辑是大同小异,所以这里用第一个路口来调试作为例子。
单路口的方向一同行如图
在这里插入图片描述

只在第一个路口加了大灯,第一状态,数码管显示时间,指示灯亮。第一状态同行结束,
在这里插入图片描述

给第一个状态一定时间的黄灯时间,黄灯同行完,第二状态开始
在这里插入图片描述

都是同行,黄灯,红灯的顺序进行着,每个路口分四个状态,每个状态只有一个方向同行,每个方向同行的时候,可以同时进行左转,右转。

4.4 高峰车流量拥挤仿真
前面提到的拥挤的的状态如图所示
在这里插入图片描述

这时候,拥挤的按键被按下,主路口的同行时间不受影响,而次路口的同行时间给其缩短,如图中所示我刚主路口切换到次路口的状态,这时候,这个次路口短短几秒时间让其同行,吧通行的周期时间缩短,而主路口的通行时间没有被缩短,所以在单位时间内把主路口的通行的时间增加了,加快了拥堵时候的痛行速度。

参考文献

[1] 王迎旭 .单片机原理与应用 第二版 .机械工业出版社
[2] 顾治华 陈天煌 忽朝险. C语言程序设计 .机械工业出版社
[3]肖洪兵. 跟我学用单片机. 北京:北京航空航天大学出版社,2002.8
[4]何立民. 单片机高级教程. 第1版.北京:北京航空航天大学出版社,2001
[5] 赵晓安. MCS-51单片机原理及应用. 天津:天津大学出版社,2001.3
[6]李广第. 单片机基础. 第1版.北京:北京航空航天大学出版社,1999
[7]徐惠民、安德宁. 单片微型计算机原理接口与应用. 第1版. 北京:北京邮电大学出版社,1996
[8] 何立民.从Cygnal 80C51F看8位单片机发展之路. 单片机与嵌入式系统应用,2002年,第5期:P5~8
[9]夏继强. 单片机实验与实践教程. 北京:北京航空航天大学出版社, 2001
[10]陈志强 胡辉. 单片机应用系统设计实践指南. 自编教材
[11]肖洪兵. 单片机应用技术. 自编教材 肖洪兵 高茂科. CAI课件 自主开发
[12 ] 周润景,张丽娜,刘印群. Proteus入门实用教程. 机械工业出版社 2007
[13] 陈忠平.基于Proteus的51系列设计与仿真 第二版。电子工业出版社 2012

总结

单片机是一款便宜却功能强大的芯片,内部带有外部中断,和自带三个定时器功能,能提供以及满足小型控制的需要。单片机支持C语言的编程,这给用户以及对单片机的爱好者无疑是更受亲睐。这样可以大大的增加编程的效率,和对其过程的理解和对其完成的效率。
而交通信号灯,在繁华的城市以及经济,文化高地集中的地方,车流人流拥挤的地带。没有一套完善的交通管理方案,往往可能导致交通事故的发生和彼此之间的冲突,更会加剧路口的拥堵。所以在社会不断的发展下,对于交通的管理也迫切的需要一套更加合理的管理方案 。使交通道路的干线化,从而可以加大一个干线的通行效率。减少在路口拥堵时带来的时间浪费。
而系统中也相当于对一个干线的控制,三路口的控制,以绿灯的时间推移,也大概的时间赋值,让车辆通过第一个路口后,可以在第二个路口以最快的时间通过。用到数码管,LED灯,这都是比较便宜而且功耗很低的器件。
从最近一段时间的制作,可以发现单片机需要很深的吃透也不是一件容易的事情,可以发现自动化给我们这个世界带来多大的变化,城市的大大小小的角落和到一个完整的全自动控制。我们会发现自动化无处不在,和我们的生活息息相关。

展望

交通信号的灯的控制是一个复杂的过程,而不是简单的单一的控制,时间的调整。以及干线的合理布置,以及整个区域,网络化的控制。可以更加合理有效的工作。所以在短短的时间内根本无法完成其巨大的一面,如果要做到一个合理更加有效的控制一个城市,以及一个地区。或许需要更多的实践考察,以及一个更大的控制器和更多的外围电路。彼此之间的通信。达到一个更大领域的控制,或许这才是当今社会所需要的。

附录

#include <reg52.h>
sbit P00 = 0x80;
sbit P01 = 0x81;
sbit P02 = 0x82;
sbit P03 = 0x83;
sbit P04 = 0x84;
sbit P05 = 0x85;
sbit P44 = 0x86;
sbit P45 = 0x87;
sbit P10 = 0x90;
sbit P11 = 0x91;
sbit P12 = 0x92;
sbit P13 = 0x93;
sbit P14 = 0x94;
sbit P15 = 0x95;
sbit P40 = 0x96;
sbit P41 = 0x97;
sbit P20 = 0xA0;
sbit P21 = 0xA1;
sbit P22 = 0xA2;
sbit P23 = 0xA3;
sbit P24 = 0xA4;
sbit P25 = 0xA5;
sbit P42 = 0xA6;
sbit P43 = 0xA7;
sbit P30 = 0xB0;
sbit P31 = 0xB1;
sbit P32 = 0xB2;
sbit P33 = 0xB3;
sbit P34 = 0xB4;
sbit P35 = 0xB5;
sbit P36 = 0xB6;
sbit P37 = 0xB7;
unsigned char numb[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数字分别为0~9
unsigned char ctr[]={0xfa,0xf5}; //0xfa(P30和P32为0,即高位有效)0xf5(P31和P33为0,即低位有效)
unsigned char shiwEW[2]; //装东西向高低位数值
unsigned char gewEW[2]; //记录南北向高低位数值

unsigned char v;
unsigned char cntctr,cntctr1;
unsigned int tmEW,tmSN,tmEW1,tmSN1;
unsigned int cnttmSN,cnttmEW,cnttmSN1,cnttmEW1;
unsigned char cntP34,cntP35,cntP36,cntP1_6;
unsigned int cnt_num,cnt_num1,cnt_key,cnt_flash,keyMemory;
int greenEW = 20,yellowEW = 3,greenSN = 10,yellowSN = 3,greenEW1 = 20,yellowEW1 = 3,greenSN1 = 10,yellowSN1 = 3;

//延时函数,x为1延时1毫秒
void delay_ms(unsigned int x)
{
int y;
while(ax–)
{
y = 70;
while(y–);
}
}
void setSecond(void)
{
while(P34 == 0);
cntP34++; //标志位被代表被按下的次数
switch(cntP34)
{
case 1:
cnttmEW = 5;
P1 = 0xf7;
break;
case 2:
cnttmEW = 1;
P1 = 0xef;
break;
case 3:
cnttmSN = 1;
P1 = 0xfe;
break;
case 4:
cnttmSN = 3;
P1 = 0xfd;
break;
case 5:
cnttmEW = 5;
cnttmSN = 5;
cnt_num = 0;
cntP34 = 0;
break;
}
}

//秒数加1
void addSecond(void)
{
while(P35 == 0);
cnt_key = 0; //时间够长的时候清零
switch(cntP34)
{
case 1:
if(keyMemory != greenEW + 10) //
{
greenEW++;
}
if(greenEW == 90)
{
greenEW = 0;
}
tmEW = greenEW;
tmSN = greenEW + yellowEW + 1;
break;
case 2:
if(yellowEW++ == 9)
{
yellowEW = 0;
}
tmEW = yellowEW;
break;
case 3:
if(keyMemory != greenSN + 10)
{
greenSN++;
}
if( greenSN == 90)
{
greenSN = 0;
}
tmEW = greenSN + yellowSN + 1;
tmSN = greenSN;
break;
case 4:
if(yellowSN++ == 9)
{
yellowSN = 0;
}
tmSN = yellowSN;
break;
}
}

void subSecond(void)
{
while(P36 == 0);
cnt_key = 0; switch(cntP34)
{
case 1:
if(keyMemory != greenEW - 10)
{
greenEW–;
}
if(greenEW == -1)
{
greenEW = 89;
}
tmEW = greenEW;
tmSN = greenEW + yellowEW + 1;
break;
case 2:
if(yellowEW-- == 0)
{
yellowEW = 9;
}
tmEW = yellowEW;
break;
case 3:
if(keyMemory != greenSN - 10)
{
greenSN–;
}
if(greenSN == -1)
{
greenSN = 89;
}
tmEW = greenSN + yellowSN + 1;
tmSN = greenSN;
break;
case 4:
if(yellowSN-- == 0)
{
yellowSN = 9;
}
tmSN = yellowSN;
break;
}
}

void display(void)
{
cnt_num++;
if(cntctr == 10)
{
cntctr = 0;
}
}
void display1(void)
{
cnt_num1++;
if(cntctr1 == 10)
{
cntctr1 = 0;
}
}
void flashDisplay(void)
{

}

void sd()

{
if(P31==0)
{
while(P31 == 0);

cntP1_6++;	    
switch(cntP1_6)
{
case 1:
	TMOD = 0x02;		    	
    TL0 = 0x06;		
    EA = 1;			
    ET0 = 1;		
    TR0 = 0;		
	P1=0xf3;
	P2=0xdb;
	break;
case 2:
	cnttmEW = 1;
	P1 = 0x0e;
	P2=0xdb;
	break;
case 3:
	cnttmSN = 1;
	P1 = 0xdb;
	P2=0Xf3;
	break;
case 4:
	cnttmSN = 3;
	P1 = 0xdb;
	P2=0x0e;
	break;
case 5:
	TMOD = 0x02;	
    TH0 = 0x06;		
    TL0 = 0x06;		
    EA = 1;		
    ET0 = 1;		    / /T0中断允许
    TR0 = 1;		   //关T0中断定时器
	cntP34 = 0;
	break;
}

}

}

//T0中断定时器 函数
void t0(void) interrupt 1
{
cntctr++;
if(cntP34 == 0)
{
display(); }
if(cntP34 != 0)
{
flashDisplay(); }
if(cnt_num == 4000)
{
cnt_num = 0;
if(tmEW-- == 0)
{
cnttmEW++; }
if(tmSN-- == 0)
{
cnttmSN++; }
}

}
void t1(void) interrupt 3
{
cntctr1++;
if(cntP34 == 0)
{
display1();
}
if(cntP34 != 0)
{
flashDisplay();
}
if(cnt_num1 == 4000)
{
cnt_num1 = 0;
if(tmEW1-- == 0)
{
cnttmEW1++; }
if(tmSN1-- == 0)
{
cnttmSN1++;
}
}

}
void FirstCross()
{
switch(cnttmEW)
{
case 1:
tmEW = yellowEW;
P13 = 1;
P14 = 0;
P15 = 1;
P23 = 1;
P24 = 1;
P25 = 0;
cnttmEW++;
break;
case 3:
tmEW = greenSN + yellowSN + 1;
P13 = 1;
P14 = 1;
P15 = 0;
P23 = 1;
P24 = 1;
P25 = 0;
cnttmEW++;
break;
case 5:
tmEW = greenEW;
P23 = 0;
P24 = 1;
P25 = 1;
P13 = 1;
P14 = 1;
P15 = 0;
cnttmEW ++;
break;
case 7:
tmEW = yellowEW;
P23 = 1;
P24 = 0;
P25 = 1;
P13 = 1;
P14 = 1;
P15 = 0;
cnttmEW++;
break;
case 9:
tmEW = greenSN + yellowSN + 1; //红灯的时间
P23 = 1;
P24 = 1;
P25 = 0;
P13 = 1;
P14 = 1;
P15 = 0;
cnttmEW++; //避开程序一些不必要的故障
break;
case 11:
tmEW = greenEW;
P13 = 0;
P14 = 1;
P15 = 1;
P23 = 1;
P24 = 1;
P25 = 0;
cnttmEW=0;
break;

}
switch(cnttmSN)
{
case 1:
	tmSN = greenSN;	
	P10 = 0;
	P11 = 1;
	P12 = 1;
	P20 = 1;
	P21 = 1;
	P22 = 0;
	cnttmSN++;	
	break;
case 3:		
	tmSN = yellowSN;	
	P10 = 1;
	P11 = 0;
	P12 = 1;
	P20 = 1;
	P21 = 1;
	P22 = 0;
	cnttmSN++;	
	break;
case 5:		
	tmSN = greenEW + yellowEW + 1;	
	P20 = 1;
	P21 = 1;
	P22 = 0;
	P10 = 1;
	P11 = 1;
	P12 = 0;
	cnttmSN ++;
	break;

case 7:
tmSN = greenSN;
P20 = 0;
P21 = 1;
P22 = 1;
P10 = 1;
P11 = 1;
P12 = 0;
cnttmSN++;
break;
case 9:
tmSN = yellowSN;
P20 = 1;
P21 = 0;
P22 = 1;
P10 = 1;
P11 = 1;
P12 = 0;
cnttmSN++;
break;
case 11:
tmSN = greenEW + yellowEW + 1;
P10 = 1;
P11 = 1;
P12 = 0;
P20 = 1;
P21 = 1;
P22 = 0;
cnttmSN =0;
break;

}
if(P35 == 0)
{
	if(cnt_key++ == 4000)
	{
	
	}		
}
if(P36 == 0)
{
	if(cnt_key++ == 4000)
	{
	
	}		
}

}
void SecondCross()
{
switch(cnttmEW1)
{
case 1:
tmEW1 = yellowEW1;
P03 = 1;
P04 = 0;
P05 = 1;
P43 = 1;
P44 = 1;
P45 = 0;
cnttmEW1++;
break;
case 3:
tmEW1 = greenSN1 + yellowSN1 + 1;
P03 = 1;
P04 = 1;
P05 = 0;
P43 = 1;
P44 = 1;
P45 = 0;
cnttmEW1++;
break;
case 5:
tmEW1 = greenEW1;
P43 = 0;
P44 = 1;
P45 = 1;
P03 = 1;
P04 = 1;
P05 = 0;
cnttmEW1 ++;
break;
case 7:
tmEW1 = yellowEW1;
P43 = 1;
P44 = 0;
P45 = 1;
P03 = 1;
P04 = 1;
P05 = 0;
cnttmEW1++;
break;
case 9: //避免cnttmEW为2
tmEW1 = greenSN1 + yellowSN1 + 1;
P43 = 1;
P44 = 1;
P45 = 0;
P03 = 1;
P04 = 1;
P05 = 0;
cnttmEW1++;
break;
case 11: //避免cnttmEW为4
tmEW1 = greenEW1;
P03 = 0;
P04 = 1;
P05 = 1;
P43 = 1;
P44 = 1;
P45 = 0;
cnttmEW1=0;
break;

}
switch(cnttmSN1)
{
case 1:
	tmSN1 = greenSN1;	
	P00 = 0;
	P01 = 1;
	P02 = 1;
	P40 = 1;
	P41 = 1;
	P42 = 0;
	cnttmSN1++;	
	break;
case 3:		
	tmSN1 = yellowSN1;	
	P00 = 1;
	P01 = 0;
	P02 = 1;
	P40 = 1;
	P41 = 1;
	P42 = 0;
	cnttmSN1++;	
	break;
case 5:		
	tmSN1 = greenEW1 + yellowEW1 + 1;		
	P40 = 1;
	P41 = 1;
	P42 = 0;
	P00 = 1;
	P01 = 1;
	P02 = 0;
	cnttmSN1 ++;
	break;

case 7:
tmSN1 = greenSN1;
P40 = 0;
P41 = 1;
P42 = 1;
P00 = 1;
P01 = 1;
P02 = 0;
cnttmSN1++;
break;
case 9:
tmSN1 = yellowSN1;
P40 = 1;
P41 = 0;
P42 = 1;
P00 = 1;
P01 = 1;
P02 = 0;
cnttmSN1++;
break;
case 11:
tmSN1 = greenEW1 + yellowEW1 + 1;
P00 = 1;
P01 = 1;
P02 = 0;
P40 = 1;
P41 = 1;
P42 = 0;
cnttmSN1 =0;
break;

}
if(P35 == 0)
{
	if(cnt_key++ == 4000)
	{
	
	}		
}
if(P36 == 0)
{
	if(cnt_key++ == 4000)
	{
	
	}		
}

}
//主函数
void main(void)
{
P1 = 0xdb;
P34 = 1;
P2=0xde;
while(P30 != 0);
delay_ms(5000);

TMOD = 0x22;	
TH0 = 0x06;		
TL0 = 0x06;		
EA = 1;			
ET0 = 1;		
ET1 = 1;
TR0 = 1;		
TH1 = 0x06;		
TL1 = 0x06;		
TR1 = 1;
P1 = 0xf3;					
P2=0xdb;
     	
tmEW = greenEW;			
tmSN = greenEW + yellowEW + 1;		
tmEW1 = 5;			
tmSN1 = 5+yellowEW1+1;		
while(1)
  
{	  FirstCross();
      SecondCross(); 
	  sd();
      if(P37==0)
       {
       greenSN=3;

// P37=0;
}
else
{
greenSN=10;
// P31=0;
}
if(P34 == 0)
{
delay_ms(15);
if(P34 == 0)
{
setSecond();
}
}
else if(P35 == 0)
{
delay_ms(15);
if(P35 == 0)
{
addSecond();
}
}
else if(P36 == 0)
{
delay_ms(15);
if(P36 == 0)
{
subSecond();
}
}
keyMemory = 200;
}
}

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-16 09:48:05       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-16 09:48:05       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-16 09:48:05       87 阅读
  4. Python语言-面向对象

    2024-03-16 09:48:05       96 阅读

热门阅读

  1. vue2 / vue3 路由(返回&跳转)时判断 + 取消跳转

    2024-03-16 09:48:05       41 阅读
  2. 力扣_动态规划3—地下城游戏

    2024-03-16 09:48:05       41 阅读
  3. 代码随想录算法训练营day60|第十章 单调栈part03

    2024-03-16 09:48:05       45 阅读
  4. 【数据结构和算法】-贪心算法

    2024-03-16 09:48:05       44 阅读
  5. hive逗号分割行列转换

    2024-03-16 09:48:05       46 阅读
  6. 【iOS ARKit】PhysicsMotionComponent

    2024-03-16 09:48:05       39 阅读