MCS-51系列单片机的存储器组织采用的是哈佛(Harvard)结构,即将程序存储器和数据存储器分开,程序存储器和数据存储器具有各自独立的寻址方式、寻址空间和控制信号。这种结构对于单片机“面向控制”的实际应用较为方便。MCS-51的存储器结构如图2-7所示(内部数据RAM的高128B仅为52子系列单片机拥有,51子系列无)。
MCS-51系列(8031和8032除外)有4个物理上相互独立的存储器空间,即内、外程序存储器和内、外数据存储器。逻辑上分为3个存储空间,即片内外统一编址的64KB的程序存储器地址空间、256B的片内数据存储器及64KB的片外数据存储器地址空间(可扩展数据RAM或I/O接口)。
(c)外部数据存储器空间 (b)内部数据存储器RAM (a)程序存储器空间
图2-7 MCS-51单片机存储器结构(1)
MCS-51系列中,8031内部没有用于存储程序的ROM存储器,8051和8751有4KB的ROM存储器,地址范围为0000H~0FFFH。无论8031还是8051,都可以外接外部ROM,但片内和片外之和不能超过64KB。8051有64KB的ROM寻址区,其中0000H~0FFFH的4KB地址区可以为片内ROM和片外ROM公用,1000H~FFFFH的60KB地址区为片外ROM所专用。在0000H~0FFFH的4KB地址区,片内ROM可以占用,片外ROM也可以占用,但不能为两者同时占用。为了指示机器的这种占用,器件设计者为用户提供了一个专用的控制引脚EA。若EA接+5V高电平,则机器使用片内4KB ROM;若EA接低电平,则机器自动使用片外ROM,如图2-8(a)所示。由于8031片内无ROM,故它的EA应接地。
图2-8 MCS-51单片机存储器结构(2)
单片机复位后,程序计数器PC的值为0000H,单片机自动从0000H开始取指执行,但要注意0003H~0023H有5个中断入口地址,主程序一般放在0023H之后的存储器单元中。因此,一般都在0000H单元放一条绝对跳转指令,用户程序则从转移后的地址开始执行。以下是5个中断入口地址。
· 0003H:外部中断INT0入口。
· 000BH:定时器T0中断入口。
· 0013H:外部中断INTl入口。
· 001BH:定时器T1中断入口。
· 0023H:串行口中断入口。
RAM存储器主要用来存放数据,故它又称为数据存储器。MCS-51的RAM存储器有片内和片外之分:片内RAM共128个,地址范围为00H~7FH,片外RAM共有64KB,地址范围为0000H~FFFFH。因此,MCS-51的RAM的实际存储容量是超过64KB的,如图2-8(b)所示。为了指示机器到片内RAM寻址还是到片外RAM寻址,单片机器件设计者为用户提供了两类不同的传送指令:MOV指令用于片内00H~FFH范围内的寻址,MOVX指令用于片外0000H~FFFFH范围内的寻址。
片内数据存储器的8位地址一共可寻址256个字节单元,51子系列单片机将其分为两个区:00H~7FH的128个单元为片内RAM区,可以读、写任何数据;80H~FFH的高128个单元为专用寄存器区,即为特殊功能寄存器(Special Function Register,SFR)区。
在低128个字节的内部RAM中,前32个单元(地址为00H~1FH)为通用工作寄存器区,共分为4组(寄存器0组、1组、2组、3组),每组8个工作寄存器由R0~R7组成,共占32个单元。选用哪一组由程序状态字PSW中的RS1、RS0这两位的设置决定,见表2-1。这个特点使MCS-51具有快速现场保护功能,能够提高执行程序的效率和响应中断的速率。若程序并不需要4组工作寄存器,那么剩下的工作寄存器可作为一般的存储器来使用。CPU在复位时自动选中0组。
20H~2FH的16个单元为位寻址区,30H~7FH为通用用户RAM区,主要用于存放用户程序的中间数据。
如表2-2所示,20H~2FH的16个单元为位寻址区,每个单元8位,共128位,其位地址范围为00H~7FH。位寻址区的每一位都可当作软件触发器,由程序直接进行位处理。程序中通常把各种程序状态标志、位控制变量设在位寻址区。同样,位寻址区的RAM单元也可作为一般的数据存储器按字节单元使用。具体位地址单元如表2-2所示。
表2-2 内部数据存储器中的位地址
字节地址 |
位 地 址 | |||||||
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 | |
2FH |
7FH |
7EH |
7DH |
7CH |
7BH |
7AH |
79H |
78H |
续上表
字节地址 |
位 地 址 | |||||||
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 | |
2EH |
77H |
76H |
75H |
74H |
73H |
72H |
71H |
70H |
2DH |
6FH |
6EH |
6DH |
6CH |
6BH |
6AH |
69H |
68H |
2CH |
67H |
66H |
65H |
64H |
63H |
62H |
61H |
60H |
2BH |
5FH |
5EH |
5DH |
5CH |
5BH |
5AH |
59H |
58H |
2AH |
57H |
56H |
55H |
54H |
53H |
52H |
51H |
50H |
29H |
4FH |
4EH |
4DH |
4CH |
4BH |
4AH |
49H |
48H |
28H |
47H |
46H |
45H |
44H |
43H |
42H |
41H |
40H |
27H |
3FH |
3EH |
3DH |
3CH |
3BH |
3AH |
39H |
38H |
26H |
37H |
36H |
35H |
34H |
33H |
32H |
31H |
30H |
25H |
2FH |
2EH |
2DH |
2CH |
2BH |
2AH |
29H |
28H |
24H |
27H |
26H |
25H |
24H |
23H |
22H |
21H |
20H |
23H |
1FH |
1EH |
1DH |
1CH |
1BH |
1AH |
19H |
18H |
22H |
17H |
16H |
15H |
14H |
13H |
12H |
11H |
10H |
21H |
0FH |
0EH |
0DH |
0CH |
0BH |
0AH |
09H |
08H |
20H |
07H |
06H |
05H |
04H |
03H |
02H |
01H |
00H |
内部RAM的高128个字节(80H~FFH)为特殊功能寄存器SFR区,其中51子系列有21个,52子系列有26个,它们离散地分布在这个区中,分别用于CPU并行口、串行口、中断系统、定时器/计数器等功能单元控制和状态寄存器。这些专用寄存器的地址映像如表2-3所示,除这21个特殊功能寄存器地址之外的其他单元是空闲没用的,不能被访问,在使用时应加以注意。
表2-3 特殊功能寄存器地址及功能表
名 称 |
符 号 |
字节 地址 |
位功能标记/位地址 | |||||||
B寄存器 |
B |
F0H |
B.7/F 7 |
B.6/F6 |
B.5/F5 |
B.4/F4 |
B.3/F3 |
B.2/F2 |
B.1/F1 |
B.0/F0 |
累加器 |
A |
E0H |
ACC.7 /E7 |
ACC.6 /E6 |
ACC.5 /E5 |
ACC.4 /E4 |
ACC.3 /E3 |
ACC.2 /E2 |
ACC.1 /E1 |
ACC.0 /EO |
程序状态 字寄存器 |
PSW |
D0H |
CY /D7 |
AC /D6 |
F0 /D5 |
RSl /D4 |
RS0 /D3 |
OV /D2 |
X /D1 |
P /D0 |
中断优先 级寄存器 |
IP |
B8H |
— |
— |
— |
PS /BC |
PTl /BB |
PXl /BA |
PT0 /B9 |
PX0 /B8 |
P3端口 寄存器 |
P3 |
B0H |
P3.7 /B7 |
P3.6 /B6 |
P3.5 /B5 |
P3.4 /B4 |
P3.3 /B3 |
P3.2 /B2 |
P3.1 /B1 |
P3.0 /B0 |
续上表
名 称 |
符 号 |
字节 地址 |
位功能标记/位地址 | |||||||
中断允许 寄存器 |
IE |
A8H |
EA /AF |
— |
— |
ES /AC |
ETl /AB |
EXl /AA |
ET0 /A9 |
EX0 /A8 |
P2端口 寄存器 |
P2 |
A0H |
P2.7 /A7 |
P2.6 /A6 |
P2.5 /A5 |
P2.4 /A4 |
P2.3 /A3 |
P2.2 /A2 |
P2.1 /A1 |
P2.0 /A0 |
串行口控 制寄存器 |
SCON |
98H |
SM0 /9F |
SM1 /9E |
SM2 /9D |
REN /9C |
TB8 /9B |
RB8 /9A |
TI /99 |
RI /98 |
P1端口 寄存器 |
P1 |
90H |
P1.7 /97 |
P1.6 /96 |
P1.5 /95 |
P1.4 /94 |
P1.3 /93 |
P1.2 /92 |
P1.1 /91 |
P1.0 /90 |
定时控制 寄存器 |
TCON |
88H |
TFl /8F |
TRl /8E |
TF0 /8D |
TR0 /8C |
IEl /8B |
ITl /8A |
IE0 /89 |
IT0 /88 |
P0端口 寄存器 |
P0 |
80H |
P0.7 /87 |
P0.6 /86 |
P0.5 /85 |
P0.4 /84 |
P0.3 /83 |
P0.2 /82 |
P0.1 /81 |
P0.0 /80 |
串行数据 寄存器 |
SBUF |
99H |
— |
— |
— |
— |
— |
— |
— |
— |
定时器1 的高8位 |
THl |
8DH |
— |
— |
— |
— |
— |
— |
— |
— |
定时器0 的高8位 |
TH0 |
8CH |
— |
— |
— |
— |
— |
— |
— |
— |
定时器1 的低8位 |
TLl |
8BH |
— |
— |
— |
— |
— |
— |
— |
— |
定时器0 的低8位 |
TL0 |
8AH |
— |
— |
— |
— |
— |
— |
— |
— |
定时器方 式选择 |
TMOD |
89H |
— |
— |
— |
— |
— |
— |
— |
— |
电源及波 特率选择 |
PCON |
87H |
— |
— |
— |
— |
— |
— |
— |
— |
数据高8 位指针 |
DPH |
83H |
— |
— |
— |
— |
— |
— |
— |
— |
数据低8 位指针 |
DPL |
82H |
— |
— |
— |
— |
— |
— |
— |
— |
堆栈指针 |
SP |
81H |
— |
— |
— |
— |
— |
— |
— |
— |
注:-表示该位地址无效。
由表2-3可见,在特殊功能寄存器中也有字节地址和位地址这套地址。它们在地址空间上都是80H~FFH,但对字节地址而言只有21个有效,对位地址只有83个是有效的(凡字节地址可被8整除的SFR可位寻址)。
SFR分别属于以下各个功能单元。
· CPU:ACC、B、PSW、SP、DPTR(由DPH和DPL组成)、PCON。
· 并行口:P0、P1、P2、P3。
· 中断系统:IE、IP。
· 定时器/计数器:TMOD、TCON、T0(由TH0和TL0组成)、T1(由THl和TLl组成)。
· 串行口:SCON、SBUF。
在这21个特殊功能寄存器中,与CPU相关的7个SFR已在上一节作了介绍,这里不再赘述。其他的特殊功能寄存器由于其功能的特殊性,将在有关章节中进行详细介绍。
下面只简单地让读者有一个初步的了解。
(1)I/O端口P0~P3。
特殊功能寄存器组中的P0、P1、P2、P3分别为I/O端口的锁存器,用于I/O端口的读/写操作。
(2)串行口数据缓冲器SBUF。
串行数据缓冲器SBUF用于存放欲发送或已接收的数据,实际上在SBUF中有两个独立的寄存器,一个是发送缓冲器,另一个是接收缓冲器。当数据写入SBUF时,就被送到发送缓冲器中准备发送,而从SBUF读出数据时,则数据一定取自接收缓冲器。
(3)定时器寄存器。
芯片中两个16位定时器/计数器T0和T1,各自由两个独立的8位寄存器组成,分别是:TH0、TL0、TH1、TL1。
(4)控制寄存器。
特殊功能寄存器组中还包含有多个控制寄存器IP、IE、TMOD、TCON、SCON和PCON,它们分别用于中断系统、定时器/计数器、串行通信的控制及工作方式控制。
外部数据存储器又称外部RAM,当片内RAM不能满足数量上的要求时,可通过总线端口和其他I/O口扩展外部数据RAM,其最大容量可达64KB,其结构如图2-8(c)所示。外部数据存储器和内部数据存储器的功能基本相同,但前者不能用于堆栈操作。
必须注意,由于数据存储器与程序存储器地址重叠,且数据存储器的片内外的低字节地址重叠,所以对片内、片外数据存储器的操作使用了不同的指令。对片内RAM读/写数据时,无读/写信号(和)产生;对片外RAM读/写数据时,有读/写信号产生。同样,对程序存储器和数据存储器的操作也是靠不同的控制信号、或来区分的。
另外,在片外数据存储器中,数据区和扩展的I/O口是统一编址的,使用的指令也完全相同,因此用户在应用系统设计时,必须合理地进行外部RAM和I/O端口的地址分配,并保证译码的唯一性。