基于AT89c51单片机实现的交通灯.docx

上传人:b****8 文档编号:23993055 上传时间:2023-05-23 格式:DOCX 页数:39 大小:1.29MB
下载 相关 举报
基于AT89c51单片机实现的交通灯.docx_第1页
第1页 / 共39页
基于AT89c51单片机实现的交通灯.docx_第2页
第2页 / 共39页
基于AT89c51单片机实现的交通灯.docx_第3页
第3页 / 共39页
基于AT89c51单片机实现的交通灯.docx_第4页
第4页 / 共39页
基于AT89c51单片机实现的交通灯.docx_第5页
第5页 / 共39页
点击查看更多>>
下载资源
资源描述

基于AT89c51单片机实现的交通灯.docx

《基于AT89c51单片机实现的交通灯.docx》由会员分享,可在线阅读,更多相关《基于AT89c51单片机实现的交通灯.docx(39页珍藏版)》请在冰豆网上搜索。

基于AT89c51单片机实现的交通灯.docx

基于AT89c51单片机实现的交通灯

科技师大学

通信与电子学院

《单片机应用技术》实训报告

 

实训题目:

模拟交通灯

 

小组成员:

龚石冲罗仁敏曾建伟

班级:

12电子科学与技术

指导老师:

熊朝松

 

1、实训选题容、要求

交通模拟灯

要求:

1、南北方向为主干道,东西方向为支路;主干路绿灯时间为45秒,红灯时间为35秒;

支路绿灯时间30秒,红灯时间为50秒,两个方向的黄灯时间都为4秒;

2、使用定时器实现时间的倒计时;用显示部件显示主干道路的倒计时变化;

3、设计三个外部按钮,分别用以手动控制紧急情况下两个方向同时禁通过;南北方向

长时间通过(不显示时间倒计时变化);东西方向长时间通过;释放按钮后则正常

通行。

2、实训计划和人员安排

经小组人员商定,分工完成任务,在课余时间完成。

若其中遇到什么问题,大家聚在一起讨论解决。

具体分工如下:

1、程序编写:

龚石冲

2、实体焊接:

龚石冲

3、实训报告:

罗仁敏

4、视频及PPT:

曾建伟

 

3、实训选题分析

交通灯由东西南北四向灯,倒计时显示,人行横道通行指示标志等部分组成。

其中东西南北四向灯中的每一向都由红、黄、绿三色灯组成;东西为一组,南北为一组。

黄灯在红绿灯之间转换时亮。

倒计时显示表示红、黄、绿灯亮时所剩时间。

由于人行横道通行指示标志与红灯是同步的,所以在模拟交通灯时省略。

交通会遇到一些突发情况。

因此交通信号灯要设定一些特定功能,以防不时之需。

整个电路由单片机完成,控制部分由软件完成,硬件只负责响应。

4、方案设计

方案一:

主控系统采用AT89C51单片机作为控制器,由定时器1间接控制

通行倒计时及南北和东西的通行。

由按键开关完成禁止通行,东西

通行,南北通行。

方案二:

主控系统采用AT89C51单片机作为控制器,由延时函数完成信号灯

的相互转换,由定时器完成通行倒计时。

由按键开关完成禁止通行,

东西通行,南北通行。

方案比较:

方案二由于信号灯的相互转换与倒计时显示用的是两种独立的方法

完成,要把这两种方法运行的时间达到一致,这大大的增大了程序

的难度,而方案一切采用了同一种方法。

就是程序变得了简单。

用端口少,耗电也最小。

统电源采用独立的+5V稳压电源,有各种

成熟电路可供选用,使此方案可靠稳定。

该设计可直接在I/O口上

接按键开关,精简并优化了电路。

结合实际情况,显示界面采用LED

数码管动态扫描的方法,满足了倒计时的时间显示输出和状态灯提

示信息输出的要求,减少系统的复杂度,既经济又简洁。

所以选择

方案一。

 

5、方案实现

该交通灯有以下几个部分组成:

紧急控制(按键电路)、复位电路、晶振电路、电源电路、单片机、led数码管显示、led信号指示灯。

如图所示:

 

该交通灯控制系统有以上几个部分组成:

紧急控制(按键电路)、单片机。

1各模块电路

1.1主控制系统

主控器采用AT89C51,是美国ATMEL公司生产的一款性能稳定、低功耗的单片机,兼容MCS-51系列产品指令系统及引脚。

片含4KB的可重复编程的Flash程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术生产,使用5(1±20﹪)V的电源电压,128×8位的部RAM,4个8位的双向可位寻址的I/O端口,2个16位定时/计数器,6个中断源,AT89C51单片机可提供许多高性价比的应用,灵活应用于各种控制领域。

单片机的P0口及P2口应用于控制南北及东西方向的通行灯,P1口及P3.0、P3.1、P3.3、P3.4口应用于2组LED计时器的控制,P2.6、P2.7、P1.7分别用于南北方向和东西方向和禁止通行的紧急情况。

 

1.2晶振电路、复位电路

1.3通行灯输出控制

道口交通灯指示采用红、绿、黄发光二极管,南北通行、东西通行各两个。

1.4时间显示电路

红绿灯通行时间采用数码管显示,这是一种很好的方法。

通行剩余时间采用高亮7段LED发光数码管,采用共阳数码管。

由于采用动态扫描的方法进行显示,即逐个循环点亮各位显示器。

虽然这样在任一时刻只有一位显示器被点亮,但由于视觉残留效应,看起来与全部显示器同时点亮效果完全一样。

为了显示LED显示器的动态扫描,不仅要给显示器提供段(字形代码)的输入之外,还要对显示器加位控制,这就是通常所说的段控和位控。

因此多位LED显示器接口电路需要有两个输出口,其中一个用于输出8条段控线(有小数点显示);另一个用于输出位控线,位控线的数目等于显示器的位数。

时间显示驱动电路如图所示。

时间显示驱动电路

 

1.5电源电路

整个系统采用的是+5V电压。

由于实训没有要求,因此可采用自制不可调的3端稳压器件,用LM7805就可以满足系统电源的要求。

LM7805部是由基准电压回路、恒流源、过流保护、过压保护和短路保护回路等8部分组成的三端集成稳压电源,且其低功耗,高效率,纹波系数小,输出电压稳定。

2.1LED显示器简介

通常所说的LED显示器由7个发光二极管组成因此也称之为七段LED显示器,其排列形状如图3.10所示。

此外,显示器中还有一个圆点型发光二极管(在图中以dp表示),用于显示小数点。

通过七个发光二极管亮暗的不同组合,可以显示多种数字、字母以及其他符号。

LED显示器中的发光二极管共有两种连接方法:

(1)共阳极接法

把发光二极管的阳极连在一起构成公共阳极。

使用时公共阳极接+5V。

这样阴极端输入低电平的段发光二极管就导通点亮,而输入高电平的则不点亮。

(2)共阴极接法

把发光二极管的阴极连在一起构成公共阴极。

使用时公共阴极接地,这样阳极端输入高电平的段发光二极管就导通点亮,而输入低电平的则不点亮。

图3.9LED显示器结构图

使用LED显示器时要注意区分这两种不同的接法。

为了显示数字或符号,要为LED显示器提供代码,这些代码是为显示字形的,因此称之为字形代码。

七段发光二极管,再加上一个小数点位,共计八段。

因此提供给LED显示器的字形代码正好一个字节。

各代码位的对应关系如表3.4。

表3.4代码对应关系表

代码位

D7

D6

D5

D4

D3

D2

D1

D0

显示段

dp

g

f

e

d

c

b

A

3.2单片机AT89C51

AT89C51是一种高效微控制器,它是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片含4Kbytes的可反复擦写的Flash只读程序存储器(FPEROM—FlashProgrammableandErasableReadOnlyMemory)和128×8位的随机存取数据存储器(RAM),该器件采用ATMEL公司的高密度、非易失性存储技术生产,它与MCS-51系统产品兼容,AT89C51单片机功能强大,具有8Kb中央处理器(CPU)和4KbFlash程序存储器,性价比高,可应用于很多要求高性价比的场合,灵活地应用于各个控制领域。

3.2.1AT89C51的主要性能

·含4Kb可重编程的FPEROM;

·与MCS-51产品指令系统完全兼容;

·128×8位的部RAM;

·4个8位(32根)双向可位寻址的I/O端口;

·2个16位的计数/定时器;

·全双工方式的串行通道(UART);

·6个中断源;

·5个向量二级中断结构;

·最高时钟振荡频率可达12MHz;

·指令集中64条为单周期指令,支持6种寻址方式,共111条指令;

·低功耗空闲和掉电方式;

·片振荡器和时钟电路。

3.2.2AT89C51的引脚功能

AT89C51为双列直插(DIP)式封装的51单片机芯片,有40条引脚,其引脚示意及功能分类如图3.2所示。

图3.289C51单片机引脚图

 

各引脚功能说明如下:

(1)主电源引脚

Vcc(40脚):

接+5(1±20﹪)V电源正端;

Vss(20脚):

接地。

(2)I/O引脚

P0口(39~32脚):

P0.0~P0.7统称为P0口。

P0口是一组8位漏极开路型双向I/O口,分时复用为低8位地址总线和双向数据总线。

作为输出口用时,每位能吸收电流的方式驱动8个逻辑门电路,对端口P0写“1”时,可作为高阻抗输入端用。

在访问外部数据存储器时,这组端口线分时转换地址(低8位)和数据总线复用,在访问期间激活部上拉电阻。

在FLASH编程时,P0口作为原码输入口,当Flash进行校验时,P0口输出原码,此时P0外部必须被拉高。

P1口(1~8脚):

P1.0~P1.7统称为P1口,可作为准双向I/O口使用。

P1是一个带部上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。

对端口写“1”,通过部的上拉电阻把端口拉到高电平,此时可作输入口。

P1口被外部下拉为低电平时,输出电流,是因为部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流。

在Flash编程和校验时,P1口作为第八位地址接收。

P2口(21~28脚):

P2.0~P2.7统称为P2口,一般作为准双向I/O使用。

P2是一个带部上拉电阻的8位双向I/O口。

P2的输出缓冲器可驱动4个TTL逻辑门电路。

当对P2端口写“1”时,部的上拉电阻把端口拉到高电平,此时可作输入口。

作输入口使用时,由于部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。

在接有片外存储器或扩展I/O口且寻址围超过256B时,P2口用作高8位地址总线。

当给出地址为“1”时,它就利用部上拉优势,当对外部八位地址数据存储器进行读/写时,P2口便输出其特殊功能寄存器的容。

在FLASH编程和校验时,P2口接收高八位地址信号和控制信号。

P3口(10~17脚):

P3.0~P3.7统称为P3口。

P3口是一组带有部上拉电阻的8位双向I/O口。

P3口的输出缓冲器可驱动4个TTL逻辑门电路接收输出电流。

当P3口写“1”时,通过部的上拉电阻上拉为高电平并作为输入口。

此时由于外部下拉为低电平,P3口将输出电流(IIL)。

除作为准双向I/O口使用外,还可以将每一位用于第二功能,而且P3口的每一条引脚均可独立定义为第一功能的输入输出或第二功能。

P3口第二功能祥见表3.1:

 

表3.1P3口第二功能表

口线

第二功能

信号名称

P3.0

RXD

串行数据接受

P3.1

TXD

串行数据发送

P3.2

——————INT0

外中断0申请

P3.3

——————INT1

外中断1申请

P3.4

T0

定时器/计数器0计数输入

P3.5

T1

定时器/计数器1计数输入

P3.6

————WR

外部数据存储器写选通

P3.7

————RD

外部数据存储器读选通

 

(3)外接晶体引脚

XTAL1(19脚):

它在单片机部是一个反向放大器的输入端,构成了片振荡器。

当采用外部时钟时,HMOS单片机的该引脚应接地;CHMOS单片机的该引脚作为外部振荡信号的输入端。

XTAL2(18脚):

它在单片机部是片振荡器的反向放大器的输出端。

当采用外部时钟时,HMOS单片机的该引脚作为外部振荡信号的输入端;CHMOS单片机的该引脚应悬空不接。

 

(4)控制线

ALE/——————PROG(30脚):

地址锁存允许/编程信号。

在访问片外程序存储器期间,此信号可用于控制锁存P0输出地址总线的低8位,ALE以每机器周期两次进行信号输出;在FLASH编程期间,此引脚用作编程脉冲——————PROG的输入端。

在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率fosc的1/6,可作为对外输出的时钟脉冲或用于定时目的。

但要注意的是:

在访问片外数据存储器期间,ALE脉冲会跳空一个。

若想禁止ALE的输出可在SFR8EH地址上置0。

此时,ALE执行MOVX,MOVC指令使ALE起作用。

另外,该引脚将被略微拉高。

如果微处理器在外部执行状态ALE禁止,置位无效。

——————PSEN(29脚):

片外程序存储器读选通信号输出端,低电平有效。

在由外部程序存储器读取指令或常数期间,每个机器周期——————PSEN两次有效,P0口读回指令或常数。

当访问部程序存储器时,——————PSEN信号不跳变。

RST/VPD(9脚):

RST即RESET,VPD为备用电源,该引脚为单片机的上电复位或掉电保护端。

当单片机振荡器工作时,该引脚上出现持续两个机器周期的高电平,就可实现复位操作,使单片机回复到初始状态。

上电时,考虑到振荡器有一定的起振时间,该引脚上高电平必须持续10ms以上才能保证有效复位。

当VCC发生故障,降低到低电平规定值或掉电时,该引脚可接上备用电源VPD(+5V)为部RAM供电,以保证RAM中的数据不丢失。

————EA/VPP(30脚):

————EA为片外程序存储器选用端,访问部程序存储器控制信号。

当————EA端接高电平时,CPU访问部程序存储器。

当————EA接低电平时,则在此期间外部程序存储器(0000H-FFFFH),则强调CPU访问外部存储器,而不管程序计数器的容是多少。

此外,该引脚还用做EPROM编程电压的输入端。

在编程期间,此引脚用作21V编程电源VPP的输入端。

 

3.2.3

AT89C51的部结构

89C51单片机部组成结构中包含运算器和控制器(CPU)、片存储器、4个并行I/O接、串行口、定时/计数器、中断系统、振荡器等功能部件[10]。

其部结构框图如图3.3所示。

图中PC是程序计数器;PSW是程序状态字寄存器;DPTR是数据指针寄存器。

图3.3AT89C51单片机部结构框图

 

·运算器和控制器

89C51的运算器和控制器功能类似于一般微机中的微处理器(CPU),是单片机的核心部件,它决定了单片机的主要功能特性。

它完成逻辑算术运算并协调单片机其它各部分的工作。

各种算术、逻辑运算所涉及到的寄存器包括:

累加器ACC、寄存器B、暂存器1(TEMP1)和暂存器2(TEMP2)、程序状态字寄存器PSW,程序计数器PC,堆栈指针SP,数据指针寄存器DPTR等。

它们位于CPU部,又称CPU专用寄存器,以区别于I/O接口专用寄存器。

 

·存储器

MCS-51系列单片机存储器组成是所谓的哈佛结构,存储器的组织方式与通用单片机系统不同,包含程序存储器与数据存储器,其地址空间是相互独立的,而不是程序存储器与数据存储器统一编址。

在89C51单片机中,程序存储器采用EEPROM,而数据存储器采用RAM。

它们又可以进一步分成部或外部两类。

①程序存储器程序存储器部和外部是统一连续编址的,部占用地址空间的低4KB,地址0000H~0FFFH,外部地址围1000H~FFFFH,共60KB。

程序存储器主要用来存放程序和常数。

当程序计数器PC由部ROM开始执行到外部ROM时,会自动寻址外接程序存储器。

程序地址空间原则上可由用户任意安排,但复位和中断源的程序入口地址在51系列单片机中是固定的,用户不能改变。

入口地址见表3.2。

复位后,CPU从0000H地址开始执行程序。

其他地址为中断服务程序入口地址,响应某个中断时,将自动从其对应的入口地址执行中断服务程序。

表3.251单片机复位、中断入口地址

操作

入口地址

复位

0000H

外部中断0

0003H

定时器/计数器0溢出

000BH

外部中断1

0013H

定时器/计数器1溢出

001BH

串行口中断

0023H

定时器/计数器2溢出或T2EX端负跳变(52子系列)

002BH

②数据存储器MCS-51系列单片机数据存储器也有部、外部之分。

但与程序存储器不同,片、片外存储器是分别独立编址的,片数据存储器除RAM块外,还有特殊功能寄存器(SFR)块,其中片数据存储器有128个字节,其编制为00H~FFH;特殊功能寄存器也占128个字节,其编制为80H~FFH;二者连续而不重叠。

外部RAM地址围0000H~FFFFH,共64KB。

部存储器可直接寻址。

尽管片、片外地址空间的低256B有重叠,但寻址并不会造成混乱。

这是因为片、片外存储器使用不同的指令(MOV和MOVX)。

扩展的I/O地址也占用数据存储器空间。

对I/O端口操作无须特殊指令且访问程序存储器是用——————PESN信号选通,而访问片外数据存储器时,由————RD信号(读)和————WR信号(写)选通。

 

③寄存器区部数据存储器分为4个区域,数据RAM用于存放临时变量,下面介绍其他三个寄存器区:

a)工作寄存器区它占用地址00~FFH的32个存单元,又分成4个区。

每个区有R0~R7共8个工作寄存器。

工作寄存器区的选择又由程序状态寄存器PSW的第4位和第3位(RS1和RS0)共同指定。

单片机复位时,RS1和RS0为零,故指向0区。

通过位操作改变RS1和RS0的值,可以方便地指向任一个区间。

b)位寻址区每位都有一个独立的8位地址(占据空间00~7F),共128位。

此外,在专用寄存器SFR中还有一部分是可以位寻址的(有些位可能无定义)。

c)专用寄存器区共有21个专用寄存器SFR,位于80~FFH地址空间。

这些寄存器又可以分为CPU专用寄存器和接口专用寄存器。

CPU专用寄存器前面己经提过,而接口专用寄存器包括两部分。

一部分就是单片机的I/O端口P0~P3,分别编址为80H、90H、A0H、B0H,共4个单元,32位,每一位都可以独立寻址。

另一部分为定时/计数器,串行口、中断的一些控制寄存器。

 

·定时/计数器

89C51有两个16位定时/计数器(T0,T1)。

在定时功能中,每个机器周期定时器加1,由于l个机器周期包含12个振荡周期,因而它的计数频率为1/12,即由定时器计数到的脉冲为振荡周期频率的1/12。

在计数器功能中,在外部事件相应输入脚(T0或T1)产生负跳变时,计数器加1。

由于计数器的计数过程需要2个机器周期(24个振荡周期),所以,最高的计数频率为振荡频率的1/24。

这两个定时/计数器的工作状态(定时/计数)及工作方式(方式0~方式3)的选择是由定时/计数器方式寄存器(TMOD)中的每位值所决定的。

定时/计数器的控制由控制寄存器(TCON)完成。

 

·I/O口

89C51不仅有4个8位并行口,供单片机和外部RAM、EEPROM等扩展连接用或与其它设备交换信息用,它还有一个全双工串行口,能同时发送和接收数据。

在前面的引脚功能中已对并行口作了简要介绍,在此就主要介绍一下串行口。

串行口也就是P3.0和P3.1的第二功能。

它既能工作在异步方式,又能工作在同步方式。

该串行口是全双工的,它在物理上分为两个独立的发送缓冲器和接收缓冲器SBUF,但它们占用一个特殊功能寄存器的地址99H,只需对SBUF进行写或读的操作,就可以同时发送和接收了。

串行口的工作方式选择、波特率选择、串行通信协议的完成,由两个特殊功能寄存器,即串行口控制寄存器SCON和功耗控制寄存器PCON完成。

 

·中断

89C51单片机提供了6个中断源,而每一个中断源都能被程控为高优先级或低优先级。

其中5个中断源包括2个外部中断和3个部中断。

两个外部中断源为

INT0和INT1,外部设备的中断请求信号、掉电等故障信号都可以从INT0而和INT1引脚输入,向CPU提出中断申请,INT0和INT1的中断请求标志IE0、IE1分别设在TCON寄存器的TCON.1、TCON.3。

3个部中断源为T0、Tl溢出中断源及片串行发送或接收中断源,T0、Tl中断请求标志TF0和TF1分别设在TCON寄存器的TCON.5、TCON.7,串行发送或接收中断标志TI或RI设在SCON寄存器的第SCON.0、SCON.1。

5个中断源中的一个、几个或全部中断源的开、关由中断允许寄存器(IE)完成,而每个中断源的优先级别的高低由中断优先级控制寄存器(IP)完成。

89C51单片机中断源简要特性见表3.3。

 

表3.3中断源特性表

名称

符号

标志符号

标志符号位置

矢量地址

优先级别

外部中断

INT0

IE0

TCON.1

0003H

最高

最低

定时器0溢出中断

TF0

TF0

TCON.5

000BH

外部中断1

INT1

IE1

TCON.3

0013H

定时器1溢出中断

TF1

TF1

TCON.7

001BH

串行口中断

R1+T1

R1

SCON.0

0023H

T1

SCON.1

 

六、仿真电路图

 

7、程序设计过程

交通道口交通灯控制系统的控制程序主要包括以下几个部分:

主程序、、显示程序、定时中断程序、等。

 

4.1.1主程序

主程序主要是负责总体程序的管理功能,实现人与机的交互设定。

因为设计采用动态扫描方式显示时间,所以主程序大部分时间要调用扫描显示程序。

主程序流程图如图4.1所示。

 

 

 

 

主程序流程图

 

程序如下:

#include

#defineucharunsignedchar

#defineuintunsignedint

//调用函数的声明

voiddisplay(uintshi1,uintge1,uintshi2,uintge2);//数码管显示函数的声明

voiddelay(uintz);//延时函数的声明

voidState1();

voidState2();

voidState3();

voidState4();

voidState5();

voidState6();

voidState7();

voidState8();

voidNanBei();

voidDongXi();

voidStop();

//定义管脚

sbitARED_NB=P0^5;

sbitBRED_NB=P2^2;

sbitAYELLOW_NB=P0^4;

sbitBYELLOW_NB=P2^1;

sbitAGREEN_NB=P0^3;

sbitBGREEN_NB=P2^0;

sbitARED_DX=P2^5;

sbitBRED_DX=P0^2;

sbitAYELLOW_DX=P2^4;

sbitBYELLOW_DX=P0^1;

sbitAGREEN_DX=P2^3;

sbitBGREEN_DX=P0^0;

sbitDXweixuan1=P3^3;//东西方向数码管位选1

sbitDXweixuan2=P3^4;//东西方向数码管位选2

sbitNBweixuan1=P3^1;//南北方向数码管位选1

sbitNBweixuan2=P3^0;//南北方向数码管位选2

sbitKey1=P2^7;

sbitKey2=P2^6;

sbitKey3=P1^7;

//定义全局变量

ucharflag1=0,flag2=1;

uintshi1,ge1,shi2,ge2,aa;

uintcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//主函数

voidmain()

{

//初始化管脚

P0=0xFF;

P1=0Xff;

P2=0xFF;

P3=0xFF;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1