当前位置:首页 > 技术心得 > 正文内容

51单片机内部扩展RAM

xjtudll14年前 (2012-06-20)技术心得51382

一直想写一篇关于51RAM的文章,网上看到这篇文章,觉得讲的比较详细,我就不献丑了,转载过来了。初学者可以看看。

原文网址:http://www.jhmcu.com/index.php/mcu-internal-expansion-ram-application/

单片机内部RAM:共256个单元,用户使用前128个单元,用于存放可读写数据,后128个单元被专用寄存器占用。

AT89S52单片机的ram,就有256字节,地址范围:00H~FFH。
SFR,特殊功能寄存器,仍然在地址范围:80H~FFH。
两者的地址重叠了,区别方法如下:
对80H~FFH直接寻址,就是读写SFR,特殊功能寄存器;
对80H~FFH间接寻址,就是读写RAM
 

RAM是用来在程序运行中存放随机变量的数据空间,51单片机默认的内部RAM只有128字节,52单片机增加至256字节,STC89C52增加 到512字节,STC89C54、55、58、516等增加到1280字节,对于编程者来说,一个芯片的RAM越多,写起程序来就越容易得心应手,不会总 考虑RAM不够用而担心这担心那,连过多的变量都不敢定义。
如果定义一个变量后,不对这个变量进行初始化,这个变量默认的初值就是0,其实这个结论是需要一定的条件的,在用KEIL编写程序时,总程序中所有变量占 用的字节之和小于128字节,并且存储器模式为small模式的前提下,对定义的变量不进行初始化时,编译器会默认将变量值设定为0。一旦程序中的总变量 超过128字节,必须对所有变量进行初始化,否则,没有被初始化的变量默认值将是不确定的。当变量总和超过128字节时,必须还要在编译器中重新设定存储 器的存储模式,存储器模式一共有3种,分别为small、compact和large模式,在KEIL编译器中有选项可进行选择,选项表如图4.4.1所 示。它决定了没有明确指定存储类型的变量、函数参数等数据的默认存储区域。如果在某些函数中需要使用非默认的存储模式,也可以使用关健字直接说明。下面对 这三种模式分别做介绍。
1. small模式
small模式中,所有缺省变量参数均装入单片机内部128字节RAM中,当定义类似如:uchar a; float b;等变量时,这些变量都装入内部128字节RAM中。使用该模式的优点是访问速度快,缺点是空间有限,而且是对堆栈的空间分配比较少,难以把握,碰到需 要递归调用的时候需要小心。所以这种模式只适用于小程序。
2. compact模式
compact模式中,所有缺省变量均位于单片机内部256字节RAM中,和在small模式中使用关健字pdata来定义变量的效果相同, 如:uchar pdata a[100];在该种模式下,程序总变量不得超过256字节,对于只有128字节的单片机,使用此模式定义变量超过128字节时,程序将出错。优点是空间 较small模式宽裕,速度较small慢,但较large要快,是一种中间状态。
3. large模式
在large模式中,所有缺省变量可放在多达64KB的RAM区,包括内部RAM和外部RAM,和使用关健字xdata来定义变量的效果相同。这种模式的优点是空间大,可存变量多,缺点是访问速度慢,尤其对于2个以上的多字节变量访问速度来说更是如此。
方便起见,STC单片机要访问扩展RAM时,可直接用以下方法:首先在编译器中设置存储器模式为large模式。

STC单片机要访问扩展RAM时,可直接用一下方法。
就是在编译器中设置存储器模式为large模式,如图。

 

51单片机存储区分配如下:

对上表的一些说明:

1.编程定义为: uchar bdata test;
所谓的可位寻址,如果你这么用:if(test^0)…else…;我的经验告诉我编译出来的程序会出错的。

我们一般可以这么用:
先做一个位定义:sbit test0 = test^0;
然后再程序中使用:if(test0)…else…;表示判断test的第0bit位的值,然后执行相应程序。其它位的用法类似。

2.编程定义为: uchar data test;
因为data区时直接存取存储,也就是说它在编程的时候最快的RAM区,所以我们往往把使用最频繁或者说对实时性要求高的数据都定义在data区(keil C中是可以设置优先存放RAM区的)。
Data区包括了4个工作寄存器组(32Byte)、位寻址区(16Byte)、用户data区(80Byte)。其实位寻址区也应该归类到用户可用 data区中,所以一般用户可以使用的直接寻址的RAM为96Byte。而实际上,一种比较极端的情况,因为单片机工作时只使用4组工作寄存器组中的一 组,我们可编程的data区可以有120Byte(我在keilC下编译测试的结果是,只有在不使用bdata的情况下才可以定义120Byte的 data区数据)。

3.编程定义为: uchar idata test;
如果你没有完全弄懂一个MPU的SFR,那么只能说你没有弄懂这个MPU了。所以这里不细说单片机的SFR,只提一点,它的地址是和IDATA区重叠的, 单片机内部时通过区分所访问的存储区来解决地址重叠问题的,因为IDATA 区只能通过间接寻址来访问。在我们的实时性要求不那么高,或者DATA区不够用的情况下我们就应该启用IDATA区。

4.编程定义为:uchar   xdata    LD    _at_   0x7f;
也可以这么使用:(需包含头文件absacc.h)

A = XBYTE[0x8100]; //从地址8100H读一个字节

B = *((char xdata *) 0×0000); // 从地址0000H读一个字节

XBYTE[0x7500] = 0xf0; // 写一个字节到7500H

P2和P0口为16bit的地址总线接口,P0口为数据总线口,数据和地址时分时传输的。

51单片机的最后一个存储空间为64K, 和CODE 区一样采用16 位寻址,属于外部数据存储区,即XDATA区。这个区通常包括一些RAM器件(如SRAM)或是一些需要通过总线接口的外围器件(特权在以前的BLOG里 多次谈过这个扩展RAM的问题,这里也不多涉及了)。对XDATA的读写操作需要至少两个处理周期来装入地址,而读写又需要两个处理周期。

 

再做一下扩展:

现在新出的51单片机都在内部扩展了外部RAM。这个RAM还是叫外部RAM,不过在芯片内部,之所以还叫外部RAM,是因为是用外部总线连接的, 访问方式还是用MOVX访问。可以参考STC89C58RD+,扩展了1024字节(byte)RAM。所以STC89C58RD+一共有 1024byte+256byte=1280byte这么多字节的RAM。

内部扩展RAM的使用

STC89C58RD+内部扩展RAM的使用是通过对特殊功能寄存器AUXR赋值实现的。

其中 EXTRAM      Internal/External RAM access 内部/ 外部 RAM 存取

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 的

扫描二维码推送至手机访问。

版权声明:本文由鸟的天空发布,如需转载请注明出处。

本文链接:http://www.xjtudll.cn/Exp/237/

标签: 51单片机
分享给朋友:

“51单片机内部扩展RAM” 的相关文章

c# toolstrip控件怎么把左边的几个小点去掉

c# toolstrip控件怎么把左边的几个小点去掉

c# toolstrip控件怎么把左边的几个小点去掉 小点如下图所示: 解决办法: 选中你的toolstrip 然后属性 属性中有个 GripStyle 设置Hidden...

EEPROM读写注意事项

EEPROM读写注意事项

在实际使用EEPROM过程中,发现一些问题: 一、快速操作EEPROM造成读写数据出错 现象:读取的数据与写入的不同,但时序波形和硬件未发现任何问题。 在查阅EEPROM规格书后发现有一个很容易忽略的参数:TDHDL,此参数用于规定当对EEPROM进行一次I2C操作后必须再等待一段时间才能再对EEP...

Protel99SE交互布局

Protel99SE交互布局

我们在PCB布局的时候,如果元件比较多,经常要花大量的时间找元件。一直以来在找寻Protel99SE交互布局的办法,后在网上发现大牛wang1jin写的一篇文章,讲述了Protel99SE交互布局的方法,但其描述了过多的无关内容,因此花了一些时间整理出了此文。 何谓交互布局?实际上通俗的讲,交互布...

Xcode ios模拟器下载及安装教程

Xcode ios模拟器下载及安装教程

1 通过Xcode下载 最新版的Xcode安装后,通常只带最新ios系统的模拟器。例如,Xcode 5.01就只带了ios7.03的模拟器。通过Xcode可以下载早期版本的模拟器。 Xcode->Preferences->Downloads Downloads下的Components就...

zencart迁移需要修改的地方

移植zencart,搬迁zencart:1.复制文件到新的服务器2.复制数据库3.修改配置文件    1)/includes/configure.php       //修改域名('HTTP_SERVER',&nb...

proteus仿真时虚拟串口窗口丢失的解决办法

proteus仿真时虚拟串口窗口丢失的解决办法

在使用Proteus调试串口时会遇到自带的串口工具无法弹出虚拟串口解决办法如下:在Simulation中止后,进入工具栏Debug-> Reset Debug Pop up Windows,并在弹出窗口中选“yes”。 再次运行Simulation,可以发现窗口可以正常弹出。...

评论列表

11
11 IP:广东省
13年前 (2013-07-18)

为什么我设置了auxr = 0x02 之后,用XBYTE读取外部扩展数据读不了,所有扩展的RAM均用不了。

麦芽糖
麦芽糖 IP:湖南省
14年前 (2012-12-08)

学习了

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。