电气信息学院
单片机与控制技术课程设计报告
课题名称 现代交通灯的设计
专业班级
学 号
学生姓名
指导教师
评 分
20##年12月24日至12月30日
课程设计量化评分标准
指导老师评语:
答辩记录
1、例举设计过程中遇到的问题及其解决方法(至少两例)。
答:(1)问题说明:74HC244芯片没有找到完整的芯片。
解决方法:后来发现74HC244芯片在Protues中是被拆分成两个部分的,一个完整的74HC244芯片是由A、B两个分开的部分组合而成的,后来采用了两个子芯片的组合。
(2)问题说明:原理图画好后,调试时发现了不明原因的错误,无法调试成功。
解决方法:在网上百度贴吧中找到了类似的问题及其解决方案,问题最终得以解决。
2、教师现场提的问题记录在此(不少于2个问题)。
答:
摘 要
城市道口交通灯控制系统模型采用单片机作为主控制器,用于十字路口的车辆及行人的交通管理,每个方向具有左拐、右拐、直行及行人4种通行指示灯,计时牌显示路口通行转换剩余时间,在出现紧急情况时可以由交警手动实现全路口车辆禁行而行人通行状态。另外,在特种车辆如119、120通过路口时,系统可自动转换为特种车辆放行,其他车辆禁行,15s后系统自动恢复正常管理。其他还有盲人提示音、120s与60s通行管理转换功能。采用标准的AT89C52单片机作为控制器;通行倒计时显示采用3位LED数码管;右拐、左拐、直行及行人4种通行状态指示灯采用双色高亮发光二极管;LED显示采用动态扫描,以节省端口数。特种车辆通行采用实时中断完成,识别方法采用红外线发射及接受方案。整套电路模块由控制系统模块、通行灯输出控制显示模块、时间显示模块和自动特种车辆控制模块等组成。道口交通控制系统控制程序主要分为以下几个模块:初始化程序、主程序、定时中断程序和特种车实时响应程序等。设计时按红绿交通灯控制程序和特种车辆经过中断程序两大部分。本系统以AT89C51单片机为核心,采用汇编语言编程,设计的交通灯可用于十字路口的车辆及行人的交通管理,设计中应用了两种倒计时显示方式,120s倒计时适用于车流量较大的大城市,60s倒计时可用于中小型城市。
关键词:单片机; 显示; 汇编语言; 交通管理; LED数码管
目 录
1 设计任务... 1
2设计方案... 1
3 系统硬件设计... 2
3.2通行灯输出控制电路... 3
3.3 时间显示模块电路... 4
3.4 特种车辆自动通行控制模块... 5
3.5 盲人提示音电路... 5
3.6 电源电路及时钟电路... 5
4 系统主要程序设计... 6
4.1 初始化程序... 6
4.2 主程序流程... 6
4.3外中断1中断服务程序... 7
4.4定时器中断服务程序... 8
5仿真与性能分析... 9
6心得体会... 10
参考文献... 11
附录1 系统原理图... 12
附录2程序清单... 13
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.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所示。
图4.2主程序流程图
4.3外中断1中断服务程序
当特种车辆经过时,车中发射红外线信号,其信号被道口控制板上的接收器接收,并输出一个低电平触发外中断1。中断处理程序流程图如图4.3所示。
图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所示。
图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程序清单
;*************************************************************************;
; 交通灯汇编程序 ;
;*************************************************************************;
TIME EQU 50H ;秒计数用
TIMESFR EQU 51H ;临时寄存器
CONR5 EQU 52H ;T1秒定时计数器用
TIMED0 EQU 55H ;单向最大定时时间,直行开始,人行开始(120S)
TIMED1 EQU 56H ;各路右拐开始时间(110S)
TIMED2 EQU 57H ;前行结束提醒(70S)
TIMED3 EQU 58H ;前行结束,人行结束,左拐开始(60S)
TIMED4 EQU 58H ;左拐结束提醒
TIMED5 EQU 5AH ;左拐结束
TIMED6 EQU 5BH ;
TIMED7 EQU 5CH ;
SN EQU P1 ;南北口
EN EQU P2 ;东西口
SCAN EQU P3 ;扫描口
LEDOUT EQU P0 ;段码口
SNEWFLAG BIT 09H ;东西口与南北口转换标志
;按键在扫描口的最高位,按一下,全红灯,再按一下,恢复原状态
;定时器T0、T1溢出周期为50ms,T0为秒计数用
;***********************中断入口程序**************************
ORG 0000H ;程序执行开始地址
LJMP START ;跳到标号START执行
ORG 0003H ;外中断0中断程序入口
RETI ;外中断0中断返回
ORG 000BH ;定时器T0中断入口地址
LJMP INTT0 ;
ORG 0013H ;外中断1中断入口
LJMP INT11 ;
ORG 001B ;定时器T1中断入口地址
LJMP INTT1 ;
ORG 0023H ;串行中断入口地址
RETI ;
;
;***************************主程序***********************
START: MOV SP,#80H
MOV R0,#00H ;清零00H~8EH内存单元
MOV R7,#8FH
CLEARDISP: MOV @R0,#00H
INC R0
DJNZ R7,CLEARDISP
MOV TIMED0,#78H ;单向最大定时时间,直行开始,人行开始(120S)
MOV TIMED1,#6EH ;各路右拐开始时间(110S)
MOV TIMED2,#46H ;前行结束提醒(70S)
MOV TIMED3,#3CH ;前行结束,人行结束,左拐开始(60S)
MOV TIMED4,#0AH ;左拐结束提醒
CLR SNEWFLAG ;南北先通行标志位
MOV TMOD,#11H ;设置T0、T1为16位定时器
MOV TL0,#0B0H ;50ms定时器初值(T0计时用)
MOV TH0,#3CH ;50ms定时器初值
MOV TL1,#0B0H ;50ms定时器初值(T1闪烁定时用)
MOV TH1,#3CH ;50ms定时器初值
JB SCAN.7,SSST ;120s管理
;以下为60s管理
LCALL DL1MS
LCALL DL1MS
LCALL DL1MS
JB SCAN.7,SSST ;干扰
MOV TIMED0,#60 ;单向最大定时时间,从直行开始,人行开始(60S)
MOV TIMED1,#55 ;各路右拐开始时间(55S)
MOV TIMED2,#35 ;前行结束提醒(35S)
MOV TIMED3,#30 ;前行结束,人行结束,左拐开始(30S)
MOV TIMED4,#05 ;左拐结束提醒
SSWAIT: JNB SCAN.7,SSWAIT
LCALL DL1MS
LCALL DL1MS
LCALL DL1MS
JNB SCAN.7,SSWAIT
SSST: MOV TIME,TIMED0 ;120S
LCALL TUNBCD
MOV SN,#66H
MOV EW,#55H
SETB EA ;总中断开放
SETB PX1
SETB EX1
SETB ET0 ;允许T0中断
SETB TR0 ;允许T0定时器
MOV R4,#14H ; 1s定时用初值(50ms*20)
MOV CONR5,#20
START1: LCALL DISPLAY ; 调用显示子程序
JNB SCAN.7,KEYFUN ;手动状态
SJMP START1 ; P1.0为1时跳回START1
KEYFUN: LCALL DISPLAY
LCALL DISPLAY
JB SCAN.7,START1
CLR ET0
CLR TR0
MOV SN,#056H ; 全车道停,行人通
NIV EW,#056H
MOV TIME,#00H ;时间显示0
LCALL TUNBCD
KEYWAIT:LCALL DISPLAY
JNB SCAN.7,KEYWAIT
KEYY: LCALL DISPLAY ;等待按键按下
JB SCAN.7,KEYY
LCALL DISPLAY
JB SCAN.7,KEYY
KEYWAIT1:LCALL DISPLAY
JNB SCAN.7,KEYWAIT1
MOV TIME,TIMED0 ;重新开始计时初值
LCALL TUNBCD
CLR SNEWFLAG ;南北先通行标志
SETB TR0
SETB ET0
AJMP START1
;******************1S计时程序************************
INTT0: PUSH ACC
PUSH PSW
CLR ET0
CLR TR0
MOV A,#0B7H ;中断响应时间同步修正
ADD A,TL0 ;低8位初值修正
MOV TL0,A ;重装初值,修正低8位
MOV A,#3CH ;高8位初值修正
ADDC A,TH0
MOV TH0,A ;重装初值,修正高8位
SETB TR0
DJNZ R4,OUTT00 ;20次中断未到,中断退出
MOV R4,#14H ; 20次中断到(1s),重赋初值
JB SNEWFLAG,INT22
DEC TIME
MOV A,TIME
CJNE A,TIMED1,LOOP11 ;判断是否小于110s
LOOP11: JC LOOP22 ;120~110
MOV SN,#66H
MOV EW,#55H
LJMP OUTT0 ;120~110
LOOP22: MOV A,TIME
CJNE A,TIMED2,LOOP33 ;判断是否小于70s
LOOP33: JC LOOP44 ;110~70
MOV SN,#6AH
MOV EW,#59H
LJMP OUTT0 ;110~70
LOOP44: MOV A,TIME
CJNE A,TIMED3,LOOP55 ;判断是否小于60s
LOOP55: JC LOOP66 ;70~60
MOV 20H,SN
CPL 04H
CPL 00H
MOV SN,20H
MOV EW,#59
LJMP OUTT0 ;70~60
LOOP66: MOV A,TIME
CJNE A,TIMED4,LOOP77 ;判断是否小于10s
LOOP77: JC LOOP88 ;60~10
MOV SN,#99H
MOV EW,#59H
LJMP OUTT0 ;60~10
LOOP88: MOV A,TIME
JZ OUT88
MOV 20H,SN
CPL 06H
CPL 02H
MOV SN,20H
MOV 20H,EW
CPL 02H
MOV EW,20H
LJMP OUTT0 ;70~60
OUT88: MOV TIME,TIMED0 ;120s初值
CPL SNEWFLAG
OUTT0: LCALL TUNBCD
OUTT00: POP PSW
POP ACC
SETB ET0
RETI
INT22: DEC TIME
MOV A,TIME
CJNE A,TIMED1,LOOP111 ;判断是否小于110s
LOPP111: JC LOOP221 ;120~110
MOV EW,#66H
MOV SN,#55H
LJMP OUTT01 ;120~110
LOOP221: MOV A,TIME
CJNE A,TIMED2,LOOP331 ;判断是否小于70s
LOOP331: JC LOOP441 ;110~70
MOV EW,6AH
MOV SN,#59H
LJMP OUTT01 ;110~70
LOOP441: MOV A,TIME
CJNE A,TIMED3,LOOP551 ;判断是否小于60s
LOOP551: JC LOOP661 ;70~60
MOV 20H,EW
CPL 04H
CPL 00H
MOV EW,20H
MOV SN,#59H
LJMP OUTT01 ;70~60
LOOP661: MOV A,TIME
CJNE A,TIMED4,LOOP771 ;判断是否小于10s
LOOP771: JC LOOP881 ;60~10
MOV EW,#99H
MOV SN,#59H
LJMP OUTT01 ;60~10
LOOP881: MOV A,TIME
JZ OUT881
MOV 20H,EW
CPL 06H
CPL 02H
MOV EW,20H
MOV 20H,SN
CPL 02H
MOV SN,20H
LJMP OUTT01 ;70~60
OUT881: MOV TIME,TIMED0 ;120S初值
CPL SNEWFLAG
OUTT01: LCALL TUNBCD
POP PSW
POP ACC
SETB ET0
RETI
;******************显示程序*************************
;显示数据在70H~72H单元内,用3位LED共阳数码管显示,LEDOUT口输出段码数据,
;SCAN口作扫描控制,每个LED数码管亮1ms再逐位循环
DISPLAY: MOV R1,#70H ;指向显示数据首地址
MOV R5,#0FEH ;扫描控制字初值
PLAY: MOV A,R5 ; 扫描字放入A
MOV SCAN,A ;从SCAN口输出
MOV A,@R1 ; 取显示数据到A
MOV DPTR,#TAB ; 取段码表地址
MOVC A,@A+DPTR ;查显示数据对应段码
MOV LEDOUT,A ; 段码放入LEDOUT口
LOOP6: LCALL DL1MS ; 显示1ms
INC R1 ; 指向下一个地址
MOV A,R5 ; 扫描控制字放入A
JNB ACC.2,ENDOUT ; ACC.2=0时,一次显示结束
RL A
MOV R5,A
MOV LEDOUT,#0FFH
AJMP PLAY
ENDOUT: MOV LEDOUT,#0FFH ; 一次显示结束,端口复位
MOV SCAN,#0FFH ; 端口复位
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,88H,0BFH
; 共阳段码表 “0”,“1”,“2”,“3”,“4”,“5”,“6”,“7”,“8","9","不亮","A","-"
;***********************延时程序*******************************
;1ms延时程序,LED显示程序用
DL1MS: MOV R6,#14H
DL1: MOV R7,#19H
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET
TUNBCD: PUSH ACC
PUSH PSW
PUSH B
MOV A,TINE
MOV B,#100
DIV AB
MOV 72H,A
JNZ JJ0
MOV 72H,#0AH ;最高位为0,不点亮
JJ0: MOV A,B
MOV B,#10
DIV AB
MOV 71H,A
JNZ JJ1
MOV A,72H ;次高位为0,先看最高位是否为不亮
SUBB A,#0AH
JNZ JJ1
MOV 71H,#0AH ;最高位为不亮,次高位也不亮
JJ1: MOV 70H,B
POP B
POP PSW
POP ACC
RET
;119、120车中断程序
INT11: PUSH ACC
PUSH PSW
CLR EX1
CLR ET0
CLR TR0
MOV SN,#055H ;红灯全亮
MOV EW,#055H
MOV TIMESFR,TIME ;保存道口数据
MOV TIME,#0FH
MOV CONR5,#20
LCALL TUNBCD
SETB ET1
SETB TR1
POP PSW
POP ACC
RETI
;**********************15s计时程序**********************
;T1中断服务程序
INTT1: PUSH ACC
PUSH PSW
CLR ET1
CLR TR1
MOV A,#0B7H ;中断响应时间同步修正
ADD A,TL1 ; 低8位初值修正
MOV TL1,A ; 重装低8位初值
MOV A,#3CH ; 高8位初值修正
ADDC A,TH1 ;
MOV TH1,A ; 重装高8位初值
SETB TR1
DJNZ CONR5,OUTT333 ; 20次中断未到,中断退出
MOV CONR5,#14H ; 20次中断到(1s),重赋初值
DEC TIME ;
LCALL TUNBCD
MOV A,TIME
JZ OUT444
OUTT333: SETB ET1
POP PSW
POP ACC
RETI
OUT444: CLR TR1
CLR ET1
MOV TIME,TIMESFR
LCALL TUNBCD
SETB ET0
SETB TR0
SETB EX1
POP PSW
POP ACC
RETI
END