8051单片机有4个存储空间:
1.内部数据存储器(片内RAM)
共128字节,字节地址范围为00H~7FH。
前32个字节00H~1FH为寄存器区,每8个寄存器形成一个寄存器组,共4个寄存器组。
之后的16个字节20H~2FH,共128位,为位地址区,位地址范围为00H~7FH。
最后的80个字节30H~7FH,为通用RAM区。
具体分布如下图所示:
寄存器0组 00H~07H
寄存器1组 08H~0FH
寄存器2组 10H~17H
寄存器3组 18H~1FH
位地址区 20H~2FH
通用RAM区 30H~7FH
2.特殊功能寄存器(片内RAM)
共21字节,分布于80H~FFH中,仅有21个有效的字节地址。
有11个特殊功能寄存器可以进行位寻址,位地址范围也为80H~FFH,但只有83个有效的位地址。
其他无效地址单元是不能被访问的。
3.程序存储器(片内ROM,可外扩)
64KB,字节地址范围0000H~FFFFH,其中片内只有4KB的程序存储器(0000H~0FFFH),如果不能满足要求,可以扩展60KB的片外程序存储器。
程序存储器中的某些地址被固定地用于特定程序的入口地址:
0000H 复位操作后的程序入口
0003H 外部中断0(INT0)服务程序入口
000BH 定时器0中断(T0)服务程序入口
0013H 外部中断1(INT1)服务程序入口
001BH 定时器1中断(T1)服务程序入口
0023H 串行I/O中断(RI/TI)服务程序入口
通常在这些入口地址开始的二、三个字节的地址单元中存放一条转移指令,用于跳转到中断服务程序,如果中断服务程序足够短,或者不会占用到下一个特定程序的入口(比如从001BH开始连续存放,不会占用到0023H地址单元),则不需要用转移指令,直接在入口地址处写中断服务程序。
4.外部数据存储器(片外,通过接口电路与单片机相连)
最大容量可达64KB。
片外RAM与片内RAM的区别:片外RAM不能进行堆栈操作;片内RAM操作时无读写信号产生,片外RAM读写操作时有读写信号(RD*,WR*)产生。
内部数据存储器和特殊功能寄存器统一编址,程序存储器和外部数据存储器均单独编址,因此89C51存储器具有三套独立编址的存储空间。
89C51的堆栈位于片内RAM中,最大空间为128B,向地址增大的方向增长,操作步骤为先加后压、先弹后减。