重庆三峡学院
课 程 设 计 报 告 书
题目:基于单片机的交通灯设计
学院(系):
学 号: 学生姓名: 指导教师: 教师职称:
制作日期 2011年12月25日
目录
1. 设计要求---------------------------------------------------- 01
2. 系统设计方案---------------------------------------------- 01
3. 硬件电路设计---------------------------------------------- 02
4. 软件系统设计---------------------------------------------- 06
5. 仿真与调试------------------------------------------------- 08
6. 实训体会---------------------------------------------------- 13
7. 附录---------------------------------------------------------- 14
摘要
单片微型计算机简称单片机,即把组成微型计算机的各个功能部件,如中央处理器(CPU)、随机存储器(RAM)、只读存储器(ROM)、I/O接口电路、定时器/计数器以及串行接口等集成在一块芯片中构成一个完整的微型计算机。设计一个基于单片机的交通灯设计。主要包括AT89c51单片机、复位电路、驱动控制芯片74LS240和74LS07及外中断等。实现控制各个路口的交通灯变化,通过外中断起
到紧急开关作用,加上复位电路,使其恢复成初始状态。
本设计主控芯片采用AT89C51单片机,配合其他基本设备完成设计。采用C51语言进行编程,编程后利用KEIL C51进行编译,生成对应用的HEX文件,采用PROETUS软件进行系统硬件的仿真模拟,检验功能。模拟试验成功后,焊接硬件电路,通过ISP下载线将HEX文件载入单片机内,完成整个设计进行实际操作,并实际记录单片机工作情况。
设计一个基于单片机的交通灯设计。主要包括AT89c51单片机、复位电路、驱动控制芯片74LS240和74LS07及外中断等。实现控制各个路口的交通灯变化,通过外中断起到紧急开关作用,加上复位电路,使其恢复成初始状态。
1. 设计要求
设计一个基本十字路口交通灯管理系统。初始化4个路口红灯全亮,2秒后切换为东西
路口红灯亮,南北绿灯亮,持续60秒,红绿灯切换过渡时红灯依旧亮,绿灯亮转变为黄灯闪烁5次,过程时间为5秒,然后切换为南北路口红灯亮,东西路口绿灯亮,持续时间60秒,过渡过程切换方式同上,5秒后,再次切换为东西路口红灯亮,南北绿灯亮。如此周而复始。
2.系统设计图
东
南
利用单片机完成交通信号灯控制器的设计,该交通信号灯控制器由一条主干道和一条支
干道汇合成十字路口,在每个入口处设置红、绿、黄三色信号灯,红灯亮禁止通行,绿灯亮
允许通行,黄灯亮则给行驶中的车辆有时间停在禁行线外。用红、绿、黄发光二极管作信号灯。如图上图所示。
(1)处于常允许通行的状态,道路有车来时才允许通行。南北亮绿灯时,东西亮红灯;东西亮绿灯时,南北亮红灯。
(2)道路上均有车时,两者交替允许通行,每次放行60秒,黄灯闪烁5秒,设立60秒、5秒计时、显示电路。
2.2方案设计
单片机可选用AT89C51,它与8051系列单片机全兼容,但其内部带有4KB的FLASH ROM,设计时无需外接程序存储器,为设计和调试带来极大的方便。南北向和东西向各采用2个数码管计时,同时需要对该方向的指示灯的点亮时间进行倒计时。
实验程序框图
3.硬件电路设计
3.1复位部分电路设计
复位引脚RST通过一个斯密特触发器与复位电路相连,斯密特触发器用来抑制噪声,在每个机器周期的S5P2,斯密特触发器的输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号。
复位电路通常采用上电自动复位和按钮复位两种方式。
该设计复位电容采用10uF,电阻1000欧,通过电阻回路放电,使电压逐渐降为零,从而实现了复位功能。
复位电路
3.2 时钟部分电路设计
时钟电路用于产生MCS-51单片机工作时所必须的时钟控制信号。其内部电路在时钟信号控制下,严格地按时序执行指令进行工作。在执行指令时,CPU首先要到程序存储器中取出需要执行的指令操作码,然后译码,并由时序电路产生一系列控制信号去完成指令所规定操作。
本设计采用12MHz晶振和两个30Pf瓷片电容,他们构成一个稳定的自激振荡器。该电容的大小影响振荡器频率的高低、振荡器的稳定性和起振的快速性。为单片机提供标准时钟。其中两个瓷片电容起微调作用。
ATMEL公司生产的AT89C51单片机它是硬件电路的核心部分,在由多片单片机组成的系统中,为了各单片机之间的时钟信号同步,应当引入唯一的公用外部脉冲信号作为各单片机的振荡脉冲,外部脉冲信号一般不低于33MHz的方波。
C1
33
晶振电路
3.3 显示部分电路设计
动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管
有效。这样一来,就没有必要每一位数码管配一个锁存器,从而大大地简化了硬件电路。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
显示电路设计
3.4 硬件连接示意图 7407管脚图
74LS240管脚图
四位一体数码管管教图
89c51管脚图
4.软件系统设计
4.1 应用系统软件设计要求
在进行应用系统的总体设计时,软件设计与硬件设计应统一考虑,相结合进行。当系统的电路设计定型以后,软件的任务也就明确了。
一般来说,软件的功能可分为两大类。一类是执行软件,它能完成各种实质性的功能,如测量计算、显示、打印、输出控制等;另一类是监控软件,它是专门用来协调各执行模块和操作者的关系,在系统软件中充当组织协调角色。 我们设计时,应从以下几个方面考虑:
1)根据软件功能的要求,将系统软件分为若干个相对独立的部分。设计出合理的软件总体结构,使其清晰、简捷、流程合理。 2)各功能程序实行模块化、子程序化。
3)在编写应用软件之前,应绘制出程序流程图。
4)要合理分配系统资源,包括ROM、RAM、定时器/计数器、中断源等。
本设计采用了模块化设计,主要由主程序模块、功能实现模块两大部分模块组成。
4.2 主程序模块设计 主程序流程图如下图所示:
交通灯控制系统设计思路
P1口:P1. 5—P1.0 红黄绿红黄绿 对应口低电平灯亮 控制灯程序流程图如下:
程序见附录:程序清单
5. 仿真与调试 5.1软件仿真
接硬件图接线,为了确保东西南北红黄绿灯能够对应显示,实验时,对P1口的接线做了调整。即,P1.0接L1,P1.1接L2,P1.2接L3,P1.3接L4,P1.4接L5,P1.5接L6。
本系统由单片机系统、LED 显示、交通灯演示系统组成。最后,系统要求实现如下的交通灯的功能:
1)接通电源后,将显示模块的程序编译后烧进单片机电路板里,如若看到红灯全亮两秒后,跳转为一红一绿,码表计时60秒;
2)在绿灯转为红灯时,要求黄灯先亮,才能变换运行车道; 3)黄灯亮时,要求每秒闪亮一次,闪烁5次,计时5秒; 4)黄灯闪烁后跳转为红灯,另一方向红灯则跳为绿灯;
5)计时60秒,绿灯再次跳转为黄灯,闪烁,红灯跳转为红灯,车辆放行;
6)在交通灯运行正常的情况下,将P3.2口所接的控制开关,拨为低电平,交通灯全部跳转为红灯亮,可供紧急车辆通行;
7)照此循环下去没有问题就证明该显示模块的测试成功
Pro仿真
初始状态
第一状态
黄灯状态
黄灯后下一状态
按下外中断的显示
按下复位的状态
Keil的仿真
执行前
执行后
5.2硬件仿真
6、结论
本系统采用MSC_51系列单片机为中心器件来设计交通灯控制器,实现了能根据实际车流量通过单片机芯片的P2口设置红、绿灯燃亮时间功能;P2口和P3口外接数码管来显示各个信号灯的时间。系统设计简单、实用性强、操作简单、程序设计简单。系统不足之处不能控制车的左、右转及自动根据车流量改变红绿灯时间等。这是由于本身地理位置以及车流量情况所定,如果有需要可以设计扩充原程序来实现。
本次课程设计让我得到了一次用专业知识、专业技能技能分析和解决问题全面系统的锻炼。让我在单片机的基本原理、单片机应用系统开发过程,以及在常用编程设计思路技巧的掌握方面都能向前迈了一大步,为了日后成为合格的应用型人才打下了良好的基础。
附录1:
程序清单
;主要子程序名称:
;MAIN:主程序
;SSEE:六位数码管动态扫描子程序
;PTDS0:拆字子程序
;CLOCK:T0中断服务子程序
;MBXS: 码表刷新判断子程序
;JTDZT: 交通灯状态判断子程序
;JJCL: 紧急车辆通行子程序
;ZMPD: 整秒到判断子程序
;HBCD: 单字节十六进制整数转换为单字节BCD码整数
;**************************************
;内存单元及状态标志定义
ZT0 EQU 0F6H ;状态0,四个路口红灯亮==2秒
ZT1 EQU 0DEH ;东西红南北绿==60秒
ZT2_1 EQU 0EEH ;东西红南北黄
ZT2_2 EQU 0FEH ;东西红南北全灭==5秒
ZT3 EQU 0F3H ;东西绿南北红==60秒
ZT4_1 EQU 0F5H ;东西黄南北红
ZT4_2 EQU 0F7H ;南北红南北全灭==5秒
STATE EQU 40H ;状态标志单元
MARK BIT 00H ;黄灯闪烁标志位
XS0 EQU 79H ;显示缓冲单元0,对应最右边数码管
XS1 EQU 7AH
XS2 EQU 7BH
XS3 EQU 7CH ;显示缓冲单元4,对应最左边数码管
;4个数码管
;XS4 EQU 7DH
;XS5 EQU 7EH ;显示缓冲单元5,对应最左边数码管
TIME1 EQU 46H ; 秒单元(十六进制)
TIME2 EQU 41H ; 秒单元(十进制BCD码)
;**************************************
ORG 0
LJMP MAIN
ORG 0003H ;外中断0(紧急车辆)处理子程序入口
LJMP JJCL
ORG 000BH ;定时器T0中断入口
LJMP CLOCK
;**************************************
;标号:MAIN。主程序。完成系统初始化,循环调用数码管扫描子程序,拆字子程序,等待定时中断。
;**************************************
ORG 0030H
MAIN: MOV SP,#60H ;调整堆栈指针 MODIFY =70H
MOV PSW ,#00H ;设置工作寄存器为0区
;MOV P2,#0FFH ;高位地址线为0FFH LCALL CSH ;调初始化子程序
LOOP:
LCALL SSEE ;调动态扫描子程序
LCALL PTDS0 ;调拆字子程序
SJMP LOOP
;**************************************
;系统初始化子程序
;**************************************
CSH: ;MOV XS5,#10H ;显示缓冲区全部送“灭”代码序号
;MOV XS4,#10H
MOV XS3,#0AH ;显示缓冲区全部送“灭”代码序号
MOV XS2,#0AH
MOV XS1,#0AH
MOV XS0,#0AH
MOV TIME1 , #0002 ;状态0持续为2s
MOV TIME2 , #0002
;MOV A,#81H ;8255初始化,PA口和PB口为输出口
;MOV DPTR,#0FF23H
;MOVX @DPTR,A
MOV TMOD,#01H ;定时器T0,方式1
MOV TL0,#0B0H ;定时50ms
MOV TH0,#3CH
CLR IT0 ;设置外中断0为电平方式工作
SETB PX0 ;设置外中断0为高级中断
ORL IE,#83H ;开放外中断0和T0中断
MOV STATE,#00H ;进入状态0
MOV P1, #ZT0 ;状态0,四个路口红灯亮
MOV R6, #00H
MOV R5, #00H ;软件计数器初始化
SETB TR0 ;启动T0
RET
;**************************************
;标号CLOCK,T0中断服务程序。根据交通灯状态变化表规定的定时时间依次切换P1口输出状态。
;使用资源:Acc,B,R6,R5,R7,P1
;**************************************
ORG 0100H
CLOCK: MOV TH0,#03CH ;T0重赋初值==50ms
MOV TL0,#0B0H
PUSH PSW ;保护现场
PUSH ACC
SETB RS0 ;切换寄存器工作区
INC R6 ;定时器计数单元加1
LCALL MBXS ;调码表刷新判断子程序
LCALL JTDZT ;调交通灯状态判断子程序
CLR RS0 ;恢复寄存器工作区为0区
POP ACC ;恢复现场
POP PSW
CRETUN: RETI ;中断返回
;**************************************
;标号MBXZ,码表状态刷新判断子程序。
;根据交通灯状态变化表规定的定时时间依次切换P1口输出状态。
;使用资源:Acc,R6,R5,R7,P1
;**************************************
MBXS: PUSH PSW ;保护现场
PUSH ACC
MOV A,R6
LCALL ZMPD ;调整秒到判断子程序
MOV A,TIME1 ;将十六进制秒数值转换为BCD码秒数值
LCALL HBCD
MOV TIME2 , A
DONE: POP ACC ;恢复现场
POP PSW
RET ;子程序返回
;**************************************
;标号ZMPD,整秒到判断子程序。
;设计思路:根据R6软件计数器的值判断。因为T0硬件定时器是定时50ms,R6单元每计数20次,即为1s。根据R6单元能否被20整除,即可判断整秒到否。到整秒,则TIME1计数单元减1,实现倒计时计数。
;**************************************
ZMPD: MOV B , #20
DIV AB ;判断整秒到否? A/B 商存于A,余数存于B
MOV A , B
JNZ RETN ;整秒未到,返回
DEC TIME1 ;整秒到,TIME1单元减1
RETN: RET
;************************************************************* ;标号HBCD,功能:单字节十六进制整数转换为单字节BCD码整数
;入口:(A)=待转换的单字节十六进制整数数
;出口:(A)=转换完成的BCD码整数(十位和个位),(R3)=百位
;影响资源:A、B、PSW、R3 堆栈需求:2字节
;************************************************************* HBCD: SUBB A,#10H
MOV B , #3CH ;MODIFY SOURCE=100
DIV AB
MOV A , B
MOV B , #10
DIV AB
SWAP A
ORL A,B
RET
;**************************************
;标号JTDZT,交通灯状态判断子程序。
;根据交通灯状态变化表规定的定时时间依次切换P1口输出状态。
;使用资源:Acc,R6,R5,R7,P1
;**************************************
JTDZT: MOV A,STATE ;初始赋值00H,0状态
CJNE A,#00H,STATE1 ; 是状态0吗?
CJNE R6,#40,ZHUANYI ;状态0的2s时间到吗?
MOV STATE,#01H ;切换到状态1
MOV P1,#ZT1 ;东西红南北绿
MOV R6,#00 ;计数器清0
LJMP RTN ;中断返回
STATE1:MOV A,STATE
CJNE A,#01H,STATE2_1 ;是状态1吗?
CJNE R6,#100,ZHUANYI ;状态1的60s时间到吗?
MOV R6,#00
INC R5 ;初始R5=00
CJNE R5,#12,ZHUANYI
MOV R5,#00H
MOV STATE,#02H ;切换到状态2_1
MOV P1,#ZT2_1 ;东西红,南北黄
MOV R7,#5 ;黄灯闪烁5次
CLR MARK ;设定状态2黄灯闪烁标志位为0
LJMP RTN
ZHUANYI:LJMP RTN
STATE2_1:MOV A,STATE
CJNE A,#02H,STATE3 ;是状态2吗?不是,转状态3 JB MARK,STATE2_2 ;黄灯标志为1,转状态2_2 CJNE R6,#10,RTN ;黄灯亮0.5s
SETB MARK ;黄灯亮0.5s后,切换到状态2_2
MOV R6,#00H ;计数器清0
LJMP RTN ;中断返回
STATE2_2:MOV P1,#ZT2_2 ; 东西红灯亮
CJNE R6,#10,RTN ;黄灯灭0.5s
CLR MARK ;黄灯灭0.5s后,切换到状态2_1标志 MOV R6,#00H
MOV P1,#ZT2_1 ; 切换到状态2-1
DJNZ R7,STATE2_1 ;黄灯闪烁5遍到否?
;DEC TIME1
;LCALL
SSEE ;;MODIFY
MOV R6,#00H ;计数器清0
MOV STATE,#03H ;切换到状态3
MOV P1,#ZT3 ;东西绿南北红
LJMP RTN ;中断返回
STATE3: MOV A,STATE ;
CJNE A,#03H,STATE4_1 ;是状态3吗?
CJNE R6,#100,RTN ;状态3的60s时间到吗? MOV R6,#00
INC R5
CJNE R5,#12,RTN
MOV R5,#00H
MOV STATE,#04H ;切换到状态4_1
MOV P1,#ZT4_1 ;切换到状态4_1
MOV R7,#5 ;黄灯闪烁5次
CLR MARK ;设定状态4黄灯闪烁标志位为0
LJMP RTN ;中断返回
STATE4_1: MOV A,STATE
CJNE A,#04H,STATE1 ;是状态4吗?不是,转状态1 JB MARK,STATE4_2 ;黄灯标志为1,转状态4_2 CJNE R6,#10,RTN ;黄灯亮0.5s
SETB MARK ;黄灯亮0.5s后,切换到状态4_2
MOV R6,#00H ;计数器清0
LJMP RTN ;中断返回
STATE4_2:MOV P1,#ZT4_2 ;切换到状态4_2
CJNE R6,#10,RTN ;黄灯灭0.5s
CLR MARK ;黄灯灭0.5s,切换到状态4_1标志
MOV R6,#00H
MOV P1,#ZT4_1 ; 切换到状态4-1
DJNZ R7,STATE4_1 ;黄灯闪烁5遍到否?
;DEC TIME1 ;LCALL SSEE ;;;;;;;MODIFY MOV R6,#00H ;计数器清0
MOV STATE,#01H ;切换到状态1 MOV P1,#ZT1 ;东西红南北绿 RTN: RETI
;***********************************************
;标号SSEE,显示缓冲区设置在7CH~79H,对应从左到右的4个数码管。
;数码管段控口采用74LS240反相驱动器,位控口采用7407(或75451)同相驱动器,数码管为共阴极。
;动态扫描子程序运行一次,对4位数码管从左到右共扫描5遍 ;*********************************************** ORG 0D50H
SSEE: SETB RS1 ;换工作区 MOV R5,#05H ;扫描5遍
SSE2: MOV 30H,#0FEH ;MOV 30H,#20H ;设置位控码,从左往右扫描 0010 0000
MOV 31H,#7CH ;MOV 31H,#FEH ;从最高位开始扫描
MOV R7,#04H ;MOV R7,#06H ;扫描6个数码管 SSE1:
;MOV R1,#20H MOV A,30H ;取位控码
;CPL A ;取反 MOV P2,A ;MOVX @R1,A ;输出位控码 MOV R0,31H MOV A,@R0
MOV DPTR,#DDFF MOVC A,@A+DPTR CPL A
;MOV R1,#21H
MOV P0,A ;MOVX @R1,A ;输出段控码 LCALL DELY5MS MOV A,30H
RL A ;位控码右移一位 MOV 30H,A DEC 31H
MOV A,#0FFH ;数码管全灭 MOV P2,A ;MOVX @R1,A
DJNZ R7,SSE1 ;4位数码管扫描完否? DJNZ R5,SSE2 ;5遍扫描完否? CLR RS1 ;恢复工作区
RET
DDFF: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H
;共阴数码管代码表0~9,灭特定提示符
DELY5MS: MOV R2, #5
D5: MOV R3,#248 DJNZ R3,$ DJNZ R2,D5 RET
;************************************************************* ;标号PTDS0,拆字子程序。
;功能: 将TIME2单元的BCD码秒数值拆分为高四位和低四位,分送XS0(XS2)和XS1(XS3)显示缓冲区
;************************************************************* PTDS0: MOV R0,#XS0 ;指向显示缓冲区首址 MOV A,TIME2 ;取要拆分的BCD码 LCALL PTDS
MOV XS2,XS0 ;两个路口显示的时间一样 MOV XS3, XS1 RET
PTDS: MOV R1,A LCALL PTDS1 MOV A,R1 SWAP A
PTDS1: ANL A,#0FH MOV @R0,A INC R0 RET
;***************************************************** ;标号JJCL,外中断模拟紧急车辆通行子程序。 ;四个路口全部红灯,定时器暂停。当紧急车辆通行完毕,即外中断撤除后,四个路口恢复原来的状态。
;***************************************************** JJCL: PUSH ACC ;保护现场 PUSH PSW
PUSH P1 ;保护P1口状态
CLR TR0 ; 停止T0计数器 JJLOOP: MOV P1 , #ZT0 ;四个路口红灯亮 MOV A , #0FFH MOV P2 , A
JNB P3.2 , JJLOOP ;紧急车辆通行完毕否,即外中断撤除否? POP P1 ;恢复路口原来状态 POP PSW ;恢复现场
POP ACC
SETB TR0 ;启动定时器 RETI END
附录3 参考资料
谢辉.《单片机原理及应用》北京:化学工业出版社,2010
李广弟,朱月秀,王秀山编著《单片机基础》北京航空大学出版社2001 蔡美琴《MCS_51单片机系统及应用》北京:高等教育出版社1992 杨居义.《单片机课程设计指导书》..北京:清华大学出版社,2009 张永枫.《单片机应用实训教程》..北京:清华大学出版社,2008
戴仙金.《51单片机及其C语言程序开发实例》..北京:清华大学出版社,2008 姜志红.《51单片机技术与应用系统开发案例精选》.北京:清华大学出版社,2008 张荫等.《单片机应用系统开发综合实例》. 北京:清华大学出版社,2008
何立民《MCS_51系列单片机应用系统设计系统配置与接口技术》北京航空航天大学出版社,1999
重庆三峡学院
课 程 设 计 报 告 书
题目:基于单片机的交通灯设计
学院(系):
学 号: 学生姓名: 指导教师: 教师职称:
制作日期 2011年12月25日
目录
1. 设计要求---------------------------------------------------- 01
2. 系统设计方案---------------------------------------------- 01
3. 硬件电路设计---------------------------------------------- 02
4. 软件系统设计---------------------------------------------- 06
5. 仿真与调试------------------------------------------------- 08
6. 实训体会---------------------------------------------------- 13
7. 附录---------------------------------------------------------- 14
摘要
单片微型计算机简称单片机,即把组成微型计算机的各个功能部件,如中央处理器(CPU)、随机存储器(RAM)、只读存储器(ROM)、I/O接口电路、定时器/计数器以及串行接口等集成在一块芯片中构成一个完整的微型计算机。设计一个基于单片机的交通灯设计。主要包括AT89c51单片机、复位电路、驱动控制芯片74LS240和74LS07及外中断等。实现控制各个路口的交通灯变化,通过外中断起
到紧急开关作用,加上复位电路,使其恢复成初始状态。
本设计主控芯片采用AT89C51单片机,配合其他基本设备完成设计。采用C51语言进行编程,编程后利用KEIL C51进行编译,生成对应用的HEX文件,采用PROETUS软件进行系统硬件的仿真模拟,检验功能。模拟试验成功后,焊接硬件电路,通过ISP下载线将HEX文件载入单片机内,完成整个设计进行实际操作,并实际记录单片机工作情况。
设计一个基于单片机的交通灯设计。主要包括AT89c51单片机、复位电路、驱动控制芯片74LS240和74LS07及外中断等。实现控制各个路口的交通灯变化,通过外中断起到紧急开关作用,加上复位电路,使其恢复成初始状态。
1. 设计要求
设计一个基本十字路口交通灯管理系统。初始化4个路口红灯全亮,2秒后切换为东西
路口红灯亮,南北绿灯亮,持续60秒,红绿灯切换过渡时红灯依旧亮,绿灯亮转变为黄灯闪烁5次,过程时间为5秒,然后切换为南北路口红灯亮,东西路口绿灯亮,持续时间60秒,过渡过程切换方式同上,5秒后,再次切换为东西路口红灯亮,南北绿灯亮。如此周而复始。
2.系统设计图
东
南
利用单片机完成交通信号灯控制器的设计,该交通信号灯控制器由一条主干道和一条支
干道汇合成十字路口,在每个入口处设置红、绿、黄三色信号灯,红灯亮禁止通行,绿灯亮
允许通行,黄灯亮则给行驶中的车辆有时间停在禁行线外。用红、绿、黄发光二极管作信号灯。如图上图所示。
(1)处于常允许通行的状态,道路有车来时才允许通行。南北亮绿灯时,东西亮红灯;东西亮绿灯时,南北亮红灯。
(2)道路上均有车时,两者交替允许通行,每次放行60秒,黄灯闪烁5秒,设立60秒、5秒计时、显示电路。
2.2方案设计
单片机可选用AT89C51,它与8051系列单片机全兼容,但其内部带有4KB的FLASH ROM,设计时无需外接程序存储器,为设计和调试带来极大的方便。南北向和东西向各采用2个数码管计时,同时需要对该方向的指示灯的点亮时间进行倒计时。
实验程序框图
3.硬件电路设计
3.1复位部分电路设计
复位引脚RST通过一个斯密特触发器与复位电路相连,斯密特触发器用来抑制噪声,在每个机器周期的S5P2,斯密特触发器的输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号。
复位电路通常采用上电自动复位和按钮复位两种方式。
该设计复位电容采用10uF,电阻1000欧,通过电阻回路放电,使电压逐渐降为零,从而实现了复位功能。
复位电路
3.2 时钟部分电路设计
时钟电路用于产生MCS-51单片机工作时所必须的时钟控制信号。其内部电路在时钟信号控制下,严格地按时序执行指令进行工作。在执行指令时,CPU首先要到程序存储器中取出需要执行的指令操作码,然后译码,并由时序电路产生一系列控制信号去完成指令所规定操作。
本设计采用12MHz晶振和两个30Pf瓷片电容,他们构成一个稳定的自激振荡器。该电容的大小影响振荡器频率的高低、振荡器的稳定性和起振的快速性。为单片机提供标准时钟。其中两个瓷片电容起微调作用。
ATMEL公司生产的AT89C51单片机它是硬件电路的核心部分,在由多片单片机组成的系统中,为了各单片机之间的时钟信号同步,应当引入唯一的公用外部脉冲信号作为各单片机的振荡脉冲,外部脉冲信号一般不低于33MHz的方波。
C1
33
晶振电路
3.3 显示部分电路设计
动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管
有效。这样一来,就没有必要每一位数码管配一个锁存器,从而大大地简化了硬件电路。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
显示电路设计
3.4 硬件连接示意图 7407管脚图
74LS240管脚图
四位一体数码管管教图
89c51管脚图
4.软件系统设计
4.1 应用系统软件设计要求
在进行应用系统的总体设计时,软件设计与硬件设计应统一考虑,相结合进行。当系统的电路设计定型以后,软件的任务也就明确了。
一般来说,软件的功能可分为两大类。一类是执行软件,它能完成各种实质性的功能,如测量计算、显示、打印、输出控制等;另一类是监控软件,它是专门用来协调各执行模块和操作者的关系,在系统软件中充当组织协调角色。 我们设计时,应从以下几个方面考虑:
1)根据软件功能的要求,将系统软件分为若干个相对独立的部分。设计出合理的软件总体结构,使其清晰、简捷、流程合理。 2)各功能程序实行模块化、子程序化。
3)在编写应用软件之前,应绘制出程序流程图。
4)要合理分配系统资源,包括ROM、RAM、定时器/计数器、中断源等。
本设计采用了模块化设计,主要由主程序模块、功能实现模块两大部分模块组成。
4.2 主程序模块设计 主程序流程图如下图所示:
交通灯控制系统设计思路
P1口:P1. 5—P1.0 红黄绿红黄绿 对应口低电平灯亮 控制灯程序流程图如下:
程序见附录:程序清单
5. 仿真与调试 5.1软件仿真
接硬件图接线,为了确保东西南北红黄绿灯能够对应显示,实验时,对P1口的接线做了调整。即,P1.0接L1,P1.1接L2,P1.2接L3,P1.3接L4,P1.4接L5,P1.5接L6。
本系统由单片机系统、LED 显示、交通灯演示系统组成。最后,系统要求实现如下的交通灯的功能:
1)接通电源后,将显示模块的程序编译后烧进单片机电路板里,如若看到红灯全亮两秒后,跳转为一红一绿,码表计时60秒;
2)在绿灯转为红灯时,要求黄灯先亮,才能变换运行车道; 3)黄灯亮时,要求每秒闪亮一次,闪烁5次,计时5秒; 4)黄灯闪烁后跳转为红灯,另一方向红灯则跳为绿灯;
5)计时60秒,绿灯再次跳转为黄灯,闪烁,红灯跳转为红灯,车辆放行;
6)在交通灯运行正常的情况下,将P3.2口所接的控制开关,拨为低电平,交通灯全部跳转为红灯亮,可供紧急车辆通行;
7)照此循环下去没有问题就证明该显示模块的测试成功
Pro仿真
初始状态
第一状态
黄灯状态
黄灯后下一状态
按下外中断的显示
按下复位的状态
Keil的仿真
执行前
执行后
5.2硬件仿真
6、结论
本系统采用MSC_51系列单片机为中心器件来设计交通灯控制器,实现了能根据实际车流量通过单片机芯片的P2口设置红、绿灯燃亮时间功能;P2口和P3口外接数码管来显示各个信号灯的时间。系统设计简单、实用性强、操作简单、程序设计简单。系统不足之处不能控制车的左、右转及自动根据车流量改变红绿灯时间等。这是由于本身地理位置以及车流量情况所定,如果有需要可以设计扩充原程序来实现。
本次课程设计让我得到了一次用专业知识、专业技能技能分析和解决问题全面系统的锻炼。让我在单片机的基本原理、单片机应用系统开发过程,以及在常用编程设计思路技巧的掌握方面都能向前迈了一大步,为了日后成为合格的应用型人才打下了良好的基础。
附录1:
程序清单
;主要子程序名称:
;MAIN:主程序
;SSEE:六位数码管动态扫描子程序
;PTDS0:拆字子程序
;CLOCK:T0中断服务子程序
;MBXS: 码表刷新判断子程序
;JTDZT: 交通灯状态判断子程序
;JJCL: 紧急车辆通行子程序
;ZMPD: 整秒到判断子程序
;HBCD: 单字节十六进制整数转换为单字节BCD码整数
;**************************************
;内存单元及状态标志定义
ZT0 EQU 0F6H ;状态0,四个路口红灯亮==2秒
ZT1 EQU 0DEH ;东西红南北绿==60秒
ZT2_1 EQU 0EEH ;东西红南北黄
ZT2_2 EQU 0FEH ;东西红南北全灭==5秒
ZT3 EQU 0F3H ;东西绿南北红==60秒
ZT4_1 EQU 0F5H ;东西黄南北红
ZT4_2 EQU 0F7H ;南北红南北全灭==5秒
STATE EQU 40H ;状态标志单元
MARK BIT 00H ;黄灯闪烁标志位
XS0 EQU 79H ;显示缓冲单元0,对应最右边数码管
XS1 EQU 7AH
XS2 EQU 7BH
XS3 EQU 7CH ;显示缓冲单元4,对应最左边数码管
;4个数码管
;XS4 EQU 7DH
;XS5 EQU 7EH ;显示缓冲单元5,对应最左边数码管
TIME1 EQU 46H ; 秒单元(十六进制)
TIME2 EQU 41H ; 秒单元(十进制BCD码)
;**************************************
ORG 0
LJMP MAIN
ORG 0003H ;外中断0(紧急车辆)处理子程序入口
LJMP JJCL
ORG 000BH ;定时器T0中断入口
LJMP CLOCK
;**************************************
;标号:MAIN。主程序。完成系统初始化,循环调用数码管扫描子程序,拆字子程序,等待定时中断。
;**************************************
ORG 0030H
MAIN: MOV SP,#60H ;调整堆栈指针 MODIFY =70H
MOV PSW ,#00H ;设置工作寄存器为0区
;MOV P2,#0FFH ;高位地址线为0FFH LCALL CSH ;调初始化子程序
LOOP:
LCALL SSEE ;调动态扫描子程序
LCALL PTDS0 ;调拆字子程序
SJMP LOOP
;**************************************
;系统初始化子程序
;**************************************
CSH: ;MOV XS5,#10H ;显示缓冲区全部送“灭”代码序号
;MOV XS4,#10H
MOV XS3,#0AH ;显示缓冲区全部送“灭”代码序号
MOV XS2,#0AH
MOV XS1,#0AH
MOV XS0,#0AH
MOV TIME1 , #0002 ;状态0持续为2s
MOV TIME2 , #0002
;MOV A,#81H ;8255初始化,PA口和PB口为输出口
;MOV DPTR,#0FF23H
;MOVX @DPTR,A
MOV TMOD,#01H ;定时器T0,方式1
MOV TL0,#0B0H ;定时50ms
MOV TH0,#3CH
CLR IT0 ;设置外中断0为电平方式工作
SETB PX0 ;设置外中断0为高级中断
ORL IE,#83H ;开放外中断0和T0中断
MOV STATE,#00H ;进入状态0
MOV P1, #ZT0 ;状态0,四个路口红灯亮
MOV R6, #00H
MOV R5, #00H ;软件计数器初始化
SETB TR0 ;启动T0
RET
;**************************************
;标号CLOCK,T0中断服务程序。根据交通灯状态变化表规定的定时时间依次切换P1口输出状态。
;使用资源:Acc,B,R6,R5,R7,P1
;**************************************
ORG 0100H
CLOCK: MOV TH0,#03CH ;T0重赋初值==50ms
MOV TL0,#0B0H
PUSH PSW ;保护现场
PUSH ACC
SETB RS0 ;切换寄存器工作区
INC R6 ;定时器计数单元加1
LCALL MBXS ;调码表刷新判断子程序
LCALL JTDZT ;调交通灯状态判断子程序
CLR RS0 ;恢复寄存器工作区为0区
POP ACC ;恢复现场
POP PSW
CRETUN: RETI ;中断返回
;**************************************
;标号MBXZ,码表状态刷新判断子程序。
;根据交通灯状态变化表规定的定时时间依次切换P1口输出状态。
;使用资源:Acc,R6,R5,R7,P1
;**************************************
MBXS: PUSH PSW ;保护现场
PUSH ACC
MOV A,R6
LCALL ZMPD ;调整秒到判断子程序
MOV A,TIME1 ;将十六进制秒数值转换为BCD码秒数值
LCALL HBCD
MOV TIME2 , A
DONE: POP ACC ;恢复现场
POP PSW
RET ;子程序返回
;**************************************
;标号ZMPD,整秒到判断子程序。
;设计思路:根据R6软件计数器的值判断。因为T0硬件定时器是定时50ms,R6单元每计数20次,即为1s。根据R6单元能否被20整除,即可判断整秒到否。到整秒,则TIME1计数单元减1,实现倒计时计数。
;**************************************
ZMPD: MOV B , #20
DIV AB ;判断整秒到否? A/B 商存于A,余数存于B
MOV A , B
JNZ RETN ;整秒未到,返回
DEC TIME1 ;整秒到,TIME1单元减1
RETN: RET
;************************************************************* ;标号HBCD,功能:单字节十六进制整数转换为单字节BCD码整数
;入口:(A)=待转换的单字节十六进制整数数
;出口:(A)=转换完成的BCD码整数(十位和个位),(R3)=百位
;影响资源:A、B、PSW、R3 堆栈需求:2字节
;************************************************************* HBCD: SUBB A,#10H
MOV B , #3CH ;MODIFY SOURCE=100
DIV AB
MOV A , B
MOV B , #10
DIV AB
SWAP A
ORL A,B
RET
;**************************************
;标号JTDZT,交通灯状态判断子程序。
;根据交通灯状态变化表规定的定时时间依次切换P1口输出状态。
;使用资源:Acc,R6,R5,R7,P1
;**************************************
JTDZT: MOV A,STATE ;初始赋值00H,0状态
CJNE A,#00H,STATE1 ; 是状态0吗?
CJNE R6,#40,ZHUANYI ;状态0的2s时间到吗?
MOV STATE,#01H ;切换到状态1
MOV P1,#ZT1 ;东西红南北绿
MOV R6,#00 ;计数器清0
LJMP RTN ;中断返回
STATE1:MOV A,STATE
CJNE A,#01H,STATE2_1 ;是状态1吗?
CJNE R6,#100,ZHUANYI ;状态1的60s时间到吗?
MOV R6,#00
INC R5 ;初始R5=00
CJNE R5,#12,ZHUANYI
MOV R5,#00H
MOV STATE,#02H ;切换到状态2_1
MOV P1,#ZT2_1 ;东西红,南北黄
MOV R7,#5 ;黄灯闪烁5次
CLR MARK ;设定状态2黄灯闪烁标志位为0
LJMP RTN
ZHUANYI:LJMP RTN
STATE2_1:MOV A,STATE
CJNE A,#02H,STATE3 ;是状态2吗?不是,转状态3 JB MARK,STATE2_2 ;黄灯标志为1,转状态2_2 CJNE R6,#10,RTN ;黄灯亮0.5s
SETB MARK ;黄灯亮0.5s后,切换到状态2_2
MOV R6,#00H ;计数器清0
LJMP RTN ;中断返回
STATE2_2:MOV P1,#ZT2_2 ; 东西红灯亮
CJNE R6,#10,RTN ;黄灯灭0.5s
CLR MARK ;黄灯灭0.5s后,切换到状态2_1标志 MOV R6,#00H
MOV P1,#ZT2_1 ; 切换到状态2-1
DJNZ R7,STATE2_1 ;黄灯闪烁5遍到否?
;DEC TIME1
;LCALL
SSEE ;;MODIFY
MOV R6,#00H ;计数器清0
MOV STATE,#03H ;切换到状态3
MOV P1,#ZT3 ;东西绿南北红
LJMP RTN ;中断返回
STATE3: MOV A,STATE ;
CJNE A,#03H,STATE4_1 ;是状态3吗?
CJNE R6,#100,RTN ;状态3的60s时间到吗? MOV R6,#00
INC R5
CJNE R5,#12,RTN
MOV R5,#00H
MOV STATE,#04H ;切换到状态4_1
MOV P1,#ZT4_1 ;切换到状态4_1
MOV R7,#5 ;黄灯闪烁5次
CLR MARK ;设定状态4黄灯闪烁标志位为0
LJMP RTN ;中断返回
STATE4_1: MOV A,STATE
CJNE A,#04H,STATE1 ;是状态4吗?不是,转状态1 JB MARK,STATE4_2 ;黄灯标志为1,转状态4_2 CJNE R6,#10,RTN ;黄灯亮0.5s
SETB MARK ;黄灯亮0.5s后,切换到状态4_2
MOV R6,#00H ;计数器清0
LJMP RTN ;中断返回
STATE4_2:MOV P1,#ZT4_2 ;切换到状态4_2
CJNE R6,#10,RTN ;黄灯灭0.5s
CLR MARK ;黄灯灭0.5s,切换到状态4_1标志
MOV R6,#00H
MOV P1,#ZT4_1 ; 切换到状态4-1
DJNZ R7,STATE4_1 ;黄灯闪烁5遍到否?
;DEC TIME1 ;LCALL SSEE ;;;;;;;MODIFY MOV R6,#00H ;计数器清0
MOV STATE,#01H ;切换到状态1 MOV P1,#ZT1 ;东西红南北绿 RTN: RETI
;***********************************************
;标号SSEE,显示缓冲区设置在7CH~79H,对应从左到右的4个数码管。
;数码管段控口采用74LS240反相驱动器,位控口采用7407(或75451)同相驱动器,数码管为共阴极。
;动态扫描子程序运行一次,对4位数码管从左到右共扫描5遍 ;*********************************************** ORG 0D50H
SSEE: SETB RS1 ;换工作区 MOV R5,#05H ;扫描5遍
SSE2: MOV 30H,#0FEH ;MOV 30H,#20H ;设置位控码,从左往右扫描 0010 0000
MOV 31H,#7CH ;MOV 31H,#FEH ;从最高位开始扫描
MOV R7,#04H ;MOV R7,#06H ;扫描6个数码管 SSE1:
;MOV R1,#20H MOV A,30H ;取位控码
;CPL A ;取反 MOV P2,A ;MOVX @R1,A ;输出位控码 MOV R0,31H MOV A,@R0
MOV DPTR,#DDFF MOVC A,@A+DPTR CPL A
;MOV R1,#21H
MOV P0,A ;MOVX @R1,A ;输出段控码 LCALL DELY5MS MOV A,30H
RL A ;位控码右移一位 MOV 30H,A DEC 31H
MOV A,#0FFH ;数码管全灭 MOV P2,A ;MOVX @R1,A
DJNZ R7,SSE1 ;4位数码管扫描完否? DJNZ R5,SSE2 ;5遍扫描完否? CLR RS1 ;恢复工作区
RET
DDFF: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H
;共阴数码管代码表0~9,灭特定提示符
DELY5MS: MOV R2, #5
D5: MOV R3,#248 DJNZ R3,$ DJNZ R2,D5 RET
;************************************************************* ;标号PTDS0,拆字子程序。
;功能: 将TIME2单元的BCD码秒数值拆分为高四位和低四位,分送XS0(XS2)和XS1(XS3)显示缓冲区
;************************************************************* PTDS0: MOV R0,#XS0 ;指向显示缓冲区首址 MOV A,TIME2 ;取要拆分的BCD码 LCALL PTDS
MOV XS2,XS0 ;两个路口显示的时间一样 MOV XS3, XS1 RET
PTDS: MOV R1,A LCALL PTDS1 MOV A,R1 SWAP A
PTDS1: ANL A,#0FH MOV @R0,A INC R0 RET
;***************************************************** ;标号JJCL,外中断模拟紧急车辆通行子程序。 ;四个路口全部红灯,定时器暂停。当紧急车辆通行完毕,即外中断撤除后,四个路口恢复原来的状态。
;***************************************************** JJCL: PUSH ACC ;保护现场 PUSH PSW
PUSH P1 ;保护P1口状态
CLR TR0 ; 停止T0计数器 JJLOOP: MOV P1 , #ZT0 ;四个路口红灯亮 MOV A , #0FFH MOV P2 , A
JNB P3.2 , JJLOOP ;紧急车辆通行完毕否,即外中断撤除否? POP P1 ;恢复路口原来状态 POP PSW ;恢复现场
POP ACC
SETB TR0 ;启动定时器 RETI END
附录3 参考资料
谢辉.《单片机原理及应用》北京:化学工业出版社,2010
李广弟,朱月秀,王秀山编著《单片机基础》北京航空大学出版社2001 蔡美琴《MCS_51单片机系统及应用》北京:高等教育出版社1992 杨居义.《单片机课程设计指导书》..北京:清华大学出版社,2009 张永枫.《单片机应用实训教程》..北京:清华大学出版社,2008
戴仙金.《51单片机及其C语言程序开发实例》..北京:清华大学出版社,2008 姜志红.《51单片机技术与应用系统开发案例精选》.北京:清华大学出版社,2008 张荫等.《单片机应用系统开发综合实例》. 北京:清华大学出版社,2008
何立民《MCS_51系列单片机应用系统设计系统配置与接口技术》北京航空航天大学出版社,1999