、MCS51单片机的存储器从物理结构上和逻辑上分别可划分几个空间
MCS-51åçæºå¨ç©çç»æä¸æå个åå¨ç©ºé´ï¼
1ãçå ç¨åºåå¨å¨
2ãçå¤ç¨åºåå¨å¨
3ãçå æ°æ®åå¨å¨
4ãçå¤æ°æ®åå¨å¨
ä½å¨é»è¾ä¸ï¼å³ä»ç¨æ·çè§åº¦ä¸ï¼8051åçæºæä¸ä¸ªåå¨ç©ºé´ï¼
1ãçå å¤ç»ä¸ç¼åç64Kçç¨åºåå¨å¨å°å空é´ï¼MOVCï¼
2ã256Bççå æ°æ®åå¨å¨çå°å空é´ï¼MOVï¼
3ã以å64Kçå¤æ°æ®åå¨å¨çå°å空é´ï¼MOVXï¼
æ©å±èµæï¼
MCS-51ç³»ååçæºç¨åºåå¨å¨å为系ç»ä½¿ç¨åºåç¨æ·ä½¿ç¨åºãå
¶ä¸0000H~002AH为系ç»ä½¿ç¨åºï¼å
¶ä½ä¸ºç¨æ·ä½¿ç¨åºãç³»ç»ä½¿ç¨åºåºå®6个å°å为ç¹å®ç¨åºçå
¥å£å°åï¼å¦ä¸ï¼
ROMå°å åè½åé
0000H ç³»ç»å¤ä½åçå ¥å£
0003H å¤é¨ä¸æ0æå¡å ¥å£
000BH å®æ¶å¨/计æ°å¨0ä¸ææå¡ç¨åºå ¥å£
0013H å¤é¨ä¸æ1æå¡ç¨åºå ¥å£
001BH å®æ¶å¨/计æ°å¨1ä¸ææå¡ç¨åºå ¥å£
0023H 串å£ä¸ææå¡ç¨åºå ¥å£
æ°æ®åå¨åºä¹ç§°ä¸ºéæºåååå¨å¨ï¼RAMï¼ï¼MCS-51åçæºçæ°æ®åå¨å¨å为两个å°å空é´ï¼å é¨æ°æ®åå¨å¨ãå¤é¨æ°æ®åå¨å¨ã
å é¨æ°æ®åå¨å¨å ±æ256Båå¨ç©ºé´ï¼ä½åªæä½128Bï¼å°å为00H~7FHï¼æ¯çæ£çæ°æ®åå¨ç©ºé´ï¼å¯ä¾ç¨æ·è¿è¡è¯»æåæä½ï¼é«128Bï¼å°å为80H~FFHï¼æ¯åçæºçç¹æ®åè½å¯åå¨åºï¼SFRï¼ã
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呢?
答案是用指令,如果是直接寻址,那么访问的就是SFR,如果是R0或者R1间接寻址,就是内部高128位RAM,如果是DPTR或者是R0,R1间接寻址,且配合的是MovX指令,那么就是访问外部64KRAM中的第80H个地址。
概括一下来说,51的内存由以下组成:
1----程序存储器(包括片内Flash或Rom,也包括片外Flash或Rom,C语言用Code定义)
2----内部低128位Ram,C语言用data定义
3---内部高128位Ram,C语言用idata定义
4---内部SFR,C语言用Sfr定义
5---外部65536个Ram(通常,很多单片机厂家不会给你扩展那么多的,一般来说扩展256个字节或者1024个字节就差不多了,最近宏晶的出了个扩展4096字节的。这65536字节的Ram,前256个可以用Pdata修饰,也可以用Xdata修饰,超过256个之后的,只能用Xdata修饰)
以上所说的只是针对51内核的单片机,其他内核的,像ARM之类的,不是这种结构的。追问
具体点
追答你觉得我的回答还不具体吗?还是太啰嗦了?
从物理上,逻辑上,都有以下部分:
1----程序存储器.
2----内部RAM
3--- 外部RAM
4--- SFR
程序空间包括片内和片外程序存储器。
数据空间包括片内(中断向量、寄存器、特殊寄存器、数据存储单元等)和片外数据存储器。
参考下图:
至少可以分成五个部分:
ROM、片内RAM、片外RAM、SFR、位寻址区。