51单片机内部只有128字节的RAM(8051),而8052有256字节的RAM,低128字节RAM直接或间接寻址都可以,高128字节RAM与SRF特殊功能寄存器共用地址,SFR只能直接寻址,高128字节RAM只能间接寻址。所以通常用总线方式扩展一片RAM。一般用62256(32kX8bit RAM)。访问方式可参考我的博文:

http://blog.ednchina.com/tengjingshu/218041/message.aspx

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

内部扩展RAM的使用

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

Mnemonic

Add

7

6

5

4

3

2

1

0

复位值

AUXR

8Eh

EXTRAM

ALE0FF

xxxx,xx00

其中

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 的

使用同普通8052 单片机

调试经过

之前的板子是使用STC89C51RD+总线方式驱动62256,但只用到1024字节的RAM,而STC89C51RD+自身就有内部扩展的1k(外部)RAM,所以这次先没焊接62256。沿用以前程序(问题就处在这!!!)。(以下程序经过简化)

#include <reg52.h>
#include <stdio.h>
#include <stcmcu.h>

void Serial_Init(void);
void printValue(void);

void main(void)
{

    AUXR=0x03;

    Serial_Init();

    printValue();

    );

}

void Serial_Init(void)
{
    //--------serial init---------------------     //串口初始化
    SCON  = 0x50;                //8 bit UART,enable
    TMOD |= 0x20;                 //t1 8 bit reload
    PCON |=0x80;                 //bandrate X 2
    TH1   = 0xFF; //0xfa set bandrate 9600 with crystal 11.0592M
    TL1   = 0xFF; //0xff : 57600
    TR1   = ;    //t1 start
    ES=;        //serial interrupt enable
    REN=;      //recieve enable
}

void printValue(void)
{                               //串口输出ScanData,一共3个值
    unsigned int j;
    xdata unsigned ];
    TI=;                               //开串口定时器
    ;j<;j++)
    {
       ScanData[j]=;
    }

    ;j<;j++){
        printf("%d\n",ScanData[j]);
    }
    Delayms();
    TI=;                               //关串口定时器
}

printf串口输出。应该输出ScanData[0], ScanData[1], ScanData[2],都为0,可是确输出

0

256

512

我很吃惊,这么简单的程序都会出错,所以一直找问题。问题出在AUXR=0x03,之前是用了62256的,但这次没有用,xdata的数据应该存储在内部扩展的RAM里面,但确因为AURX这个寄存器进行相应改动,仍然访问外部RAM(62256)。因改为AUXR=0x01 / AUXR="0x00"。(AUXR第一位是ALEOFF,用于ALE禁止输出)。改了之后,串口输出:

0

0

0

正确了,后来程序又改为:

#include <reg52.h>
#include <stdio.h>
#include <stcmcu.h>

void Serial_Init(void);
void printValue(void);

xdata unsigned ];

void main(void)
{

   AUXR=0x01;

   Serial_Init();

   printValue();

   );

}

void Serial_Init(void)
{
    //--------serial init---------------------     //串口初始化
    SCON  = 0x50;                //8 bit UART,enable
    TMOD |= 0x20;                 //t1 8 bit reload
    PCON |=0x80;                 //bandrate X 2
    TH1   = 0xFF; //0xfa set bandrate 9600 with crystal 11.0592M
    TL1   = 0xFF; //0xff : 57600
    TR1   = ;    //t1 start
    ES=;        //serial interrupt enable
    REN=;      //recieve enable
}

void printValue(void)
{                               //串口输出ScanData,一共3个值
    unsigned int j;
    xdata unsigned ];
    TI=;                               //开串口定时器
    ;j<;j++)
    {
       ScanData[j]=;
    }

    ;j<;j++){
        printf("%d\n",ScanData[j]);
    }
    Delayms();
    TI=;                               //关串口定时器
}

定义了一个全局变量数组adData[512],这个数组的元素是int型的(16bit),所以一共占用1024字节RAM,加上3字节的ScanData数组,一共使用了1027个字节,编译后也可以在keil的Output Window中看出。

Program Size: data="32".1 xdata="1027" code="1175"

此时,虽然AUXR=0x01,定义成访问内部扩展RAM,但由于adData[512]是全局变量,定义时就分配RAM,所以但在printValue里分配局部变量ScanData时,RAM已经超过的STC89C58RD+的1024内部扩展RAM的上限,所以串口输出出错,和之前一样,输出

0

256

512

所以,千万要注意外部RAM够不够,不够的话,就不要省一片62256了J

注意的话:

快速使用的数    用内部RAM,只有128字节(8051)/256字节(8051)  访问只用1个机器周期

存储的数据      内部扩展的RAM  要注意芯片DataSheet上内部扩展RAM的大小

外部RAM  用总线方式访问,如32kX8 RAM 62256

51单片机最大可64k寻址

调试单片机内部扩展RAM的更多相关文章

  1. 51单片机局部变量占用ram的问题

    51单片机局部变量占用ram的问题 一.问题 自从工作以来基本不使用51或者增强型51之类的单片机.最近调试芯圣HC89S003F4增强型51,移植了32的实用代码,结果发现RAM爆了!!! 二.实践 ...

  2. STM32L系列单片机内部EEPROM的读写

    STM32L系列单片机内部提供了EEPROM存储区域,但实质上,其FLASH也是EEPROM类型,只不过有一块区域被开放出来专门用作EEPROM操作而已.STM32L的EEPROM使用寿命设计为100 ...

  3. 自制单片机之七……扩展:DS18B20温度测量

    DS18B20数字温度测量传感器,网上介绍很多,我就不罗嗦了.见图 DS18B20与前产品DS1820的不同: DS18B20继承了DS1820的全部优点,并做了如下改进 1.供电范围扩大为3.0-- ...

  4. 单片机FLASH与RAM、ROM的关系

    片机FLASH主要用作程序存贮器,就是替代以前的ROM,最大的有有点是降低了芯片的成本并且可以做到电擦写,目前市场上单片机的FALSH寿命相差比较大,擦写次数从1000~10万的都有,但存储时间可以保 ...

  5. Windbg程序调试系列1-Mex扩展使用总结

    最近一直在频繁使用Windbg做线上Dump调试,与微软做Case交流的时候,发现微软CSS团队,用了一个非常效率的Windbg 插件,Mex: 使用介绍: https://blogs.msdn.mi ...

  6. Linq调试实时输出信息扩展方法(摘抄)

    原文在此 [译]如何在C#中调试LINQ查询 原linq语句: var res = employees .Where(e => e.Gender == "Male") .Ta ...

  7. STC89C52单片机内部EEPROM驱动

    STC89C52单片机自身带有4K的存储空间,分为8个扇区,每个扇区512字节,第一扇区起始地址为:0x2000, 结束地址为:21FF, 第八扇区起始地址为0x2E00,结束地址是2FFF #inc ...

  8. 单片机成长之路(51基础篇) - 021 STC89C51系列单片机 内部EEPROM 驱动

    最近又看了一下关于stc单片机的知识,感觉在使用中EEPROM是个经常用到的东西,特地学习了一下,给大家分享一下心得,如有不足,多多包涵,废话不多说,一图解千言,先上图: /*------------ ...

  9. 单片机引脚扩展芯片74HC595手工分解实验

    我们先来看下效果 74HC595是常用的串转并芯片,支持芯片级联实现少量IO口控制多个IO口输出功能 14脚:DS,串行数据输入引脚 13脚:OE, 输出使能控制脚,它是低电才使能输出,所以接GND ...

随机推荐

  1. KMP学习

    刚才看了(连接)写的翻译,把kmp算法的工作过程讲的很不错,kmp算法的核心是next,next为什么要那么赋值?其实就是前缀和后缀的最大匹配值,用这个值在匹配失败的时候可以跳过一个不必要的匹配.   ...

  2. 【深入了解cocos2d-x 3.x】定时器(scheduler)的使用和原理探究(3)

    上篇文章分析到了定时器的定义.这篇的重点就是定时器是怎样执行起来的. 1.从main中寻找定时器的回调 讲定时器的执行,就不得不触及到cocos2dx的main函数了,由于定时器是主线程上执行的.并非 ...

  3. 对不起,说句粗话——这个太屌了,windows1.0安装程序(附下载)

    今天逛一个软件论坛发现的,仅仅有几百K.遥想当今我刚接触windows的版本号是3.1,当时记得非常清楚哦,进入windows要从dos命令行进入.如今一转眼,变成进入伪dos是执行栏里敲cmd了.唉 ...

  4. Java 异常处理的误区和经验总结--转载

    本文着重介绍了 Java 异常选择和使用中的一些误区,希望各位读者能够熟练掌握异常处理的一些注意点和原则,注意总结和归纳.只有处理好了异常,才能提升开发人员的基本素养,提高系统的健壮性,提升用户体验, ...

  5. sql 处理以字符隔开的字符串(类似split)

    sql 处理以字符隔开的字符串(类似split)的处理方法. CREATE PROCEDURE dbo.Vip_SendMails @userids varchar(MAX), ), ), @c va ...

  6. Android - Broadcast机制

    以下资料摘录整理自老罗的Android之旅博客,是对老罗的博客关于Android底层原理的一个抽象的知识概括总结(如有错误欢迎指出)(侵删):http://blog.csdn.net/luosheng ...

  7. OD: File Vulnerabilities & Protocols & Fuzz

    IE.Office 等软件有个共同点,即用文件作为程序的主要输入,但攻击者往往会挑战程序员的假定和假设. 文件格式 Fuzz 就是利用畸形文件测试软件的稳健性,其流程一般包括: * 以一个正常文件作为 ...

  8. 产品经理(PM)常用原型图设计工具

    本文转贴自:http://www.zhangping.name/2010/08/28/pm-wireframes-design-tools/ ,尽管都是一些商业软件,但对设计的确非常有帮助. 天天和产 ...

  9. C#基础学习第二天(.net菜鸟的成长之路-零基础到精通)

    1.加号的使用  在我们c#当中,如果想要两个字符串相连接,那么我们可以使用+号连接.  加号两边如果有一边是字符串,那么此时字符串起到了一个连接的作用.  如果加号两遍都是数字,那么加号起到一个相加 ...

  10. 武汉科技大学ACM:1007: 文本编辑器

    Problem Description YB打算写一个功能强大的文本编辑器,并取一个炫酷拉风,高端优雅的名字,比如“YB牌文本编辑器”之类的.既然功能强大,那肯定得有个查找功能吧.但是他在完成这个功能 ...