前边介绍单片机资源的时分,咱们提到过 STC89C52 共有 512 字节的 RAM,是用来保存数据的,比方咱们界说的变量都是直接存在 RAM 里面的。可是单片机的这 512 字节的 RAM在位置上并不都是相等的,而是分块的,块与块之间在物理结构和用法上都是有差异的,因而咱们在运用的时分,也要留意一些问题。
51 单片机的 RAM 分为两个部分,一块是片内 RAM,一块是片外 RAM。规范 51 的片内 RAM 地址从 0x00H~0x7F 共 128 个字节,而现在咱们用的 51 系列的单片机都是带扩展片内 RAM 的,即 RAM 是从 0x00~0xFF 共 256 个字节。片外 RAM 最大能够扩展到 0x0000~0xFFFF 共 64K 字节。这里有一点咱们要理解,片内 RAM 和片外 RAM 的地址不是连起来的,片内是从 0x00 开端,片外也是从 0x0000 开端的。还有一点,片内和片外这两个名词来自于前期的 51 单片机,别离指在芯片内部和芯片外部,但现在简直一切的 51 单片机芯片内部都是集成了片外 RAM 的,而真实的芯片外扩展则很少用到了,尽管它还叫片外 RAM,但实际上它现在也是在单片机芯片内部的,咱们的 STC89C52 便是这样。以下是几个 Keil C51 语言中的要害字,代表了 RAM 不同区域的区别,咱们先记一下。
data:片内 RAM 从 0x00~0x7F
idata:片内 RAM 从 0x00~0xFF
pdata:片外 RAM 从 0x00~0xFF
xdata:片外 RAM 从 0x0000~0xFFFF
咱们能够看出来,data 是 idata 的一部分,pdata 是 xdata 的一部分。为什么还这样去区别呢?由于 RAM 分块的拜访方法主要和汇编指令有关,因而这块内容咱们了解一下即可,只需求记住怎么拜访速度更快就行了。
咱们界说一个变量 a,能够这样:unsigned char data a=0,而咱们前边界说变量时都没有加 data 这个要害字,是由于在 Keil 默认设置下,data 是能够省掉的,即什么都不加的时分变量便是界说到 data 区域中的。data 区域 RAM 的拜访在汇编语言顶用的是直接寻址,履行速度是最快的。假如你界说成 idata,不仅仅能够拜访 data 区域,还能够拜访 0x80H~0xFF 的规模,但加了 idata 要害字后,拜访的时分 51 单片机用的是通用寄存器直接寻址,速度较 data会慢一些,并且咱们平常大多数情况下不太期望拜访到 0x80H~0xFF,由于这块一般用于中止与函数调用的仓库,所以在绝大多数情况下,咱们运用内部 RAM 的时分,只用 data 就能够了。
关于外部 RAM 来说,运用 pdata 界说的变量存到了外部 RAM 的 0x00~0xFF 的地址规模内,这块地址的拜访和 idata 相似,都是用通用寄存器直接寻址,而假如你界说成 xdata,能够拜访的规模更广泛,从 0 到 64K 的地址都能够拜访到,可是它需求运用 2 个字节寄存器DPTRH 和 DPTRL 来进行直接寻址,速度是最慢的。
咱们的 STC89C52 共有 512 字节的 RAM,分为 256 字节的片内 RAM 和 256 字节的片外RAM。一般情况下,咱们是运用 data 区域,data 不行用了,咱们就用 xdata,假如期望程序履行功率尽量高一点,就运用 pdata 要害字来界说。其它类型有更大的 RAM 的 51 系列单片机,假如要运用更大的 RAM,就必须得用 xdata 来拜访了。