单片机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
没发
相似回答