分析单片机内存如何使用
作者:小盒子 于:大连 2007.4.24【整理】
由于单片机的内存比较小,在以前的型号如AT89c51内存只有128byte,按照目前的电子市场飞速的发展,这么点点的内存只够做一个简单的电子系统,若是大一点的就远远不够用了,这样要么就要外扩一个静态RAM,要么就要选择一个内存比较大一点的单片机,比如:AT89S52 [256byte]\ SST89E564 [1K]等等。这样在使用KEIL软件的时候是如何适用超过128byte字节的RAM呢?很多人都有这样的疑问【当初我搞的也不是很明白】。
在网上也看到了很多人都有这样的想法:
① 超过变量128后必须使用compact模式编译
实际的情况是只要内存占用量不超过256.0【前提是:单片机的内存必须要大于128byte,对于at89c51来说想达到256也达不到啊,本身就不够用】 就可以用 small 模式编译。要是单片机提供的内存更大的话,那也可以在small模式编译的。
② 128以上的某些地址为特殊寄存器使用,不能给程序用
这样的想法也是不对的,单片机与 PC 机不同,51 单片机不使用线性编址,特殊寄存器与 RAM 使用重复的地址。但访问时采用不同的指令,所以并不会占用 RAM 空间。
下面我用汇编和C语言进行解释一下上面红色字的意思:【很多人都能说出这样的道理,但是很少有人举出实际的例子供大家参考和分析,下面我会在汇编和C语言做出实际的语句,来和大家一起分析一下】
首先先给P0口赋值0x55;
P0 DATA 080H
MOV A , #55H;
MOV P0 , A; ;因为p0口特殊功能寄存器的地址是0x80
若是往0x80地址存储数据0xAA。则需要执行以下语句
MOV RO ,#80H
MOV @R0 , #0AAH
参照上面的语句就能知道同样都是0x80地址却有着不一样的效果.
下面在写一下C语言的语句
sfr P0 = 0x80;
unsigned char idata i _at_ 0x80;
void main(void)
{
//P0口赋值0x55;
P0 = 0x55;
//0x80地址存储数据0xAA
i = 0xAA;
}
根据上面总结出来的,看完所有的代码我想对大家应该有所帮助吧?仔细看看我上面的代码或我的说明,我想这个时候你应该对单片机的内存有个进一步的了解了。对你以后开发单片机应该会有所帮助的。如果你对此有所疑问,或者我的说法有错误,请您给我留言,我们共同交流,由于时间的关系,以前整理的资料好多都丢了,今天在此作了一个简单的整理并发上来,希望对看我的blog的人用……看过的人希望您能留下宝贵的意见或留言,谢谢!!!