2.3 51单片机存储结构及位处理器
存储器是51单片机最重要的编程资源,已介绍的寄存器PSW和P0~P3都属于存储器的范畴。本节主要介绍51单片机存储器的结构、配置、字节编址及位地址。
2.3.1 51单片机存储器的特点
51单片机的存储器与一般微机存储器的配置不同,微机把程序和数据共存同一存储空间,各存储单元对应唯一的地址。而51单片机的存储器把程序和数据的存储空间严格区分开。
51单片机存储器的划分方法如下。
(1)物理存储空间分配
51单片机存储器为字节存储单元,从物理结构上划分,有如下4个存储空间。
1)片内程序存储器(4KB)。
2)片外程序存储器(可以扩展为64KB)。
3)片内数据存储器(256B)。
4)片外数据存储器(可以扩展为64KB)。
(2)逻辑地址空间
从用户使用(编程)的角度划分,51单片机存储器从逻辑上划分为3个存储器地址空间。
1)片内外统一编址的64KB的程序存储器地址空间。
2)片内(128+128)B数据存储器地址空间。
3)片外64KB的数据存储器地址空间。
对于同一地址信息,可表示不同的存储单元。故在访问不同的逻辑存储空间时,51单片机提供了不同形式的指令如下。
● MOV指令用于访问内部数据存储器。
● MOVC指令用于访问片内外程序存储器。
● MOVX指令用于访问外部数据存储器。
显然,51单片机的存储器结构较微机复杂。掌握51单片机存储器结构对单片机应用程序设计是大有帮助的,因为单片机应用程序就是面向CPU、面向存储器进行设计的。
8051单片机存储结构如图2-6所示。
图2-6 8051单片机存储结构
由图2-6可以看出,内部程序存储器(4KB-ROM)地址空间为0000H~0FFFH,外部程序存储器地址空间为0000H~FFFFH。
内部数据存储器(128B-RAM)地址空间为00H~7FH,特殊功能寄存器(共21个)在RAM的80H~FFH地址空间内,而外部数据存储器地址空间为0000H~FFFFH。
2.3.2 程序存储器
程序存储器用于存放已编制好的程序及程序中用到的常数。一般情况下,在程序调试运行成功后,由单片机开发板将程序写入(下载)程序储存器。程序在运行中不能修改程序存储器中的内容。
程序存储器由ROM构成,单片机掉电后ROM内容不会丢失。
8051片内有4KB的ROM,87C51内含4KB的可编程EPROM程序存储器,89C51内含4KB的闪速EEPROM;89S51内含4KB的Flash闪速程序存储器。
单片机在工作时,由程序计数器(PC)自动指向将要执行的指令在程序存储器中的存储地址。51单片机程序存储器地址为16位(二进制数),因此程序存储器的地址范围为64KB。片内、片外程序存储器的地址空间是连续的。
8052、89S52等单片机内部ROM为8KB。
当引脚时,CPU访问内部程序存储器(即8051的程序计数器PC在0000H~0FFFH地址范围内),当PC的值超过0FFFH,CPU自动转向访问外部程序存储器,即自动执行片外程序存储器中的程序。
当时,CPU访问外部程序存储器(8051程序计数器PC在0000H~FFFFH地址范围内),CPU总是从外部程序存储器中取指令。
一般情况下,首先使用片内程序存储器,因此,设置。
MOVC指令用于访问程序存储器。
在程序存储器中,51单片机定义了7个单元用于特殊用途。
0000H:CPU复位后,PC=0000H,程序总是从程序存储器的0000H单元开始执行。
0003H:外部中断0中断服务程序入口地址。
000BH:定时器/计数器0溢出中断服务程序的入口地址。
0013H:外部中断1中断服务程序入口地址。
001BH:定时器/计数器1溢出中断服务程序的入口地址。
0023H:串行口中断服务程序的入口地址。
002BH:定时器/计数器2溢出或T2EX(P1.1)端负跳变时的入口地址(仅52子序列所特有)。
由于以上7个特殊用途的存储单元相距较近,在实际使用时,通常在入口处安放一条无条件转移指令。例如,在0000H单元可安排一条转向主控程序的转移指令;在其他入口可安排转移指令使之转向相应的由用户设计的中断服务程序实际入口地址。
2.3.3 数据存储器
数据存储器用于存放程序运算的中间结果、状态标志位等。
数据存储器由RAM构成,一旦掉电,其数据将丢失。
在51单片机内,数据存储器分为内部数据存储器和外部数据存储器,这是两个独立的地址空间,在使用时必须分别编址。
内部数据存储器为(128+128)B。外部数据存储器最大可扩充为64KB,其地址指针为16位二进制数。
51单片机提供MOV指令用于访问内部RAM,MOVX用于访问外部RAM。
内部数据存储器是最活跃、最灵活的存储空间,51单片机指令系统寻址方式及应用程序大部分是面向内部数据存储器的。内部数据存储器分为高、低128B两大部分,如图2-7所示。
图2-7 片内数据存储器的配置
由图2-7可以看出:
● 低128B为RAM区,地址空间为00H~7FH。
● 高128B为特殊功能寄存器(SFR)区,地址空间为80H~FFH,其中仅有21个字节单元是有定义的。
1.通用寄存器区
在低128B的RAM区中,将地址00~1FH共32个单元设为工作寄存器区,这32个单元又分为4组,每组由8个单元按序组成通用寄存器R0~R7。
通用寄存器R0~R7不仅用于暂存中间结果,而且是CPU指令中寻址方式不可缺少的工作单元。任一时刻CPU只能选用一组工作寄存器为当前工作寄存器,因此,不会发生冲突。未选中的其他三组寄存器可作为一般数据存储器使用。
CPU复位后,自动选中第0组工作寄存器。
可以通过程序对程序状态字PSW中的RS1、RS0位进行设置,以实现工作寄存器组的切换,RS1、RS0的状态与当前工作寄存器组的对应关系见表2-2。
2.可位寻址区
地址为20H~2FH的16个RAM(字节)单元,既可以像普通RAM单元按字节地址进行存取,又可以按位进行存取,这16个字节共有128(16×8)个二进制位,每一位都分配一个位地址,编址为00H~7FH,如图2-8所示。
图2-8 片内RAM区字节地址及位地址分配
由图2-8看出,位地址和字节地址都是用8位二进制数(2位十六进制数)表示,但其含义不同。字节地址单元的数据是8位二进制数,而位地址单元的数据是1位二进制数,在使用时要特别注意。
1)字节地址20H单元,该地址单元的数据为D0~D7(8位);而该单元的每一位的地址如下。
因为位地址00H~07H分别表示20H单元D0~D7位的地址,故其位地址又可表示为20H.0~20H.7。
2)位地址为20H,该位地址单元是字节地址24H单元的第0位,故位地址又可表示为24H.0。
必须指出,对于某个地址,既可以表示字节地址,又可以表示位地址(如20H、21H等),那么,如何区分一个地址是字节地址还是位地址呢?可以通过指令中操作数的类型确定。如果指令中的另一个操作数为字节数据,则该地址必为字节地址;如果指令中的另一个操作数为一位数据,则该地址必为位地址。例如:
3.只能字节寻址的RAM区
在30H~7FH区的80个RAM单元为用户RAM区,只能按字节存取。所以,30H~7FH区是真正的数据缓冲区。
4.堆栈缓冲区
在应用程序中,往往需要一个后进先出的RAM缓冲区,用于子程序调用和中断响应时保护断点及现场数据,这种后进先出的RAM缓冲区称之为堆栈。原则上,堆栈区可设在内部RAM的00H~7FH的任意区域,但由于00H~1FH及20H~2FH区域的特殊作用,堆栈区一般设在30H~7FH的范围内。由堆栈指针SP指向栈顶单元,在程序设计时,应通过对SP初始化来设置堆栈区。
2.3.4 专用寄存器(SFR)
在片内数据存储器的80H~FFH单元(高128B)中,有21个单元作为专用寄存器(SFR),又称特殊功能寄存器。
51单片机内部的I/O口(P0~P3)、CPU内的累加器A等统称为特殊功能寄存器。这些寄存器离散分布在片内数据存储器的80H~FFH单元,每一个寄存器都有一个确定的地址,并定义了寄存器符号名,其地址分布见表2-4。
由于特殊功能寄存器并未占满128个单元,故对空闲地址的操作是没有意义的。
对特殊功能寄存器的访问只能采用直接寻址方式。
对其地址能被8整除的特殊功能寄存器,可对该寄存器的各位进行位寻址操作。
表2-4 特殊功能寄存器(SFR)地址
(续)
下面简要介绍部分特殊功能寄存器(SFR)。
1)累加器ACC:字节地址为E0H,并可对其D0~D7各位进行位寻址,D0~D7位地址相应为E0H~E7H。
2)寄存器B:字节地址为F0H,并可对其D0~D7各位进行位寻址,D0~D7位地址相应为F0H~F7H,主要用于暂存数据。
3)程序状态字PSW:字节地址为D0H,并可对其D0~D7各位进行位寻址,D0~D7数据位的位地址相应为D0H~D7H,主要用于寄存当前指令执行后的某些状态信息。
例如:Cy表示进位/借位标志,指令助记符为C,位地址为D7H(也可表示为PSW.7)。
4)堆栈指针SP:字节地址为81H,不能进行位寻址。
5)端口P0:字节地址为80H,并可对其D0~D7各位进行位寻址。D0~D7数据位的位地址相应为80H~87H(也可表示为P0.0~P0.7)。
6)端口P1:字节地址为90H,并可对其D0~D7各位进行位寻址。D0~D7数据位的位地址相应为90H~97H(也可表示为P1.0~P1.7)。
7)端口P2:字节地址为A0H,并可对其D0~D7各位进行位寻址。D0~D7数据位的位地址相应为A0H~A7H(也可表示为P2.0~P2.7)。
8)端口P3:字节地址为B0H,并可对其D0~D7各位进行位寻址。D0~D7数据位的位地址相应为B0H~B7H(也可表示为P3.0~P3.7)。
SFR的TMOD、TCON、SCON、DPH、DPL及IE等寄存器是单片机主要功能部件的重要组成部分,在后续章节中详细介绍。
2.3.5 位处理器
所谓位处理,是指对一位二进制数据(即0和1)的处理,一位二进制数的典型应用就是开关量(位)控制。当输出的一位二进制数据为1(ON)时,控制负载通电,为0(OFF)时控制负载断电,如电动机起动/停止、多层电梯及交通灯的控制等。单片机具有较强的位处理能力。
对于许多控制系统,开关量控制是控制系统的主要目的,传统的CPU,对于开关量控制却显得不那么方便,而51单片机值得骄傲的正是它有效地解决了单一位的控制。
51单片机片内CPU还是一个性能优异的位处理器,也就是说51单片机实际上又是一个完整而独立的1位单片机(也称布尔处理机)。该布尔处理机除了有自己的CPU、位寄存器、位累加器(即进位标志Cy)、I/O口和位寻址空间外,还有专供位操作的指令系统,可以直接寻址并对位存储单元和SFR的某一位进行操作。51单片机对于位操作(布尔处理)有置位、复位、取反、测试转移、传送、逻辑与和逻辑或运算等功能。
把8位微型机和布尔处理机相互结合在一起,是单片机的主要特点之一,也是微机技术上的一个突破。
布尔处理机在开关量决策、逻辑电路仿真和实时控制方面非常有效。而8位微型机在数据采集及处理、数值运算方面有明显的优势。在51单片机中,8位微型机和布尔处理机的硬件资源是复合在一起的,二者相辅相成。
例如,8位CPU的程序状态字PSW中的进位标志Cy,在布尔处理机中用作累加器C;又如,内部数据存储器既可字节寻址,又可位寻址,这正是51单片机在设计上的精美之处。
利用布尔处理功能可以方便地进行随机逻辑设计,使用软件来实现各种复杂的逻辑关系,免除了许多类似8位数据处理中的数据传送、字节屏蔽和测试判断转移等烦琐的方法,从而取代数字电子电路所能实现的组合逻辑和时序逻辑电路,在这一方面,可以说单片机是万能的数字电路。