51单片机RAM扩展

我用P0(低)和P2(高)作为地址线扩展了外部RAM。我的问题是:我用C语言编程时怎样寻址阿?
是不是必须用P0(低)和P2(高)作为地址线,xdata 的使用才正确

要让51外扩展的RAM起作用,关键是要确保在MCU相关引脚上产生正确的外部读写时序(我这里默认你硬件连接全部正确).

首先很关键的一步是要仔细看你使用的MCU的资料,
下面我仅对C语言需要注意的地方讲解(汇编这里就略了,因为对于新手来说,讲的复杂并不是好事)
1、对于ATMEL、WINBOND等MCU,可以在C里,直接用 xdata 保留关键字来对变量进行声明,这样在访问这些变量时就能直接产生外部读写信号。
2、对于STC的MCU(比较新的MCU类,我这里就列举目前的STC类MCU内部用1024个字节RAM扩展),这里有更多的功能选择,位于内部8EH地址上的AUXR是RAM的扩展管理寄存器,其中的EXTRAM位(位1):
0 : 内部扩展的EXT_RAM可以存取
RD+ 系列单片机:
在00H 到3FFH 单元(1024 字节),使用MOVX @DPTR 指令访问,超过400H 的地址空间总是访问外部数据存储器(含400H 单元),MOVX @Ri 只能访问00H 到FFH 单元。
RC 系列单片机:
在00H 到FFH 单元(256 字节),使用MOVX @DPTR 指令访问,超过100H 的地址空间总是访问外部数据存储器(含100H 单元),MOVX @Ri 只能访问00H 到FFH 单元。
1: External data memory access.
外部数据存储器存取,禁止访问内部扩展RAM,此时MOVX @DPTR / MOVX @Ri 的使用同普通8052 单片机

下面是对于STC RD+的C语言简单举例子:
unsigned char xdata sum;
sum = 20;
这里在 EXTRAM 为0的情况下,如果sum的地址超过400H(含400H),那么就能产生外部RAM的读写时序,如果sum的地址小于400H,那么只能访问内部扩展的RAM,但不会产生外部RAM的读写时序。
这里在 EXTRAM 为1的情况下,那么就直接产生外部RAM的读写时序。

好了,就讲这样简单吧,总之,在使用MCU硬件前,必须先对该硬件资料熟悉,使用的时候,才能游刃有余。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-04-22
是的,还有另一种方法就是要有
#include <absacc.h>绝对地址头文件。
然后加一条宏
#define RAM XBYTE[0xffee] 其中0xffee就是外部地址,
向外部RAM写数据直接用 RAM=0x11语句就行了,同理读相反
第2个回答  2009-04-21
定义成这样:

xdata char_zi[20];

xdata a1,a2,a4;

就可以自动到外部寻址