关于51单片机外扩RAM的问题。请大侠们帮忙解答,先谢过。

我们用51单片机,但是现在RAM不够用,所以想外扩RAM。51单片机里面P2口作为外扩RAM的高8位地址,P0口作为低8位的地址。我想问各位大侠,现在我想访问外扩RAM的地址为0xffe内部的数据,那么程序应该怎么写?是不是应该用 XBYTE 这个来写要寻找的外扩RAM的地址?
XBYTE[0XFFEc]=10; 这条语句是不是就是把P2,P0口的电平变成FFEC?就是相当于这个是地址,利用这个地址选中外扩RAM的这个地址内的存储单元,然后把10这个数存到这个存储单元内?
我主要想问的就是 XBYTE[ ] 这条语句是不是就是把P2,P0口的电平变成与这条语句括号内的数相一致?

现在的rom和ram都很丰富,rom有好几k的,你写程序肯定够了,除非你要用大量的数据,才会使用大量的程序空间,比如几十k,才会考虑去扩充。
扩充是用p0口和p2口扩充,p0口是数据,p2口是地址,用373锁存就可以扩展了。地址如果不是很大,可以用138译码,这样可以扩展多片芯片,如果很大,就采用线选咯。
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-09-02
不知道你用的是什么编译器,在KEIL下可以这样写:
unsigned char xdata ini _at_ 0xffe;
unsigned char xdata *GpBase = &ini;
之后GpBase[0]=10; a=GpBase[0];就是写、读0xffe的内容了,而且GpBase[1]表示0xfff,依次类推。追问

就是在KEIL下面写的,你的第一句程序是定义一个 存储于外扩RAM的变量ini,它的地址是 OXFFE。
然后又定义了一个指针GpBase ,指向存储于外部RAM的变量ini。
但是下面那个GpBase [ ] 这个是什么意思? 是表示一个数组名吗?

以下是我想的,不知道对不对,麻烦给看一下,谢谢了。
unsigned char xdata sum;
XBYTE[0XFEEE]=sum;
sum=5;
这样就把变量存到绝对地址为 OXFEEE的 外扩RAM中了。

追答

我没有用过XBYTE,这需要测试验证。GpBase 是一个指针,C语言中的指针和数组关系密切,数组名称本身就是一个指向数组第一个元素的指针。以上是验证过的。

追问

我看你那个 写的 ini 的 绝对地址是 oxffe,这个能定义地址为 12位的吗? 不是定义成为16位的吗?
如果定义成为16位的,例如 定义成为 oxffee 那么 对应的P2口和P0口的电平是不是应该分别为:11111111 11101110

追答

当然可以定义16位,0xffe=0x0ffe,P2口和P0口电平正如你分析的那样。

本回答被提问者采纳
相似回答
大家正在搜