作者: | 来源:互联网 | 2023-09-01 12:21
简述
8051 微控制器共有 128 字节的 RAM。我们将讨论这 128 字节 RAM 的分配,并检查它们作为堆栈和寄存器的用途。
8051 中的 RAM 内存空间分配
8051 内部的 128 字节 RAM 被分配了地址 00 到 7FH。它们可以作为内存位置直接访问,并分为以下三个不同的组 -
从 00H 到 1FH 位置的 32 个字节被留出用于寄存器组和堆栈。
从 20H 到 2FH 位置的 16 个字节被留出用于位寻址读/写存储器。
30H到7FH位置的80个字节用于读写存储;它被称为scratch pad. 这些 80 位 RAM 被 8051 程序员广泛用于存储数据和参数。
在 8051 中注册寄存器组
总共为寄存器组和堆栈预留了 32 字节的 RAM。这 32 个字节被分成四个寄存器组,其中每个组有 8 个寄存器,R0-R7。从 0 到 7 的 RAM 位置为 R0-R7 的 bank 0 留出,其中 R0 是 RAM 位置 0,R1 是 RAM 位置 1,R2 是位置 2,依此类推,直到内存位置 7,即属于 bank 的 R7 0.
第二组寄存器 R0-R7 从 RAM 的位置 08 开始,然后转到位置 OFH。R0–R7 的第三组从内存位置 10H 开始,然后转到位置 17H。最后,RAM 位置 18H 到 1FH 被预留给第四组 R0-R7。
默认寄存器库
如果 RAM 位置 00-1F 为四个寄存器组留出,那么当 8051 上电时我们可以访问 R0-R7 的哪个寄存器组?答案是寄存器组0;也就是说,在对 8051 进行编程时,从 0 到 7 的 RAM 位置以名称 R0 到 R7 进行访问。因为通过诸如 R0 到 R7 之类的名称来引用这些 RAM 位置比通过它们的存储位置更容易。
如何切换寄存器组
寄存器组 0 是 8051 上电时的默认值。我们可以使用 PSW 寄存器切换到其他 bank。PSW 的 D4 和 D3 位用于选择所需的寄存器组,因为它们可以被位寻址指令 SETB 和 CLR 访问。例如,“SETB PSW.3”将设置 PSW.3 = 1 并选择存储体寄存器 1。
RS1 |
RS2 |
寄存器组选择 |
---|
0 |
0 |
寄存器组0 |
0 |
1 |
寄存器组1 |
1 |
0 |
寄存器组2 |
1 |
1 |
寄存器组3 |
堆栈及其操作
堆叠在 8051
堆栈是 CPU 用来临时存储数据或内存地址等信息的 RAM 部分。考虑到寄存器数量有限,CPU 需要这个存储区域。
如何访问堆栈
由于堆栈是 RAM 的一部分,因此 CPU 内部有寄存器指向它。用于访问堆栈的寄存器称为堆栈指针寄存器。8051 中的堆栈指针为 8 位宽,可以取值为 00 到 FFH。8051 初始化时,SP 寄存器的值为 07H。这意味着 RAM 位置 08 是用于堆栈的第一个位置。CPU 寄存器在堆栈中的存储操作称为PUSH,并将堆栈中的内容返回到 CPU 寄存器中称为 POP.
压入栈
在 8051 中,堆栈指针 (SP) 指向堆栈的最后使用位置。当数据压入堆栈时,堆栈指针(SP)加1。执行PUSH时,寄存器的内容保存在堆栈中,SP加1。为了将寄存器压入堆栈,我们必须使用它们的 RAM 地址。例如,指令“PUSH 1”将寄存器 R1 压入堆栈。
从堆栈中弹出
将堆栈的内容弹出回给定的寄存器与推入过程相反。每次弹出操作时,栈顶字节都被复制到指令指定的寄存器中,栈指针递减一次。