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

51单片机内部扩展RAM

xjtudll12年前 (2012-06-20)技术心得46092

一直想写一篇关于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” 的相关文章

常见ESD保护元件分类

常见ESD保护元件分类

一般而言,ESD保护元件的分类可以通过其保护策略与方向性来进行,主要包括压敏电阻[1]、聚合物和瞬态电压抑制器(TVS[2])等。 在这几种保护元件中,压敏电阻在低电压时,呈现出高电阻,其中的每个小型二极管两端的电压都相当低,同时电流也相当小;而在较高电压时,其中的独立二极管开始导通,同时压敏电阻...

eclipse显示行号及字体设置

eclipse显示行号及字体设置

1 编辑器显示行号 Windows -> Preferences -> General -> Editors -> Text Editors -> Show line numbers(勾选) 2 显示字体设置 Windows -> Preferences -&g...

使用Doxygen生成Html文档

使用Doxygen生成Html文档

Doxygen是一种开源跨平台的,以类似JavaDoc风格描述的文档系统,完全支持C、C++、Java、Objective-C和IDL语言,部分支持PHP、C#。注释的语法与Qt-Doc、KDoc和JavaDoc兼容。Doxgen可以从一套归档源文件开始,生成HTML格式的在线类浏览器,或离线的LA...

Proteus网络标号自动加一

Proteus网络标号自动加一

在原理图界面,按A(切换到英文输入法),弹出如下窗口: 将PROPERTY=VALUE改成net=P0#,那么网络标号就会从P00开始自动加一,如图所示。...

数模转换器原理及组成

数模转换器原理及组成

数模转换器原理 DAC输出模拟量的大小与输入数字量大小成正比。假设DAC转换比例系数为k,则: DAC输出特性(k为转换比例系数) 两个相邻数码转换出的电压值之间的差值,是信息所能分辨的最小量(1 LSB);最大输入数字量对应的输出电压值(绝对值)用FSR表示。 数模转换器组成 D...

如何获取.NET Framework目录路径?

问题: 如何在C#应用程序中获取.NET Framework目录路径? 例如:“C:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727” 方法: 通过使用以下方法可以获取当前.NET应用程序活动的CLR安装目录的路径: Sys...

评论列表

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

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

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

学习了

发表评论

访客

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