单片机RAM如何扩展

我在做试验,用的是AT89C51RC,ram512,应该算是大的了,但是老是不够用,现提以下问题,忘有识之士帮我,厚恩难忘。

1. 用idata定义变量的时候,到了200多的时候,就会出错,是不是占用了有用的寄存器,我的RAM为512,用idata和xdata各能定义多少数据。

2.是不是在定义汉字的数组时候,例如xdata z8[]={"第000 号用户通过"};这个就比较占ram,我才定义了10组左右,这个xdata就用完了,超过的是不是就会覆盖前面的。

3。把变量定义在子程序中定义和在主程序中定义有啥区别,会不会在子程序中定义省一些ram。

4。我现在还想做汉字的字库,这个就根本不行了,想扩展ram,请问该如何扩展,用啥芯片,扩展完之后,定义变量时候,还用xdata就行吗。

5.做汉字字库,是不是还有其他的方式,好像有一个存储器芯片AT45db041,用这种芯片,该如何让定义变量啊。
6 以上问题,会几个回答几个,谢谢大家了。
外部ram该如何让扩展呀,用啥芯片

1、我用89s52有256的RAM,但也只能够用一半。个人猜测可能有点像电脑上的进程那样,每个进程都有4G的虚拟内存,但只有2G是用户空间,还有2G是系统空间。可能这个也一样。因为系统也要帮你做一些事,你都用完了RAM,系统怎么帮你做事呀?

2、这个没用过,不懂。

3、这个最后再讲。

4、5、像上面讲的一样,把你要显示的东西定义在ROM上面,
而不是定义在RAM上,定义的时候用个code 关键字就得了。
就拿89S52来说ROM有8K 而RAM 才256.就样的话还有必要扩展吗?数码管,点阵的显示代码定义在ROM上,用的时候和RAM上的一样,但要注意一点,定义的时候必须初始化,因为在ROM上定义的,你对他赋值是错误的,你可以写个小程序试下。

最后说下3、强烈建议楼主再好好看看书。
在子程序中定义的变量,可以理解为一种临时变量吧。
因为出了子程序它的生命周期就结束了,回到主函数是不能
再用了的。子函数里面的变量,和形参,是函数被调用时才对他们分配内存的。调用结束后它们的空间就被释放了,到下次调用时再分配。(申明为静态变量和外部变量除外,他们的生命周期是和主函数一样的)

你最好搞明白各种变量的在哪分配,生命周期是多长。不然你引用一个被销毁了的东西当然就会出错了。

还有个函数形参和实参之间的关系的。以前答的。你可以去看下,希望对你有帮助。

http://zhidao.baidu.com/question/97142601.html
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-06-08
1,因为堆栈也要用到idata部分的RAM,所以当然不能太多。考虑到堆栈的关系,所以idata能定义的数据是不太确定的,与实际程序的复杂性有关。建议对速度要求不高或者使用不频繁的变量尽量不要定义在idata。只有xdata,有多少就可以用多少
2,这个很正常,因为你的XDATA只有256字节,一个汉字就占用2字节,10组的话,一组才25字节左右,并不算多。超过了不会覆盖前面的,只会使用后面的地址,虽然这些地址实际上并没有对应的硬件空间,当然,这样运行也会出错
如果你这个数组在运行的时候不需要修改,建议在前面加个code,这样就不占用RAM了
3,子程序中的RAM是局部变量,程序编译的时候会做覆盖分析,如果编译器确认两个变量对应的子程序不可能同时运行,那这些变量就会别覆盖,能节省RAM
4,汉字字库一般用ROM来扩展,用RAM不好。因为RAM不可能掉电保存数据的,所以实际上你的程序里还得先有个汉字字库,然后拷贝到RAM里,这样就浪费空间了。实际上8051的RAM空间也装不下一个汉字库。建议用串行的EEPROM来装汉字库,这样扩展简单一些。外部RAM里的变量仍然用xdata就行
5,这个就是我上面说的串行存储芯片。串行存储芯片的地址空间无法直接使用在8051的存储空间,当然就不能直接通过变量去访问,只能用函数去访问。所以建议你做一个读取函数,从EEPROM里读取所需汉字的字库内容到一个临时数组里。

RAM扩展可以用常见的SRAM芯片,例如62256,8bit*32K,当然一般还需要个地址锁存器,例如74HC573,更简单的方法是选择内部RAM足够的单片机。有些8051内部集成有8KB SRAM,对于大多数场合来说是够用了
第2个回答  2009-06-08
基本同意一楼的。补充一下:想做全的汉字字库,你扩展ROM也不够,用串行太慢,显示时屏上的帧一帧一帧的难看。建议楼主也不要扩展RAM了,AT89C51RC的FLASH也有32K,相信你的代码量也只有10几K,还有10几K放字库,不用全的汉字字库,你用到什么汉字就装什么汉字。关于从字库中提取想要的汉字,网上很多。
第3个回答  2009-06-08
data【一般不写】:定义低128个字节
idata:定义0~255个字节
xdata:0~65535个字节

如果做汉字库的话,一般我们是定义在rom区的
定义的格式是
unsigned char code HANZIKU[2848] ={
/*保 CB1A3 */
0x10,0x00,0x1B,0xF8,0x12,0x08,0x22,0x08,0x32,0x08,0x63,0xF8,0xA0,0x40,0x2F,0xFE,
0x20,0xE0,0x21,0x60,0x21,0x50,0x22,0x58,0x24,0x4E,0x28,0x44,0x20,0x40,0x00,0x00,
。。。。。
第4个回答  2009-06-08
没发

52单片机扩展ram要写代码吗
步骤如下:1、硬件接口:将扩展的RAM与52单片机的地址总线、数据总线和控制信号进行连接。要根据RAM芯片的规格和单片机的引脚分配,将它们正确地连接在一起。2、内存映射:在代码中配置扩展RAM的内存映射。涉及将RAM的地址范围映射到单片机的地址空间中。要确定RAM的起始地址和大小,将映射到适当的单片机地址...

单片机RAM不够用怎么办?
可以采用串行总线控制的EEPROM扩展。

请教,单片机RAM不够用该如何解决
④、可以用逻辑运算的,就不要采用算术运算。如 a\/8,可以写成 a>>3,当然 a不是浮点型数据才行。而a*2则是 a<<1;而a%4,可以写成 a&0x03;………2、扩大RAM ①、买个同系列高RAM区间的单片机。②、买个同系列高RAM区间的单片机。③、买个同系列高RAM区间的单片机。

单片机空间法怎样扩大容量RAM
方法,有好几种。换其它,具有大容量RAM的单片机芯片。外接大容量RAM的存储器芯片。外接SD卡。接上各种通信线路,上传、下载大量数据。

想问一下单片机外扩ROM和RAM的方法是什么,怎么做到的?直接连接吗?_百度...
象51单片机P0口是数据和地址共用的总线,分时输出低8位地址和数据信号,需用锁存器锁存先输出的低8位地址,此外还有锁存信号读写信号线等.为了方便应用,虽然要求使用单片机时尽量不扩展外部ROM和RAM以及IO口,但所有单片机教程上还有这方面的内容,你随便找一本教材都可参考....

单片机的ram是什么?
扩展RAM80C51单片机可以通过外接存储器芯片来扩展RAM的容量,扩展RAM的特点是容量大、可读可写,但速度相对较慢。SFR80C51单片机的SFR寄存器用于存储特殊功能的控制位和状态位,如I\/O端口控制、定时器\/计数器控制、中断控制等。SFR的特点是速度快、容量小、具有特定的控制功能。总之,80C51单片机的RAM由内部...

单片机RAM如何扩展
而不是定义在RAM上,定义的时候用个code 关键字就得了。就拿89S52来说ROM有8K 而RAM 才256.就样的话还有必要扩展吗?数码管,点阵的显示代码定义在ROM上,用的时候和RAM上的一样,但要注意一点,定义的时候必须初始化,因为在ROM上定义的,你对他赋值是错误的,你可以写个小程序试下。最后说下...

各路大虾,单片机片内ram不够用,怎么办
一是外扩RAM 二是选择片上有大容量RAM的单片机 如STC 单片机片上RAM有768 Byte 1280Byte 还有2k 4k的 如果仍不够 stm32f103有64KRAM stm32f407有192K的RAM 价格也贵了不少

ram 单片机片内ram不够用,怎么办
看来77e58果然超强啊! 答 1: 有问题的 答 2: 有什么问题的? 答 3: 不妨试试有两个建议:一是重新优化你的代码;二是条件允许的话外扩SRAM。 答 4: 77e58片内有1280字节的RAM 答 5: 我想问的就是可以从哪些方面进行优化?不知道通常可以从哪些方面进行优化啊,有哪些技巧的啊? 答 6:...

单片机外扩RAM A0当片选时,读写的操作过程
因此如果采用对齐方式接线(A0接A0,A1接A1)的话 当单片机向RAM写数据时,只写8位,但是RAM却不知道,却把16位写进来了(连接了16根数据线),这样会造成致命的错误 所以通常在这中存储机制不对应的存储器接线中,会使用错位接线 16bits是8bits的两倍,相当于左移1位, 所以单片机的A1就接到存储器的A0上 ...

相似回答