『原创』讨论有关单片机内存的问题

                                          分析单片机内存如何使用

               作者:小盒子      于:大连   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的人用……看过的人希望您能留下宝贵的意见或留言,谢谢!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值