1、内部 RAM:共 256 个单元,用户使用前 128 个单元,用于存放可读写数据,后 128 个单元被专用寄存器占用。
前 128 单元具体分为:
1.工作寄存器区:共 4 个组,每组为 8 个存储单元,即
00H-07H,08H-0FH,10H-17H,18H-1FH,具体选择哪一个由程序状态字(PSW)中的 RS1 和 RS0 的组合决定(在此我就不展开了,呵呵……)
2.位寻址区:20H-2FH,共 16 个单元,每一位可以进行位寻址(16*8=128 个位地 址),就是每一个触发位,就是 bit 可以寻址
3.便笺区:从 30H-7FH,共 80 个单元,用于存放用户数据或作堆栈区使用。
4.从 80H-FFH 为专用寄存器占用,其中还离散的分布 SFR(21 个特殊功能寄存器)
2、256B
其中 00H~7FH
可分为 3 个区域:
00H~1FH 是通用寄存器区
20H~2FH 是位寻址区
30H~7FH 是用户 RAM 区
80H~FFH 是特殊功能寄存器区
3、AT89S51 单片机的 ram,只有 128 字节,地址范围:00H~7FH。
SFR 不是 RAM,是特殊功能寄存器,地址范围:80H~FFH,SFR 在其中离散分布
着。
AT89S52 单片机的 ram,就有 256 字节,地址范围:00H~FFH。 SFR,特殊功能寄存器,仍然在地址范围:80H~FFH。 两者的地址重叠了,区别方法如下:
对 80H~FFH 直接寻址,就是读写 SFR,特殊功能寄存器;对 80H~FFH 间接寻址,就是读写 RAM。
先说说这几个词是什么意思:
1,DATA,51 的内部 RAM,只有 128B(字节)大小,不管是最新的什么增强型 单片机;
2,XDATA,外部 RAM,只能使用 MOVX 寻址
3,CODE,代码区,即是你的代码的大小,AT89C51为 4K,C52 为 8K 等,增强
型的有更多的选择。
然后说明一下,几种 RAM的区别:
1,DATA,也是上面 1 提到的 DATA RAM,占 51 的 128B;
2,IDATA,大小也为 128B,与 DATA 构成 256 字节的内存(如 AT89C52)
3,PDATA,外部 RAM 的前 256B(就是一个页的大小),是 XDATA 的一部分;
4,XDATA,外部 RAM
所以你的那个单片机的 1280B,其实组成为:
DATA :128B
IDATA:128B
XDATA:1024B
所以你的问题,“使用片内 RAM”打勾只是软件仿真用的;你的 XDATA 用了 758B, 说明你特意用 XDATA 关键字定了这么大的内存,比如大数组或者内存模式时,使用了 lager 模式,那么编译器会自动把超出的部分放到 XDATA 里,我猜你应该 是这里选择了 lager 模式,不过你的内容这么大,也只能选择 lager 模式。
以上为原创,如果想看更详细的介绍,可以看以下链接:
单片机 C 语言 unsigned char code table[] code 是什么作用?
code 的作用是告诉单片机,我定义的数据要放在 ROM(程序存储区)里面,写 入后就不能再更改,其实是相当与汇编里面的寻址 MOVC(好像是),因为 C 语言 中没办法详细描述存入的是 ROM 还是 RAM(寄存器),所以在软件中添加了这一个语句起到代替汇编指令的作用,对应的还有 data 是存入 RAM 的意思。
程序可以简单的分为 code(程序)区,和 data (数据)区,code 区在运行的时候是不可以更改的,data 区放全局变量和临时变量,是要不断的改变的,cpu 从 code 区读取指令,对 data 区的数据进行运算处理,因此 code 区存储在什么介质上并不重要,象以前的计算机程序存储在卡片上,code 区也可以放在 rom 里面, 也可以放在 ram 里面,也可以放在 flash 里面(但是运行速度要慢很多,主要读 flash 比读 ram 要费时间),因此一般的做法是要将程序放到 flash 里面,然后 load到 ram 里面运行的;DATA 区就没有什么选择了,肯定要放在 RAM 里面,放到 rom 里面改动不了。
完整的pdf格式文档51黑下载地址:
单片机关于RAM的作用 .pdf
(92.78 KB, 下载次数: 44)
|