十字交通灯报告.docx
《十字交通灯报告.docx》由会员分享,可在线阅读,更多相关《十字交通灯报告.docx(41页珍藏版)》请在冰豆网上搜索。
十字交通灯报告
单片机原理及其应用
课程设计实训报告
姓名:
胡丽娜
学号:
091102010112
班级:
09电信统本01班
指导老师:
董昌孝
实训时间:
2011年12月31日
摘要与概述:
随着微控技术的日益完善和发展,单片机的应用不断走向深入。
它的应用必定导致传统的的控制技术从根本上发生变革。
它在工业控制,数据采集,智能仪表,,机电一体化,家用电器等领域得到广泛的应用,极大的提高了这些领域的技术水平和自动化控制。
同时,伴随着我国经济的告诉发展,私家车,公交车的增加,无疑会给我国的道路交通系统带来沉重的压力,很多大城市都不同程度地受到交通堵塞问题的干扰。
下面以AT89C51单片机为核心,设计出以人性化,智能化为目的的交通灯控制系统。
本项目主要从单片机应用上来实现十字路口交通灯智能化管理,用来控制过往车辆的正常化运作。
本系统采用单片机、键盘、LED显示、交通灯演示系统组成。
设计一个用于十字路口的车辆及行人的交通管理,系统包括左拐、右拐、及行基本的交通灯的功能,计时牌显示路口通行转换剩余时间,在出现紧急情况时可由交通手动实现全路口车辆禁行而行人通行状态。
另外,在特种车辆如119、120通过路口时,系统可自动转为特种车辆放行,其他车辆禁止通行的状态,15s后系统自动恢复正常管理。
其他还有84s与60s通行管理转换等功能。
采用数码管与点阵LED相结合的显示方法,既要求倒计时数字输出,又要求有状态灯输出等。
关键字:
单片机系统(AT89C51)、8255控制、交通规则、LED显示、动态扫描、按键输入、分时段调整
参考文献:
[1]《单片机课程设计指导》北京航天航空大学出版社
[2]《基于MCS-51系列的单片机原理的应用设计》国防工业出版社
[3]《单片机实训教程》北京大学出版社
[4]《单片机系统原理及应用》
[5]《微机原理及应用》
基于AT89C51单片机的
交通灯控制系统设计
实训准备资料
AT89C51简介
·主要特性
AT89C51是一种带4K字节存储器ProgrammableandErasableReadOnlyMemory)的低电压、高性能CMOS8位微处理器,俗称单片机89C2051是一种带2K字节闪存可编程可擦除只读存储器单片机的可擦除只读存储器可以反复擦除1000次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器。
AT89C单片机为很多嵌入式控制系统供了一种灵活性高且价廉的方案。
AT89C51管脚图:
·管脚说明
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P0口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:
口管脚备选功能
P3.0RXD(串行输入口)
P3.1TXD(串行输出口)
P3.2/INT0外部中断0)
P3.3/INT1(外部中断1)
P3.4T0(记时器0外部输入)
P3.5T1(记时器1外部输入)
P3.6/WR(外部数据存储器写选通)
P3.7/RD(外部数据存储器读选通)
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V
编程电源(VPP)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
XTAL1和XTAL2分别为反向放大器的输入和输出。
该反向放大器可以配置为片内振荡器。
石晶振荡和陶瓷振荡均可采用。
如采用外部时钟源驱动器件,XTAL2应不接。
有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。
·芯片擦除
整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并仍在工作。
在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用保持ALE管脚处于低电平10ms来完成。
在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。
此外,AT89C51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。
在闲置模式下,CPU停止工作。
但RAM,定时器,计数器,串口和中断系统其他芯片功能,直到下一个硬件复位为止。
·串口通讯
单片机的结构和特殊寄存器,这是编写软件的关键。
至于串口通信需要用到那些特殊功能寄存器呢,它们是SCON,TCON,TMOD,SCON等,各代表什么含义呢?
SBUF数据缓冲寄存器这是一个可以直接寻址的串行口专用寄存器。
有朋友这样问起过“为何在串行口收发中,都只是使用到同一个寄存器SBUF?
而不是收发各用一个寄存器。
”实际上SBUF包含了两个独立的寄存器,一个是发送寄存,另一个是接收寄存器,但它们都共同使用同一个寻址地址-99H。
CPU在读SBUF时会指到接收寄存器,在写时会指到发送寄存器,而且接收寄存器是双缓冲寄存器,这样可以避免接收中断没有及时的被响应,数据没有被取走,下一帧数据已到来,而造成的数据重叠问题。
发送器则不需要用到双缓冲,一般情况下我们在写发送程序时也不必用到发送中断去外理发送数据。
操作SBUF寄存器的方法则很简单,只要把这个99H地址用关键字sfr定义为一个变量就可以对其进行读写操作了,如sfrSBUF=0x99;当然你也可以用其它的名称。
通常在标准的reg51.h或at89x51.h等头文件中已对其做了定义,只要用#include引用就可以了。
SCON串行口控制寄存器通常在芯片或设备中为了监视或控制接口状态,都会引用到接口控制寄存器。
SCON就是51芯片的串行口控制寄存器。
它的寻址地址是98H,是一个可以位寻址的寄存器,作用就是监视和控制51芯片串行口的工作状态。
51芯片的串口可以工作在几个不同的工作模式下,其工作模式的设置就是使用SCON寄存器。
它的各个位的具体定义如下:
SM0SM1SM2RENTB8RB8TIRI
SM0、SM1为串行口工作模式设置位,这样两位可以对应进行四种模式的设置。
串行口工作模式设置。
SM0SM1模式功能波特率
000同步移位寄存器fosc/12
0118位UART可变
1029位UARTfosc/32或fosc/64
1139位UART可变
在这里只说明最常用的模式1,其它的模式也就一一略过,有兴趣的朋友可以找相关的硬件资料查看。
表中的fosc代表振荡器的频率,也就是晶振的频率。
UART为(UniversalAsynchronousReceiver)的英文缩写。
SM2在模式2、模式3中为多处理机通信使能位。
在模式0中要求该位为0。
REM为允许接收位,REM置1时串口允许接收,置0时禁止接收。
REM是由软件置位或清零。
如果在一个电路中接收和发送引脚P3.0,P3.1都和上位机相连,在软件上有串口中断处理程序,当要求在处理某个子程序时不允许串口被上位机来的控制字符产生中断,那么可以在这个子程序的开始处加入REM=0来禁止接收,在子程序结束处加入REM=1再次打开串口接收。
大家也可以用上面的实际源码加入REM=0来进行实验。
TB8发送数据位8,在模式2和3是要发送的第9位。
该位可以用软件根据需要置位或清除,通常这位在通信协议中做奇偶位,在多处理机通信中这一位则用于表示是地址帧还是数据帧。
RB8接收数据位8,在模式2和3是已接收数据的第9位。
该位可能是奇偶位,地址/数据标识位。
在模式0中,RB8为保留位没有被使用。
在模式1中,当SM2=0,RB8是已接收数据的停止位。
TI发送中断标识位。
在模式0,发送完第8位数据时,由硬件置位。
其它模式中则是在发送停止位之初,由硬件置位。
TI置位后,申请中断,CPU响应中断后,发送下一帧数据。
在任何模式下,TI都必须由软件来清除,也就是说在数据写入到SBUF后,硬件发送数据,中断响应(如中断打开),这时TI=1,表明发送已完成,TI不会由硬件清除,所以这时必须用软件对其清零。
RI接收中断标识位。
在模式0,接收第8位结束时,由硬件置位。
其它模式中则是在接收停止位的半中间,由硬件置位。
RI=1,申请中断,要求CPU取走数据。
但在模式1中,SM2=1时,当未收到有效的停止位,则不会对RI置位。
同样RI也必须要靠软件清除。
常用的串口模式1是传输10个位的,1位起始位为0,8位数据位,低位在先,1位停止位为1。
它的波特率是可变的,其速率是取决于定时器1或定时器2的定时值(溢出速率)。
AT89C51和AT89C2051等51系列芯片只有两个定时器,定时器0和定时器1,而定时器2是89C52系列芯片才有的。
波特率在使用串口做通讯时,一个很重要的参数就是波特率,只有上下位机的波特率一样时才可以进行正常通讯。
波特率是指串行端口每秒内可以传输的波特位数。
有一些初学的朋友认为波特率是指每秒传输的字节数,如标准9600会被误认为每秒种可以传送9600个字节,而实际上它是指每秒可以传送9600个二进位,而一个字节要8个二进位,如用串口模式1来传输那么加上起始位和停止位,每个数据字节就要占用10个二进位,9600波特率用模式1传输时,每秒传输的字节数是9600÷10=960字节。
51芯片的串口工作模式0的波特率是固定的,为fosc/12,以一个12M的晶振来计算,那么它的波特率可以达到1M。
模式2的波特率是固定在fosc/64或fosc/32,具体用那一种就取决于PCON寄存器中的SMOD位,如SMOD为0,波特率为focs/64,SMOD为1,波特率为focs/32。
模式1和模式3的波特率是可变的,取决于定时器1或2(52芯片)的溢出速率。
可以用以下的公式去计算这两个模式的波特率设置时相关的寄存器的值:
波特率=(2SMOD÷32)×定时器1溢出速率
上式中如设置了PCON寄存器中的SMOD位为1时就可以把波特率提升2倍。
通常会使用定时器1工作在定时器工作模式2下,这时定时值中的TL1做为计数,TH1做为自动重装值,这个定时模式下,定时器溢出后,TH1的值会自动装载到TL1,再次开始计数,这样可以不用软件去干预,使得定时更准确。
在这个定时模式2下定时器1溢出速率的计算公式如下:
溢出速率=(计数速率)/(256-TH1)
上式中的“计数速率”与所使用的晶体振荡器频率有关,在51芯片中定时器启动后会在每一个机器周期使定时寄存器TH的值增加一,一个机器周期等于十二个振荡周期,所以可以得知51芯片的计数速率为晶体振荡器频率的1/12,一个12M的晶振用在51芯片上,那么51的计数速率就为1M。
通常用11.0592M晶体是为了得到标准的无误差的波特率,那么为何呢?
计算一下就知道了。
如我们要得到9600的波特率,晶振为11.0592M和12M,定时器1为模式2,SMOD设为1,分别看看那所要求的TH1为何值。
代入公式:
11.0592M
9600=(2÷32)×((11.0592M/12)/(256-TH1))
TH1=250
12M
9600=(2÷32)×((12M/12)/(256-TH1))
TH1≈249.49
上面的计算可以看出使用12M晶体的时候计算出来的TH1不为整数,而TH1的值只能取整数,这样它就会有一定的误差存在不能产生精确的9600波特率。
当然一定的误差是可以在使用中被接受的,就算使用11.0592M的晶体振荡器也会因晶体本身所存在的误差使波特率产生误差,但晶体本身的误差对波特率的影响是十分之小的,可以忽略不计。
8155芯片相关知识
8155管脚图
8155管脚作用
ST:
复位信号输入端,高电平有效。
复位后,3个I/O口均为输入方式。
AD0~AD7:
三态的地址/数据总线。
与单片机的低8位地址/数据总线(P0口)相连。
单片机与8155之间的地址、数据、命令与状态信息都是通过这个总线口传送的。
RD:
读选通信号,控制对8155的读操作,低电平有效。
WR:
写选通信号,控制对8155的写操作,低电平有效。
CE:
片选信号线,低电平有效。
IO/M:
8155的RAM存储器或I/O口选择线。
当IO/=0时,则选择8155的片内RAM,AD0~AD7上地址为8155中RAM单元的地址(00H~FFH);当IO/=1时,选择8155的I/O口,AD0~AD7上的地址为8155I/O口的地址。
ALE:
地址锁存信号。
8155内部设有地址锁存器,在ALE的下降沿将单片机P0口输出的低8位地址信息及,IO/的状态都锁存到8155内部锁存器。
因此,P0口输出的低8位地址信号不需外接锁存器。
PA0~PA7:
8位通用I/O口,其输入、输出的流向可由程序控制。
PB0~PB7:
8位通用I/O口,功能同A口。
PC0~PC5:
有两个作用,既可作为通用的I/O口,也可作为PA口和PB口的控制信号线,这些可通过程序控制。
TIMERIN:
定时/计数器脉冲输入端。
TIMEROUT:
定时/计数器输出端。
VCC:
+5V电源。
8155的地址编码及工作方式
在单片机应用系统中,8155是按外部数据存储器统一编址的,为16位地址,其高8位由片选线CE提供,CE=0,选中该片。
当CE=0,IO/M=0时,选中8155片内RAM,这时8155只能作片外RAM使用,其RAM的低8位编址为00H~FFH;当CE=0,IO/M=1时,选中8155的I/O口,其端口地址的低8位由AD7~AD0确定,如表所示。
这时,A、B、C口的口地址低8位分别为01H、02H、03H(设地址无关位为0)。
8155芯片的I/O口地址
AD7~AD0
选择I/O口
A7
A6
A5
A4
A3
A2
A1
A0
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
×
0
0
0
0
1
1
0
0
1
1
0
0
0
1
0
1
0
1
命令/状态寄存器
A口
B口
C口
定时器低8位
定时器高6位及方式
8155的A口、B口可工作于基本I/O方式或选通I/O方式。
C口可工作于基本I/O方式,也可作为A口、B口在选通工作方式时的状态控制信号线。
当C口作为状态控制信号时,其每位线的作用如下:
PC0:
AINTR(A口中断请求线)
PC1:
ABF(A口缓冲器满信号)
PC2:
ASTB(A口选通信号)
PC3:
BINTR(B口中断请求线)
PC4:
BBF(B口缓冲器满信号)
PC5:
BSTB(B口选通信号)
8155的I/O工作方式选择是通过对8155内部命令寄存器设定控制字实现的。
命令寄存器只能写入,不能读出,命令寄存器的格式如下图所示:
8155命令寄存器格式
8155内还有一个状态寄存器,用于锁存输入/输出口和定时/计数器的当前状态,供CPU查询用。
状态寄存器的端口地址与命令寄存器相同,低8位也是00H,状态寄存器的内容只能读出不能写入。
所以可以认为8155的I/O口地址00H是命令/状态寄存器,对其写入时作为命令寄存器;而对其读出时,则作为状态寄存器。
状态寄存器的格式如图6-17所示。
图6-178155状态寄存器格式
8155的定时/计数器
8155内部的定时/计数器实际上是一个14位的减法计数器,它对TIMERIN端输入脉冲进行减1计数,当计数结束(即减1计数“回0”)时,由TIMEROUT端输出方波或脉冲。
当TIMERIN接外部脉冲时,为计数方式;接系统时钟时,可作为定时方式。
定时/计数器由两个8位寄存器构成,其中的低14位组成计数器,剩下的两个高位(M2,M1)用于定义输出方式。
其格式如下:
基于AT89C51交通灯的设计
项目要求
用AT89C51单片机控制一个交通灯系统,晶振采用12MHz。
设A车道与B车道交叉组成十字路口,A车道主干道,B车道支道。
设计要求如下:
(1)用发光二极管模拟交通型号灯;
(2)正常情况下,A,B两车道轮流放行,A车道放行50S,另有5S用于警告;东西南北车道放行30S,另有5S用于警告;
(3)在交通繁忙时,交通信号灯控制系统应有手空开关,可人为地改变信号灯的状态,以缓解交通拥挤状况。
在B车道放行期间,若A车道有车而B车道无车,按下模拟开关K1使A车道放行期间,若B车道有车而A车道无车,按下模拟开关K2使B车道放行15S。
(4)有紧急车辆通过时,按下开关K3使啊,A,B车道均为红灯,禁止通行20S。
系统设计
交通灯控制主要控制A,B两车道的交通,以AT89C51单片机为核心芯片,通过控制三色LED灯的亮灭来控制各车道的通行;另外通过3个按键来模拟个车道有无车辆的情况和紧急车辆的情况。
根据设计要求,制定总体设计思想如下:
(1)正常情况下运行主程序,采用0.5S延时子程序的反复调用来实现各种定时时间。
(2)一个车道有车而另一个车道无车时,采用外部中断1执行中断服务程序,并设置该中断为低优先级中断。
(3)有紧急车辆通过时,采用外部中断0执行中断服务程序,并设置该中断为高优先级中断,实现二级中断嵌套。
硬件设计
系统框图
基于AT89C51单片机的交通信号控制系统由电源电路、单片机主控电路、按键控制电路和道路显示电路几部分组成,框图如图所示:
电路原理
用12只发光二极管模拟交通信号灯,以AT89C51单片机的PO控制这12只发光二极管,由于单片机带负载的能力有限,因此,在PO口与发光二极管之间用74LS07作驱动电路,PO口输出低电平时,信号灯亮;输出高电平时,信号灯灭。
在正常情况和交通繁忙时,A,B两车道的6只信号灯的控制状态有5种形态,即PO口控制功能及相应控制码如表所示。
分别以按键K1,K2模拟A,B车道的车辆检测信号,开关K1按下时,A车道放行;开关K2按下时,B车道放行;开关K1,K2的控制信号经异或取反后,产生中断请求信号(低电平有效),通过外部中断1向CPU发出中断请求;因此产生外部中断1中断的条件应是:
INT1=K1⊕,可用集成块74LS266(如无74LS266,可用74LS86与74LS04组合代替)来实现。
采用中断加查询扩展法,可以判断出要求放行的是A车道(按下开关K1)还是B车道(按下开关K2)。
以按键K3模拟紧急车辆通过开关,当K3为高电平时属于正常情况,当K3为低电平时,属紧急车辆通过的情况,直接将K0信号接至INTO(p3.2)脚即可实现中断0中断。
交通信号与控制状态对应关系
控制状态
P0口
控制码
P0.7
P0.6
P0.5
P0.4
P0.3
P0.2
P0.1
P0.0
未用
未用
B道
绿灯
B道
黄灯
B道
红灯
A道
绿灯
A道
黄灯
A道
红灯
A道放行,B道禁止
F3H
1
1
1
1
0
0
1
1
A道警告,B道禁止
F5H
1
1
1
1
0
1
0
1
A道禁止,B道放行
DEH
1
1
0
1
1
1
1
0
A道禁止,B道警告
EEH
1
1
1
0
1
1
1
0
A道禁止,B道禁止
F6H
1
1
1
1
0
1
1
0
元件名称
规格
数量
用途
价格
供应商
1
51单片机
AAT89C51
1个
控制核心
9元
北京九州微星公司
2
晶振
12MHz立
式
1个
晶振电路
0.98元
上海红羿机械电子有限公司
3
集成电路
74LS86
1个
按键电路
0.1元
深圳市福田区华强商行
74LS04
1个
按键电路
2元
深圳市高科电子商行
74LS07
1个
LED驱动
2.5元
青岛凯得利电子有限公司
4
按键
4个
按键电路
0.5元/个
5
电解电容
22uf/10V
1个
复位电路
1元
雅达康电子科技有限公司
6
瓷片电容
30pf瓷片电容
2个
晶振电路
0.1元/个
东莞市朗汛电子有限公司
7
电阻
1Ω
4个
复位电路
0.04元/个
浙江盛博电子有限公司
电阻
300Ω
12个
LED限流
0.04元/个
8
LED
红,黄,绿各4个
12个
红,黄,绿灯
0.2元./个
殴时电子元件上海有限公司
9
电源
5V/0.5A
1个
提供+5V
1个