精华内容
下载资源
问答
  • 51单片机内部ram

    千次阅读 2013-08-20 17:55:54
    51单片机默认的内部RAM只有128字节,52单片机增加至256字节,STC89C...现在新出的51单片机都在内部扩展了外部RAM,通常的情况是256B+1024B的RAM组合,不过在芯片内部之所以还叫外部RAM是因为是用外部总线连接的,访问方

    51单片机默认的内部RAM只有128字节,52单片机增加至256字节,STC89C54、55、58、516等增加到1280字节。

    单片机内部RAM,共256个单元,用户使用前128个单元,用于存放可读写数据,后128个单元被专用寄存器占用。现在新出的51单片机都在内部扩展了外部RAM,通常的情况是256B+1024B的RAM组合,不过在芯片内部之所以还叫外部RAM是因为是用外部总线连接的,访问方式还是MOVX。

    51单片机内部ram分配如下:

    地址

     


    0x80~0xff




    高128字节,用于SFR




    0x30~0x7f



    数据缓冲区



    0x20~0x2f


    16个字节(28位)可位寻址bdata区

    0x1f

    第四组寄存器R0~R7

    0x10~0x17

    第三组寄存器R0~R7

    0x08~0x0f

    第二组寄存器R0~R7

    0x00~0x07

    第一组寄存器R0~R7

    可位寻址bdata区unsigned char bdata test;

                                  sbit test0=test^0;就可以单独使用test的第0位

    数据缓冲区unsigned char data test;

    外部存储区A=XBYTE[0x8100];从地址8100H读一个字节

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

     


    在keil->option->Target->MemoryMode中有三种存储器模式:small、compact、large。


    Small:变量存储在内部的RAM。

    Large:变量存储在外部RAM里。

    一般都使用small来存储变量,单片机优先把变量存储在内部RAM,如果内部RAM不够再到外部RAM里,而Large则先将变量存储到外部RAM。

    采用small方式,unsigned char xdata a;指定变量a存储在外部ram

                            Unsigned char a;变量默认存储在内部ram里

    采用large方式,unsigned char xdata a;变量存储在外部ram

                            Unsigned char a;变量默认存储在外部ram

     

     本文档下载地址:http://download.csdn.net/detail/luckywang1103/598254

    展开全文
  • AVR单片机外部RAM访问

    2020-08-03 05:07:07
    本文以ATMEGA64单片机为测试平台,外扩74HC573(资料上讲用AHC系列,但是我用HC系列在16M晶振下配置成最快速度访问并没有发现什么不妥,当然这是个不严谨的设计)以及62256芯片。
  • 单片机读写外部RAM

    2014-06-29 18:24:16
    单片机读写外部RAM
  • 单片机传送数据 将存储器中 0000H--00FFH 中的数据传送到 2000H--20FFH中 悬赏分:30 - 解决时间:2009-10-4 09:42 ======================================= 其他回答: 如果是51单片机,应该这样: MOV DPL,...
  • 单片机内部扩展RAM

    千次阅读 2015-07-15 12:18:52
    51单片机内部只有128字节的RAM(8051),而8052有256字节的RAM,低128字节RAM直接或间接寻址都可以,高128字节RAM与SRF特殊功能...现在新出的51单片机都在内部扩展了外部RAM。这个RAM还是叫外部RAM,不过在芯片内部,之

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

    现在新出的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 


    使用同普通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();

       while(1);

    }

    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   = 1;    //t1 start

        ES=1;        //serial interrupt enable   

        REN=1;      //recieve enable

    }


    void printValue(void)

    {                               //串口输出ScanData,一共3个值

        unsigned int j;

        xdata unsigned char ScanData[3];

           TI=1;                               //开串口定时器

           for (j=0;j<3;j++)

              {

                 ScanData[j]=0;

              }

        for (j=0;j<3;j++){

                  printf("%d\n",ScanData[j]);

           }

           Delayms(10);

           TI=0;                               //关串口定时器

    }

    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


    正确了J


    后来程序又改为:


    #include <reg52.h>

    #include <stdio.h>

    #include <stcmcu.h>


    void Serial_Init(void);

    void printValue(void);


    xdata unsigned int adData[512];

    void main(void)

    {

       AUXR=0x01;

       Serial_Init();

       printValue();

       while(1);

    }

    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   = 1;    //t1 start

        ES=1;        //serial interrupt enable   

        REN=1;      //recieve enable

    }

    void printValue(void)

    {                               //串口输出ScanData,一共3个值

        unsigned int j;

        xdata unsigned char ScanData[3];

           TI=1;                               //开串口定时器

           for (j=0;j<3;j++)

              {

                 ScanData[j]=0;

              }

        for (j=0;j<3;j++){

                  printf("%d\n",ScanData[j]);

           }

           Delayms(10);

           TI=0;                               //关串口定时器

    }

         定义了一个全局变量数组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寻址

    展开全文
  • 51单片机外部ram扩展c程序及硬件结构
  • 单片机读写系统设计 单片机 外部扩展 RAM ROM EEPROM
  • RAM是用来在程序运行中存放随机变量的数据空间,51单片机默认的内部RAM只有128字节,52单片机增加至256字节,STC89C52增加到512字节,STC89C54、55、58、516等增加到1280字节,对于编程者来说,一个芯片的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模式。
        其次,为安全起见,当程序中定义多于128字节的其它变量时,最好申明为xdata型,如 uchar xdata table[100];意思为定义一个100个字节容量的数组,将其在扩展RAM中分配存储空间。另外一定要注意,在large模式下,编写程序时,定义的变量总数千万不要超过对应单片机的内部最大RAM字节数,因为即使超过了,编译器也不会提示错误,但是程序必定会出错。

    转载于:https://www.cnblogs.com/xmphoenix/archive/2011/10/23/2221951.html

    展开全文
  • 可能大家都知道不管是ROM还是RAM越大越好,但对于ROM和RAM是什么意思以及两者之间的区别却不了解。简单的说,一个完整的计算机系统是由软件硬件组成的。其中,硬件部分由中央处理单元CPU(包括运算器控制器)、...

    随着智能手机的发展,不管是看手机配置还是经常在生活中与网络中都经常听人有人讨论一些词。比如手机RAM多少或者ROM多少等等。可能大家都知道不管是ROM还是RAM越大越好,但对于ROM和RAM是什么意思以及两者之间的区别却不了解。

    简单的说,一个完整的计算机系统是由软件和硬件组成的。其中,硬件部分由中央处理单元CPU(包括运算器和控制器)、存储器和输入/输出设备构成。目前个人电脑上使用的主板一般只能支持到1GB的内存,即使是INTEL目前最高阶的450NX芯片组也只能支持到4GB。

    单片机的一个主要作用就是数据信息的处理,而在处理数据的过程中,需要一些“容器”来存放这些数据。这就好比烧饭要用到锅碗瓢盆一样。在这里,我们称这些“容器”为“存储器”。

    存储器的物理实质是一组(或多组)具备数据输入/输出和数据存储功能的集成电路,用于充当设备缓存或保存同定的程序及数据。存储器按存储信息功能的不同,可分为只读存储器ROM和随机存储器RAM

    RAM

    RAM是指通过指令可以随机的、个别的对各个存储单元进行访问的存储器,一般访问时间基本固定,而与存储单元地址无关。RAM的速度比较快,但其保存的信息需要电力支持,一旦丢失供电即数据消失,所以又叫易失性存储器,还有一种很有趣的叫法是“挥发性存储器”,当然这里“挥发”掉的是数据而不是物理上的芯片。在51单片机中,RAM主要用来保存数据、中间结果和运行程序等,所以也把RAM叫做数据存储器。

    ROM

    ROM英文概念是 Read Only Memory,只读式存储器,在计算机中,是一种类型的内存。此类型内存常被用于存储重要的或机密的数据。理想上认为,此种类型的内存是只能读取,而不允许擦写。在51单片机中,ROM一般用来存放常数、数据表格、程序代码等,所以也叫做程序存储器

    ROM和RAM区别

    至于ROM与RAM的主要区别相信大家也已经想到了。在手机中,RAM是指手机内存,属于手机内部存储器,属于随机存储,速度高于ROM,对于手机配置性能起着重要的决定性,另外掉电后,数据被清空,比如手机运行着QQ与其它软件,重启手机后,软件就没有处于登录状态,这点也比较好理解吧。

    9752dfcca536ad563d32b6074854329c.png

    而ROM则属于外部存储,比如我们经常可以购买SD卡放入手机里面,则就是手机ROM,手机ROM就是我们通常说的存储卡,也可以简单的理解成手机硬盘吧。用来存储手机系统文件、图片、电影等等,不会随着掉电而丢失数据,ROM越大存储的数据就越多。

    ROM存放指令代码和一些固定数值,程序运行后不可改动;RAM用于程序运行中数据的随机存取,掉电后数据消失。。

    ROM即只读存储器。ROM中的信息一次写入后只能被读出,而不能被操作者修改或删除。一般用于存放固定的程序或数据表格等。

    不能被操作者修改或删除。一般用于存放固定的程序或数据表格等。

    当然,“只读”这个“传统”的概念有时是可以被一些新特性的器件颠覆的。下面介绍的这两种类型的ROM就可以使用适当的方法进行擦除或改写。

    1.EPROM

    EPROM 与一般的ROM的不同点在于,它可以用特殊的装置擦除或重写其中的内容。

    2.闪存FLASH

    闪速存储器,又称PEROM, 它是完全非易失的,可以在线写入,并且可以按页连续字节写入,读出速度快。

    RAM即随机存储器。这就是我们平常所说的内存,主要用来存放各种现场的输入/输出数据、中间计算结果,以及与外部存储器交换信息,或是作堆桟用。它的存储单元根据具体需要可以读出或改写。

    RAM只能用于暂时存放程序和数据。一旦电源关闭或发生断电,RAM中的数据就会丢失。而ROM中的数据在电源关闭或断电后仍然会保留下来。这也许就是二者最大的区别吧。

    展开全文
  • 此程序为本人亲自编写并用过的,保证程序绝对没问题!
  • 8031单片机ROM RAM扩展

    2010-04-02 22:55:48
    8031单片机ROM RAM扩展,只作为参考
  • 1 C51基础(软件实验)1、用C51绝对地址访问实现内部RAM 30H和外部RAM 2000H内容交换。#includemain(){unsigned char t;DBYTE[0X30]=1;XBYTE[0X2000]=2;t=DBYTE[0X30];DBYTE[0X30]=XBYTE[0X2000];XBYTE[0X2000]=t;...
  • 单片机ROM RAM扩展

    2009-12-18 21:51:33
    单片机的rom ram扩展,电路连接图,以及74LS138的应用,片选!直观容易理解
  • 51单片机的存储器的RAM详解及仿真,详细描述单片机内部RAM,外部RAM的操作,及用Proteus 仿真查看具体的寄存器。
  • 1.ram keil c语言编程ram是程序运行中存放随机变量的数据空间。在keil中编写程序,如果当前模式为small模式,如果总的变量大小未超过128b,则未初始化的变量的初值默认为0.如果所有的变量超过small模式下的128b大小...
  • 51单片机Proteus仿真+Keil工程-实验6-单片机扩展RAM6264实验:直接向RAM6264读写数据,通过按键在八位数码管显示,并向RAM写数据,仿真观察写入RAM的数据
  • 单片机RAM的扩展教材

    2012-07-24 09:36:30
    单片机 RAM的扩展 教材,欢迎下载来参考学习
  • 关于单片机RAM的作用

    2020-08-04 15:55:35
    绍了有关单片机存储器的基本知识
  • [1]”中,众人给出了单片机RAM容量小的很多原因。 在所有影响单片机内RAM增加的原因中,一个基础的问题就是RAM会占用很多硅片面积,这也会直接引起芯片价格的增加。这是因为在同样的硅片上,占用硅片面积大会使得MCU...
  • 有时候在用protues仿真的时候发现代码没问题可就是运行不了,这可能是你的RAM使用量超出了protues中所选的单片机默认RAM大小。本文以图文方式教你在Protues中更改51单片机默认RAM大小
  • 51单片机的片内RAM和片外RAM的区别

    千次阅读 2020-05-16 19:27:44
    但是单片机的这 512 字节的 RAM在地位上并不都是平等的,而是分块的,块与块之间在物理结构用法上都是有区别的,因此我们在使用的时候,也要注意一些问题。 51 单片机RAM 分为两个部分,一块是片内 RAM,一块是...
  • LD就是扩展的外部RAM变量,地址是0x7fff,也就是说P2的最高位就是CS信号。示波器测试了P0口任意一个数据的变化、CS的变化、WR\RD信号的变化
  • 我用的扩展芯片是IS62C256AL-45UI(32K*8),电路连接方法常规的一样,用的是74HC573。 void Externram_Initl()//初始化 { C_S = 0; WR = 1; RD = 1; P0 = 0xFF; P2 = 0xFF; } 遇到的问题是按照...
  • 内容描述:Keil开发工具下,STM32内部RAM在线调试配置方法,以及每一项配置的详细说明。 注:本文章只适用于在线仿真形式,需要使用能够进行在线仿真的调试器(Jlink,Stlink),串口方式不能进行仿真。 RAM模式...
  • 当时写代码的思路是这样的,先把一段数据(数组)储存进单片机内0x30-0x3F的地址里,再把这个地址里的数据通过24C01的读写函数送到24C01的储存空间0x30-0x3F内。 所以这一段代码是这样的: p=0x30; .
  • 单片机关于RAM的作用

    万次阅读 2011-08-26 13:25:18
    1、内部RAM:共256个单元,用户使用前128个单元,用于存放可读写数据,后128个单元被专用寄存器占用。 前128单元具体分为: 1.工作寄存器区:共4个组,每组为8个存储单元,即00H-07H,08H-0FH,10H-17H,18H-1FH,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,204
精华内容 3,281
关键字:

单片机内部ram和外部ram