在51单片机中如何划分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,但实际上它现在也是在单片机芯片内部的.但是单片机的这 512 字节的 RAM在地位上并不都是平等的,而是分块的,块与块之间在物理结构和 用法上都是有区别的,因此我们在使用的时候,也要注意一些问题。
51单片机RAM分为四个区域
1.工作寄存器区(00H~1FH)
2.位寻址区(20H~2FH)
3.用户RAM区(30H~7FH)
4.特殊功能寄存器(80H~FFH)
其中1.2.3处于RAM低128单元,4处于高128单元
也就是声明变量时data与idata位置
而栈就是在用户RAM区内人为开辟的一段空间,用于存放数据,而单片机也相应的为这段空间提供了硬件也就是SP寄存器。SP是一个8位寄存器用于存放栈顶位置。
51单片机的具体存储器地址分配
数据存储器(RAM)为 256 字节, 地址范围为00H~FFH, 分为两大部分: 低 128 字节(00H~7FH)为真正的RAM区; 高 128 字节(80H~FFH)为特殊功能寄存器区SFR。
程序存储器(ROM)的内部地址为 0000H~0FFFH, 共 4 KB; 外部地址为 1000H~FFFFH, 共 60 KB。 当程序计数器由内部 0FFFH执行到外部 1000H 时, 会自动跳转。
一般分为数据存储器RAM,程序存储器ROM,内存的具体地址都是规定好的,不需要我们划分,只需要我们知道他们的具体地址就好了。MCS-51单片机内部RAM读操作时,被选中单元的数据经数据线、输入/输出区处理后传送给CPU;写操作时,CPU将数据经输入/输出区转化、数据线存入被选中单元。由于受RAM的集成度限制。
大家可以看出来,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 来进 行间接寻址,速度是最慢的。
MCS-51单片机由许多RAM组合而成。CPU访问存储器时,一次只能访问RAM中的某一片,片选控制区选中,地址译码器的输出信号控制该片某个地址的寄存器与CPU接通;当片选线接入无效电平时,则该片与CPU之间处于断开状态。
一般情况下,我们是使用 data 区域,data 不够用了,我们就用 xdata,如果希望程序执行效率尽量 高一点,就使用 pdata 关键字来定义。其它型号有更大的 RAM 的 51 系列单片机,如果要使用更大 的 RAM,就必须得用 xdata 来访问了。