2.4 存储器结构
存储器是单片机的3大部件之一,主要用来存储信息(即数据和程序)。存储器按配置方法分为主存和外存。“主存”又称为“内存”,用于存放当前执行的数据和程序;“外存”用于存放暂不执行的数据和程序。目前单片机主要配置内存。
存储器结构分为独立的两部分:数据存储器(RAM)和程序存储器(ROM)。8051单片机的存储器可分为4个存储空间:片内程序存储器(片内ROM)、片外程序存储器(片外ROM)、片内数据存储器(片内RAM)、片外数据存储器(片外RAM)。
这4类存储器与其对应的地址关系,如表2.2所示。
表2.2 RS1、RS0与寄存器R0~R7间的对应关系
8051单片机片内有4KB的程序存储器和256B的数据存储器,还可以片外扩展至64KB程序存储器和64KB数据存储器。关于这部分内容将在系统扩展部分介绍。
2.4.1 程序存储器
程序存储器设计人员编写的程序就存放在单片机的程序存储器中,也称为“只读程序存储器”(ROM)。程序和数据一样,都是由机器码组成的代码串,只是程序代码存放于程序存储器中。
51系列单片机具有64KB程序存储器寻址空间,这64KB的地址空间是统一编址的,没有采用片内、片外分区的方式。区分片内、片外是由引脚上的电平来指示的。
◆ ,即接高电平时,CPU从片内的程序存储中读取程序,当PC值超过片内ROM的容量时,才会转向外部的程序存储器读取程序。
◆ ,即接低电平时,CPU从片外的程序存储中读取程序,并输出选通信号。
◆ 对于内部无ROM的8031单片机,其ROM只能外接,必须使。
程序存储器由16位的程序计数器(PC)指示当前地址。片内ROM的地址为0000H~0FFFH。单片机启动复位后,程序计数器(PC)的内容为0000H,系统将从0000H单元开始执行程序。
在程序存储器中的0003H~0032H,共48B被保留专用于中断处理程序,称为中断矢量区,系统必须跳过这一区域。
◆ 0000H~0002H单元:系统复位后,PC为0000H,单片机从0000H单元开始执行程序,如果程序不从0000H单元开始执行,则应在这三个单元中存放一条无条件转移指令,让系统跳过这一区域,直接去执行用户指定的程序。
◆ 0003H~002AH:这40个单元各有用途,被均匀地分为6段,其定义如表2.3所示。
表2.3 中断入口地址
以上地址单元是专门用于存放中断处理程序的。中断响应后,按中断的类型自动转到各自的中断区去执行程序。这些地址单元不能用于存放程序的其他内容,只能存放中断服务程序。通常情冴下,每段只有8个地址单元不能保存完整的中断服务程序,因而一般在中断响应的地址区,存放一条无条件转移指令,指向程序存储器的真正存放中断服务程序的空间。这样中断响应后,CPU读到这条转移指令,便转向真正存放中断服务程序的空间,继续执行中断服务程序。
2.4.2 数据存储器
数据存储器也称为“随机存取数据存储器”。51系列单片机的数据存储器在物理逻辑上分为两个地址空间,即片内数据存储区和片外数据存储区。片内RAM有256B的用户数据存储区域(不同型号有所区别),是用于存放执行的中间结果和过程数据的51系列单片机的。数据存储器均可读/写,部分单元还可以位寻址,其结构示意图如图2.5所示。
图2.5 数据存储器结构示意图
51系列单片机内部RAM共有256个单元(不同型号有所区别),这256个单元按其功能分为两部分。
1.低128B片内RAM
低128B片内RAM,地址空间为00H~7FH单元,为用户数据RAM,可以存放运算结果和标志位等。该区域按其功能还可分为如下3个区域。
00HH~1 FHH:工作寄存器区,开辟了4组工作寄存器,每组R0~R7,在前面寄存器一节进行过详细介绍。
20HH~2 FHH:位寻址区,共16B,128位。布尔处理的存储空间就是位寻址区,既可作为一般单元用字节寻址,也可以进行位寻址。该区域除了作为一般RAM进行读/写外,还可进行执行置“1”、清“0”、求反、转移、传送和逻辑等位操作。位寻址区地址表如表2.4所示。
表2.4 位寻址区位地址表
30H~7FH:字节寻址区,共80B,用户使用的一般RAM,可在此区域开辟堆栈。
2.高128B片内RAM
高128B片内RAM:地址空间为80H~FFH地址单元,为特殊功能寄存器(SFR)区。8051内部有21个特殊寄存器,AT89S52有32个特殊寄存器,如表2.5所示。
表2.5 特殊功能寄存器(SFR)
说明:
带*号的特殊功能寄存器都是可以位寻址的寄存器。
特殊功能寄存器分散在30H~7FH片内RAM区,其中有部分地址单元未定义,不能使用。访问特殊功能寄存器使用直接寻址方式,其中有一部分(表中带*号)特殊功能寄存器也可以采用位寻址,其特征是地址能被8整除。访问这些寄存器中的各位时,在位寻址指令中,可以用“寄存器名.位”、“字节地址.位”、“位地址”、“位名称”等来表示。例如“B.5”表示寄存器B的第5位。可位寻址的特殊功能寄存器及其位地址如表2.6所示。
表2.6 可位寻址的特殊功能寄存器及其位地址
2.4.3 存储器扩展
51系列单片机为了满足不同应用的需要,除了设置内部存储器外,还可以根据需要进行外部存储器扩展。外部存储器扩展时,采用P0和P2作为16位地址总线的低8位和高8位,另外,P0口还分时复用为8位数据总线。
1.外部程序存储器扩展
与普通的8051单片机不同,AT89S52内部设有8KB的可擦写Flash存储器。这个程序存储器可从外部扩展至56KB,这时需要将单片机的引脚接高电平。在外部扩展程序存储器情冴下,程序可以首先从片内的程序存储器开始顺序执行,访问时CPU会自动转向外部程序存储器。
当CPU访问外部程序存储器的时候,程序存储器指针(PC)的低8位地址由P0口输出,PC的高8位地址由P2口输出。P2口和P0口共同组成16位地址总线。外部程序存储器中的指令代码由P0口输入,即P0口是低8位地址线和8位数据线的分时复用。
为了保证在访问外部程序存储器期间,16位的地址码不变,并且能正确地从P0口读入程序代码,应该将P0口输出的低8位地址在ALE信号的控制下存入地址锁存器,这样便可以将P0口空出来读取8位的程序代码。
如果引脚接低电平,则CPU直接从片外程序存储器的0000H地址开始执行,而不管片内8KB的Flash是否含有程序代码。
2.外部数据存储器扩展
AT89S52单片机内部的256B的RAM如果不够用,外部还可以扩展64KB的数据存储器空间。
由于访问外部数据存储器是随机的,因此其访问地址可由工作寄存器R0或R1来寻址256B单元或由数据指针(DPTR)寻址54KB的空间。
访问外部数据存储器的硬件结构和访问外部程序程序器相同。R0或R1的8位地址由P0口送入地址锁存器输出,DPTR的16位地址则由P0口输出低8位地址到锁存器中,P2口则输出高8位地址。读/写的数据由P0口输入/输出,因此P0口仍然是地址/数据分时复用的。
访问外部数据MOVX类指令是单字节双周期指令,因此在第二个机器周期ALE信号将减少一次。
访问外部数据存储器的读/写选通信号为和,均为低电平有效。访问外部程序和数据存储器各有不同的地址指针PC、Ri、DPTR,各指针又有不同的读或者读/写选通信号、。这就从结构上把程序存储器和数据存储器的访问截然分开。两者虽然同用16位地址总线,由于使用两套完全不同的地址指针和读、读/写选通信号,从而保证了指令的执行不会出错,为单片机的应用提供了方便。
访问内部RAM用MOV类指令,访问片内RAM还是特殊功能寄存器则由寻址方式来区分。
◆ 访问特殊功能寄存器只能用直接寻址方式。
◆ 访问外部数据存储器则需选用MOVX类指令。
◆ 对于只需寻址256B单元的可采用Ri进行8位地址间接寻址,否则选用DPTR16位地址指针,寻址64KB地址空间。
◆ 读取程序存储器中的固定数据,则需选用MOVC类指令。
可见,访问不同地址空间的数据需要采用不同的指令类型。