3.1 单片机存储器
3.1.1 数据存储器
数据存储器(RAM)也称为随机存取数据存储器。MCS-51单片机的数据存储器在物理上和逻辑上都分为两个地址空间,一个内部数据存储区和一个外部数据存储区,如图3-1所示。8051内部RAM共有256个单元,通常把这256个单元分为两部分:低128单元(单元地址0x00~0x7F)和高128单元(单元地址0x80~0xFF)。

图3-1 数据存储器结构
1.片内数据存储器低128单元
8051单片机片内数据存储器低128字节用于存储程序执行过程中的各种变量和临时数据,使用时可分为工作寄存器区、可位寻址区和堆栈区,基本配置见表3-1。
表3-1 片内RAM低128单元的配置

(1)工作寄存器区。
8051单片机的工作寄存器区位于片内RAM的低32个单元,按地址由小到大分为4组,每个组包括8个8位的寄存器,地址由低到高依次命名为R0~R7。
在任一时刻,CPU只能使用其中一组寄存器,至于选用哪个工作寄存器组,由PSW中的RS0和RS1位确定,可由指令设置。单片机复位时RS0=0、RS1=0,因此工作寄存器组0为默认的工作寄存器组。
(2)位寻址区。
片内RAM的0x20~0x2F区间16个单元为固定的可位寻址存储区,可进行字节操作也可进行位寻址。每个单元有8位,16个单元共128位,每一位都有一个位地址,相应的位地址为0x00~0x7F。表3-2为片内RAM位寻址区的位地址,其中MSB表示高位,LSB表示低位。
表3-2 片内RAM位寻址区

(3)用户数据缓冲区。
剩下的80个单元就是片内RAM,供用户使用,地址单元为0x30~0x7F。对这部分区域的使用不作任何规定和限制,但在应用中一般把堆栈开辟在这个区域。
2.片内数据存储器高128单元
片内RAM的高128单元是供给特殊功能寄存器(SFR,也称专用寄存器)使用的。特殊功能寄存器是单片机各功能部件所对应的寄存器,用来存放相应功能部件的控制命令、状态和数据的区域。它们离散地分部在片内RAM的高128单元中,共21个字节,其分配情况见表3-3。
表3-3 特殊功能寄存器分配表

这些特殊功能寄存器中,凡是字节地址能被8整除(字节末位为0或者8)的特殊功能寄存器都是既可字节寻址又可位寻址的,否则,只能按字节寻址。可位寻址的特殊功能寄存器的每一位都有位地址,有的还有位名称、位编号。需要注意的是有的SFR有位名称,却无位地址,也不可以进行位寻址、位操作,如TMOD。全部特殊功能寄存器区可位寻址的位共有83位。
(1)常用的特殊功能寄存器。
1)程序计数器PC。
程序计数器PC是一个16位计数器,其内容为下一条将要执行指令的地址,寻址范围为64 KB。PC有自动加1的功能,从而控制程序的执行顺序。PC没有物理地址,是不可寻址的,因此用户无法对它进行读写。但可以通过转移、调用、返回等指令改变其内容,以实现程序的转移。
2)程序状态字PSW。
程序状态字PSW是一个8位的寄存器,用于存放程序运行中的各种状态信息。PSW的各位定义见表3-4。
表3-4 PSW各位的定义

① CY或C(PSW.7):进位标志位。(https://www.daowen.com)
② AC(PSW.6):辅助进位标志位,用于BCD码的十进制调整运算。
③ F0(PSW.5):用户自定义标志位。可用软件使它置1或清0,也可由软件来测试标志F0以控制程序的流向。编程时,该标志很有用。
④ RS1、RS0(PSW.4、PSW.3):4组工作寄存器区选择控制位1和位0。RS1、RS0与片内工作寄存器组的对应关系见表3-5。
表3-5 RS1、RS0与片内工作寄存器组的对应关系

⑤ OV(PSW.2):溢出标志位,指示运算是否产生溢出。
⑥ F1(PSW.1):保留位,未用。
⑦ P(PSW.0):奇偶标志位。存放累加器ACC数据的二进制形式中“1”的个数的奇偶性。一般用于异步串行通信中的奇偶校验。当ACC中“1”的个数为奇数时P=1,当ACC中“1”的个数为偶数时P=0。
(2)位操作与字节操作。
8051单片机有一部分存储器既可以位操作也可以字节操作,例如特殊功能寄存器TCON,存储器地址为0x88,存储器可字节寻址也可位寻址。
执行TCON=0x40与执行TR1=1时,TCON存储器结果如图3-2所示。

图3-2 字节操作与位操作结果
3.片外数据存储器
若片内RAM不够用时,可扩展片外数据存储器(片外RAM),最大范围为64 KB,称为XDATA区。在XDATA区进行分页寻址操作时,称为PDATA区。
3.1.2 程序存储器
51单片机的程序存储器用来存放编好的程序和程序执行过程中不会改变的原始数据。一般用于存放用户程序、数据和表格等信息。程序存储器内部结构如图3-3所示。

图3-3 程序存储器内部结构
MCS-51单片机按程序存储器可分为内部无ROM型(如8031)和内部有ROM型(如8051)两种。
51单片机片外最多能扩展64 KB程序存储器,片内外的ROM是统一编址的。如果单片机的
保持高电平,8051的程序计数器PC在0x0000~0x0FFF地址范围内,则执行片内ROM存储的程序,PC在0x1000~0xFFFF地址范围内,则自动执行片外程序存储器中的程序;如果单片机的
保持低电平,则只能寻址外部程序存储器,片外程序存储器的地址从0x0000开始编址。
程序存储器中有一部分存储单元用于特定功能:
第一组特殊单元是0x0000~0x0002。系统复位后,PC=0x0000,表示单片机从0x0000单元开始执行程序。
第二组特殊单元是0x0003~0x002A,共40个单元。这40个单元被平均分为5段,用作存储5个中断源的中断程序入口地址。
0x0003~0x000A:外部中断0中断入口地址存放区;
0x000B~0x0012:定时/计数器0中断入口地址存放区;
0x0013~0x001A:外部中断1中断入口地址存放区;
0x001B~0x0022:定时/计数器1中断入口地址存放区;
0x0023~0x002A:串行口中断入口地址存放区。