折腾来折腾去

pikipity的blog

单片机原理及程序设计 第二章 记忆体和寄存器

上一章主要是简单介绍了一下 8051 的样子和结构,这一章主要介绍内存,为将来介绍各个特殊功能和 assembly 做准备。

记忆体种类

记忆体主要分为两种:

  1. 只读记忆体(ROM):资料一旦存储就不能删除或是修改(既不能重新写入),且内容不会因为断电而消失。一般来说,我们可以认为你所编写的程式就存储在 8051 的 ROM 中,当然现在的新科技已经允许通过一定的手段来从新修改 ROM 上的内容了,所以你可以向你的 8051 芯片中重新写入程式,但是重新写入的次数是有限,但是这个次数非常大,所以不用担心。8051 内部 ROM 容量为 4K Byte,最大可扩充到 64K Byte。8052 内部 ROM 容量为 8K Byte,最大可扩充到 64K Byte
  2. 随即存储存储器(RAM):可以随时将数据存入记忆体的任意位置,但是断电后数据会消失。一般来说,我们可以认为程式临时数据就是存储在 8051 的 RAM 中的。8051 内部 RAM 容量为 128 Byte,最大可扩充到 64K Byte。8052 内部 RAM 容量为 256 Byte,最大可扩充到 64K Byte。

地址分配

我们不可能随意的将数据存储在记忆体中,如果那样的话,我们就难以知道自己所需的数据到底存储在哪里,所以我们用“地址”来对记忆体中的数据定位。我们一般用一个十六进制数1 来表示一个地址。程式记忆体(可以理解为 ROM)和资料记忆体(可以理解为 RAM)的地址是分开的。

  1. 程式记忆体地址分配:由于 8051 允许外部扩充程式记忆体,所以程式记忆体的地址分配有两种(以下程式记忆体的地址都是一个地址代表一个字节(8位二进制)):
    • EA 引脚接高时:

      当 EA 接高时,程式记忆体的地址分配

    • EA 引脚接地时:

      当 EA 接地时,程式记忆体的地址分配

  2. 资料记忆体地址分配:资料记忆体的地址(依然是一个地址代表一个字节(8位二进制))从 00H 到 FFH,共分为四个部分:
    • 00H ~ 1FH:四个寄存器组。由于在写 assembly 程序的时候,每次都记住地址很麻烦,所以 assembly 为一部分地址直接预设了名字,这样我们就可以直接通过调用名字来使用这一部分内存而不是记住地址。这四个寄存器组 RB0~RB3 中,每个寄存器组又包含8个8位寄存器 R0~R7(每个字节地址就是一个寄存器),主要用来存放数据。但每次只能使用一个寄存器组,通过 RS0 和 RS1 两个位元来控制到底使用哪个寄存器组:

      RS1 RS0 寄存器组 位置
      0 0 RB0 00H~07H
      0 1 RB1 08H~0FH
      1 0 RB2 10H~17H
      1 1 RB3 18H~1FH
    • 20H ~ 2FH:可位元寻址区,这一部分的地址都允许直接对 bit 进行操作。例如,21H.0 就代表在字节地址 21H 的8位二进制的第 0 位。
    • 30H ~ 7FH:一般数据与堆栈区。不可以位元寻址,就是一般的存储数据的地方
    • 80H ~ FFH:特殊功能寄存器(SFR)。8051 本事已经内置了很多的功能,在第一章的8051单片机结构中就可以看到,有计时/计数器、中断、UART串口等等,这些特殊功能需要通过设置这一部分的 SFR 的参数来控制。在讲解各个特殊功能的时候会讲解如何设置参数,和这些参数代表什么意思。下面是一幅AT89系列的 SFR 地址分配表,将来可以对照、理解。

      AT89系列的 SFR 地址分配表

      注意:

      • 注意最左边一列都可以位元寻址
      • 括号中的寄存器代表 AT89C52 才有,AT89C51 没有


  1. 十六进制数就是以逢16进1作为进位制的数,一般用数字0到9和字母A到F表示,并在数后面加一个“H”来表示此数为16进制。



Comments