前边介绍单片机资源的时候,我们提到过 STC89C52 共有512字节的 RAM,是用来保存数据的,比如我们定义的变量都是直接存在 RAM 里边的。但是单片机的这512字节的 RAM 在地位上并不都是平等的,而是分块的,块与块之间在物理结构和用法上都是有区别的,因此我们在使用的时候,也要注意一些问题。

51单片机的 RAM 分为两个部分,一块是片内 RAM,一块是片外 RAM。标准51的片内 RAM 地址从 0x00H~0x7F 共128个字节,而现在我们用的51系列的单片机都是带扩展片内 RAM 的,即 RAM 是从 0x00~0xFF 共256个字节。片外 RAM 最大可以扩展到 0x0000~0xFFFF 共 64 K 字节。这里有一点大家要明白,片内 RAM 和片外 RAM 的地址不是连起来的,片内是从 0x00 开始,片外也是从 0x0000 开始的。还有一点,片内和片外这两个名词来自于早期的51单片机,分别指在芯片内部和芯片外部,但现在几乎所有的51单片机芯片内部都是集成了片外 RAM 的,而真正的芯片外扩展则很少用到了,虽然它还叫片外 RAM,但实际上它现在也是在单片机芯片内部的,我们的 STC89C52 就是这样。以下是几个 Keil C51 语言中的关键字,代表了 RAM 不同区域的划分,大家先记一下。

data:片内 RAM 从 0x00~0x7F

idata:片内 RAM 从 0x00~0xFF

pdata:片外 RAM 从 0x00~0xFF

xdata:片外 RAM 从 0x0000~0xFFFF

大家可以看出来,data 是 idata 的一部分,pdata 是 xdata 的一部分。为什么还这样去区分呢?因为 RAM 分块的访问方式主要和汇编指令有关,因此这块内容大家了解一下即可,只需要记住如何访问速度更快就行了。

我们定义一个变量 a,可以这样:unsigned char data a=0,而我们前边定义变量时都没有加 data 这个关键字,是因为在 Keil 默认设置下,data 是可以省略的,即什么都不加的时候变量就是定义到 data 区域中的。data 区域 RAM 的访问在汇编语言中用的是直接寻址,执行速度是最快的。如果你定义成 idata,不仅仅可以访问 data 区域,还可以访问 0x80H~0xFF 的范围,但加了 idata 关键字后,访问的时候51单片机用的是通用寄存器间接寻址,速度较 data 会慢一些,而且我们平时大多数情况下不太希望访问到 0x80H~0xFF,因为这块通常用于中断与函数调用的堆栈,所以在绝大多数情况下,我们使用内部 RAM 的时候,只用 data 就可以了。

对于外部 RAM 来说,使用 pdata 定义的变量存到了外部 RAM 的 0x00~0xFF 的地址范围内,这块地址的访问和 idata 类似,都是用通用寄存器间接寻址,而如果你定义成 xdata,可以访问的范围更广泛,从0到 64 K 的地址都可以访问到,但是它需要使用2个字节寄存器 DPTRH 和 DPTRL 来进行间接寻址,速度是最慢的。

我们的 STC89C52 共有512字节的 RAM,分为256字节的片内 RAM 和256字节的片外 RAM。一般情况下,我们是使用 data 区域,data 不够用了,我们就用 xdata,如果希望程序执行效率尽量高一点,就使用 pdata 关键字来定义。其它型号有更大的 RAM 的51系列单片机,如果要使用更大的 RAM,就必须得用 xdata 来访问了。

html5如何划分区域,10.4 51单片机 RAM 区域的划分相关推荐

  1. 最大化使用51的RAM空间

    目录 初衷 使用bit定义变量,或"降级"变量的类型 减小缓存的大小 将大型的数组放在外部RAM 真正能用于产品的代码为非阻塞代码,需要做分层和隔离,为此使用了队列结构,另外为了标 ...

  2. 51单片机的工作寄存器R0~R7位于内部RAM什么位置

    转自:https://zhidao.baidu.com/question/1495509806096353459.html 51单片机的工作寄存器一共有32个,为RAM中的00H--1FH单元,分为4 ...

  3. 10 51单片机汇编:让定时器产生中断(使用Keil模拟器)[系列教程之10]

    10 51单片机汇编:让定时器产生中断(使用Keil模拟器)[系列教程之10] 该系列主仓库地址:https://gitee.com/langcai1943/8051-from-boot-to-app ...

  4. 51单片机ROM和RAM

    文章目录 @[TOC](文章目录) 一.51单片机的程序存储器结构 1.内部结构 2.程序存储器的7个特殊地址 二.51单片机的数据存储器 1.片内数据存储器 2.片外数据存储器 提示:以下是本篇文章 ...

  5. protues仿真扩展51单片机片外RAM的方法

    protues仿真扩展51单片机片外RAM的方法 由于protues仿真stc89c52的单片机时,是使用相近的at89c52.而AT89C52只有256B的RAM,并不能储存巨大的变量.所以,需要更 ...

  6. 10.4.4 51单片机控制系统8个LED“跑马灯”实验

    10.4.4 51单片机控制系统8个LED"跑马灯"实验 仿真+代码 方法一 利用数组 #include"reg52.h"#define u8 unsigned ...

  7. 51单片机外扩RAM,ROM操作。

    这是51单片机内置的功能,可以让我们少写很多时序,让代码变的整洁好看. 这里先拓展点小知识:RAM,ROM的区别,地址数据总线,控制总线. 1.RAM是一种掉电会丢失数据的可读可写的存储器.//其实题 ...

  8. 51单片机+直流电机PWM 10级调速控制

    51单片机+直流电机PWM 10级调速控制 Proteus仿真演示 示例程序代码 #include <STC89C5xRC.H> typedef unsigned char u8; typ ...

  9. 单片机c语言访问片外存储器,教你给51单片机扩展片外RAM

    原标题:教你给51单片机扩展片外RAM 上一文中扩展了单片机的程序存储器,4KB存储空间提升到64KB.其实,4K的代码空间还凑合,但是51自带的256B数据存储空间使用起来还真紧张,其中留给用户的连 ...

最新文章

  1. Face ID 上手体验信息汇总:面部解锁流畅,原理移植AR让人憧憬
  2. MVC新手教程三:Entity Framework 4.0 来实现MVC的增删改查功能,10分钟搞定
  3. Vue2.0+vuex+H5实现音乐播放及歌曲切换功能的方法及原理解释
  4. 最简单的nginx教程 - 如何把一个web应用部署到nginx上
  5. jconsole查看连接数_在JConsole和VisualVM中查看DiagnosticCommandMBean
  6. 【转】C++指针详解!!!!
  7. java string不为空_java如何正确判断String为空
  8. [转载]Memcached缓存服务的简单安装
  9. MySQL服务器安装完之后如何调节性能
  10. volley浅析(磨砺营马剑威Android)
  11. Linux用scp实现无密码传输文件和目录(使用密钥)
  12. Mac 用快捷键选取文字,省时省力提高工作效率
  13. 计算机二级C语言题库(60套真题+刷题软件)2022年9月份新题第二套
  14. 科学计算机使用的软件,科学计算器软件有哪些?2020好用的科学计算器推荐
  15. dispatch_group_async
  16. csapp 大作业 hello的自白
  17. CDH安装时报错:/opt/cloudera/parcels/.flood/.../CDH-6.3.2-1.cdh6.3.2.p0.1605554-el7.parcel does not exist
  18. RecyclerView让置顶项置顶
  19. 第7章第24节:双图排版:两张图片的一大一小对比排版 [PowerPoint精美幻灯片实战教程]
  20. 如何使用Windows File Recovery工具在 Windows 10 上恢复丢失的文件

热门文章

  1. 分享WCF聊天程序--WCFChat
  2. linux服务器文件索引inodes满了
  3. Thinkphp5 分页带参数(亲测)
  4. git 撤销对工作区中文件的修改
  5. php轻量级的性能分析工具xhprof的安装使用
  6. rocketmq 消费者不能调用其他服务_Spring Cloud Alibaba RocketMQ - 构建异步通信的微服务...
  7. python中数组的维度_Python数组维度问题
  8. PHP对抗web扫描器的脚本技巧
  9. android返回后屏幕旋转了,Android recovery 模式下屏幕显示旋转
  10. 如何在群晖服务器上启用plex远程访问,如何在Synology NAS上更新Plex | MOS86