51单片机——存储类型

发布于:2025-03-05 ⋅ 阅读:(100) ⋅ 点赞:(0)

主要内容:区分data,bdata,idata,pdata,xdata,code

8051系列单片机存储器结构的特点:ROM和RAM独立编址

8051系列单片机将程序存储器(ROM)和数据存储器(RAM)分开,并有各自的寻址机构和寻址方式。8051系列单片机在物理上有四个存储空间:

  • 片内程序存储器空间        内ROM——51-->4KB        52-->8KB
  • 片外程序存储器空间        外ROM——最大可扩展到64KB
  • 片内数据存储器空间        内RAM——51-->128B        52-->256B
  • 片外数据存储器空间        外RAM——最大可扩展到64KB

关键字 存储器类型 地址范围 与存储空间的对应关系
data 内部RAM 0x00~0x7F 直接寻址片内数据存储区,访问速度快(128字节)
bdata 内部RAM 0x20~0x2F 可位寻址片内数据存储区,允许位与字节混合直接访问(16字节)
idata 内部RAM 0x00~0xFF 间接寻址片内数据存储区,可访问片内全部RAM地址空间(256字节)
pdata 外部RAM 0x00~0xFF 分页寻址片外数据存储区(256字节)由 MOVX @R0 间接访问
xdata 外部RAM 0x00~0xFFFF 片外数据存储区(64K),由 MOVX @DPTR 间接访问
code 64K  ROM 0x0000~0xFFFF 代码存储区(64K),由 MOVC @DPTR 指令访问

data:00H~7FH        片内RAM,访问低128字节,地址为00H~7FH的低128字节片内RAM区又可以划分为三个区域:①通用寄存器区②可位寻址区③用户RAM区(堆栈也可以设在这里)

bdata:20H~2FH        16个字节可使用,每个字节的8位可以单独使用,16×8位=128位 可使用

idata:片内RAM,访问高128字节

pdata:片外RAM,0000H~00FFH,访问低256字节,一般不使用

xdata:片外RAM,0000H~FFFFH,可以访问全部区域

code:ROM

pdata用 MOV @Ri,A 写数据        用 MOV A,@Ri 读数据

xdata用 MOV @DPTR,A 写数据        用 MOV A,@DPTR 读数据

0000H~00FFH既可以用pdata也可以用xdata,但是00FFH以上必须用xdata

当使用code存储类型定义数据时,C51编译器会将其定义在代码空间(ROM或EPROM),这里存放着指令代码和其它非易变信息,调试完成的程序代码被写入8051单片机的片内ROM/EPROM或片外EPROM中。在程序执行过程中,不会有信息写入这个区域,因为程序代码是不能进行自我改变的。

当使用xdata存储类型定义常量、变量时,C51编译器会将其定位在外部数据存储空间(片外RAM),该空间位于片外附加的8K,16K,32K或64K RAM芯片中(如一般常用的6264,62256等等)。其最大可寻址范围为64K。在使用外部数据区的信息之前,必须用指令将它们移动到内部数据区中,当数据处理完之后,将结果返回到片外数据存储区。片外数据存储区主要用于存放不常使用的变量,或收集等待处理的数据,或存放要被发往另一台计算机的数据。

pdata存储类型属于xdata类型,它的一字节地址(高8位)被妥善保存在P2口中,用于I/O操作。

idata存储类型可以间接寻址内部数据存储器(可以超过127个字节)。

访问片内数据存储器(data,bdata,idata)比访问片外数据存储器(xdata,pdata)相对要快一些,因此可将经常使用的变量置于片内数据存储器,而将规模较大的,或不常使用的数据置于片外数据存储器中。

C51存储类型及其大小和值域
存储类型 长度(bit) 长度(byte) 值域范围
data 8 1 0~255        8bit
idata 8 1 0~255        8bit
pdata 8 1 0~255        8bit
code 16 2 0~65535        16bit
xdata 16 2 0~65535        16bit

变量的存储类型定义举例:

char data varl;                             /* item1 */
bit bdata flags;                            /* item2 */
float idata x,y,z;                          /* item3 */
unsigned int pdata dimension;               /* item4 */
unsigned char xdata vector[10][4][4];       /* item5 */

[注释] 

item1:字符变量char varl被定义为data存储类型,C51编译器将把该变量定位在8051片内数据存储区中(地址:00H~0FH)。

item2:位变量flags被定义为bdata存储类型,C51编译器将把该变量定位在8051片内数据存储区(RAM)中的位寻址区(地址:20H~2FH)。

item3:浮点变量x,y,z被定义为idata存储类型,C51编译器将把该变量定位在8051片内数据存储区,并只能用间接寻址的方法进行访问。

item4:无符号整型变量dimension被定义为pdata存储类型,C51将把该变量定位在片外数据存储区(片外RAM),并用操作码MOVX @Ri 访问。

item5:无符号字符三维数组变量unsigned char vcctor[10][4][4]被定义为xdata存储类型,C51编译器将其定位在片外数据存储区(片外RAM)中,并占据10×4×4=160个字节存储空间,用于存放该数组变量。

存储模式及说明
存储模式 说明
SMALL 参数及局部变量放入可直接寻址的片内存储器(最大128字节,默认存储类型是DATA),因此访问十分方便。另外所有对象,包括栈,都必须嵌入片内RAM。栈长很关键,因为实际栈长依赖于不同函数的嵌套层数。
COMPACT 参数及局部变量放入分页片外存储区(最大256字节,默认的存储类型是PDATA),通过寄存器R0和R1(@R0,@R1)间接寻址,栈空间位于8051系统内部数据存储区中。
LARGE 参数及局部变量直接放入片外数据存储区(最大64K,默认存储类型为XDATA)使用数据指针DPTR来进行寻址。用此数据指针进行访问效率较低,尤其是对两个或多个字节的变量,这种数据类型的访问机制直接影响代码的长度。另一不方便之处在于这种数据指针不能对称操作。

网站公告

今日签到

点亮在社区的每一天
去签到