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

51单片机内部扩展RAM

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

一直想写一篇关于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://xjtudll.cn/Exp/237/

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

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

VS2010:此项目与Visual Studio的当前版本不兼容

VS2010:此项目与Visual Studio的当前版本不兼容

问题: 网上下载了一个C#工程,是用VS2013开发的,但是本地只有VS2010。打开后提示:此项目与Visual Studio的当前版本不兼容 解决办法: 1、用记事本打开解决方案文件“解决方案名.sln”,然后修改最上面两行为如下代码: Microsoft...

OSX:如何移动NSWindow而同时不移动其子Window

参考资料: http://stackoverflow.com/questions/7657132/how-to-move-an-nswindow-without-moving-child-nswindows 问题: 应用程序有个主window,在主window里,新建了一个子window。 每当移动...

因为数据库正在使用,所以无法获得对数据库的独占访问权

还原或删除sql server 2008数据库时,经常烩出现: “因为数据库正在使用,所以无法获得对数据库的独占访问权”,终解决方案如下 关键SQL语句: use master ALTER DATABASE [datebase] SET OFFLINE WITH ROLLB...

word文档无法打开插入文档里的RAR文件

问题: 办公室的电脑打不开插入word文档插入文档里的RAR文件,但在其他电脑上可以打开。打开时提示:此对象创建于Package中。此应用程序不能用来打开此对象。请确认此应用程序已正确安装,并且未被删除、移动或重命名。 请问该问题如何解决?谢谢! 答案: C:\WINDOWS\system32 目录...

水晶报表字符串字体大小根据字数调整

在实际应用中,可能需要根据字数多少来调整字体的大小。简单介绍一个方法。          选择要设置的字段,右键->设置对象格式->字体->大小,单击右边的x+2进入公式工作室,输入如下代码: if L...

固定电容标称容量及误差

电容器上标有的电容数是电容器的标称容量。电容器的标称容量和它的实际容量会有误差。常用固定电容允许误差的等级见表1。 表1 固定电容允许误差等级 误差 ±2%...

评论列表

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

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

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

学习了

发表评论

访客

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