2.3 AT89S51的存储结构
AT89S51单片机的存储器配置在物理结构上有4个存储空间:片内程序存储器、片外程序存储器、片内数据存储器、片外数据存储器。从逻辑上来看,有3个存储器地址空间:片内、外统一编址的程序存储器地址空间,片内数据存储器地址空间和片外数据存储器地址空间。在访问3个不同的逻辑空间时,应采用不同形式的指令,以产生不同的内部控制信号,用来选择所需的逻辑空间。图2-12表示了AT89S51单片机存储器空间结构。
图2-12 AT89S51单片机存储器空间结构
(a)程序存储器地址分配; (b)数据存储器地址分配
2.3.1 程序存储器
动画:单片机的程序存储器
微课:程序存储器
单片机的程序存储器一般用于存放编好的程序、表格和常数。AT89S51单片机的程序存储器地址分配如图2-13 (a)所示。其中,单片机内部有4 KB的程序存储器,地址为0000H~0FFFH。片外最多可扩展空间达64 KB,地址为1000H~FFFFH,片内与片外程序存储器的最大寻址范围为64 KB (即地址为0000H~FFFFH)。由于单片机的程序存储器采用片内、片外统一编址,所以范围为0000H~0FFFH的地址空间是在片内存储器还是片外存储器,取决于单片机外围引脚的状态。如果接高电平(即=1),表示0000H~0FFFH在片内程序存储器中;如果接低电平(即=0),则表示0000H~0FFFH在片外程序存储器中。
一般来说,对于有内部程序存储器的单片机,应将引脚EA接高电平,使程序从内部程序存储器开始执行。当程序超出内部程序存储器的容量时,自动转向外部程序存储器1000H~FFFFH地址范围执行。
AT89S51单片机执行程序时,与微型计算机执行程序类似,也是由程序计数器PC控制程序执行的顺序。单片机中的程序计数器PC (Program Counter)是一个16位的专用寄存器,用来存放即将执行的下一条指令所在的地址。它具有自动加1的功能。当CPU要取指令时,PC的内容送至地址总线上,从PC所指向的存储器地址中取出指令,PC内容则自动加1,指向下一条指令,以保证程序按顺序执行。当单片机接通电源时,PC 会被复位为0000H,此时,单片机从0000H开始将指令依次取出执行。
AT89S51的程序存储器中有5个特殊地址单元,用于中断程序的入口地址。
·0003H:外部中断0入口地址。
·000BH:定时/计数器0中断入口地址。
·0013H:外部中断1入口地址。
·001BH:定时/计数器1中断入口地址。
·0023H:串行口中断入口地址。
由于0000H单元与这些中断程序入口地址之间的存储空间有限,为了不影响这些中断入口地址的正常使用,常在0000H单元及这些中断入口处都放置一条绝对无条件跳转指令,使程序跳转到用户指定的主程序或中断服务程序的存储空间中执行。
2.3.2 数据存储器
微课:数据存储器
动画:单片机的数据存储器
数据存储器(RAM)用于存放运算中间结果、数据暂存和缓冲、待调试的程序。数据存储器在物理上和逻辑上都分为两个地址空间:一个是由128 B的片内RAM和26个特殊功能寄存器(SFR)构成的内部数据存储器,另一个是片外最大可扩充64 KB的数据存储器,如图2-12 (b)所示。
片外数据存储器的使用通常出现在单片机内部RAM容量不够的情况下。扩展容量可由用户根据需要确定,最大可扩充 64 KB,地址范围0000H~FFFFH。需要注意的是,AT89S51单片机扩展的I/O接口与片外数据存储器统一编址。
使用片内和片外数据存储器时采用不同的指令加以区别。在访问片内数据存储器时,可使用MOV指令;要访问片外数据存储器可使用MOVX指令。片外数据存储器只能采用间接寻址方式,可使用 R0、R1 和 DPTR 作间址寄存器。R0、R1作为8位地址指针,寻址范围为256 B;而DPTR是16位地址指针,故寻址范围可达64 KB。
AT89S51单片机的内部数据存储器只有地址为00~7FH的共128 B RAM可供用户使用,与片内 RAM 统一编址的80H~FFH 地址空间中,只有26 个存储空间被特殊功能寄存器(SFR)占用。
1.片内数据存储区(00~7FH)
片内数据存储区地址为00~7FH的空间划分为工作寄存器区、位寻址区及用户RAM区3部分。
(1)工作寄存器区(00H~1FH)
工作寄存器区共32个存储单元,分为4组,每组由8个地址单元组成通用寄存器R0~R7,其地址分配如表2-2所示。每组寄存器均可作为CPU当前的工作寄存器,当前工作寄存器可通过特殊功能寄存器中的程序状态字PSW的RS1、RS0两位进行设置。例如,如果RS1 RS0=01H,则表示选中了第1组,即地址为08H~0FH的单元构成当前的工作寄存器R0~R7。
表2-2 单片机工作寄存器地址分配表
当CPU复位后,自动选中第0组工作寄存器。一旦选中了一组工作寄存器,其他3组的地址空间只能用于数据存储器,不能作为寄存器。如果要使用必须重新设置RS1、RS0的状态。
(2)位寻址区(20H~2FH)
位寻址区共16B,每1B 为8 位,共128 位,这128 位用位地址编号,范围为00H~7FH。这些位地址单元构成了布尔处理器的存储空间,其地址分布如表2-3所示。位寻址区既可采用位寻址方式访问,也可以采用字节寻址方式访问,这种位寻址能力是51系列单片机一个重要特点。
表2-3 位地址分配表
(3)用户RAM区(30H~7FH)
用户RAM区共80个单元,可作为堆栈或数据缓冲使用。
2.特殊功能寄存器区(80H~FFH)
AT89S51单片机中共有26个特殊功能寄存器(SFR),这些寄存器离散地分布在内部数据存储器的80H~FFH这128 B的地址空间中。
这些特殊功能寄存器只能采用直接寻址及位寻址,其中,地址为X0H和X8H的各寄存器可位寻址,如表2-4所示,表中用“∗”表示可位寻址的寄存器。
表2-4 特殊功能寄存器(SFR)地址分配表
这些特殊功能寄存器(SFR)都和单片机的相关部件有关,如ACC、B、PSW与CPU有关,SP、DPTR与存储器有关,P0~P3与I/O端口有关,IP、IE 与中断系统有关,TCON、TMOD、TH0、TL0、TH1、TL1与定时/计数器有关,SCON、SBUF与串行口有关,PCON与电源有关。这些SFR专门用来设置单片机内部的各种资源,记录电路的运行状态,参与各种运算及输入/输出操作,如设置中断和定时器的工作方式、进行并行及串行输入/输出等。
下面简述几个常用的特殊功能寄存器的功能。
(1)累加器ACC
ACC是一个具有特殊用途的8位寄存器,主要用于存放操作数或运算结果。AT89S51指令系统中大多数指令的执行都要通过累加器ACC进行。因此,在CPU中,累加器的使用频率是很高的。当采用寄存器寻址时,可用A表示累加器。
(2)寄存器B
寄存器B在乘、除法指令中用于暂存数据。乘法指令的两个操作数分别取自于A和B,其结果存放在BA寄存器对中。具体应用见第3章中有关乘法、除法指令的内容。
(3)程序状态字PSW
PSW是一个可编程的8位寄存器,用来存放与当前指令执行结果相关的状态。AT89S51有些指令的执行会自动影响PSW相关位的状态,在编程时要加以注意。同时,PSW中某些位的状态也可通过指令设置。PSW各标志位的定义如表2-5所示。
表2-5 PSW各标志位
CY:进位标志位。当累加器A的最高位有进位(加法)或借位(减法)时,CY=1;否则CY=0。在布尔操作时,它是各种位操作的“累加器”。CY在指令中常简记为C。
AC:辅助进位标志位。当累加器A的D3位向D4位进位或借位时,AC=1;否则为0。有时AC也被称为半进位标志。
F0:用户标志位。可以根据需要用程序将其置位或清0,以控制程序的转向。
RS1、RS0:工作寄存器区选择位。RS1、RS0可由指令置位或清0,用来选择单片机的工作寄存器区,其选择方法见表2-2。
OV:溢出标志位。当有符号数采用补码运算时,其结果超出范围(-127~+128)时,有溢出,OV=1;否则OV=0。
—:保留位。
P:奇偶校验位。指示累加器A中操作结果的“1”的个数的奇偶性。凡是改变累加器A中内容的指令均影响P标志位。当A中有奇数个“1”,则P=1;否则P=0。此标志位对串行通信中的数据传输有重要的意义,在串行通信中常采用奇偶校验的方法来校验数据传输的可靠性。
(4)堆栈指针SP
堆栈是存储区中一个存放数据地址的特殊区域,主要是用来暂存数据和地址的,操作时按先进后出的原则存放数据,其生成方向由低地址到高地址。
堆栈指针SP是一个8位特殊功能寄存器,指示堆栈的底部在片内RAM中的位置。系统复位后,SP的初始值为07H。由于08H~1FH单元分属于工作寄存器区1~3,所以一般将SP的初值改变至片内RAM的高地址区(30H以上)。
(5)数据指针DPTR
DPTR是一个16位地址寄存器,主要用来存放16位地址,作间接寻址寄存器使用,可用于读写外接数据存储器或I/O端口。AT89S51单片机提供了两个数据指针DP0和DP1,可通过双时钟指针寄存器AUXR1来选择,如表2-4所示。当DPTR选择位DPS为0时,选择DP0;为1时,选择DP1。它们也可以拆成两个独立的8位寄存器使用,即DPH (高8位)和DPL (低8位)。
(6)端口P0~P3
P0~P3分别表示I/O端口中的P0~P3锁存器。在AT89S51中可以把I/O端口当作一般的特殊功能寄存器来使用,不再专设端口操作指令,均采用统一的MOV指令,使用方便。
(7)串行数据缓冲器SBUF
串行数据缓冲器SBUF用于存放串行通信中待发送或已接收到的数据。它实际上是由两个独立的寄存器组成,一个是发送缓冲器,一个是接收缓冲器。
(8)定时/计数器TH1、TL1、TH0、TL0
AT89S51中有两个16位定时/计数器T0和T1。它们各自由两个独立的8位寄存器组成,共为4个寄存器TH1、TL1、TH0和TL0,可以分别对这4个寄存器寻址,但不能把T0、T1当16位寄存器来对待。由于定时/计数器工作方式的不同,定时器使用的有效位数会发生变化。具体应用见第5章相关章节。
除上述SFR以外,另外还有IE、IP、TMOD、TCON,SCON和PCON等寄存器,将在以后的章节中介绍。