交通灯课程设计.docx

上传人:b****8 文档编号:9877549 上传时间:2023-02-07 格式:DOCX 页数:23 大小:539.85KB
下载 相关 举报
交通灯课程设计.docx_第1页
第1页 / 共23页
交通灯课程设计.docx_第2页
第2页 / 共23页
交通灯课程设计.docx_第3页
第3页 / 共23页
交通灯课程设计.docx_第4页
第4页 / 共23页
交通灯课程设计.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

交通灯课程设计.docx

《交通灯课程设计.docx》由会员分享,可在线阅读,更多相关《交通灯课程设计.docx(23页珍藏版)》请在冰豆网上搜索。

交通灯课程设计.docx

交通灯课程设计

交通信号灯模拟控制系统设计

第一章

1.1 交通灯国内外发展概况

随着经济的发展,城市现代化程度不断提高,城市交通网络中交通拥挤日益严重,道路运输所带来的交通拥堵、交通事故和环境污染等负面效应日益突出。

交通问题已经日益成为世界性的难题。

为了解决车和路的矛盾,常用的两种方法:

一是控制需求,最直接的办法就是限制车辆的增长:

二是增加供给,也就是修路。

但是这两个办法都有其局限性。

交通是社会发展和人民生活水平提高的基本条件,经济的发展必然带来出行的增加而且在我国汽车工业正处在起步阶段的时期。

因此限制车辆的增长不是解决问题的好办法。

所以在道路管理方面就要加强交通安全,而在道路管理中最长见的就是交通灯。

1.2交通信号灯的作用和工作原理

改善交通秩序,增加交通安全;减少交通延误,提高经济效益;降低污染程度,保护生态环境;节省能源和土地消耗。

 

交通信号灯由红灯、绿灯、黄灯组成。

红灯表示禁止通行,绿灯表示准许通行,黄灯表示警示。

交通信号灯分为机动车信号灯、非机动车信号灯、人行横道信号灯、车道信号灯、方向指示信号灯、闪光警告信号灯、道路与铁路平面交叉道口信号灯。

交通信号灯用于道路平面交叉路口,通过对车辆、行人发出行进或停止的指令,使各同时到达的人、车交通流尽可能减少相互干扰,从而提高路口的通行能力,保障路口畅通和安全。

 设计一个十字路口交通灯自动控制电路:

  

工作顺序为南北绿灯,东西红灯→南北黄灯,东西红灯→南北红灯,东西绿灯→南北红灯,东西绿灯 

要求各状态的工作时间如下所示。

绿灯-(30s)-黄灯--(5s)-红灯--(35s)--绿灯--(循环) 

 

第二章

2.1 单片机系统

单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统。

对51系列单片机来说,最小系统一般应该包括:

单片机、晶振电路、复位电路。

下面给出一个51单片机的最小系统电路图。

 

图2.1最小系统

2.1.1晶振电路 

复位电路:

由电容串联电阻构成,由图并结合"电容电压不能突变"的性质,可以知道,当系统一上电,RST脚将会出现高电平,并且,这个高电平持续的时间由电路的RC值来决定.典型的51单片机当RST脚的高电平持续两个机器周期以上就将复位,所以,适当组合RC的取值就可以保证可靠的复位.一般教科书推荐C 取10u,R取8.2K.当然也有其他取法的,原则就是要让RC组合可以在RST脚上产生不少于2个机周期的高电平.至于如何具体定量计算,可以参考电路分析相关书籍。

图2.1.1晶振

2.1.2 复位电路 

晶振电路:

典型的晶振取11.0592MHz(因为可以准确地得到9600波特率和19200波特率,用于有串口通讯的场合)/12MHz(产生精确的uS级时歇,方便定时操作)。

图2.1.2复位电路

2.1.3信号灯控制电路,LED及显示接口 

发光二极管简称LED,采用砷化镓、镓铝砷、和磷化镓等材料制成,其内部结构为一个PN结,具有单向导电性,当在发光二极管PN结上加正向电压时,PN结势垒降低,载流子的扩散运动大于漂移运动,致使P区的空穴注入到N区,N区的电子注入到P区,这样相互注入的空穴与电子相遇后会产生复合,复合时产生的能量大部分以光的形式出现,因此而发光。

使用LED作指示电路时,应该串接限流电阻,该电阻的阻值大小应根据不同的使用电压和LED所需工作电流来选择。

发光二极管的压降一LED的光学参数与pn结结温有很大的关系。

一般工作在小电流IF<10mA,或者10~20 mA长时间连续点亮LED温升不明显。

 

绿灯是通行信号,面对绿灯的车辆可以直行红灯是禁行信号,面对红灯的车辆必须在交叉路口的停车线后停车。

黄灯是警告,信号,面对黄灯的车辆不能越过停车线,但车辆已十分接近停车线而不能安全停车时可以进入交叉路口。

图2.1.3LED及红绿灯

2.2 系统总体框图

 

图2.2总体框图

 

2.3 设计流程图

 

 

图2.3流程图

 

第三章

3.1 信号灯亮灭的定时

在单片机应用系统中,实现定时的方法一般有以下三种:

 

1、软件定时:

让计算机执行一段程序来进行事件延时。

这个程序段本身份没有安排其他的执行目的,只是利用该程序段的执行花费的一个固定时间。

通过适当的选择指令和安排循环次数,可调节这段程序执行所需花费的时间的长短。

其特点是定时时间精确,不需外加硬件电路,但占用CPU时间。

因此软件定时的时间不宜过长。

 

2、硬件定时:

利用硬件电路实现定时。

其特点是不占用CPU时间,通过改变电路元器件参数调来节定时,但使用不够灵活方便。

对于时间较长的定时,常用硬件电路来实现。

 

3、可编程定时器:

通过专用的定时计数器芯片来实现。

其特点是通过对系统时钟脉冲进行计数实现定时,定时的时间可通过程序的设定的方法改变,使用灵活方便。

也可实现对外部脉冲的计数功能。

 

4、单片机交通控制器的设计,当定时计数器设置为计数工作方式时,技术器对来自输入引脚T0和T1的外部信号计数,外部信号的下降沿将触发计数。

最高检测频率为振荡频率的二十四分之一。

计数器对外部输入信号的占空比没有特别的限制,但必须保证输入信号的高电平与低电平的持续时间在一个机器周期以上。

 

当设置了定时器的工作方式并启动定时器工作后,定时器就安倍设定的工作方式独立工作,不在占用CPU的操作时间,只有在计数器计满溢出时才能中断CPU当前的操作。

 

 

 

第四章

4.1 原理图

图4.1原理图

 

第五章

5.1 最小系统调试

5.1.1调试

首先应该确认电源电压是否正常。

用电压表测量接地引脚跟电源引脚之间的电压,看是否是电源电压,我们所用的电源电压是5V。

接下来就是检查复位引脚电压是否正常。

分别测量按下复位按钮和放开复位按钮的电压值,看是否正确。

然后再检查晶振是否起振了,一般用示波器来看晶振引脚的波形,注意应该使用示波器探头的“X10”档。

另一个办法是测量复位状态下的IO口电平,按住复位键不放,然后测量IO口(没接外部上拉的P0口除外)的电压,看是否是高电平,如果不是高电平,则多半是因为晶振没有起振。

另外还要注意的地方是,要将EA引脚拉高,因为我们用的是片内ROM,否则会出现程序乱跑的情况。

有时用仿真器可以,而烧入片子不行,往往是因为EA引脚没拉高的缘故(当然,晶振没起振也是原因只一)。

经过上面几点的检查,一般即可排除故障了。

如果系统不稳定的话,有时是因为电源滤波不好导致的。

在单片机的电源引脚跟地引脚之间接上一个0.1uF的电容会有所改善。

如果电源没有滤波电容的话,则需要再接一个更大滤波电容,例如220uF的。

遇到系统不稳定时,就可以并上电容试试。

5.1.2故障点分析 

检测故障点的方法如下:

 

①测量电压法。

首先要确认的是各芯片电源引脚的电压是否正常,其次检查各种参考电压是否正常,另外还有各点的工作电压是否正常等。

 

②信号注入法。

将信号源加至输入端,然后依次往后测量各点的波形,看是否正常,以找到故障点。

有时我们也会用更简单的办法,例如用手握一个镊子,去碰触各级的输入端,看输出端是否有反应。

 

③当然,还有很多其它的寻找障点的方法,例如看、听、闻、摸等。

“看”就是看元件有无明显的机械损坏,例如破裂、烧黑、变形等;“听”就是听工作声音是否正常,例如一些不该响的东西在响,该响的地方不响或者声音不正常等;“闻”就是检查是否有异味,例如烧焦的味道、电容电解液的味道等,对于一个有经验的电子维修人员来说,对这些气味是很敏感的;“摸”就是用手去试探器件的温度是否正常,例如太热,或者太凉。

5.2软件调试问题及解决

一个应用系统并非一次就可以正确无误地设计出来,尤其是设计的程序,必须经过多次的调试才能确凿无误地工作。

为避免浪费,并不把刚刚编写好的程序直接写到EPROM、EEPROM等中去,更不会急于生产安装部分硬件,在专用的仿真器或开发试验台上进行。

 

Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。

另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。

 

Keil软件可以对我们写的汇编程序进行编译,它能清晰的显示出程序的各种信息,并能明确的指出程序的错误之处和错误的原由。

以致我们能够得到结构,书写都无误的汇编语言的程序。

 

第六章

总结

通过过这里课程设计,我学到了很多专业知识,拓展了我们的专业知识面,因为我们这次课设的任务是完成一个基于单片机的交通信号灯控制系统,在此之前我们对单片机的概念还是比较模糊,虽然有了一些理论上知识,但是没有亲自动手实践的经验。

通过这一段时间做课程设计的学习,我们对单片机有了更深层次的了解,此外,因为我们要完成的任务涉及到软件和硬件,所以我们在学习单片机的过程中也熟悉并掌握了相关软件的使用,如protel,proteus等,与及巩固了模拟电路和数字电路相关的知识,还有熟练了C语言编写和汇编语言编写的一些规则和规范原则。

因为,我们这个学期开设了微机原理的课程,学习了相关的汇编语言,所以我们所设计的交通信号灯系统是用汇编语言实现的,这有助于我们巩固相关的专业知识。

硬件电路上,我们参考了学长及网上的相关资料,两者相结合而设计的。

而这次主要的收获在于调试部分,在调试的过程中遇到的种种错误,让我们学到了不少的东西,确实是从失败中比从成功中能学到更多的东西,比如设计思路,还有各个元器件的参数,比如LED灯给多大电流会亮,数码管要多大电流才可以驱动,最主要的是要深入了解单片机的物理接口,每个物理接口可以灌入的最大电流是多少,每8个接口可以灌入的最大电流是多少,与及I/O接口的驱动能力,只有了解各个元器件的具体参数,才能有效并快速的检查出错误所在的位置。

此外,还解决了一些问题如

1、如何驱动发光二极管?

LED的因为是一种低电压直流产品,而市电是交流220V,所以其工作需要LED驱动电源。

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电源转换器,通常情况下:

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

2、LED驱动原理:

正向压降(VF)和正向电流的(IF)关系,当正向电压超过某个阈值(约2V),即通常所说的导通电压之后,可近似认为,IF与VF成正比。

当前超高亮LED的最高IF可达1A,而VF通常为2~4V。

由于LED的光特性通常都描述为电流的函数,而不是电压的函数,因此采用恒流源驱动可以更好地控制亮度。

此外,LED的正向压降变化范围比较大(最大可达1V以上),VF的微小变化会引起较大的,IF变化,从而引起亮度的较大变化。

所以,采用恒压源驱动不能保证LED亮度的一致性,并且影响LED的可靠性、寿命和光衰。

因此,超高亮LED通常采用恒流源驱动。

注:

LED的温度与光通量(φV)成反比,85℃时的光通量是25℃时的一半,而一40℃时光输出是25℃时的1.8倍。

温度的变化对LED的波长也有一定的影响,因此,良好的散热是LED保持恒定亮度的保证。

3、数码管显示电路的设计

LED数码管带小数点的LED数码管由8段发光二极管组成,分别定义为a、b、c、d、e、f、g和dp,8段发光二极管的一个同名端接在一起,定义为公共端(com)。

根据所接同名端的不同,LED数码管分为共阴和共阳两种,图4为其外形及结构图。

要令数码管显示不同的字符,一要分别控制各段的独立端的电平,二要控制公共端,使相应的发光二极管点亮。

如要显示“1”,则应使b、c点亮。

以共阴数码管为例,应向b、c端送高电平,其余段送低电平,向com端送低电平。

我们通常称控制a~g和dp的信号为段码,控制com端的信号为位码。

4、如何实现定时功能

如果是普通51的话,其实可以这么说,比如16位的定时器。

首先分清一个概念,其实定时器和计数器的原理都是一样的,都是“数”脉冲,有些人强行的认为,定时器是定时的,计数器是计数的,那就不对了。

一般来说,定时器使用的是内部时钟(有时候也是用外部基准时钟,但情况比较少),因为时钟稳定的特点,我们就可以通过计N个脉冲,那么时间T=N*(1/F)(f为时钟频率)。

计数器,一般计外部脉冲。

有时候定时器和计数器联合使用,是用来测量外部秒冲频率。

51的,具体实现是,计数到65535再加一的话,定时器就会溢出,如果开了中断的话,就会进入中断服务程序。

5、如何读取键盘数据

只须将时间变量设置为“全局变量”即可。

既使其在定时中断中自动累加循环,又使其随键盘控制而增减。

显示数据亦从全局变量读取并处理后完成。

 

 

参考文献

参考文献:

 

[1] 曹国华、余锡存等编著,单片机原理及接口技术[M],西安电子科技大学出版社  

[2] 周航慈等编著,单片机程序设计基础[M],北京航空航天大学出版社

[3] 康华光等编著,电子技术基础 第五版 数字部分[M],高等教育出版社边

[4] 海龙,孙永奎等编著, 单片机开发与典型工程项目实例详解[M],电子工业出版社 

[5] 何立民等编著,单片机应用系统设计[M],北京航空航天大学出版社

[6] 黄冰,覃伟年,黄知超等编著,微机原理及应用,重庆大学出版社

[7] 王港元等编著,电子技能基础,四川大学出版社

 

附  录 

软件流程图:

 

ORG0030H

AJMPINIT

ORG00H

;;;;;;;;;;;;;;;;;;;设置初始状态;;;;;;;;;;;;;;;;;;;;;;;

INIT:

MOV42H,#1;闪烁标志位

MOVR0,#0;R0为状态标志位

MOVSP,#60H;设置堆栈指针

MOVDPTR,#TABLE;将TABLE送DPTR

MOVP2,#0FFH;所有计数器片选置1

MOVR7,#0;计数器1十位

MOVR6,#5;计数器1个位

MOVR5,#60;循环次数

MOVR2,#0;计数器2十位

MOVR1,#5;计数器3个位

MOVP1,#0F6H;红绿灯状态

LJMPSCAN;跳计数器扫描段代码

;;;;;;;;;;;;;;;;;设置状态1;;;;;;;;;;;;;;;;;;;;;;;;;;;;

STATE1:

MOVP1,#0EEH;红绿灯状态

MOVR0,#1;R0为状态标志位

MOV40H,#1;判断闪烁位

MOV41H,#1;判断闪烁位

MOVP2,#0FFH;所有计数器片选置1

MOVR7,#3;计数器1十位

MOVR6,#5;计数器1个位

MOVR5,#60;循环次数

MOVR2,#3;计数器2十位

MOVR1,#0;计数器3个位

LJMPSCAN;跳计数器扫描段代码

;;;;;;;;;;;;;;;;;;设置状态2;;;;;;;;;;;;;;;;;;;;;;;;;

STATE2:

MOVP1,#0F5H;红绿灯状态

MOV42H,#1;判断闪烁位

MOVR0,#2;R0为状态标志位

MOVP2,#0FFH;所有计数器片选置1

MOVR7,#3;计数器1十位

MOVR6,#0;计数器1个位

MOVR5,#60;循环次数

MOVR2,#3;计数器2十位

MOVR1,#5;计数器2个位

LJMPSCAN;跳计数器扫描段代码

;;;;;;;;;;;;;;;;扫描显示数码管和红绿灯;;;;;;;;;;;;;;;;;;;;;;

SCAN:

MOVA,R7;将计数器十位送A

MOVCA,@A+DPTR;取数据对应的码

MOVP0,A;送P0口显示

CLRP2.7;选中第一个数码管显示

LCALLDELA;延迟

SETBP2.7;取消选中的第一个数码管

MOVA,R6;计数器个位送A

MOVCA,@A+DPTR;取计数器个位对应的码

MOVP0,A;送P0口显示

CLRP2.6;选中第二个数码管显示

LCALLDELA;延迟

SETBP2.6;取消选中的第二个数码管

MOVA,R2;将计数器十位送A

MOVCA,@A+DPTR;取计数器个位对应的码

MOVP0,A;送P0口显示

CLRP2.5;选中第三个数码管显示

LCALLDELA;延迟

SETBP2.5;取消选中的第三个数码管

MOVA,R1;选中第四个数码管

MOVCA,@A+DPTR;去计数器个位对应的码

MOVP0,A;送P0口显示

CLRP2.4;选中第四个数码管显示

LCALLDELA;延迟

SETBP2.4;取消选中的第四个数码管

DJNZR5,SCAN;循环扫描

MOVR5,#60;扫描一秒到给R5送扫描下一秒时间

DECR6;计数器1个位减1

DECR1;计数器2个位减1

CJNER1,#5,LP1;判断计数器1个位是否为5

SJMPLP2;若是则跳转LP2

LP1:

CJNER6,#5,LOOP;判断1、2个位是否为5,不是则跳转LOOP

SJMPLP3;若是则跳转LP3

LP2:

CJNER2,#0,LP3;计数器2个位是否为0

SJMPLP4;跳LP4

LP3:

CJNER7,#0,LOOP;判断1、2十位是否为0,不是则跳转LOOP

SJMPLP4;跳LP4

LP4:

MOVR5,#60;若计数器为05,则开始闪烁

CJNER0,#0,SET1;闪烁初始态为当前状态决定

LJMPSHINESCAN;跳闪烁语句

SET1:

CJNER0,#1,SET2;设置闪烁初始态--数码管10s和5s

MOVR7,#1

MOVR6,#0

MOVR2,#0

MOVR1,#5

LJMPSHINESCAN;跳转到闪烁段代码

SET2:

CJNER0,#2,SET3;设置闪烁初始态--数码管5s和10s

MOVR7,#0

MOVR6,#5

MOVR2,#1

MOVR1,#0

LJMPSHINESCAN;跳转到闪烁段代码

SET3:

NOP

LJMPSHINESCAN;跳转到闪烁段代码

LOOP:

CJNER1,#0FFH,LOOP1;判断2个位是否减为0

MOVR1,#9;超出给2个位赋9

DECR2;并且将2十位减1

LOOP1:

CJNER6,#0FFH,LOOP2;判断1个位是否减为0

MOVR6,#9;超出给1个位赋9

DECR7;并且将1十位减1

LOOP2:

CJNER2,#0FFH,LOOP3;判断2十位是否减为0

MOVR2,#0;减为0则计数器2置0

MOVR1,#0;计数器2置0

LOOP3:

CJNER7,#0FFH,MID;判断计数器1十位是否为0

AJMPSTATE1;为0则跳到状态1

MID:

LJMPSCAN;不为0则跳SCAN继续扫描

;;;;;;;;;;;;;;;;;;;;;;闪烁代码--计数器1、2全亮状态;;;;;;;;;;;;;;;;;;;;;;;;

SHINESCAN:

MOVA,41H;41H内容送A

CJNEA,#0,VV1;判断41H内容是否为0

CLRP1.5;是则东西黄灯开始闪烁

VV1:

MOVA,42H;42H内容送A

CJNEA,#0,TT1;判断42H内容是否为0

CLRP1.2;是则南北黄灯开始闪烁

TT1:

MOVA,R7;将计数器十位送A

MOVCA,@A+DPTR;取数据对应的码

MOVP0,A;送P0口显示

CLRP2.7;选中第一个数码管显示

LCALLDELA;延迟

SETBP2.7;取消选中的第一个数码管

MOVA,R6;计数器个位送A

MOVCA,@A+DPTR;取计数器个位对应的码

MOVP0,A;送P0口显示

CLRP2.6;选中第二个数码管显示

LCALLDELA;延迟

SETBP2.6;取消选中的第二个数码管

MOVA,R2;将计数器十位送A

MOVCA,@A+DPTR;取计数器个位对应的码

MOVP0,A;送P0口显示

CLRP2.5;选中第三个数码管显示

LCALLDELA;延迟

SETBP2.5;取消选中的第三个数码管

MOVA,R1;选中第四个数码管

MOVCA,@A+DPTR;去计数器个位对应的码

MOVP0,A;送P0口显示

CLRP2.4;选中第四个数码管显示

LCALLDELA;延迟

SETBP2.4;取消选中的第四个数码管

DECR5;R5减1

CJNER5,#30,SHINESCAN;

;;;;;;;;;;;;;;;;;;;闪烁代码--计数器1亮;;;;;;;;;;;;;;;;;;;;;;;;;;

TAP:

SETBP1.2;将东西黄灯灭掉

CJNER0,#1,PP1;判断红绿灯状态是否为1

MOVA,41H;将41H内容送A

CJNEA,#0,TT;判断41H是否为0

SETBP1.5;将南北黄灯灭掉

TT:

MOVA,R7;将计数器十位送A

MOVCA,@A+DPTR;取数据对应的码

MOVP0,A;送P0口显示

CLRP2.7;选中第一个数码管显示

LCALLDELA;延迟

SETBP2.7;取消选中的第一个数码管

MOVA,R6;计数器个位送A

MOVCA,@A+DPTR;取计数器个位对应的码

MOVP0,A;送P0口显示

CLRP2.6;选中第二个数码管显示

LCALLDELA;延迟

SETBP2.6;取消选中的第二个数码管

MOVA,42H;将42H的内容送A

CJNEA,#1,QQ1;判断42H内容是否为1

MOVA,40H;将40H的内容送A

CJNEA,#1,PP1;判断40H的内容是否为1,不为1跳转PP1(不是1即计数器2闪烁)

LCALLDELA;若为1则开始延时

LCALLDELA

DECR5;R5减1

JMPTAP3;跳TAP3

;;;;;;;;;;;;;;;;;;;;;;;;;;;闪烁代码--计数器2亮;;;;;;;;;;;;;;;;;;;;;;;;;

PP1:

SETBP1.5;将南北黄灯灭掉

MOVA,42H;将42H内容送A

CJNEA,#0,BB;判断42H内容是否为0,不是则跳转BB

SETBP1.2;为0则将东西黄灯灭掉

BB:

MOVA,R2;将计数器十位送A

MOVCA,@A+DPTR;取计数器个位对应的码

MOVP0,A;送P0口显示

CLRP2.5;选中第三个数码管显示

LCALLDELA;延迟

SETBP2.5;取消选中的第三个数码管

MOVA,R1;选中第四个数码管

MOVCA,@A+DPTR;去计数器个位对应的码

MOVP0,A;送P0口显示

CLRP2.4;选中第四个数码管显示

LCALLDELA;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1