c51语言提供了code存储类型来访问,C51数据类型和存储空间

关于单片机存储器的问题,idata,data,badata,xdata,pdata,code,

片内存储区,片外存储区

关于51单片机内存问题,一直是个疑惑大家的问题,因为51单片机是个很另类的单片机。

下面我给楼主讲解一下:

51单片机之所以另类,是因为,他寻址内存的空间,不是靠总线,是用指令的方式。

51单片机有以下几个内存模块组成:

1】ROM或者Flash,叫程序存储区,你写的程序是存在这里面的,上电后从这里面执行。

程序存储区也分为片内和片外,一般来说,现在的51很多已经做到了64K,所以很少有外扩

片外Flash或者片外的Rom了,Flash或者Rom不管是片内还是片外的,只能用来定义常量,是用code来修饰,也就是说,用code来修饰的东西,在程序运行过程中,不能修改;

2】RAM有------内部RAM的低128位(00-7F),对应C语言就是data,比如我定义一个变量,

data unsigned char Var = 0;

那么,这个Var变量就是放在内部的低128位Ram中

-------内部RAM的高128位(80-FF),对应C语言就是idata,比如我定义一个变量,

idata unsigned char Var = 0;

那么,这个Var变量就是放在内部的高128位Ram中

-------特殊功能寄存器(SFR)(80-FF),对应C语言就是Sfr比如我定义一个变量,

Sfr unsigned char Var = 0x90;

那么,这个Var变量就是放在内部的特殊功能寄存器中,这是你对Var操作,相当于操作一个特殊的寄存器,但是小心,不能随便定义Sfr变量,很危险

------外部RAM 64K(0000-FFFF)

外部的RAM可以扩展到65536个,但是前256个算是一页,这一页比较特殊,是用

pdata来修饰的,当然,也可以用xdata来修饰。

除了第一页的256个以外的其他65280个空间,只能用xdata来修饰;

回过头来讨论pdata和xdata,这两个都能修饰外部Ram的第一页,但是,Pdata只能修饰第一页,即最前面的256个外部Ram,那么,这最前面的256个到底用Pdata还是Xdata好的呢?

答案:是Pdata,因为Xdata修饰的变量,用的是DPTR寻址,Pdata用的是R0和R1.DPTR因为是16位的,所以可以覆盖整个的64K外部Ram,R0和R1是8位,所以只能寻址最前面的256个,也就是外部Ram的第一页,但是,用R0寻址,比DPTR快一倍,代码也小的很多。

楼主又疑惑了,好多地址是重复的,比如,我向80H地址写一个数值,单片机怎么知道读的是内部的高128位RAM?还是SFR?还是外部64K的RAM呢?

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值