单片机课程设计现代交通灯的设计.docx
《单片机课程设计现代交通灯的设计.docx》由会员分享,可在线阅读,更多相关《单片机课程设计现代交通灯的设计.docx(29页珍藏版)》请在冰点文库上搜索。
![单片机课程设计现代交通灯的设计.docx](https://file1.bingdoc.com/fileroot1/2023-5/29/0623a906-f860-433e-b435-9c436d8d5ae6/0623a906-f860-433e-b435-9c436d8d5ae61.gif)
单片机课程设计现代交通灯的设计
电气信息学院
单片机与控制技术课程设计报告
课题名称现代交通灯的设计
专业班级*************
学号**********
学生姓名****
指导教师******
评分
摘要
城市道口交通灯控制系统模型采用单片机作为主控制器,用于十字路口的车辆及行人的交通管理,每个方向具有左拐、右拐、直行及行人4种通行指示灯,计时牌显示路口通行转换剩余时间,在出现紧急情况时可以由交警手动实现全路口车辆禁行而行人通行状态。
另外,在特种车辆如119、120通过路口时,系统可自动转换为特种车辆放行,其他车辆禁行,15s后系统自动恢复正常管理。
其他还有盲人提示音、120s与60s通行管理转换功能。
采用标准的AT89C52单片机作为控制器;通行倒计时显示采用3位LED数码管;右拐、左拐、直行及行人4种通行状态指示灯采用双色高亮发光二极管;LED显示采用动态扫描,以节省端口数。
特种车辆通行采用实时中断完成,识别方法采用红外线发射及接受方案。
整套电路模块由控制系统模块、通行灯输出控制显示模块、时间显示模块和自动特种车辆控制模块等组成。
道口交通控制系统控制程序主要分为以下几个模块:
初始化程序、主程序、定时中断程序和特种车实时响应程序等。
设计时按红绿交通灯控制程序和特种车辆经过中断程序两大部分。
本系统以AT89C51单片机为核心,采用汇编语言编程,设计的交通灯可用于十字路口的车辆及行人的交通管理,设计中应用了两种倒计时显示方式,120s倒计时适用于车流量较大的大城市,60s倒计时可用于中小型城市。
关键词:
单片机;显示;汇编语言;交通管理;LED数码管
1设计任务
1.1要求:
(1)设计一款带左转、直行,右转三种通行绿灯,参见实物效果图;
(2)带紧急按钮功能,当紧急按钮按下时,所有方向均亮起红灯;
(3)夜间运行模式按钮,按下时,所有方向黄灯闪烁;
(4*)可更在线修改红绿灯等待间隔时间
(5*)实现显示倒计时功能
(6#)其他功能(创新部分)
1.2实际功能设计:
(1)每个方向具有左拐、右拐、直行及行人4种通行指示。
(2)计时牌显示路口通行转换剩余时间。
(3)在出现紧急情况时可以由交警手动实现全路口车辆禁行而行人通行状态。
(4)在特种车辆如119、120通过路口时,系统可自动转换为特种车辆放行,其他车辆禁行,15s后系统自动恢复正常管理。
(5)盲人提示音、120s与60s通行管理转换功能。
2设计方案
2.1设计方案
采用标准的AT89C52单片机作为控制器;通行倒计时显示采用3位LED数码管;右拐、左拐、直行及行人4种通行状态指示灯采用双色高亮发光二极管;LED显示采用动态扫描,以节省端口数。
特种车辆通行采用实时中断完成,识别方法采用红外线发射及接受方案。
按以上系统构架设计,单片机端口资源刚好满足要求。
整个电路组成框图如图2.1所示。
上电复位
南北通行灯(2组)
P1
P2
AT89C52
P0
INT1
P3
东西通行灯(2组)
串口通信
3位LED显示器(4组)
119、120车辆监测
列扫描驱动
自动/手动键盘
图2.1采用LED动态扫描的交通灯控制系统
3系统硬件设计
3.1主控制系统电路
整套电路模块由控制系统模块、通行灯输出控制显示模块、时间显示模块和自动特种车辆控制模块等组成。
主控制器采用AT89C52,是ATMEL公司生产的一款性能稳定的8位单片机,AT89C52具有1个8KB的Flash程序存储器,1个512字节的RAM,4个8位的双向可位寻址I/O端口,3个16位定时/计数器及1个串行口和6个二级中断结构。
单片机的P1口及P2口分别用于控制南北及东西的通行灯,P0口及P3.0~P3.2口用于4组3位LED计时器的控制,特种车辆通过时使用外中断1口(P3.3),手动自动转换采用P3.7口按键。
主控系统电路图如图3.1所示。
图3.1主控系统电路
3.2通行灯输出控制电路
道口交通灯指示采用高亮度红绿双色发光二极管,左拐、右拐、直行及行人各一个。
当发光电流为6mA时,按公式R=(5-1.8)/0.006计算,限流电阻应为510欧姆。
由于南北通行时双向指示牌相同,因此每个端口应具有12mA的吸收电流能力。
另外,人行道口按4个灯算须24mA的吸收电流。
这样在单片机的输出口需接驱动电路74HC244,以保护单片机的输出端口。
道口指示灯电路图如图3.2所示。
图3.2单片机复位电路
3.3时间显示模块电路
道口剩余时间采用高亮红色7段LED发光数码管显示,采用共阳数码管,如用单片机吸收电流驱动,列扫描驱动使用三极管,按每段6mA电流算,全显示字形“8”时,每个数码管需6mA*8=48mA。
由于单片机每个段码输出口需吸收24mA电流,因此在电路设计中也使用了驱动集成块74HC244。
时间显示模块电路如图3.3所示。
图3.4时间显示模块电路
3.4特种车辆自动通行控制模块
自动道口灯在特种车辆到来时能自动关闭所有绿灯,让特种车辆通过。
设计中采用红外线发生器作为特种车的发信器,使用实时中断响应来响应特种车辆的通行要求。
红外线接收器一般采用电视机用一体化红外线接收器,具有很高的灵敏度和较强的抗干扰能力。
3.5盲人提示音电路
道口控制系统设计中,方便盲人过人行道的提示音电路,声音控制电路与人行道通行控制绿灯相同步,当绿灯亮时响一下,在行人结束通行前,绿灯闪烁10s时会间隔响5次(每次1s)。
盲人提示音电路如图3.5所示。
图3.5数码管显示电路
3.6电源电路及时钟电路
整个系统采用的电源电压只需+5V电压,故采用不可调的3端稳压器件,用常用的LM7805就可以满足系统电源的要求。
LM7805三端集成稳压电源内部由基准电压回路、恒流源、过流保护、过压保护和短路保护等8部分组成,具有低功耗、高效率、纹波系数小、输出电压稳定等优点。
图3.6电源电路及时钟电路
4系统主要程序设计
道口交通控制系统控制程序主要分为以下几个模块:
初始化程序、主程序、定时中断程序和特种车实时响应程序等。
4.1初始化程序
初始化程序主要完成内存规划,定时器的工作模式、中断方式等的设定。
由于子程序调用较多,因此初始化时堆栈指针设于80H处。
定时器T0、T1设为16位定时器模式,定时时间为50ms,T0为秒计时用,T1为通行结束闪烁用。
4.2主程序流程
主程序主要负责总体程序管理功能,实现人机交互设定。
由于采用动态扫描方式显示时间,因此主程序大部分时间要调用扫描显示程序。
主程序流程图如图4.2所示。
开始
初始化
显示程序
N
P3.7=0?
Y
键功能程序
图4.2主程序流程图
4.3外中断1中断服务程序
当特种车辆经过时,车中发射红外线信号,其信号被道口控制板上的接收器接收,并输出一个低电平触发外中断1。
中断处理程序流程图如图4.3所示。
送全红灯,数据缓存
外中断程序
保护现场
红灯
显示
15s倒计时结束?
N
关外中断1
Y
关定时器T1,开外中断
开定时器T1
现场恢复,中断返回
图4.3外中断1中断服务程序流程图
4.4定时器中断服务程序
定时器中断服务程序主要用于行车及行人的通行指示,通行规则如下:
(1)车辆南北直行、各路右拐,南北向行人通行。
南北向通行时间为1min,各路右拐比直行滞后10s开放。
(2)车辆南北向左拐、各路右拐,形容人禁行。
通行时间为1min。
(3)车辆东西向直行、各路右拐,东西向行人通行。
东西向通行时间为1min,各路右拐比直行滞后10s开放。
(4)车辆东西向左拐、各路右拐,行人禁行。
通行时间为1min。
交通灯的四种通行规则,是以控制红绿灯端口控制码的方式实现的。
它的原理是,将按不同规则通行时的各路口的红绿灯亮灭情况转换为单片机端口控制码。
其指示灯功能通过T0定时中断服务程序实现。
定时器T0溢出中断周期设为50ms,中断累计20次(即1s)时对120s倒计时单元减1操作。
设计中将四种通行规则分成不同的亮灯方式,通过查询秒倒计时单元的数据,实现不同的时间段给控制端口送不同的控制数据码。
控制码分为5个时间段:
120~110s、110~70s、70~60s、60~10s、10~0s。
交通管理定时功能程序流程图如图4.4所示。
T0中断程序
现场保护
关中断T0
T0初值重装
相应的处理程序
N
判断
Y
南北/东西标志位取反
中断返回
图4.4定时器中断处理流程图
5仿真与性能分析
1、系统仿真过程
图5.1仿真图
2仿真结果与分析
调试时,按红绿交通灯控制程序和特种车辆经过中断程序两大部分电路进行调试,并且南北方向、东西方向的指示灯同时调试。
6心得体会
单片机这门课程是在大三下半学期学的,等到了大四开始单片机课程设计,我感觉有些内容有些陌生,周围的同学也有这种感觉。
刚开始选课程设计题目时,我原本以为应该不麻烦的,因为我选择的是交通灯的控制,感觉大体是运用定时器及中断的原理来做。
这类问题以前在单片机实验中做过类似的实验,实时操作的交通灯控制我也曾用PLC做过的。
所以大体感觉,交通灯的问题,用编程来解决,原理应该是很简单的。
拿到题目后,我看了看后,感觉思路清晰了,用单片机中定时器和中断的知识即可。
所以,我决定先完成程序设计部分,用汇编语言编程。
在编程过程中,我感觉以前学过的一些单片机编程的某些语法不熟悉,所以还花了一些时间复习以前的内容。
本次课程设计不必以前的实验操作,因为这次交通灯的控制要求实现的功能比以前复杂,不仅要有各个方向通行灯的定时指示,还需要有扩展功能,我将夜间模式换成了特种车运行模式,另外还添加了盲人提示部分。
整个程序中,子程序的调用比较频繁,所以编程需要较强的逻辑性。
编完程序后,我在Protues中画系统原理图。
以前曾用CAD画过图,但是感觉Protues和CAD二者还是有一定区别的。
有的原件不怎么好找,比如74HC244这个芯片,先前怎么找都找不到像先前见过的那种类型的,后来才发现,原来一个74HC244芯片其实是元件库中的两个分开的子芯片的组合。
画图、调试感觉有点麻烦,也费了许多时间,但是感觉整个过程,收获还是不少的。
参考文献
[1]黄惟公,邓成中,王燕.单片机原理与应用技术.西安:
西安电子科技大学出版社,2007.
[2]朱清慧.Protueus显示控制系统设计与实例.北京:
清华大学大学出版社,2011.
[3]秦时宏,徐春辉.MCS-51单片机原理及应用.武汉:
华中科技大学出版社.2010.
[4]张迎新等编著.单片机原理及应用.北京:
电子工业出版社,2009.1
[5]张迎新编著.单片机初级教程.北京:
航空航天大学出版社,2007.8
[6]李勋等编著.单片机实用教程.北京:
航空航天大学出版社,2000.6
[7]余永权等编著.单片机在控制系统的应用.北京:
电子工业出版社,2003.10
[8]蔡伟智:
《LED道路交通灯的研制》,液晶与显示,第20卷第五期
[9]张大明:
《单片机控制实训》,机械工业出版社,2007
附录1系统原理图
附录2程序清单
;*************************************************************************;
;交通灯汇编程序;
;*************************************************************************;
TIMEEQU50H;秒计数用
TIMESFREQU51H;临时寄存器
CONR5EQU52H;T1秒定时计数器用
TIMED0EQU55H;单向最大定时时间,直行开始,人行开始(120S)
TIMED1EQU56H;各路右拐开始时间(110S)
TIMED2EQU57H;前行结束提醒(70S)
TIMED3EQU58H;前行结束,人行结束,左拐开始(60S)
TIMED4EQU58H;左拐结束提醒
TIMED5EQU5AH;左拐结束
TIMED6EQU5BH;
TIMED7EQU5CH;
SNEQUP1;南北口
ENEQUP2;东西口
SCANEQUP3;扫描口
LEDOUTEQUP0;段码口
SNEWFLAGBIT09H;东西口与南北口转换标志
;按键在扫描口的最高位,按一下,全红灯,再按一下,恢复原状态
;定时器T0、T1溢出周期为50ms,T0为秒计数用
;***********************中断入口程序**************************
ORG0000H;程序执行开始地址
LJMPSTART;跳到标号START执行
ORG0003H;外中断0中断程序入口
RETI;外中断0中断返回
ORG000BH;定时器T0中断入口地址
LJMPINTT0;
ORG0013H;外中断1中断入口
LJMPINT11;
ORG001B;定时器T1中断入口地址
LJMPINTT1;
ORG0023H;串行中断入口地址
RETI;
;
;***************************主程序***********************
START:
MOVSP,#80H
MOVR0,#00H;清零00H~8EH内存单元
MOVR7,#8FH
CLEARDISP:
MOV@R0,#00H
INCR0
DJNZR7,CLEARDISP
MOVTIMED0,#78H;单向最大定时时间,直行开始,人行开始(120S)
MOVTIMED1,#6EH;各路右拐开始时间(110S)
MOVTIMED2,#46H;前行结束提醒(70S)
MOVTIMED3,#3CH;前行结束,人行结束,左拐开始(60S)
MOVTIMED4,#0AH;左拐结束提醒
CLRSNEWFLAG;南北先通行标志位
MOVTMOD,#11H;设置T0、T1为16位定时器
MOVTL0,#0B0H;50ms定时器初值(T0计时用)
MOVTH0,#3CH;50ms定时器初值
MOVTL1,#0B0H;50ms定时器初值(T1闪烁定时用)
MOVTH1,#3CH;50ms定时器初值
JBSCAN.7,SSST;120s管理
;以下为60s管理
LCALLDL1MS
LCALLDL1MS
LCALLDL1MS
JBSCAN.7,SSST;干扰
MOVTIMED0,#60;单向最大定时时间,从直行开始,人行开始(60S)
MOVTIMED1,#55;各路右拐开始时间(55S)
MOVTIMED2,#35;前行结束提醒(35S)
MOVTIMED3,#30;前行结束,人行结束,左拐开始(30S)
MOVTIMED4,#05;左拐结束提醒
SSWAIT:
JNBSCAN.7,SSWAIT
LCALLDL1MS
LCALLDL1MS
LCALLDL1MS
JNBSCAN.7,SSWAIT
SSST:
MOVTIME,TIMED0;120S
LCALLTUNBCD
MOVSN,#66H
MOVEW,#55H
SETBEA;总中断开放
SETBPX1
SETBEX1
SETBET0;允许T0中断
SETBTR0;允许T0定时器
MOVR4,#14H;1s定时用初值(50ms*20)
MOVCONR5,#20
START1:
LCALLDISPLAY;调用显示子程序
JNBSCAN.7,KEYFUN;手动状态
SJMPSTART1;P1.0为1时跳回START1
KEYFUN:
LCALLDISPLAY
LCALLDISPLAY
JBSCAN.7,START1
CLRET0
CLRTR0
MOVSN,#056H;全车道停,行人通
NIVEW,#056H
MOVTIME,#00H;时间显示0
LCALLTUNBCD
KEYWAIT:
LCALLDISPLAY
JNBSCAN.7,KEYWAIT
KEYY:
LCALLDISPLAY;等待按键按下
JBSCAN.7,KEYY
LCALLDISPLAY
JBSCAN.7,KEYY
KEYWAIT1:
LCALLDISPLAY
JNBSCAN.7,KEYWAIT1
MOVTIME,TIMED0;重新开始计时初值
LCALLTUNBCD
CLRSNEWFLAG;南北先通行标志
SETBTR0
SETBET0
AJMPSTART1
;******************1S计时程序************************
INTT0:
PUSHACC
PUSHPSW
CLRET0
CLRTR0
MOVA,#0B7H;中断响应时间同步修正
ADDA,TL0;低8位初值修正
MOVTL0,A;重装初值,修正低8位
MOVA,#3CH;高8位初值修正
ADDCA,TH0
MOVTH0,A;重装初值,修正高8位
SETBTR0
DJNZR4,OUTT00;20次中断未到,中断退出
MOVR4,#14H;20次中断到(1s),重赋初值
JBSNEWFLAG,INT22
DECTIME
MOVA,TIME
CJNEA,TIMED1,LOOP11;判断是否小于110s
LOOP11:
JCLOOP22;120~110
MOVSN,#66H
MOVEW,#55H
LJMPOUTT0;120~110
LOOP22:
MOVA,TIME
CJNEA,TIMED2,LOOP33;判断是否小于70s
LOOP33:
JCLOOP44;110~70
MOVSN,#6AH
MOVEW,#59H
LJMPOUTT0;110~70
LOOP44:
MOVA,TIME
CJNEA,TIMED3,LOOP55;判断是否小于60s
LOOP55:
JCLOOP66;70~60
MOV20H,SN
CPL04H
CPL00H
MOVSN,20H
MOVEW,#59
LJMPOUTT0;70~60
LOOP66:
MOVA,TIME
CJNEA,TIMED4,LOOP77;判断是否小于10s
LOOP77:
JCLOOP88;60~10
MOVSN,#99H
MOVEW,#59H
LJMPOUTT0;60~10
LOOP88:
MOVA,TIME
JZOUT88
MOV20H,SN
CPL06H
CPL02H
MOVSN,20H
MOV20H,EW
CPL02H
MOVEW,20H
LJMPOUTT0;70~60
OUT88:
MOVTIME,TIMED0;120s初值
CPLSNEWFLAG
OUTT0:
LCALLTUNBCD
OUTT00:
POPPSW
POPACC
SETBET0
RETI
INT22:
DECTIME
MOVA,TIME
CJNEA,TIMED1,LOOP111;判断是否小于110s
LOPP111:
JCLOOP221;120~110
MOVEW,#66H
MOVSN,#55H
LJMPOUTT01;120~110
LOOP221:
MOVA,TIME
CJNEA,TIMED2,LOOP331;判断是否小于70s
LOOP331:
JCLOOP441;110~70
MOVEW,6AH
MOVSN,#59H
LJMPOUTT01;110~70
LOOP441:
MOVA,TIME
CJNEA,TIMED3,LOOP551;判断是否小于60s
LOOP551:
JCLOOP661;70~60
MOV20H,EW
CPL04H
CPL00H
MOVEW,20H
MOVSN,#59H
LJMPOUTT01;70~60
LOOP661:
MOVA,TIME
CJNEA,TIMED4,LOOP771;判断是否小于10s
LOOP771:
JCLOOP881;60~10
MOVEW,#99H
MOVSN,#59H
LJMPOUTT01;60~10
LOOP881:
MOVA,TIME
JZOUT881
MOV20H,EW
CPL06H
CPL02H
MOVEW,20H
MOV20H,SN
CPL02H
MOVSN,20H
LJMPOUTT01;70~60
OUT881:
MOVTIME,TIMED0;120S初值
CPLSNEWFLAG
OUTT01:
LCALLTUNBCD
POPPSW
POPACC
SETBET0
RETI
;******************显示程序*************************
;显示数据在70H~72H单元内,用3位LED共阳数码管显示,LEDOUT口输出段码数据,
;SCAN口作扫描控制,每个LED数码管亮1ms再逐位循环
DISPLAY:
MOVR1,#70H;指向显示数据首地址
MOVR5,#0FEH;扫描控制字初值
PLAY:
MOVA,R5;扫描字放入A
MOVSCAN,A;从SCAN口输出
MOVA,@R1;取显示数据到A
MOVDPTR,#TAB;取段码表地址
MOVCA,@A+DPTR;查显示数据对应段码
MOVLEDOU