51单片机有以下几个内存模块:
1、ROM或者Flash,叫程序存储区,你写的程序是存在这里面的,上电后从这里面执行。
程序存储区也分为片内和片外,一般来说,现在的51很多已经做到了64K,所以很少有外扩片外Flash或者片外的Rom了,Flash或者Rom不管是片内还是片外的,只能用来定义,是用code来修饰,也就是说,用code来修饰的东西,在程序运行过程中,不能修改;
2、RAM有------内部RAM的低128位(00-7F),对应C语言就是data,比如我定义一个变量,
dataunsigned char Var = 0;
那么,这个 Var变量就是放在内部的低128位Ram中
-------内部RAM的高128位(80-FF),对应C语言就是idata,比如我定义一个变量,
idataunsigned char Var = 0;
那么,这个 Var变量就是放在内部的高128位Ram中
-------(SFR)(80-FF),对应C语言就是Sfr比如我定义一个变量,
Sfrunsigned 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快一倍,代码也小的很多。
MCS-51读写IDATA区的速度是最快的,而且访问方法也是最多的。访问XDATA区的速度相对就要慢很多。MCS-51的堆栈要优先开辟在IDATA区中,并且在IDATA区中开辟的堆栈,可以使用栈指针寄存器SP来控制。如果栈实在太大,只能开辟在XDATA区中,那么CPU的SP寄存器就很难借力,只能由我们自己来构造堆栈结构和堆栈指针。处理器的状态保存在状态寄存器PSW 中,状态字中包括进位位、用于BCD 码处理的辅助进位位、奇偶标志位、溢出标志位、还有前面提到的用于寄存器组选择的RS0 和RS1。用于保存处理器当前的一些状态。
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |