我们在学习传统的MCS-51单片机的时候,一定学习过51单片机的存储结构。传统的MCS-51存储器有三个空间,分别是片内RAM(内部数据存储器)、片外RAM(外部扩展的数据存储器) 和 ROM(内部或者外部程序存储器)。按照具体数据的物理存储空间来说,MCS-51单片机在有四个物理存储空间,它们分别是:片内程序存储器(片内ROM)、片外程序存储器(片外ROM)、片内数据存储器(片内RAM)、片外数据存储器(片外RAM)。
1 片内RAM空间
上述的这四种物理存储空间中,最早的8031单片机,只有数据存储器即内部RAM是标配的,其他都需要外扩,而到来的8051兼容机中,内部的数据存储器(RAM)和内部的程序存储器(ROM)都成了标配。只不过更加不同型号,RAM和ROM的大小有些许区别。那么,在那个存储器贵如金的年代,为何还要将RAM作为标配?而且这个还是价格非常昂贵的静态RAM。这是因为,哈佛结构的计算机,存储器是整个计算体系的核心,你可以发现,51单片机外设相关的存储器,它们都被编入数据存储器(RAM)的地址。如图1所示。
图1 MCS-51单片机内部256字节RAM存储分布
由图1中,我们可以发现,MCS-51单片机的地址范围是00H到7FH (52系列延伸到FFH),为8位地址,所以最大可寻址的范围为256个单元地址。这些地址被分成4个功能区:
地址00H~1FH,共32字节,分成四个工作寄存器区,每区有寄存器 R0~R7。此存储区如果需要使用寄存器进行数据的存储,则可以直接使用寄存器寻址。如“MOV A,R0”。
地址20H-2FH,共16字节,是位寻址区,共有128个“位”,位地址:00~7FH。此区域的变量,也可按照字节寻址,来读写。如,我们将20H地址的第0位(0或者1)移入程序状态字(PSW)的进位标志位(C),则可以:“MOV C, 20H.0”。
地址30H-7FH,这个区域内的内存空间,主要是存放用户编写程序时产生的临时数据,这块区域内的寻址方式都为间接寻址,而且只能按照字节单位进行寻址。如果使用C语言要访问内部存储区,那么你所定义的指针只能指向这一片地址。
地址80H-FFH,此区域为特殊功能寄存器区(SFR),共有128个地址,其中离散的分布着21个特殊功能寄存器,必须直接寻址才能读写。另外,部分地址可以被8整除的特殊功能寄存器,也可以支持位寻址。(52系列,在此范围,还有128字节的 RAM,必须间接寻址才能读写)。
注意,在51单片机的内部RAM中进行编程的时候,必须使用MOV指令进片内RAM的读写。
2 外部RAM扩展
除了内部RAM的这些存储空间,MCS-51单片机也支持外部RAM的扩展。普通51单片机最大可以片外扩展64K字节空间的RAM,其地址范围为0000H~FFFFFH,我们可以使用标准MCS-51单片机的P0口和P2口对RAM进行扩展。其扩展电路如图2所示。
图2 外部RAM扩展
片外RAM地址的最大范围是0000H到FFFFH,即最大容量为64KB。对片外RAM读写,必须使用 MOVX 指令。对片外RAM采用间接寻址方式,R0、R1和DPTR都可以做为间接寻址寄存器,R0、R1是8位的寄存器,即R0、R1的寻址范围最大为256个单元,而DPTR是16位地址指针,寻址范围就可达到64KB。也就是说在寻址片外RAM时,寻址范围超过了256B,就不能用R0、R1做为间接寻址寄存器,而必须用DPTR寄存器做为间接寻址寄存器。
3 片外ROM扩展
除了RAM可以扩展之外,51单片机还支持外部程序存储器的扩展,此时做外ROM扩展的时候,需要使用到PSEN引脚去做芯片的选通。PSEN(非)为外部程序存储器读选通信号,在读外部ROM时PSEN(非)低电平有效,以实现外部ROM单元的读操作,全拼为Program Store Enable。外部ROM的扩展电路如图3所示。
图3 MCS-51单片机外部ROM扩展
ROM的地址范围是0000H到FFFFH,容量即为64KB,地址长度16位,作用是 存放程序及程序运行时所需的常数。其中4K地址(0000~0FFFH)的空间保留在了在片内,剩余的其它地址被用作片外ROM的地址,因此如果要扩展片外ROM,则其地址范围最大为(0x1000~0xffff)。当引脚EA为高电平时,则寻址内部ROM,当EA为低电平时,则寻址外部ROM。如果单片机想要读取ROM中的数据,必须使用 MOVC 指令。