
3.1 8051单片机的存储器结构
3.1.1 存储器的概念和分类
存储器是储存二进制信息的数字电路器件。微型机的存储器包括主存储器和外存储器。外存储器(外存)主要指各种大容量的磁盘存储器、光盘存储器等;主存储器(内存)是指能与CPU直接进行数据交换的半导体存储器。存储器是计算机中不可缺少的重要部件。半导体存储器具有存取速度快、集成度高、体积小、可靠性高、成本低等优点。单片机是微型机的一种,它的主存储器也采用半导体存储器。
1.半导体存储器的基本概念
位:信息的基本单位是位(bit或b),表示一个二进制信息“1”或“0”。在存储器中,位信息是由具有记忆功能的半导体电路实现的。例如用触发器记忆一位信息。
字节:在微型机中信息大多是以字节(Byte或B)形式存放的。一个字节由8位信息组成(1B=8bit),通常称做一个存储单元。
存储容量:存储器芯片的存储容量是指一块芯片中所能存储的信息位数。例如8K×8位的芯片,其存储容量为8×1024×8位=65536位信息。存储体的存储容量则是指由多块存储器芯片组成的存储体所能存储的信息量,一般以字节的数量表示。
地址:地址表示存储单元所处的物理空间的位置,用一组二进制代码表示。地址相当于存储单元的“单元编号”,CPU可以通过地址码访问某一存储单元,一个存储单元对应一个地址码。例如,8051单片机有16位地址线,能访问的外部存储器最大地址空间为64K(65536)字节,对应的16位地址码为0000H~FFFFH:第0个字节的地址为0000H,第1个字节的地址为0001H,…,第65535个字节的地址为FFFFH。
存取周期:是指存储器存放或取出一次数据所需的时间。存储容量和存取周期是存储器的两项重要性能指标。
2.半导体存储器的分类
半导体存储器按读、写功能可以分为随机读/写存储器RAM(Random Access Memory)和只读存储器ROM(Read Only Memory)。
随机读/写存储器RAM可以进行多次信息写入和读出,每次写入后,原来的信息将被新写入的信息所取代。另外,RAM在断电后再通电时,原存的信息全部丢失。它主要用来存放临时的数据和程序。
RAM按生产工艺,可以分为双极型RAM和MOS RAM,而MOS RAM又分为静态RAM(SRAM)和动态RAM(DRAM)。
(1)双极型RAM:以晶体管触发器作为基本存储电路,存取速度快,但结构复杂、集成度较低,比较适合用于小容量的高速暂存器。
(2)MOS RAM:以MOS管作为基本集成元件,具有集成度高、功耗低、价格便宜等优点,现在微型计算机一般采用MOS RAM。
只读存储器ROM的信息一旦写入后,便不能随机修改。在使用时,只能读出信息,而不能写入,且在掉电后ROM中的信息仍然保留。它主要用来存放固定不变的程序和数据。
ROM按不同的编程写入方式,可以分为以下几种。
(1)掩膜ROM:其存储的信息在制造过程中采用一道掩膜工艺生成,一旦出厂,信息就不可改变。
(2)可编程只读存储器PROM:其存储的信息可由用户通过特殊手段一次性写入,但只能写入一次。
(3)可擦除只读存储器:其存储的信息用户可以多次擦除,并可用专用的编程器重新写入新的信息。可擦除只读存储器又可分为紫外线擦除的EPROM、电擦除的EEPROM和Flash ROM。
3.1.2 8051单片机存储器的组织结构
1.微型机存储器的结构形式
1)普林斯顿结构
一般的微型机(如个人电脑PC机),它的存储器采用普林斯顿结构,程序和数据共用一个存储器逻辑空间,统一编址(如图3.1所示)。
2)哈佛结构
8051单片机的存储器则采用哈佛结构,程序与数据分为两个独立存储器逻辑空间,分开编址(如图3.2所示)。8051单片机的数据存储器空间和程序存储器空间相互独立。因为单片机主要面向测控对象,通常有大量的控制程序和较少的随机数据。为了将程序和数据分开,单片机使用较大容量的程序存储器来固化程序代码,使用少量的数据存储器来存取随机数据。程序在只读存储器ROM中运行,不易受外界侵害,可靠性高。

图3.1 普林斯顿结构

图3.2 哈佛结构
2.8051存储器地址空间的组成
8051单片机存储器,从物理结构上可分为4个存储器地址空间:
(1)片内程序存储器空间;
(2)片外程序存储器空间;
(3)片内数据存储器空间;
(4)片外数据存储器空间。
8051单片机存储器,从逻辑结构上可分为3个存储器地址空间:
(1)64KB程序存储器;
(2)256B片内数据存储器;
(3)64KB片外数据存储器。
3.8051存储器的组织结构
1)8051程序存储器(ROM)的组织结构
8051单片机有64KB 程序存储器空间,空间地址为0000H~0FFFFH,根据引脚的不同输入电平,来选择片内或片外低位存储单元。
(31脚):访问程序存储器选择信号输入线。当
为低电平时,CPU只能访问外部程序存储器;当
为高电平时,CPU可访问内部程序存储器(当8051单片机的PC值小于等于0FFFH时),也可访问外部程序存储器(当PC值大于0FFFH时),如图3.3所示。

图3.3 8051程序存储器结构示意图
2)8051数据存储器(RAM)的组织结构
(1)64KB片外数据存储器空间(与扩展I/O接口共用)。
8051单片机外部可扩展64KB的片外数据存储器空间(与扩展的外部I/O接口共用),空间地址为0000H~0FFFFH。注意:8051单片机扩展的外部数据存储器和外部I/O接口共用一个地址空间,统一编址。
(2)256B片内数据存储器。
8051内部RAM有256个单元,空间地址为00H~0FFH,包括片内RAM和特殊功能寄存器SFR。8051单片机的片内RAM和特殊功能寄存器SFR共用一个地址空间,统一编址。
3.1.3 8051内部数据存储器——内部RAM
8051内部RAM有256个单元,通常在空间上分为两个区域:低128个单元(00H~7FH)的内部数据RAM块和高128个单元(80H~0FFH)的专用寄存器SFR块。
1.内部RAM低128单元
8051低128个单元是真正的内部数据RAM区,是一个多功能复用型数据存储器,其按用途可分为三个区域。如图3.4所示。
1)工作寄存器区(00H~1FH)
也称为通用寄存器区,该区域共有4组寄存器,每组由8个寄存单元组成,每个单元8位。各组均以R0~R7为寄存器编号,共32个单元,单元地址为00H~1FH。
在任一时刻,CPU只能使用其中一组通用寄存器,称为当前通用寄存器组,具体可由程序状态寄存器PSW中RS1、RS0位的状态组合来确定。通用寄存器为CPU提供了就近存取数据的便利,提高了工作速度,也为编程提供了方便。

图3.4 8051内部RAM低128单元配置
2)位寻址区(20H~2FH)
位寻址区是指CPU可以对其中的每一个二进制位单独进行读、写操作的区域。
位寻址区的地址为内部RAM的20H~2FH,共16个单元,计16×8位=128位,而位地址为00H~7FH。位寻址区既可作为一般的RAM区进行字节操作,也可对单元的每一位进行位操作,因此称为位寻址区,是存储空间的一部分。例如,可以对位地址为“00H”的位存储单元中写入“1”。如表3.1列出了内部RAM位寻址区中每一位可访问二进制位的位地址。
表3.1 位寻址区的位地址

其中:MSB——最高有效位;
LSB——最低有效位。
3)用户RAM区(30H~7FH)
所剩80个单元即为用户RAM区,单元地址为30H~7FH,在一般应用中把堆栈设置在该区域中。
对内部RAM低128单元的使用做几点说明:
(1)8051的内部RAM 00H~7FH单元可采用直接寻址或间接寻址方式实现数据传送。
(2)内部RAM 20H~2FH单元的位地址空间可实现位操作。当前工作寄存器组可通过软件对PSW中的RS1、RS0位的状态设置来选择。
(3)8051的堆栈是自由堆栈,单片机复位后,堆栈底为07H,在程序运行中可任意设置堆栈。堆栈设置通过对SP的操作实现,例如用指令“MOV SP,#30H”将堆栈设置在内部RAM 30H以上单元。
2.内部RAM高128单元
内部RAM高128单元是供给专用寄存器使用的,因此称之为专用寄存器区,也称为特殊功能寄存器区(SFR区),单元地址为80H~0FFH。8051共有22个专用寄存器,其中程序计数器PC在物理上是独立的,没有地址,故不可寻址,它不属于内部RAM的SFR区。其余的21个专用寄存器都属于内部RAM的SFR区,是可寻址的,它们的单元地址离散地分布于80H~0FFH。如表3.2所示为21个专用寄存器一览表。
表3.2 8051专用寄存器一览表

注:带“·”专用寄存器表示可以进行位操作。
1)程序计数器PC(Program Counter)
PC是一个16位计数器,其内容为单片机将要执行的指令机器码所在存储单元的地址。PC具有自动加1的功能,从而实现程序的顺序执行。由于PC是不可寻址的,因此用户无法对它直接进行读写操作,但可以通过转移、调用、返回等指令改变其内容,以实现程序的转移。PC的寻址范围为64KB,即地址空间为0000H~0FFFFH。
以上关于程序计数器PC的叙述表明:
(1)PC中存放的内容恒为16位地址信息;
(2)PC中存放的16位地址信息是单片机即将执行的指令机器码所在存储区域的地址。
PC中的内容在单片机指令执行过程中具有自动加1的功能(转移类指令除外),以使单片机连续执行指令。当需要改变指令的执行顺序时,只要改变PC中的内容即可。
2)累加器ACC(简写A)
累加器ACC是8位寄存器,是最常用的专用寄存器,功能强、地位重要。它既可存放操作数,又可存放运算的中间结果。MCS-51系列单片机中许多指令的操作数来自累加器ACC。累加器非常繁忙,是单片机的执行程序瓶颈,制约了单片机工作效率的提高,现在已经有些单片机用寄存器阵列来代替累加器ACC。
3)数据指针DPTR
数据指针DPTR为16位寄存器,它是MCS-51中唯一的一个16位寄存器。编程时,既可按16位寄存器使用,也可作为两个8位寄存器分开使用。DPH为DPTR的高8位寄存器,DPL为DPTR的低8位寄存器。DPTR通常在访问外部数据存储器时作为地址指针使用,寻址范围为64KB。
总结8051单片机内部RAM单元分布如图3.5所示。

图3.5 8051单片机内部RAM单元分布图
3.1.4 8051内部程序存储器——内部ROM
大多数51系列单片机内部都配置一定数量的程序存储器ROM,如图3.6所示。如8051芯片内有4KB掩膜ROM存储单元,AT89C51芯片内部配置了4KB Flash ROM,它们的地址范围均为0000H~0FFFH。内部程序存储器有一些特殊单元,使用时要注意。
ROM中一组特殊单元是0000H~0002H。单片机通电或复位后,(PC)=0000H,这样单片机就从0000H单元开始执行指令。如果此时单片机的应用程序存放在其他区域,就要在这三个单元中存放一条无条件转移指令,以便转去执行指定区域的应用程序。
另外,在程序存储器中专门开辟了各个中断源的入口向量地址区域,以便为中断技术服务(中断的概念以后讲述),分配如下。
0003H~000AH:外部中断0中断地址区。
000BH~0012H:定时器/计数器0中断地址区。
0013H~001AH:外部中断1中断地址区。
001BH~0022H:定时器/计数器1中断地址区。
0023H~002AH:串行中断地址区。
中断地址区首地址为各个中断源的入口向量地址,每个中断地址区有8个地址单元。在中断地址区中应存放中断服务程序,但8个单元通常难以存下一个完整的中断服务程序,因此往往需要在中断地址区首地址中存放一条无条件转移指令,转去中断服务程序真正的入口地址。
从002BH开始的单元才是用户可以随意使用的程序存储器。
对程序存储器的操作做以下说明:
(1)程序指令的自主操作。CPU按照PC指针自动地从程序存储器中取出指令。
(2)用户使用指令对程序存储器中的常数表格进行读操作,可用MOVC指令实现。

图3.6 8051单片机内部ROM单元分布图