初学51单片机几个困惑知识点解惑

一   数据的存储类型

先来看看8XX51单片机的存储空间:有四个存储空间,分别是片内程序存储空间、片外程序存储空间、片内数据存储空间、片外数据存储空间,传说中的哈佛结构,如下图所示



当EA引脚接高电平时,0000~0FFF访问的内部程序存储器,地址1000~FFFF访问的片外程序存储器,二者统一编址,片内不够用自动用片外的,当EA接低电平时,无视片内,0000~FFFF全访问的是片外。是为程序存储器。片内片外可供访问的有64K,当然要想访问片外的程序存储器得先外接了ROM才行!

接下来,对于数据存储器,片内的只有256B,片外最多可扩展64K,两者不统一编址,贴个片内RAM的结构图如下:


这256B的又可以划分为四个部分,分别是:寄存器组(0区~3区),用于存放函数的形参和一些局部变量,共32个字节;可位寻址的RAM区,共16个字节,16×8位,c51中bit类型的变量放在这;还有就是48~127字节是用户数据区,堆栈区一般在这;最后就128B的专用寄存器组,当然不全用完,只有21个寄存器,共占26个字节,可位寻址的寄存器如上图所示。

下面进入这部分的正题:c51的存储类型,共有这么几个:data、bdata、idata、pdata、xdata。其中data修饰的变量放在片内数据区,直接寻址;bdata修饰的变量放在片内数据区的可位寻址区部分,支持字节和位混合寻址;idata修饰的变量也是在片内数据区,它只能寄存器寻址,也就是在访问这个变量时,其地址由某个寄存器给出,pdata修饰的变量是放在片外数据区的某个256B大小的页面的页内,最后xdata修饰的变量也是放在片外数据区,不过64K大小的空间随便搁哪,另外还有一个code修饰的变量是放在程序区的!经常将一个大的不怎么变的常量用code修饰。如果变量没用存储修饰符修饰,那么由编译器默认放置,由编译选项决定。

再谈谈指针,c51中指针有两种:一个是基于存储器的指针,另一个是通用指针。

基于存储器的指针定义时,定义了所指向的变量的存储类型,如  char xdata * px; 其中px指向了一个存放在片外数据区的字符变量,px本身则在编译器默认的数据区(由编译模式决定),px变量本身的长度是两个字节,原因很简单,片外数据存储区有64K ,寻址的话需要16位地址;同理指向code修饰变量的指针本身也是两个字节,指向data、idata、pdata修饰的变量的指针只有一个字节的长度。

通用指针就是我们普通形式定义的指针,不管它指向神马,都是三个字节,为毛是三个字节呢,因为第一个字节要放所指变量的存储类型的编码,后两个字节自然是所指变量的地址了。


c51中还可以用常量作为指针,如在定义外部端口的地址时,可以有这样的形式:#define  OUT XBYTE[0xBFFF] ,这个XBYTE就是一个常量指针,在头文件absacc.h中有这样的定义:#define XBYTE ((unsigned char * ) 0x 20000L),下面来解释一下这是神马东东:首先从最里面看起 0x20000L,这是一个占三个字节的十六进制长整数;高字节是十六进制数2,低两个字节是十六进制数0000,然后左边有个(unsigned char * )将这个长整数强制转换为一个unsigned char型指针,这个无名的常量指针指向哪呢?要从指针的内容分析,首先,高字节是个2,意思是我指向的存储单元在片外数据区(其实2是变量存储类型xdata的编码),低两个字节是0000,意思是我指向片外数据区的第一个存储单元(地址时0x0000),然后再给这个常量指针起个名字叫做XBYTE。那么XBYTE[0xBFFF]这个就好理解多了,不就是从0x0000处偏移0xBFFF个字节的那个存储单元的内容嘛,再把这个单元起个名字叫做OUT,然后访问这个存储单元时就可以写:  OUT = 数据 ,  变量 = OUT 等等。

关于存储类型就写到这了,供和我一样的单片机苦逼初学者借鉴,然后内容浅显,各位专业看官大可一哂而过~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值