1、对程序员来讲,最基本的
51单片机具有如下3个存储空间:
(1)内部数据空间,地址范围0~255,使用MOV指令和8位地址进行直接和间接访问,当然也有更多的操作类指令如ANL、ADD等可以直接或间接地访问该空间;
(2)外部数据空间,地址范围0~65535,(仅可)使用MOVX指令配合存于DPTR中的16位地址或存于R0、R1中的(低)8位地址进行寄存器间接方式的读写访问;使用8位地址访问外部数据空间实际是默认更高位的地址须由其它输出口线事先指定或实际配置的外部数据存储器不超过256字节而没有更高位的地址线需要给定;
(3)程序存储空间,地址范围0~65535,(仅可)使用MOVC指令配合作为基地址的存于DPTR中的16位地址或当前PC中的16位地址和事先传送到累加器A中的8位变地址进行基址变址方式的只读访问;
2、内部和外部数据存储器的区分不在于数据存储器位于单片机内部或外部,而是在于数据存储器与CPU的紧密程度,或者说CPU访问它们的方便程度。
(1)实际上51的内部数据存储器与CPU结合非常紧密,甚至位于内部数据空间的ACC、PSW乃至其它SFR其实可以认为就是CPU的一部分,如此就可以说内部数据存储器就是位于CPU内部的数据存储器;由于各种指令直接或间接寻址的支持,CPU对位于内部数据空间的数据存储器的访问是非常方便的,而外部数据空间的数据存储器可称为外部RAM(或记为XRAM),就是特别指明需要用MOVX指令间接寻址才能访问的数据存储器。
(2)内部数据存储器一定是位于51单片机内部的,而外部数据存储器则不能说一定就位于单片机的外部。为了应用方便(节省I/O口线,避免通过外部总线扩展XRAM的麻烦,以及节省物理空间等),很多增强的51系列单片机都将一定量的XRAM集成到芯片的内部,即便如此,这些数据存储器使用的是外部数据空间,因此仍然(也只能)是外部数据存储器。
3、最基本51单片机的内部数据存储空间可进一步划分为寄存器组区(地址0~31,共32字节)、位寻址区(地址32~47,共16字节)、用户RAM区(地址48~127,共80字节)和SFR区(地址128~255,共128字节)等4个功能区;
(1)寄存器组区的32字节内部RAM分为4组(地址0~7、8~15、16~23、24~31),称为4个寄存器组(依次称为寄存器组0、1、2和3),每组8个字节分别命名为寄存器R0、R1、...、R7,可通过PSW寄存器中的RS1、RS0位组合(即PSW.4和PSW.3)选择其中一组为当前寄存器组。当前寄存器组中的寄存器R0~R7可在51单片机的汇编指令中以直接引用的方式非常方便地进行读写访问(例如MOV A,R1),而对非当前寄存器组中的寄存器则可按一般内部RAM单元使用8位内部RAM地址进行直接和间接访问。寄存器组区的所有32字节也都可以作为一般内部RAM单元访问和使用。51单片机指令系统中除了累加器A以外,可直接引用的当前寄存器R0~R7是最为高效方便的了。
(2)51单片机有一整套位操作指令,可以通过8位位地址对位于内部数据空间的256个二进制位进行直接访问,可以认为这是一个通过8位位地址访问的位地址空间。片内RAM地址32~47上的16个字节共有128个二进制位,占据了前述256位地址空间中的前半部分(位地址0~127),因此称这16个字节所在的片内RAM区为位寻址区,它们即可以按字节寻址,其中的每一位也可以按位寻址。
(3)内部RAM中剩余的部分可用于一般的数据暂存或设置为堆栈区段。
(4)特殊功能寄存器(SFR)区总计有128字节的空间,其中离散地分布着最基本51单片机的21个特殊功能寄存器。这些特殊功能寄存器实际上是单片机功能部件在内存中的映像,是CPU访问功能部件的通道和手段。其中除了A、B、PSW、SP和DPTR等CPU自身的部分以外,其余都是在片设备和端口的访问窗口,CPU通过这些窗口对其进行配置和应用。后继的各种不同的51单片机如果增加了更多的在片设备和接口,最终都要通过在SFR区设计安放更多的特殊功能寄存器来体现给CPU。那些所在地址能被8整除的特殊功能寄存器,它们的每个位都是具有位地址的,因此也是可以按位访问的。每个位的位地址就等于其所在特殊功能寄存器的地址加上该位的位序号(例如PSW的内部RAM字节地址是0D0H,该地址能够被8整除,所以PSW的每一位都分配有位地址,而CY是PSW的最高第7位,则CY的位地址就是0D0H+7=0D7H)。位地址空间的后半部分都是这样分配给特殊功能寄存器的功能位的,那些最需要按位访问的特殊功能寄存器都分配在可以具有位地址的字节地址上。
(5)基本51单片机只有128字节的内部RAM,可使用字节地址0~127进行直接或间接访问,而52单片机则有256字节的内部RAM。增加的128字节RAM只能使用字节地址128~255进行间接访问,并且事先规定特殊功能寄存器只能通过字节地址或位地址进行直接访问,通过这种办法规避了与SFR所占地址空间的冲突。由于堆栈操作本身就是根据SP的值对内部RAM单元进行的间接访问,因此增加的128字节高地址RAM可以用作堆栈区段。