第四章基于单片机控制的流水灯.docx
- 文档编号:10272337
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:38
- 大小:357.31KB
第四章基于单片机控制的流水灯.docx
《第四章基于单片机控制的流水灯.docx》由会员分享,可在线阅读,更多相关《第四章基于单片机控制的流水灯.docx(38页珍藏版)》请在冰豆网上搜索。
第四章基于单片机控制的流水灯
4.1流水灯
在这一章开始之前,我们先来引入本章要实现的一个任务,我们在节日的时候在街上都看过漂亮的小灯,按照一定的规律闪烁,在本章中我们也来实现这样的一种功能,我们的任务是利用单片机和8个普通的红色发光二极管来实现流水灯,让发光二极管按照一定的规律发光。
比如让8个二极管逐个点亮,或者逐个熄灭。
实现的手段不是普通的数字电路的方式,而是利用单片机。
因为是第一次接触单片机这个概念,所以接下来我们将来学习有关单片机的基础知识。
4.1.1仿真
4.1.2实验
4.2AT89S5X单片机系统结构
4.2.1单片机概述
我们先来看一下单片机的基本概念,所谓单片机是单片微型计算机(Single-ChipMicrocomputer)的简称。
就是将微处理器(CPU)、存储器(存放程序或数据的ROM和RAM)、总线、定时器/计数器、输入/输出接口(I/O口)和其他多种功能器件集成在一块芯片上的微型计算机。
4.2.2单片机总体结构
单片机本身已经是一个小型的集成系统,里面包含了很多资源,随着技术的发展,单片机的功能越来越强,种类也越来越多。
现在知名的单片机厂家有Intel,ATMEL,Philips等,因此单片机的种类非常多,但是作为初学者的入门单片机,现在最常见的还是51系列。
本书以ATMEL公司生产的AT89S51单片机作为典型芯片,选择这个类型的单片机,是因为AT89S51系列完全兼容8051(包括非常常见的AT89C51,但是AT89C51已经停产)指令系统及指标,便于向下兼容;而且自带的ISP(在线编程)功能,能进行方便的在线编程,易于调试和学习,特别适合于初学者。
图4-1到图4-3是芯片的几种基本封装形式。
图4-4是AT89S51的系统框图。
图4-1DIP封装图4-2PLCC封装
芯片的主要特点如下:
(1)与MCS-51产品指令系统完全兼容。
(2)方便的在线编程系统,4k字节Flash闪存,1000次擦写周期。
(3)最高工作频率33MHz(AT89C51的最高频率为24MHz)。
(4)32个可编程I/O口线,2个16位定时/计数器,6个中断源。
(5)低功耗空闲和掉电模式。
(6)中断可从空闲模式唤醒系统。
(7)看门狗及双数据指针。
(8)三级程序加密锁。
图4-3TQFP封装
图4-4AT89S51方框图
4.2.3单片机的引脚说明
AT89S51的引脚大致分为电源、时钟、I/O口、地址总线和控制总线等几个部分,它们的功能简述如下(以DIP40的封装为例):
1.电源
VCC(40脚):
电源脚,接+5V电源
GND(20脚):
接地
2.时钟
XTAL1是AT89S51片内振荡器的反相放大器输入端,XTAL2则是输出端,一般使用时两脚之间接一个晶振,最高频率可以为33MHz,XTAL1和XTAL2一般都接一个电容到地,大小一般为30pf左右,连接方法如下图所示.
当使用外部时钟时,XTAL1接外部时钟,XTAL2保持悬空。
3.I/O口
AT89S51单片机的I/O口共有四组,分别是P0、P1、P2和P3四组,具体的结构参考4.2.5节,这里先简要的做一些介绍。
P0口是一组8位的并行双向I/O口,作为输出时每个管脚可驱动8个TTL负载。
同时P0口也可以作为低8位地址/数据总线,当作输出时,需要外接上拉电阻;用作输入时,需先向口写“1”,此时P0口就成为高阻抗输入口。
P1口是内部自带上拉电阻的8位准双向I/O口,能驱动4个TTL负载。
在使用ISP编程时P1口的第二功能如下表所示:
端口引脚
第二功能
P1.5
MOSI(用于ISP)
P1.6
MOSO(用于ISP)
P1.7
SCK(用于ISP)
P2口是内部自带上拉电阻的8位准双向I/O口,能驱动4个TTL负载,当访问外部存储器时,定义为高8位地址总线。
P3口是内部自带上拉电阻的8位准双向I/O口,能驱动4个TTL负载。
P3口除了基本的I/O口功能外,还有非常重要的第二功能,如下表所示:
端口引脚
第二功能
P3.0
RXD(串行接受端口)
P3.1
TXD(串行发送接口)
P3.2
(外部中断0请求端)
P3.3
(外部中断1请求端)
P3.4
定时计数器0外部计数输入端
P3.5
定时计数器1外部计数输入端
P3.6
(外部数据写选通)
P3.7
(外部数据读选通)
4.控制引脚
RST(9脚):
复位信号输入端。
在该引脚上持续2个机器周期以上的时间就可以进行系统复位。
系统复位电路有很多种样式。
下面是两种比较简单的复位电路。
ALE/
(ADDRESSLATCHENABLE/PROGRAMMING):
这个引脚是用于锁存外部存储器(包括程序存储器和数据存储器)的低8位地址,即使不访问外部存储器,ALE仍然以时钟频率的1/6输出固定的脉冲信号,因此,它可以对外输出脉冲或者用于定时目的。
当对片内的FLASHROM编程时,此引脚第二功能为
,作为编程脉冲输入端。
(PROGRAMSTOREENABLE)程序存储允许输出信号端。
是外部程序存储器的读选通信号,当AT89S51由外部程序存储器取指令(或数据)时,每个机器周期会有2次
有效,对于外部数据存储器则不会出现这个有效信号。
(ENABLEADDRESS/VOLTAGEPULSEOFPROGRAMMING):
外部程序存储器地址允许输入端/编程电压输入端。
要使单片机访问片外的程序存储器(地址为0000H-FFFFH),
端必须保持低电平;如果
端保持高电平,则单片机执行片内程序存储器中的指令。
4.2.4单片机存储器结构
AT89S51单片机的存储器在物理结构上分为程序存储器和数据存储器,每一个又分为2种,片内和片外,这种程序存储器和数据存储器分开的结构形式,称为哈佛结构。
AT89S51单片机的程序存储器和数据存储器的寻址空间都是64kB,在地址上都是0000H-FFFFH,因此在判断到底使用哪个存储器时,一般利用指令来实现判断。
例如,一般利用MOVC来访问程序存储器;利用MOVX来访问数据存储器。
而在C51编程中,则一般通过变量的类别表示存储器的类型。
例如,可以用code关键字来表示程序存储区数据;利用data,idata,bdata等来表示内部数据存储区数据,利用xdata,pdata等来表示外部数据存储区数据。
(1)程序存储器地址空间
单片机的程序存储器(ROM)分为片内程序存储器和片外程序存储器两个部分,片内程序存储器空间是从0000H-0FFFH,也即4KB;而片外程序存储器地址为1000H-FFFFH,当要使用片外程序存储器空间时,必须确保
为低电平,如果
为高电平,则程序指针首先指向片内的0000H-0FFFH,当地址超过0FFFH时,转向片外程序存储空间。
具体分配可以见下图:
60KB
外部ROM
FFFFH
1000H
4KB
外部
EA=0
4KB
内部
EA=1
0FFFH0FFFH
0000H0000H
AT89S51程序存储器
程序存储空间中的低地址空间一般是预留给系统使用的,详细的分配见下表:
存储单元
应用
中断入口
0000H-0002H
引导程序入口地址
无
0003H-000AH
外部中断0
0003H
000BH-0012H
定时中断0
000BH
0013H-001AH
外部中断1
0013H
001BH-0022H
定时中断1
001BH
0023H-002AH
串口中断
0023H
(2)数据存储器地址空间
单片机的数据存储空间(RAM)也分为片内数据存储空间和片外数据存储空间,AT89S51的片外数据存储空间为64KB,地址从0000H-FFFFH;片内数据存储空间为256个字节,其中低128个字节属于真正的RAM空间,可以直接或者间接寻址,地址为00H-07FH;而高128个字节属于特殊功能寄存器(SFR)区,地址为80H-FFH。
先简要介绍一下低128个字节(00H—7FH)的分布情况:
其中00H--1FH共32个字节为4组工作寄存器区,每组有8个寄存器(R0—R7),可以通过中的RS1,RS0来选择当前的工作寄存器组。
20H--2FH的16个字节是可以位寻址的空间,许多对位操作的指令可以直接对这里的空间进行操作。
30H--7FH共有80个字节单元,为字节寻址的内部RAM区,可供用户作为数据存储区。
或者设置堆栈。
对于高128个字节空间(80H-FFH),AT89S51主要作为特殊功能寄存器使用(对于S52单片机此块区域既是RAM区又是特殊功能寄存器区,两者是重叠的空间),下表描述了AT89S51的特殊功能寄存器的地址分布。
对应的值是寄存器复位后的初始值,其中X表示不定值,由程序设置。
表AT89S51特殊寄存器映像及复位值
0F8H
0FFH
0F0H
B
00000000
0F7H
0E8H
0EFH
0E0H
ACC
00000000
0E7H
0D8H
0DFH
0D0H
PSW
00000000
0D7H
0C8H
0CFH
0C0H
0C7H
0B8H
IP
XX000000
0BFH
0B0H
P3
11111111
0B7H
0A8H
IE
0X000000
0AFH
0A0H
P2
11111111
AUXR1
XXXXXXX0
WDTRST
XXXXXXXX
0A7H
98H
SCON
00000000
SBUF
XXXXXXXX
9FH
90H
P1
11111111
97H
88H
TCON
00000000
TMOD
00000000
TL0
00000000
TL1
00000000
TH0
00000000
TH1
00000000
AUXR
00000000
8FH
80H
P0
11111111
SP
00000111
DP0L
00000000
DP0H
00000000
DP1L
00000000
DP1H
00000000
PCON
0XXX0000
87H
对于89S52而言,增加了与T2相关的一些寄存器。
AT89S51与AT89C51基本上是一致的,但是AT89S51增加了一个数据指针,一个看门狗寄存器,两个辅助寄存器等。
下面简要做一下介绍。
相比与89C51的单DPTR数据寄存器,89S51提供了两路数据寄存器,分别位于82H—83H和84H—85H。
要选择使用哪一个寄存器,则需要在AUXR1(辅助寄存器1)中定义。
具体见下表:
含义
-
-
-
-
-
-
-
DPS
位
7
6
5
4
3
2
1
0
AUXR1的初始值(复位值)为xxxxxxx0B,表中‘-’的含义表示预留扩展用,说明只有最低位‘DPS’有意义,具体含义为:
DPS:
0------------------表示选择DPTR0,也即选择寄存器DP0L,DP0H。
DPS:
1------------------表示选择DPTR1,也即选择寄存器DP1L,DP1H。
除了AUXR1以外,AT89S51中还有一个AUXR寄存器,它是用来对ALE,复位和看门狗的功能进行设置的一个特殊寄存器,具体见下表:
含义
-
-
-
WDIDLE
DISRTO
-
-
DISALE
位
7
6
5
4
3
2
1
0
AUXR的初始值(复位值)为xxx00xx0B,表中‘-’的含义表示预留扩展用,其他几位的具体含义为:
DISALE:
0-------------------表示ALE以1/6晶振频率输出信号。
DISALE:
1-------------------表示ALE只有在执行MOVX和MOVC指令时激活。
DISRTO:
0--------------表示看门狗定时结束时,reset脚输出高电平。
DISRTO:
1--------------reset脚只作输入。
WDIIDLE:
0--------------空闲模式下,WDT(看门狗)继续计数。
WDIIDLE:
1--------------空闲模式下,WDT(看门狗)停止计数。
这里解释下空闲模式和掉电模式:
●空闲模式(IdleMode):
cpu处于睡眠状态,所有片上外部设备保持激活状态,可以通过软件产生,可以被任一个中断或者硬件复位终止
●掉电模式(Power-downMode):
晶振停止工作,片上RAM和SFR(特殊功能寄存器)保持原值,掉电模式可以通过外部中断和硬件复位退出。
(3)专用功能寄存器
专用功能寄存器是特殊功能寄存器中的几个特例,由于它们在单片机的工作模式控制上有重要的作用,常常单独拿出来说明,主要包括程序状态字,电源控制寄存器以及一些与定时,中断和串口有关的寄存器,下面简单介绍几个最基本的寄存器,更加详细的内容参看后续的章节。
1.程序状态字(PSW)
程序状态字是一个8位的寄存器,其结构及各位状态标志定义如下:
CY
AC
F0
RS1
RS0
OV
-
P
-——可由用户定义
CY——进位标志位
AC——辅助进位标志位
F0——标志位,供用户使用
RS1,RS0——组合起来选择寄存器组,详细见下表。
OV——溢出标志
P——奇偶标志,表示累加器中值为1的位数的奇偶数
工作寄存器组选择表
RS1
RS0
选择寄存器组
0
0
0
0
1
1
1
0
2
1
1
3
2.电源控制寄存器(PCON)
PCON寄存器的格式和功能如下:
SMOD
-
-
POF
GF1
GF0
PD
IDL
SMOD——波特率倍增位
GF1、GF0——用户通用标记
PD——掉电方式控制位,PD=1时进入掉电模式
IDL——空闲方式控制位,IDL=1时进入空闲方式
POF是掉电标志位,上电期间POF置一,POF可以用软件控制使用与否,但不受复位影响。
3.中断寄存器(IE)
中断寄存器IE的格式和基本功能见下表:
IE
EA
-
-
ES
ET1
EX1
ET0
EX0
符号
功能
EA
中断总允许控制位,EA=0,禁止所有中断
-
预留
ES
串口中断允许控制位
ET1
定时中断1允许控制位
EX1
外部中断1允许控制位
ET0
定时中断0允许控制位
EX0
外部中断0允许控制位
IE是用来控制中断允许的寄存器,而IP则是用来设定中断的优先级的寄存器,中断的优先级有两级,分别是高优先级和低优先级,低优先级中断处理程序可以被高优先级中断源中断,但不能被另一个低优先级中断源中断,而高优先级中断处理程序是不能被任何中断源中断的,而设定中断的高低优先级就是通过IP寄存器来实现的。
IP的格式和基本功能如下:
-
-
-
PS
PT1
PX1
PT0
PX0
-——保留位。
PS——定义串行口中断优先级。
PT1——定时器1中断优先级。
PX1——定义外部中断1的中断优先级。
PT0——定义定时器0中断优先级。
PX0——定义外部中断0的中断优先级。
(4)几种单片机存储器的差别
到此为止,有关存储器的基本内容告一段落,下面通过一张表将常见的几种芯片的存储器进行一个简单的比较,如下表所示:
芯片
ROM
RAM
SFR
其他
AT89S51
4K可在线编程
FLASH存储器
128字节
看门狗
双数据指针
2个定时计数器
AT89C51
4K可重复擦写
FLASH存储器
128字节
无看门狗
单数据指针
2个定时计数器
AT89S52
8K可在线编程
FLASH存储器
256字节
看门狗
双数据指针
3个定时计数器
AT89C52
8K可在线编程
FLASH存储器
256字节
无看门狗
单数据指针
3个定时计数器
4.2.5单片机I/O口
单片机的I/O口是单片机与外界交流的通道,相当于一个系统的交通要道,从单片机内部向外部传送数据或者由外部向单片机传送数据都需要通过I/O口来实现,AT89S51单片机具有4组8位的I/O口,在前面的引脚说明中有简单的介绍,下面来详细介绍一下他们的结构和工作原理。
(1)P0口
P0口共有8位,其中每一位的结构如下图所示:
由上图可见,P0端口由锁存器、输入缓冲器、切换开关、一个非门、一个与门及场效应管驱动电路构成。
再看图的右边,标号为P0.X引脚的图标,也就是说P0.X引脚可以是P0.0到P0.7的任何一位,即在P0口有8个与上图相同的电路组成。
下面介绍一下各个部分的基本功能:
输入缓冲器:
在P0口中,有两个三态的缓冲器,在学数字电路时,我们已知道,三态门有三个状态,即在其的输出端可以是高电平、低电平,同时还有一种就是高阻状态(或称为禁止状态),从图中可以看出,上面一个是读锁存器的缓冲器,也就是说,要读取D锁存器输出端Q的数据,那就得使读锁存器的这个缓冲器的三态控制端(上图中标号为‘读锁存器’端)有效。
下面一个是读引脚的缓冲器,要读取P0.X引脚上的数据,也要使标号为‘读引脚’的这个三态缓冲器的控制端有效,引脚上的数据才会传输到我们单片机的内部数据总线上。
D锁存器:
构成一个锁存器,通常要用一个时序电路,时序的单元电路在学数字电路时我们已知道,一个触发器可以保存一位的二进制数(即具有保持功能),在51单片机的32根I/O口线中都是用一个D触发器来构成锁存器的。
上图中的D锁存器,D端是数据输入端,CP是控制端(也就是时序控制信号输入端),Q是输出端,
是反向输出端。
对于D触发器来讲,当D输入端有一个输入信号,如果这时控制端CP没有信号(也就是时序脉冲没有到来),这时输入端D的数据是无法传输到输出端Q及
的。
如果时序控制端CP的时序脉冲一旦到了,这时D端输入的数据就会传输到Q及
端。
数据传送过来后,当CP时序控制端的时序信号消失了,这时,输出端还会保持着上次输入端D的数据(即把上次的数据锁存起来了)。
如果下一个时序控制脉冲信号来了,这时D端的数据才再次传送到Q端,从而改变Q端的状态。
多路开关:
在51单片机中,当内部的存储器够用(也就是不需要外扩展存储器时,这里讲的存储器包括数据存储器及程序存储器)时,P0口可以作为通用的输入输出端口(即I/O)使用,当单片机或者编写的程序超过了单片机内部的存储器容量,需要外扩存储器时,P0口就作为‘地址/数据’总线使用。
那么这个多路选择开关就是用于选择是做为普通I/O口使用还是作为‘数据/地址’总线使用的选择开关了。
大家看上图,当多路开关与下面接通时,P0口是作为普通的I/O口使用的,当多路开关是与上面接通时,P0口是作为‘地址/数据’总线使用的。
输出驱动部份:
从上图中可以看出,P0口的输出是由两个MOS管组成的推拉式结构,也就是说,这两个MOS管一次只能导通一个,当V1导通时,V2就截止,当V2导通时,V1截止。
以上是各个部分的基本介绍,下面我们来具体研究一下P0口做为I/O口及地址/数据总线使用时的具体工作过程。
1.首先来看一下P0口作为I/O端口使用时的基本情况。
此时多路开关的控制信号为0(低电平),这时与门输出为0(低电平),那V1管就截止,在多路控制开关的控制信号是0(低电平)时,多路开关是与锁存器的
端相接的。
当P0口作为I/O口时,还分为输入和输出两种状态,当其由数据总线向引脚输出时,此时属于输出状态,当写锁存器信号CP有效,此时数据的流向如下:
数据总线→锁存器的输入端D→锁存器的
端→多路开关→V2管的栅极→V2的漏极到输出端P0.X。
前面我们已讲了,当多路开关的控制信号为低电平0时,与门输出为低电平,V1管是截止的,所以作为输出口时,P0是漏极开路输出,类似于OC门,当驱动上接电流负载时,需要外接上拉电阻。
下图就是由内部数据总线向P0口输出数据的流程图,用箭头线表示:
当P0口处于输入状态时,还分为两种状态,分别是读引脚和读寄存器状态,先来看下读引脚状态,如下图:
此时,下面的缓冲器的读引脚端有效,数据直接通过引脚输入到内部总线,数据流向见箭头方向。
而读锁存器则是直接从三态缓冲器读取锁存器输出端Q的状态,请看下图:
在输入状态下,从锁存器和从引脚上读来的信号一般是一致的,但也有例外。
例如,当从内部总线输出低电平后,锁存器Q=0,
=1,场效应管V2开通,端口线呈低电平状态。
此时无论端口线上外接的信号是低电乎还是高电平,从引脚读入单片机的信号都是低电平,因而不能正确地读入端口引脚上的信号。
又如,当从内部总线输出高电平后,锁存器Q=1,
=0,场效应管V2截止。
如外接引脚信号为低电平,从引脚上读入的信号就与从锁存器读入的信号不同。
为此,单片机在对端口P0一P3的输入操作上,有如下约定:
凡属于读-修改-写方式的指令,从锁存器读入信号,其它指令则从端口引脚线上读入信号。
读-修改-写指令的特点是,从端口输入(读)信号,在单片机内加以运算(修改)后,再输出(写)到该端口上。
下面是几条读--修改-写指令的例子。
INCP1
DECP3
CPL P2
这样安排的原因在于读-修改-写指令需要得到端口原输出的状态,修改后再输出,读锁存器而不是读引脚,可以避免因外部电路的原因而使原端口的状态被读错。
2、作为地址/数据复用口使用时的工作原理
这时多路开关‘控制’信号为‘1’,‘与门’解锁,‘与门’输出信号电平由“地址/数据”线信号决定;多路开关与反相器的输出端相连,地址信号经“地址/数据”线→反相器→V2场效应管栅极→V2漏极输出。
当控制信号为“1”,地址/数据信号为“0”时,与门输出低电平,V1管截止;反相器输出高电平,V2管导通,输出引脚的地址信号为低电平。
和数据/地址信号相同,见下图:
而当控制信号为“1”、地址/数据信号为“1”时,“与门”输出为高电平,V1管导通;反相器输出低电平,V2管截止,输出引脚的地址信号为高电平。
和地址/数据信号相同,见下图:
可见,在输出“地址/数据”信息时,V1、V2管是交替导通的,负载能力很强,可以直接与外设存储器相连,无须增加总线驱动器。
(2)P1口
P1口的结构最简单,用途也
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第四 基于 单片机 控制 流水
![提示](https://static.bdocx.com/images/bang_tan.gif)