资源描述
前 言
在今天,红绿灯安装在各个道口上,已经成为疏导交通车辆最常见和最有
效的手段。但这一技术在19世纪就已出现了。交通信号灯的出现,使交通
得以有效管制,对于疏导交通流量、提高道路通行能力,减少交通事故有
明显效果。通过三个星期的学习,本人对单片机的结构和功能已有了初步
的了解和认识。单片机在交通控制中起到了举足轻重的作用,掌握了单片
机的工作原理也就基本了解了交通灯的运做原理。作为一个学生,为了更
好地掌握单片机的结构和功能,为了进一步加强自己的实践能力,本人设
计了以下的一款交通灯。
目录
前言……………………………………………………3
目录……………………………………………………4
一、毕业设计的要求和内容…………………………5
二.硬件电路说明……………………………………6
三.软件部分说明……………………………………11
四.系统设计及总结……………………………………21
附录一主要材料……………………………………22
附录二 原理图……………………………………23
附录三PCB板型……………………………………24
附录四3D效果图……………………………………25
附录五 流程图……………………………………26
附录六 源程序和注释说明…………………………27
致谢……………………………………………………35
参考文献…………………………………………………35
一、毕业设计的要求和内容
1.1工作要求
本次毕业设计,是针对实际要求,灵活应用所学知识,独立进行系统综合设计的过程,以达到巩固单片机基础知识、掌握单片机系统开发过程和提高动手实践能力的目的。
1.2、技术要求
某十字路口,如下图所示,设计一个十字路口交通灯信号控制器,指挥交通车的通行。要求如下:
1)东西通道和南北通道交替通行,东西通道每次放行时间大于南北通道每次放行时间。
2)绿灯亮表示可以通行,红灯亮表示禁止通行。
3)每次绿灯变红灯时,绿灯先闪转变黄灯(此时另一干道上的红灯不变)。
4)十字路口要有数字显示,作为时间提示,以便人们更直观地把握时间。具体要求东西通道、南北通道通行时间及黄灯亮的时间均以秒为单位作减计数。
二.硬件电路说明
2.1电路设计原理图
见附录
2.2电路工作原理
本设计是以89S51为主控芯片 ,利用P1口控制74LS240(八反相缓冲器,线驱动器)驱动发光二极管模拟交通灯。倒计时显示部分采用串口实现。串口工作在方式0时通过外接移位寄存器74LLS164实现串并转换。需要显示的数据经RXD端输出 经过74LS164串并转换输出到共阳极的LED数码管显示,利用T0定时器进行1S定时。
2.3 89S51 单片机介绍
2.3
关于74LS240
由于单片机的驱动能力太弱 所以给加了 驱动电路 有因为发光二极管驱
动 功率不大所以我选用了八反相缓冲器/8位三态门电路74LS240
无锁存功能
2.4
介绍74LS164
本设计采用164把串行口逐位输出的数据进行串并转换进而控制LED的显示
2.5 单片机最小系统
2.6 改进部位
本设计添加了应急通行 用按钮开关控制东西南北的应急通行信号 其中东西方向接外中断0 南北接外中断1。按一下按钮该方向通行 另外方向停止 按两下恢复原样 。具体看原理图
2.8 框图
状态
持续时间/S
东西方向
南北方向
绿
黄
红
绿
黄
红
1
1
灭
灭
亮
灭
灭
亮
2
30
亮
灭
灭
灭
灭
亮
3
3
亮
亮
灭
灭
灭
亮
4
20
灭
灭
亮
亮
亮
灭
5
3
灭
灭
亮
闪
亮
灭
6
30
亮
灭
灭
灭
灭
亮
循环
三.软件部分说明
3.1.1 利用定时器定时1S
定时/计数器的四种工作方式
工作方式0:定时/计数器的工作方式0称之为13位定时/计数器方式。它由TL的低5位和TH的8位构成13位的计数器,此时TL的高3位不用。
工作方式2:在工作方式2中,只有8位参与计数,而高8位是不参与计数的,用作预置数的存放,这样计数范围就小了,每当计数溢出,就会打开T0的高、低8位之间的开关,预置数就进入低8位。当然这是由硬件自动完成的,不需要我们去操心。通常工作方式2用于波特率发生器,对于这种用途,定时器就是为了提供一个时间基准,计数溢出后不需做任何的事情,要做的
仅仅只有一件,就是重新装入预置数,再开始计数,而且中间不能有任何的延迟,可见这个任务用这种工作方式来完成是最妙不过了。
工作方式3:在这种工作方式下,T0被拆成2个独立的定时/计数器来用。其中,TL0可以构成8位的定时器或计数器工作方式;而TH0则只能作为定时器用,我们知道定时/计数器使用时需要有控制,计满后溢出需要有溢出标记,T0被分成两个来用,那就要两个控制及溢出标记了,从何而来呢?TL0还是用原来的T0的标记,而TH0则借用T1的标记,如此一来T1不是标记、控制可用了吗?是的,在一般情况下,只有在T1以工作方式2运行时,才让T0工作于方式3。
工作方式1:工作方式1是16位的定时/计数器方式,将TMOD的M1M0设为“01”即可,其他特性与工作方式0相同。
3.1.2 定时1S
十字路口交通灯模拟控制器定时器采用工作方式1,先定时125MS,然后在定时中断程序中累加中断次数,8次为一秒,这样就可以起到定时1S的功能。
工作方式由工作方式控制寄存器(TMOD)决定,FR寄存器TMOD用于2个定时器/计数器T1/T0的工作方式设定,各位的含义表示如下:
GATE:门控位,定义T1/T0的启动方式,
C/T-:定时/计数功能选择位。为“0”作定时器用;为“1”,作计数器用。
M1M0:工作方式选择位。
00 方式0 13位计数器
01 方式1 16位计数器
10 方式2 初值自动重装8位计数器
11 方式3 2个8位计数器,仅适用于T0
十字路口交通灯模拟控制器设计采用6M晶振,因此定时125MS,可用下列语句实现。工作方式1是16位计数结构的工作方式,计数器由TH全部8位和TL全部8位构成。
所以初始化定时器T0工作方式1,定时125MS的语句如下:
MOV TMOD,#01
MOV TH0,#3CH
MOV TL0,#0B0H
定时1S在定时器0中断程序中完成,即计数八次为1S。定时器中断初始化
进入定时器0中断
程序如下 :
SETB EA ;开中断
定时是否到1S
SETB ET ; 定时器0允许中断
SETB TR ;开始定时
定时器定时1S的中断流程图
定时时间减1
计数值加1 定时不变
出定时器0中断
3.2外中断程序
对于外中断必须有中断的初始化程序、中断服务程序。
3.2.1 中断的初始化步骤
1) 要使用中断则首先必须中断中断允许。
2) 硬件的初始化:设置引脚连接设置I/O口的输入输出。
3) 软件的初始化:设置中断寄存器,设置中断服务地址,清除中断标志,设置中断触发模式。
4) 使能中断。
外中断是由外部原因引起的中断,有两个中断源,即外中断0和外中断1,中断请求信号由引脚P3.2和P3.3输入。
外中断请求信号弹有两种方式,一是电平方式,二是脉冲方式,可通过有关控制位的定义进行规定。电平方式为低电平有效,只需在单片机的(INT0)和(INT1)中断请示输入端采样到有效的低电平时,就会激活外部中断。脉冲方式则在脉冲的后负跳沿有效,即在相邻两个机器周期对中断请求引入端电平进行采样中,如前一次为高,后一次为低即为有效中断请求。这就要求在这种中断方式,中断请求信号的脉冲宽度必须大于一个机器周期,以保证电平变化能被单片机采样到。
3.2.2 定时器控制寄存器(TCON)
外中断请求方式的控制位在定时控制寄存器TCON中的位(IT0)和(IT1)两个位,当IT0(IT1)=0为电平方式,IT0(IT1)=1为脉冲方式。同时此寄存器中的位89(IE0)和(IE1)为外中断请求标志位,当CPU采样到INT0(INT1)端出现有效中断请求时,此位由硬件 置1。在中断响应完成后转向中断服务时,再由硬件自动清除。
3.2.3 中断允许控制寄存器(IE)
下面本文对有关控制位作说明:EA——中断允许总控制位。EA=0,中断总禁止,禁止所有中断。EA=1,中断总允许,总允许位打开后,各中断的允许或禁止由各中断允许控制位设置决定。
.EX0(EX1)——外部中断允许控制。EX0(EX1)=0,禁止外部中断。EX0(EX1)=1,允许外部中断。
.EX0(ET1)——定时/计数中断允许控制位。ET0(ET1)-0,禁止定时/计数中断。ET0(ET1)=1,允许外部中断。ET0(ET1)=1,允许定时/计数中断。
.ES——串行中断允许控制位。ES=0,禁止串行中断。ES=1,允许串行中断。
中断的允许和禁止就是中断的开放和关闭,中断允许就是开放中断的禁止就是关闭中断。从以上说明我们可看出,MCS-51的中断允许是通过两级控制的,以EA位作为总中断控制位,以各中断挖掘位为分控制位。当总中断位为禁止状态时,不管分控制位是允许或禁止,整个中断都是禁止的。MCS-51单片机复位后,IE=00H,因此中断处于禁止状态。
值得一提的是:单片机中断响应后还会自动关闭中断,因此在转入中断服务程序后,应由软件指令禁止中断。
3.2.4 中断优先级控制寄存器(IP)
MCS-51的中断优先级控制比较简单,只设置了高、低两个级别的有限级,各中断源的优先级别先级别由优先寄存器(IP)进行控制。
.PX0——外中断0(INT0)优先级控制位。
.PI0——定时中断0优先级控制位。
.PX1——外中断1优先级控制位。
.PT1——定时中断1优先级控制位。
.PS——串行中断优先级控制位。
控制位=0,优先级为低。控制位=1,优先级为高。
中断优先级是为了中断嵌在服务的,控制原则为:
1) 低优先级中断不能打断高优先级的中断服务,而高优先级的中断服务可以打断低优先级的中断服务。
2) 同级的中断已经响应,其他中断将被禁止。
3) 如果同级的多个中断源同时出现,CPU将按查询次序确定哪个中断被响应,次序为:外中断0-定时中断0-外中断1-定时中断1-串行中断。
3.2.5中断控制寄存器的状态设置
本例设计要采用定时器中断,外中断0,外中断1。定时器中断、外中断、串口中断控制如下,其中外中断0、1优先级最高,保证了应急通行的需求。
MOV SCON,#00H ; 工作于工作方式0,既移位寄存器状态
SETB ES ;开总中断
SETB ET0 ;开定时器中断
SETB TR0 ;启动T0定时器
SETB IT0 ;外中断0为脉冲触发方式
SETB IT1 ;外中断0为脉冲触发方式
MOV IP,#05 ;外中断0,1为高优先级
SETB EX0 ;开个中断0
SETB EX1 ;开外中断1
外中断程序逻辑流程
进入外中断
标志位是否1
否 是
复位
指标志位,关外中断
开外中断 出外中断
3.3.串口工作方式设计
3.3.1串口工作方式
串口有4种方式:方式0、1、2、3,由串口控制寄存器SCON和PCON控制。
0 0 方式0 同步移位寄存器
0 1 方式1 10位异步收发
1 0 方式2 11位异步收发
2 1 方式3 11位异步收发
1) 方式1:10位异步收发
方式1下,串行口位10位通用异步接口。发送或接收数据信息为10位,包括1位起始位“0”、8位数据、1位停止“1”。
方式1发送:数据从TXD端口输出,当数据写入发送缓冲器SBUF时,启动发送器发送。发送完数据后,置中断标志T1=1,申请中断,通知CPU可以发送下一个数据。
方式1接收:首先使REN=1,串行口从RXD接收数据,当采样到1至0跳变时,确认是起始位“0”,就开始接收数据,当接收完数据时,置中断标志RI=1,申请中断,通知CPU从SBUF取走接收到的数据。
2) 方式2 :11位异步收发方式。发送或接收信息包括1位起始“0”、8位数据库位、1位可编程位、1位停止位“1”。
方式2发送:发送前,先根据通信协议由软件包设置TB8为“奇偶校验位”或“数据标识位”,然后将要发送的数据SBUF,即能启动发送器。发送过程是由执行任何一条以SBUF为目的的寄存器的指令而启动的,把8位数据装入SBUF,同时还把TB8装到发送移位寄存器的第9位上,然后从TXD(P3.1)端口输出数据。
方式2接收:先置REN=1,使串行口为允许接收状态,同时还要将RI清“0”。然后再根据SM2的状态和所接收到的RB8的状态决定此串行口在信息到来后是否置R1=1,并申请中断,通知CPU接收数据。
当SM2=0时,不管RB8为“0”还是为“1”,都置RI=1,此串行接收发送来的信息。
当SM2=1时,且RB8=0,表示在多机通信情况下,接收的信息为“数据帧”,但不是发给本从机的,此时RI不置“1”,因而SBUF中接收的数据帧将丢失。
3) 方式3:11位异步收发。方式3为波特率可变的11位异步通信方式,除了波特率区别之外,其他方式都与方式2相同。
4) 方式0:在方式0下,串行口作同步移位寄存器用,以8位数据为一帧,先发送或接收最低位,每个机器周期发送或接收一位,故其波特率固定为“F/12”。串行数据由RXD(P3.0)端输入或输出,同步移位脉冲由TXD(P3.1)端送出.这种方式常用于扩展I/O口,可以外接74165或者74164.
方式0发送:当1个数据写入发送缓冲器SBUF时,串行口即把8位数据以F/12的波特率从RXD端口送出,发送完后将中断标志TI置“1”。
方式0接收:REN是串行接收允许控制位。REN=0时禁止接收;REN=1时允许接收。当接收到8位数据时,将中断标志RI置“1”。
3.3.2 十字路口交通灯模拟控制器串口设计
本例设计串口若悬河工作于工作方式0,即同步移位寄存器状态
MOV SCON,#00H ;串口工作方式0
传送数据语句如下:
MOV DPTR,#SEGTABI;字形码0~9地址
MOV A,DIS-LB ;低位数据
MOVC A,@A+DPTR ;查表
MOV SBUF ,A ;发送数据
DL1:JNB TI,DLI ;查询是否发送完一个字节
CLR TI
3.3.3关于字形编码
根据各管的接线形式,可分成共阴极型和共阳极型。给LED数码管的七个发光二极管加不同的电平,二极管显示不同亮暗的组合就可以形成不同的字形,这种组合称之为字形码。
显示字型
H
G
F
E
D
C
B
A
共阴极字形码
共阳极字形码
0
0
0
1
1
1
1
1
1
0X3F
0XC0
1
0
0
0
0
0
1
1
0
0X06
0XF9
2
0
1
0
1
1
0
1
1
0X5B
0XA4
3
0
1
0
0
1
1
1
1
OX4F
0XB0
4
0
1
1
0
0
1
1
0
0X66
0X99
5
0
1
1
0
1
1
0
1
0X6D
0X92
6
0
1
1
1
1
1
0
1
0X7D
0X82
7
0
0
0
0
0
1
1
1
0X07
0XF8
8
0
1
1
1
1
1
1
1
0X7F
0X80
9
0
1
1
1
1
1
1
1
0X6F
OX90
四、系统设计及总结
通过这次的课程设计,让我受益匪浅,也让我了解和掌握了一些编程
思想和对I/O口的使用和应用的条件的思考,对单片机的各个管脚功
能的理解和掌握。实现了软件和硬件的有效结合,缺一不可。设计让
我把单片机的理论知识用在实践中,实现了理论和实践相结合,从中
更懂得理论的是实践的基础,实践有能检验理论的正确性,更激发了
我对专业知识的渴求,这些对我以后参加工作或者继续学习都会有很
大的帮助和影响。
一个小小的单片机居然涵盖了 如此之多 输入输出端口不说 还有显
示部分 用到中断 串行口 更使我对单片机的基本原理、单片机应用系统 开发过程,以及在常用编程设计思路技巧的掌握方面都能向前迈了一大步,为
日后成为合格的应用型人才打下良好的基础。
而作为一位学生,在对交通灯的设计中,因知识和经验的不足,只能通过
模仿其它的编程思路,再加上一些自己的思想去完成这个设计,因此在各
个方面都会有一些不足,敬请指正。但我会在以后的学习中逐渐去完善、
巩固我的单片机知识。
附录一
主要材料:印制电路板 1块
晶振6M 1块
普通电阻 3个(由于数码管显示太暗 我才用了360欧姆的)
单片机89S51 1块
按钮3个 ( 我采用了外部中断0 ,1)
电容 3个 (无极性)
发光二极管 6个 (红黄绿各两个)
7805 稳5V的一个
桥堆一个
1000uf和10uf 有极性
插头一个
数码管共阳两个
变压器一个
74LS164两个
74LS240一个
底座一个
附录二
原理图protel文件
附录三 PCB 板型一块
附录四
3D效果图
附录五
主程序流程图
调用第0状态
开 定时器 中断
程序初始化T0 外中断
准备
每个状态大致一样之举了第一状态
红黄绿状态
显示时间
显定时中断时间减一
第一种状态子程序
时间减一到0没有
第二种状态子程序
到 否
返回执行下一状态
第三种状态子程序
第四种状态子程序
循环
附录六
源程序和重要注释说明
注:程序用了伪指令 方便修改时间参数 这个程序比原来的多了 紧急通道
DIS_LB EQU 32H ;时间数据高位
DIS_HB EQU 33H ;时间数据高位
E_PASST EQU 30 ;东西方向绿灯通电时间
N_PASST EQU 20 ;南北方向绿灯通电时间
FLASHT EQU 5 ;黄灯闪烁时间
SECOND_F EQU 20H.0 ;定时1S标志
INT0_F EQU 20H.1 ;外中断0标志位
INT1_F EQU 20H.1 ;外中断1标志位
ORG 0000H
AJMP MAIN
ORG 0003H ;外中断0入口地址
LJMP INT_0 ;调至外中断0服务程序
ORG 000BH ;T0中断入口
AJMP T0_INT ;调至T0服务程序
ORG 0013H ;外中断1入口地址
LJMP INT_0 ;调至外中断1服务程序
ORG 0100H
MAIN:
;初始化程序*********************************
MOV SP,#50H ;定时器T0工作于方式1,定时125MS,开起定时器0中断
MOV TMOD,#01
MOV TH0,#0BH
MOV TL0,#0DCH ;串口工作于工作方式0,即移位寄存器状态
MOV SCON,#00H
SETB EA ;开总中断
SETB ET0 ;开定时器中断
SETB IT0 ;外中断0为脉冲触发方式
SETB IT1 ;外中断0为脉冲触发方式
MOV IP,#05 ;外中断0,1为高优先级
SETB EX0 ;开外中断0
SETB EX1 ;开外中断1
;****************************************************
MOV R2,#0
MOV 20H,#0
;开始所有灯亮以便检测交通灯的好坏,亮一秒
MOV P1,#0FFH
SETB TR0
;开启定时
JNB SECOND_F,$
CLR SECOND_F
;********************************************************
T_LIGHT:MOV R3,#E_PASST
F_STEP:MOV P1,#24H ;东西亮绿灯,南北亮红灯,即P1
MOV A,R3
LCALL H_D ;调用十六-十进制程序
LCALL DIS ;调用显示程序
JNB INT0_F,LP11
AJMP F_STEP
LP11:JNB INT1_F,LP12
AJMP T_STEP
LP12:JNB SECOND_F,$ ;显示上面数据1S
CLR SECOND_F
CJNE R3,#0,F_STEP ;变化显示数据
;****************************
MOV R3,#FLASHT ;东西亮绿灯,南北闪烁黄灯
S_STEP: MOV A,R3
MOV P1,#22H
LCALL H_D
LCALL DIS
JNB INT0_F,LP21
;是否第一次出现外中断0,是转东西亮绿灯,南北亮红灯,
;否则检测外中断1信号是否第一次出现
AJMP F_STEP
LP21:JNB INT1_F,LP22
AJMP T_STEP ;外中断1第一次出现转东西亮红灯,南北亮绿灯
LP22: JNB SECOND_F,$ ;
CLR SECOND_F ;示出现外中断正常显示
CJNE R3,#0,LP1
AJMP T_STEP
LP1: MOV P1,#02H
MOV A,R3
LCALL H_D
LCALL DIS
JNB SECOND_F,$
CLR SECOND_F
CJNE R3,#0,S_STEP
;*********************************
T_STEP:MOV R3,#N_PASST ;南北亮绿灯,东西亮红灯
LP2: MOV P1,#81H
MOV A,R3
LCALL H_D
LCALL DIS
JNB INT0_F,LP31
AJMP F_STEP
LP31:JNB INT1_F,LP32
AJMP T_STEP
LP32:JNB SECOND_F,$
CLR SECOND_F
CJNE R3,#0,LP2
;****************************
MOV R3,#FLASHT ;南北亮绿灯,东西闪烁黄灯
FORTH_STEP:
MOV P1,#41H
MOV A,R3
LCALL H_D
LCALL DIS
JNB INT0_F,LP41
AJMP F_STEP
LP41: JNB INT1_F,LP42
AJMP T_STEP
LP42: JNB SECOND_F,$
CLR SECOND_F
CJNE R3 ,#0,LP3
LJMP T_LIGHT
LP3:MOV P1,#40H
MOV A,R3
LCALL H_D
LCALL DIS
JNB SECOND_F,$
CLR SECOND_F
CJNE R3 ,#0,FORTH_STEP
LJMP T_LIGHT
;***************************
;十六到十式转换
H_D:MOV B,#10
DIV AB
MOV DIS_HB,A
JNZ LP5
MOV A,#10
LP5:MOV A,B
MOV DIS_LB,A
RET
;********************************
;时间显示子程序,显示两位十进制数,发光显示共阳极
DIS:MOV R7,#2
MOV R0,#DIS_LB
DL0:MOV A,@R0
ADD A,#0BH
MOVC A,@A+PC
MOV SBUF,A
DL1: JNB TI,DL1
CLR TI
INC R0
DJNZ R7,DL0
RET
SEGTAB:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
T0_INT:CLR TR0
MOV TH0,#0BH
MOV TL0,#0DCH
SETB TR0
INC R2
CJNE R2,#8,RETURN
MOV R2,#0
SETB SECOND_F
DEC R3
RETI
INT_0:
CLR EX0 ;关外中断
CLR EX1
JNB INT0_F,INT0LP1 ;检测外中断0信号是否第一次,是则置位
CLR INT0_F ;外中断0信号第二次出现,恢复数据,启动定时器0
MOV R3,40H
SETB TR0
SETB EX1 ;开外中断
AJMP INT0LP2
INT0LP1:
CLR TR0 ;外中断0信号第一次出现,关定时器0清1S标志位
CLR SECOND_F
SETB INT0_F ;置位外中断0标志位
MOV 40H,R3 ;保存数据
MOV R3,#99 ; 送99S显示
INT0LP2:SETB EX0 ;开外中断0
RETI
INT_1:
CLR EX1
CLR EX0
JNB INT1_F,INT1LP1
CLR INT1_F
MOV R3,40H
SETB TR0
SETB EX0
AJMP INT1LP2
INT1LP1:
CLR TR0
CLR SECOND_F
SETB INT1_F
MOV 40H,R3
MOV R3,#99
INT1LP2:SETB EX1
RETURN:
RETI
END
致 谢
通过这次的课程设计,让对单片机有了更深一层的了解,也体会
了单片机在现实生活中的重要性。在这次实习中,我能顺利完成
交通灯的设计,要感谢*****学院而我在设计中遇到的很多问题,都
应该感谢****老师在理论和实操方面的帮助,我才能顺利地完成,
也让我学到了很多知识。同时也要对帮助过我的同学表示谢意。在
以后的学习中,定会更加地努力,以更好的成绩去回报学校及老师的栽培。
参考文献
(1)倪志莲.《单片机应用技术》, 北京理工大学出版社
(2) 徐根耀.《电子元器件与电子制作》
展开阅读全文