1.MCS-51存储器的结构
如图所示,MCS-51 的存储器在物理结构上分成四个存储空间:片内程序存储器、片外程序存储器、片内数据存储器和片外数据存储器。但从用户使用的角度,即从逻辑上考虑,则有三个存储空间:片内外统一编址的64KB 程序存储器地址空间(0000H~FFFFH),256B 的片内数据存储器地址空间 (00H~FFH)及64KB片外数据存储器地址空间(0000H~FFFFH) 。
CPU 在访问三个不同的逻辑空间时,通过采用不同形式的指令(访问程序存储器使用MOVC 指令、访问片内数据存储器使用 MOV 指令、访问片外数据存储器使用 MOVX 指令)来产生相应的存储器选通信号。
2.片内数据存储器
数据存储器用于存放各种运算的中间结果,用作缓存和数据暂存,以及设置特征标志等,8051的片内数据存储器(RAM)空间较小,仅用 8位地址寻址,最大寻址范围为256个单元(00H~FFH),按使用情况不同可分成低 128B 单元(00H~7FH)和高 128B 单元(80H~FFH)。其中低 128B 单元为真正的RAM存储器,高 128B 单元为特殊功能存器(SFR)区。整个片内RAM区的分布如图所示
(1)片内数据存储器低128B
片内数据存储器低128B按用途不同又分为三个区域:
(1) 通用寄存器区
00H~1FH共32个单元为通用寄存器区,分4组,每组有8个8位的存器R0~R7,如图为通用工作寄存器的地址表。
任意时刻CPU只能选用四个工作寄存器组中的一组作为当前工作寄存器组。因此四组寄存器都用 R0~R7 表示,不会发生冲突。未被选中的工作寄存器区的各个单元,可以作为一般的数据缓冲器使用。
CPU当前使用的工作寄存器区是由程序状态字(PSW)的RS1和RS0设置决定的,PSW中这两位状态和所使用寄存器对应关系如上,通过编程修改RSW中RS1、RS0两位的状态,就能任选一个工作寄存器区作为当前工作寄存器区。
注:单片机复位后自动选择工作寄存器0区
(2) 片外数据存储器高128B
内部RAM的20H~2FH 为位寻址区域。这 16个单元(共16X8=128位)的一位都有一个地址,称为位地址。它们占据位地址空间的 00H~7FH,地址分配如表所示。这16个单元的每一位都可以看作一个软件触发器,用于存放各种程序标志、位控制变量。同样,位寻址区的RAM单元也可以作为一般的数据缓冲器使用。
(3) 用户RAM区
30H~7FH为真正数据缓冲区,可用来暂存用户数据或当作堆栈使用。
在微型机中,堆栈是在内存 RAM 中开辟的一个特定的存储区,专门用来暂时存放数据或断点地址,并按照“先进后出(FILO: First-In Last-Out),后进先出(LIFO:Last-In FirstOut)”的原则进行操作。
MCS-51单片机的堆栈,是在片内RAM低128B中开辟的一个专用区(一般选择30H~7FH作为栈区)。堆栈操作示意图如图所示。堆栈的一端是固定的,称为栈底;另一端是浮动的,称为栈顶。当堆栈中没有数据时,栈顶与栈底重合。当数据进栈时,栈顶会自动地向地址递增的方向变化。一般把堆栈中的数据称为元素,最后进栈的那个元素所在地址就栈顶是栈顶。由于堆栈元素的存入和取出必须遵循FILO和LIFO的原则,因此堆栈的操作总是对栈顶进行的。
2.片内数据存储器高128B
MCS-51单片机内部的I/O口锁存器、串行口数据缓冲器、定时器/计数器以及各种控制寄存器和状态寄存器等统称为特殊功能寄存器,简称为SFR(Special Function Registers)。
MCS-51共有21个SFR,它们离散地分布在片内RAM地址为80H~FFH的高128B区域,且每一个SFR都有一个字节地址,并定义了符号名,其地址分布见表所示
21个SFR并未完全占满 128个单元,若用指令访问未被占用的单元,其操作将是无意义的。对 SFR的访问只能采用直接寻址方式。在21个SFR中,字节地址的低位为8和0的SFR的每一位都具有位地址,可进行位寻址,且大多数可位寻址SFR的每一位都有一个位名。
常见的SFR寄存器:
(1)累加器ACC(Accumulator)
累加器是8位的寄存器,是最重要的特殊功能寄存器,许多指令的操作数取自 ACC,大部分运算结果也存放在ACC中。在指令系统中,累加器ACC的助记符常记为A,在以后叙述时也将ACC简述为A。
(2)寄存器B
寄存器B是8位寄存器,主要用于乘法和除法操作指令。对于其他指令,寄存器 B可作为一般数据寄存器使用。
(3)堆栈指针SP(Stack Pointer)
堆栈指针 SP是一个8位寄存器,用它存放栈顶的地址。进栈时,SP 自动加1,将数据压入SP所指向的单元;出栈时,则将 SP 所指向单元的内容弹出,然后SP 自动减1。因此SP总是指向栈顶。
系统复位后,SP被初始化为 07H,所以第一个压入堆栈的数据存放到 08H单元,即栈区为从07H单元开始的连续存储单元。由于08H~1FH单元为工作存器区1~3,20H~2FH为位寻址区,在程序设计中很可能要用到这些单元,所以用户在编程时最好把 SP 的值改为30H 或更大值,以免栈区与要使用的工作寄存器区或位寻址区发生冲突,造成数据混乱。栈区的大小可用“深度”表示,用户在设定堆栈时应该考虑到堆栈的深度,以便能满足子程序嵌套时的需要。
(4)程序状态字PSW(Program Status Word)
PSW是8位寄存器,用于寄存程序运行的状态信息。其中有些位(如Cy、AC、OV、P等)的状态是更具程序执行结果由硬件自动设置,而有些位(如RS1,RS0等)的状态则由软件设置。程序状态寄存器各位的状态可以用特定的指令来测试,也可以读出。程序状态字PSW格式如下:
Cy:进位标志。
在进行加(或减)法运算时,如果最高位 D7 发生进位(或借位),则Cy=1,否则Cy=0,
在进行位操作时,Cy又是布尔处理机的累加器,指令助记符用C表示。
AC:半进位标志。
当进行加(或减)法运算时,如果低半字节向高半字节产生进位(或借位)时,则AC=1,否则AC=0。AC标志亦用于校正BCD码加法运算的结果,作为BCD码调整指令“DAA”判断的依据之一。
P:奇偶标志位。
该标志位始终跟踪累加器A的奇偶性,如果A中有奇数个1,则标志P=1;否则P=0。
OV:溢出标志位。
进行带符号数的加法(或减法)算术运算时,如果运算结果超出累加器所能表示的范围(-128B~+127B)时,则发生溢出,此时OV=1;否则OV=0。
判断方法:当两个数相加(或相减)时,如果位7(D7)和位6(D6)同时发生进位(或借位),则OV=0,否则OV=1。进行乘法运算时,如果乘积超出累加器A所能表示的范围(0~255),则发生溢出,乘积的高字节必须放置在寄存器 B中,此时OV=1;否则,OV=0。进行除法运算时,如果除数为 0,则除法运算无法进行,此时OV=1;否则,OV=0。
F1F0:用户标志位。
可由用户设定作为软件标志。
RS1、RS0:工作寄存器组选择位。
用以选择当前工作的寄存器组。用户用软件改变RS1和RSO的组合,从而指定当前选用的工作寄存器组,其组合关系见表 。MCS-51单片机复位后,RS1=RS0=0。所以CPU自动选中工作寄存器0组作为当前工作寄存器组。
(5)数据指针DPTR (Data Pointer)
数据指针DPTR是一个16位的特殊功能寄存器,编程时,DPTR既可以作为一个16位寄存器使用,也可以作为两个独立的 8位寄存器分开使用,此时用 DPH表示 DPTR的高节,用DPL表示DPTR的低字节。一般编程时,常用DPTR来存放外RAM 单元(或外部I/O接口)的16位地址,作间接寄存器使用,它可指向外RAM64KB范围内的任一存储单元。
(6)程序计数器PC
程序计数器PC(Program Counter)是16位专用存器,其内容就是下一条要执行的指令首地址。CPU 总是把 PC的内容送往地址总线,作为选择存储单元的地址,以便从指定的存储单元中取出指令,译码和执行。
PC具有自动加1的功能。当CPU 顺序执行指时,PC的内容以增量的规律变化着于是当一条指令取出后,PC 就指向下一条指令。如果不按顺序执行指令,在跳转之前必须将转移的目标地址送往程序计数器,以便从该地址开始执行程序。由此可见,PC实际上是一个地址指示器,改变 PC 中的内容就可以改变指令执行的次序,即改变程序执行的路线当系统复位后,PC=0000H,CPU便从这一固定的入口地址开始执行程序。
PC不在上述的RAM存储器内,为不可寻址的专用寄存器。
3.片内程序存储器
程序存储器用于存放程序代码和表格常数。MCS-51 所支持的最大程序存储器空间为64KB,其地址指针就是16位的程序计数器PC。
对于内部有4KB程序存储器的单片机(8051或8751),EA接Vcc(+5V),当程序计数器PC的值在0000H~0FFFH时,CPU则从内部程序存储器取指令;当PC值大于0FFFH时,则从外部的程序存储器取指令。如果EA接(地),则内部的程序存储器被忽略,CPU总是从外部的程序存储器中取指令。
在程序存储器中,有6个特殊的单元区域:
•0000H~0002H: 复位引导程序区。系统复位后,由于(PC)=0000H,所以单片机总是从0000H 单元开始取指令执行程序。如果不希望程序不是从 0000H 单元开始执行,则必须在该单元区域中存放一条无条件转移指令,以便直接转到要执行的程序位置。
•0003H~000AH:外部中断0中断子程序入口地址区。
•000BH~0012H:定时/计数器0溢出中断子程序入口地址区。
•0013H~001AH:外部中断1中断子程序入口地址区。
•001BH~0022H:定时/计数器1溢出中断子程序入口地址区。
•0023H~002AH:串行口中断子程序入口地址区。
中断响应后,按中断种类由硬件控制 PC 自动转到各中断区的首地址去执行程序。但每个中断入口地址区只有 8个单元,无法放置完整的中断处理子程序,因此,程序员在编程时必须在中断入口区放置一条无条件转移指令,将程序引导到真正的中断处理程序的实际入口位置。