2.4 80C51单片机的存储器组织
80C51单片机的存储器在物理结构上分为程序存储器和数据存储器,共有四个存储空间:分别是片内程序存储器、片内数据存储器、片外程序存储器和片外数据存储器。存储空间分布如图2-4所示,从使用者的角度看,80C51单片机存储器的地址空间为三类:程序存储器、数据存储器、特殊功能寄存器。
图2-4 80C51存储器物理结构
2.4.1 80C51单片机的程序存储器
80C51单片机的程序存储器最大配置为64KB,用于存放编好的程序和表格常数。由图2-4所示可知,程序存储器由两个部分组成:片内程序存储器ROM,8051/8751的容量为4KB,地址为0000H~0FFFH;片外程序存储器最多可扩至64KB,地址为1000H~FFFFH,片内外统一编址。并且通过引脚进行设置。
1.EA引脚的作用
当引脚接高电平(=1)时,80C51单片机程序计数器在0000H~0FFFH范围内(即前4KB地址)执行片内ROM中的程序;当指令地址超过0FFFH后,就自动转向执行片外ROM中的程序。80C51单片机从片内程序存储器和片外程序存储器取值时执行速度相同。
当引脚接低电平(=0)时,80C51单片机片内ROM不起作用,CPU只能从片外扩展的程序存储器ROM中取指令执行,片外扩展的程序存储器ROM的地址从0000H开始编址。这种接法特别适用于无片内程序存储器的8031型号的单片机。
CPU访问片内、片外ROM时,使用MOVC指令。
2.程序存储器中的保留单元
程序存储器的某些单元是留给系统使用的,见表2-1。由于80C51单片机上电复位后,程序计数器的内容为0000H,所以CPU总是从0000H开始执行程序。存储单元0000H~0002H用做80C51单片机上电复位后引导程序的存放单元。使用时通常在这三个单元中存放一条转移指令(LJMP MAIN),那么程序就被引导到转移指令指定的程序段去执行。
表2-1 保留的存储单元
80C51单片机有5个中断源,在程序存储器中规定了5个中断服务程序的入口,并且在每个中断向量之间有8个单元提供用户使用。例如,外部中断0引脚(P3.2)有效时,向CPU发出中断申请,CPU响应的中断请求后自动将中断服务程序的入口地址0003H装入PC,程序就自动转向0003H单元开始执行。如果事先在0003H~000AH存入转移到中断服务程序的转移指令,则程序就被自动转移到指定的中断服务程序空间去执行。
2.4.2 80C51单片机的数据存储器
数据存储器RAM用于存放运算的中间结果、数据暂存和缓冲、标志位等。数据存储器空间也分成片内和片外两大部分,片内存储器空间为256B,地址范围为00H~0FFH;片外数据存储器空间可扩展为64KB,地址范围为0000H~0FFFFH。下面分别进行介绍。
1.片外RAM
片外数据存储器通过硬件电路可以扩展为64KB,地址范围为0000H~0FFFFH。使用时通过“MOVX”指令进行数据存取。
2.片内RAM
片内数据存储器共有128B,地址范围为00H~7FH。它们又分为三个部分:工作寄存器区、位寻址区和用户区。
1)地址为00H~1FH的32B定义为工作寄存器区,并且分成四组来使用,称为0组、1组、2组和3组。每组有8个工作寄存器,每个字节定义为一个工作寄存器,分别用R0~R7表示。每组寄存器均可选作CPU的当前工作寄存器组。若程序中并不需要四组寄存器,其余可以作一般RAM单元使用。CPU复位后,选中第0组寄存器为当前的工作寄存器。通过对程序状态字PSW中RS1、RS0的设置,可以选择其他组为当前工作寄存器,见表2-2。
2)地址为20H~2FH的单元为“位寻址区”,这16B既可以按字节寻址,也可以按位寻址。这16B总共128bit,每1bit都有唯一的位地址,可通过位寻址方式访问其各位,其位地址分布见表2-3。
表2-2 工作寄存器地址表
表2-3 RAM位寻址区地址表
3)地址为30H~7FH的单元为用户区,用户可以在这个区域存取数据,也可以定义为堆栈区。
对于128B的RAM区,CPU访问时可以采用字节地址或位地址方式。如果访问位地址区,就用位寻址方式,否则可以采用直接寻址或间接寻址方式。
位寻址能力是80C51单片机的一个重要特点。这些可寻址位,通过执行指令可直接对某一位操作,如置1、清0等,可用作软件标志位或用于位(布尔)处理。
2.4.3 80C51单片机的特殊功能寄存器
80C51单片机片内RAM的地址空间80H~FFH为特殊功能寄存器(SFR)区,有21个特殊功能寄存器,它们离散地分布在80H~FFH的RAM空间中。访问特殊功能寄存器只允许使用直接寻址方式,这些特殊功能寄存器见表2-4所示。
在表2-4中,有21个特殊功能寄存器,有些特殊功能寄存器的符号地址上标有“※”号,它表示该特殊功能寄存器既可以位寻址也可以字节寻址。表中有10个寄存器是既可以
表2-4 80C51单片机特殊功能寄存器表
位寻址也可以字节寻址,特征是它们的字节地址正好能被8整除,其地址分布见表2-5。下面介绍部分特殊功能寄存器,其余将在后续章节中讲述。
表2-5 特殊功能寄存器地址表
(续)
1)累加器ACC是80C51单片机最常用的8位特殊功能寄存器;在执行运算指令时,许多指令的操作数取自于ACC,许多运算中间结果也存放于ACC中。在指令系统中用A作为累加器ACC的助记符。
2)寄存器B在乘、除指令中使用最多。乘法指令的两个操作数分别取自A和B,乘积存于B和A两个8位寄存器中。详见乘除法指令,在其他指令中,B可作为一般通用寄存器或一个RAM单元使用。
3)程序状态字寄存器PSW,它的8位包含了程序执行后的状态信息,供程序查询和判断之用。其各位含义如下:
CY:进位、借位标志位,有进位、借位时CY=1,否则CY=0。
AC:辅助进位、借位标志位,当高半字节与低半字节间有进位或借位时AC=1,否则AC=0。
F0:用户标志位,由用户自己定义。
RS1、RS0:当前工作寄存器组选择位,工作寄存器地址表见表2-2。
OV:溢出标志位,有溢出时OV=1,否则OV=0。
P:奇偶标志位,存于ACC中的运算结果有奇数个1时P=1,否则P=0。
4)8位堆栈指针寄存器SP,它总是指向栈顶。80C51单片机的堆栈通常设在30H~7FH这一段RAM中。在系统上电或复位时,SP的初始值为07H,可以在初始化程序中重新设置。
80C51单片机堆栈操作遵循“先进后出,后进先出”的原则:入栈操作时,首先执行SP加1操作,然后数据入栈存入SP指向的单元;出栈操作时,先将SP指向单元的数据弹出,然后执行SP减1操作,这时SP指向的单元是新的栈顶。由此可见,80C51单片机的堆栈区是向地址增大的方向生成的。
5)16位数据指针寄存器DPTR,通常作为地址寄存器使用,用于存放16位地址,也可以分成两个8位寄存器DPH和DPL使用。可以对片外64KB范围的RAM/ROM数据进行间接寻址或变址寻址操作。
6)并行I/O端口锁存器P0~P3,它们都可以进行位寻址和字节寻址。每一条I/O线均可以作为输入和输出使用,输出时可以锁存数据,输入时可以进行数据缓冲。