3.3 MCS-51单片机的存储器结构
MCS-51系列单片机存储器采用哈佛结构,即程序存储器和数据存储器完全分开,程序存储器和数据存储器各有自己的寻址方式、寻址空间和控制信号。
MCS-51系列单片机存储器从物理结构上可分为片内、片外程序存储器(8031 和8032无片内程序存储器)与片内、片外数据存储器等4部分;从功能上可分为64KB程序存储器空间、128B片内数据存储器空间、128B内部特殊功能寄存器空间、位地址空间和64KB片外数据存储器等5部分;其寻址空间可划分为:程序存储器、片内数据存储器和片外数据存储器3个独立的地址空间。
MCS-51单片机的程序存储器(ROM)和数据存储器(RAM),在使用上是严格区分的,不得混用。程序存储器通常存放程序指令、常数及表格等,系统在运行过程中不能修改其中的数据;数据存储器则存放缓冲数据,系统在运行过程中可修改其中的数据。
3.3.1 程序存储器
1.编址与访问
计算机的工作是按照事先编制好的程序命令序列逐条顺序执行的,程序存储器用来存放这些已编制好的程序和表格常数,它由只读存储器ROM或EPROM组成。计算机为了有序地工作,设置了一个专用寄存器——程序计数器PC。每取出指令的1个字节后,其内容自动加1,指向下一个字节,使计算机依次从程序存储器中取指令予以执行,完成某种操作。由于MCS-51单片机的程序计数器为16位,因此可寻址的地址空间为64KB。
MCS-51单片机从物理配置上可有片内、片外程序存储器,但作为一个编址空间,其编址规律为:先片内,后片外,片内、外连续,二者一般不重叠。图3-7所示为编址图。
图3-7 程序存储器编址图
单片机执行指令时,是从片内程序存储器取指令,还是从片外程序存储器取指令,由单片机引脚电平的高低来决定。= 1时,先执行片内程序存储器的程序,当PC的内容超过片内程序存储器地址的最大值(51子系列为0FFFH,52子系列为1FFFH)时,将自动转去执行片外程序存储器中的程序;=0时,CPU从片外程序存储器中取指令执行程序。对于片内无程序存储器的8031、8032单片机,引脚应接低电平。对于片内有程序存储器的单片机,如果引脚接低电平,将强行执行片外程序存储器中的程序。此时应在片外程序存储器中存放调试程序,以便对单片机进行调试工作。注意:片外程序存储器存放调试程序的部分,其编址与片内程序存储器的编址是可以重叠的,借的换接可实现分别访问。在现代单片机应用系统设计中,一般都选择片内带足够大程序存储器的单片机,所以不需要扩展片外的程序程序器,这样就可以直接将接高电平。
2.程序存储器中的6个特殊地址
程序地址空间原则上可由用户任意安排,但复位和5 个中断源的程序入口地址在MCS-51系列单片机中是固定的,用户不能更改。这些入口地址如表3-3所示。
表3-3 MCS-51系列单片机复位、中断入口地址
注:定时器/计数器2溢出或T2EX端负跳变(52子系列)中断源的程序入口地址为002BH。
表3-3中6个入口地址互相离得很近,只隔3个或8个单元,容纳不下稍长的程序段。所以其中实际存放的往往是一条无条件转移指令,使程序分别跳转到用户程序真正的起始地址,或跳转到所对应的中断服务程序的真正入口地址。
3.3.2 数据存储器
1.编址与访问
MCS-51单片机片内、外数据存储器是两个独立的地址空间,应分别单独编址。片内数据存储器除RAM块外,还有特殊功能寄存器(SFR)块。对于51子系列,前者有128个字节,其编址为00H~7FH;后者有128个字节,其编址为80H~0FFH;二者连续但不重叠。对52子系列,前者有256B,其编址为00H~0FFH;后者有128B,其编址为80H~0FFH。后者与前者高128B的编址是重叠的。由于访问它们所用的指令不同,并不会引起混乱。片外数据存储器一般是16位编址。数据存储器的编址如图3-8所示。
图3-8 数据存储器编址图
说明:① MS-51单片机的51子系列的内部数据存储器为128B,地址空间为00H~7FH,52子系列的内部数据存储器为256B,地址空间为00H~0FFH,特殊功能寄存器地址空间为80H~0FFH。显然,内部数据存储器区的80H~0FFH空间与特殊功能寄存器的地址重叠,但是通过指令中采取不同的寻址方式可解决这个重叠问题,即特殊功能寄存器只能用“直接寻址”方式,内部数据存储器80H~0FFH单元只能用“寄存器间接寻址”方式,也就是说,地址重叠不会造成混乱,只是在软件编程时应注意。
② 如果只扩展少量片外数据存储器,容量不超过256B,也可按8位编址,自00H开始,最大可至FFH。这种情况下,地址空间与片内数据存储器重叠,但访问片内、外用不同的指令,也不会引起混乱。
③ 片外数据存储器按16位编址,其地址空间与程序存储器重叠,但不会引起混乱,访问程序存储器是用信号控制,而访问片外数据存储器时,由信号(读)和信号(写)控制。
2.片内数据存储器
MCS-51单片机片内RAM共有128B,字节范围为00H~7FH。图3-9所示为51子系列单片机片内RAM的配置图。由图3-9可见,片内数据存储器共分为工作寄存器区、位寻址区、数据缓冲区共3个区域。
图3-9 MCS-51单片机内部RAM分布图
(1)工作寄存器区
00H~1FH单元为工作寄存器区。工作寄存器也称通用寄存器,用于临时寄存8位信息。工作寄存器分成4组,每组都是8个寄存器,用R0~R7来表示。程序中每次只用一组,其余各组不工作。使用哪一组寄存器工作,由程序状态字PSW中的PSW.3(RS0)和PSW.4(RS1)两位来选择,其对应关系如表3-4所示。
表3-4 工作寄存器组的选择表
通过软件设置RS0和RS1两位的状态,就可任意选一组寄存器工作。这个特点使MCS-51单片机具有快速现场保护的功能,对于提高程序效率和响应中断的速度是很有利的。
该区域当不被用做工作寄存器时,可以作为一般的RAM区使用。
(2)位寻址区
20H~2FH单元是位寻址区。这16个单元(共计16×8=128位)的每一位都赋予了一个位地址,位地址范围为00H~7FH。位地址区的每一位都可当做软件触发器,由程序直接进行位处理。通常可以把各种程序状态标志、位控制变量存入位寻址区内。
该区域当不被用做位寻址区时,可以作为一般的RAM区使用。
在这里要注意,位地址7FH和字节地址7FH是两个完全不同的概念。
(3)数据缓冲区
30H~7FH是数据缓冲区,即用户RAM,共80个单元。
由于工作寄存器区、位寻址区、数据缓冲区统一编址,使用同样的指令访问,这三个区的单元既有自己独特的功能,又可统一调度使用。因此,前两个区未使用的单元也可作为用户RAM单元使用,使容量较小的片内RAM得以充分利用。
52子系列单片机片内RAM有256个单元,前两个区的单元数与地址都与51子系列的一致,用户RAM区却为30H~0FFH,有208个单元。对于片内RAM区的字节地址80H~0FFH的区域,只能采用间接寻址方式进行访问。
(4)堆栈和堆栈指针
堆栈是按先进后出的原则进行读写的特殊RAM区域。MCS-51单片机的堆栈区是不固定的,原则上可以在内部RAM的任何区域内。实际应用中要根据对片内RAM各功能区的使用情况灵活设置,但应避开工作寄存器区、位寻址区和用户实际使用的数据区。
系统复位后,SP初始化为07H,所以第一个压入堆栈的数据存放在08H单元,即堆栈区是从07H单元开始的一部分连续存储单元。在编程时用户应将堆栈区设定在30H单元以上,如通过指令:
MOV SP,#60H
将堆栈区设定在从片内RAM60H开始的一部分连续单元。
3.3.3 特殊功能寄存器
特殊功能寄存器(SFR,Special Function Registers),又称为专用寄存器,专用于控制、管理片内算术逻辑部件、并行I/O接口、串行I/O接口、定时器/计数器、中断系统等功能模块的工作。用户在编程时可以置数设置,却不能自由地移作它用。各专用寄存器(PC例外)与片内RAM统一编址,且作为直接寻址字节可直接寻址。除PC外,51子系列单片机共有18个专用寄存器,其中3个为双字节寄存器,共占用21B;52子系列有21个专用寄存器,其中5个为双字节寄存器,共占用26B。按地址排列的各个特殊功能寄存器名称、表示符、地址如表3-5所示。
表3-5 特殊功能寄存器名称、符号、地址一览表
注:表中带*的寄存器与定时器/计数器2有关,只在52子系列芯片中存在。RLDH、RLDL也可写为RCAP2H、RCAP2L,分别称为定时器/计数器2捕捉高字节、低字节寄存器。
其中有12个专用寄存器可以位寻址,它们字节地址的低半字节为0H或8H(即可位寻址的特殊功能寄存器字节地址具有能被8整除的特征)。在表3-6中列出了这些位的位地址与位名称。
表3-6 特殊功能寄存器可位寻址的寄存器名称、位地址名称及地址表
注意,在SFR块地址空间80H~0FFH中,仅有21个(51子系列)或26个(52子系列)字节作为特殊功能寄存器离散分布在这128个字节范围内,其余字节无意义,用户不能对这些字节进行读/写操作。若对其进行访问,则将得到一个不确定的随机数,因而是没有意义的。
用户在使用特殊功能寄存器时,不需要记住特殊功能寄存器及其位的地址,只要记住特殊功能寄存器及位的名称就可以了,操作时对其名字进行操作。