描述

单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能集成到一块硅片上构成的一个小而完善的微型计算机系统。如今运用最为广泛的就是C51单片机,其中典型的有80C51和89c51单片机。今天主要以C51单片机存储器类型及存储模式为中心而展开的话题。

1、80C51存储器的结构

程序存储器寻址范围为64KB(用PC或DPTR),片内数据存储器寻址范围为256B,80H-FFH只能间接寻址,片外数据存储器寻址范围为64KB(DPTR、P2、@Ri)

图1 80C51程序存储器系统结构

图2 80C51数据存储器系统结构

2、程序存储器及其操作

程序存储器用来存放应用程序和表格常数,设计中应用根据要求选择容量,其最大容量为64KB。单片机复位时,PC指针从0000H地址开始执行,应用程序的第一条指令的入口必须是0000H。程序存储器中有一些固定的中断入口地址,这些入口地址不得安放其他程序,而应安放中断服务程序,这些入口地址如表2.3所列。

表1 程序存储器的固定中断入口地址

程序存储器的操作有:

(1)程序指令的自主操作:按PC指针顺序操作。

(2)表哥常数的查表操作:用MOVC指令。

3、数据存储器及其操作

3.1片内数据存储器的结构

数据存储器的结构如图所示。

3.2片内数据存储器的应用特性

(1)复用特性:除工作寄存器、位寻址单元有固定空间外,其余没有使用的都可作数据缓冲区。

(2)复位特性:复位时SP=07H、PSW=00H,故栈底在07H,工作寄存器为0组。

(2)活动推栈:程序运行中,SP可随意设置。

3.3片内数据存储器的操作

(1)直接寻址操作,如:

MOV 30H, #50H; 30H-#50H

(2)间接寻址操作,如:

MOV R0, #30H; 30H赋给R0

MOV A, @R0; A-((R0))

(3)位地址空间操作,如:

SETB 00H; 20H的D0位置1

(4)工作寄存器的选择操作,如:

MOV PSW, #18H; RS1、RS0置成11

(5)堆栈操作,如:

MOV SP, #70H; 栈底设在70H

3.4片外数据存储器的操作

使用MOVX命令,只能与A交换数据。

(1)读入数据

MOVX A, @TPDR

MOVX A, @Ri

(2)写入数据

MOVX @TPTR, A

MOVX @Ri, A

例如:将片外567FH单元的数写入累加器A中,用TPDR指针操作为:

MOV DPTR, #567FH

MOVX A, @DPTR

用R0间接寻址操作为:

MOV R0, #7FH

MOV P2, #56H

MOVX A, @R0

4.C51存储类型《?XML:NAMESPACE PREFIX = O /》

对于在片外扩充的接口,可以根据硬件形成的地址,用#define语句进行定义,例如:

#define unsigned char xdata adAddr_at_0x2000;/*定义了片外接口地址为2000H*/

C51编译器支持80C51及其派生系列的体系结构,并提供对80C51所有存储区的访问。每个变量可以用表1中所列的存储器类型明确地分配到指定的存储空间。

表1 C51存储类型与80C51存储空间的关系

对内部数据存储器的访问比对外部数据存储器的访问快许多,因此应当将频繁使用的变量放在内部数据存储器,而把较少使用的变量放在外部数据存储器中。

下面用实例说明各种存储器变量的声明。

(1)程序存储器变量:程序存储器的数据不能修改,通常将跳转向量或表格存放在该区,存储器类型标识符为code。

例如:unsigned char code text[] = “ENTER PARAMETER”;

(2)直接寻址内部数据存储器变量:可在一个机器周期直接寻址,因此将常用的变量放在data区。存储器类型标识符为data。

例如:unsigned char data flag; /*声明一个内部直接寻址的无符号字节变量*/

(3)间接寻址内部数据存储器变量:用8位寄存器作为指针寻址内部存储器。存储器类型标识符为idata。

例如:unsigned char idata buffer[8]; /*声明一个内部间接寻址的无符号字节数组*/

(4)位寻址内部数据存储器变量:是内部数据存储器的位寻址区,位变量对需要位操作的数据十分有用,其存储器类型标识符为bdata。

注意:位寻址变量应声明为全局变量,否则编译将出错。

例如:unsigned char bdata bStatue; /*定义可位寻址的位变量,在片内RAM中*/

sbit statue_0 = bStatue^0; /*定义位变量bStatue的第三位的符号地址*/

bit数据类型可以用来访问用bdata存储器类型标识声明的变量的位。

外部数据存储器的声明与前面例子相似,这里不再说明。

如果变量声明中遗漏存储器类型标识符,则自动选择默认的存储器类型。默认的存储器类型应用到所有全局变量、静态变量、函数自变量和不能分配寄存器的自动变量。默认的存储器类型取决于编译时的存储器模式。这都是不同于一般C语言的地方。

5.C51的存储器模式

存储器模式确定了用于函数自变量、自动变量和无明确存储类型变量的默认存储器类型。可用编译器控制指令Small,Compact和Large指定编译时的存储器模式。用存储器类型标识符明确声明一个变量,优先于默认存储器类型。

(1)Small模式

所有变量默认位于80C51内部数据存储器,这和使用data存储器类型标识符明确声明是相同的。该模式变量访问非常有效,但所有数据对象和堆栈必须适合内部RAM。因为使用的堆栈空间决定于不同函数嵌套的深度,故对堆栈的尺寸要求严格。

(2)Compact模式

所有变量默认位于外部数据存储器的一页(256B)内,这和使用pdata存储器类型标识符明确声明是相同的。地址高字节通常设置P2,编译器无法设置这个端口,故必须在启动代码中手工设置。该模式能容纳最多256B的变量,这个限制是用R0、R1间接寻址造成的。该模式的效率不如Small模式的效率,变量访问速度不如Small模式的快,但比Large模式快。

(3)Large模式

所有变量默认位于外部数据存储器,这和使用xdata存储器类型标识符明确声明是相同的。寻址使用数据指针(DPRT),变量访问效率低,特别是对多字节变量,该模式的数据访问比Small模式和Compact模式生成的代码多。

一般经常使用Small模式,它可生成最快、最紧凑和最有效的代码。通常可以明确指定变量的存储位置。仅当使用Small模式时不适合应用或操作才上升到Compact模式和Large模式。

打开APP精彩内容

点击阅读全文

c语言存储器模式,单片机C51存储器类型及存储模式相关推荐

  1. 简述单片机c51语言程序结构,单片机C51程序结构

    <单片机C51程序结构>由会员分享,可在线阅读,更多相关<单片机C51程序结构(14页珍藏版)>请在人人文库网上搜索. 1.1 C51程序流程与控制C语言是一种结构化的编程语言 ...

  2. python中代理模式分为几种类型_代理模式

    JDK 自带的动态代理 java.lang.reflect.Proxy:生成动态代理类和对象: java.lang.reflect.InvocationHandler(处理器接口):可以通过invok ...

  3. 支持c语言编程的单片机,单片机的C语言编程(标准版).pptx

    单片机的C语言编程(标准版) 第03讲 单片机的C语言编程;1.1 C语言概述与最简单的C程序 ;1.1 C语言概述与最简单的C程序 ;二.C语言的程序结构;1.1.2 C语言与MCS-51单片机; ...

  4. C51存储器类型与51单片机的物理区域

    1.  data区空间小,所以只有频繁用到或对运算速度要求很高的变量才放到data区内,比如for循环中的计数值. 2.  data区内最好放局部变量. 因为局部变量的空间是可以覆盖的(某个函数的局部 ...

  5. c51语言的数据存储模式,第5章项目三单片机存储结构及C51语言.ppt

    第5章项目三单片机存储结构及C51语言 项目三 基本功 任务一 MCS-51单片机基础 任务二 单片机C51语言程序设计基础 二.MCS-51单片机存储器及存储空间 1.存储器的概念 什么是存储器呢? ...

  6. 单片机c51语言变量,单片机c语言教程:C51变量

    上课所提到变量就是一种在程序执行过程中其值能不断变化的量.要在程序中使用变量必须先用标识符作为变量名,并指出所用的数据类型和存储模式,这样编译系统才能为变量分配相应的存储空间.定义一个变量的格式如下: ...

  7. 单片机中存储器扩展位地址线怎么算_51单片机存储器小结

    存储器分为程序存储器(ROM)和数据存储器(RAM),两种又都可以分为片内和片外,片外即需要自己在单片机外部扩展. 8051单片机的片内程序存储器有4K,片内数据存储器有256个字节,其中又分为高12 ...

  8. 51单片机c语言编程函数,单片机C语言教程:C51函数

    其实一直出现在例子中的 main()也算是一个函数,只不过它比较特殊,编译时以它做为程序的开始段.有了函数C 语言就有了模块化的优点,一般功能较多的程序,会在编写程序时把每项单独的功能分成数个子程序模 ...

  9. c51语言的设计步骤,第3章节单片机c51语言程序的设计基本.ppt

    第3章节单片机c51语言程序的设计基本 第3章 单片机C51语言程序设计基础 3.1 语句与流程控制 3.2 函数 3.3 本章小结 3.4 实训三 简易十字路口交通信号灯控制 教学提示 教学要求 3 ...

  10. c语言单片机常用函数,C51单片机C语言函数编辑 -单片机-电子工程世界网

    其实一直出现在例子中的 main()也算是一个函数,只不过它比较特殊,编译时以它做为程序的开始段.有了函数C 语言就有了模块化的优点,一般功能较多的程序,会在编写程序时把每项单独的功能分成数个子程序模 ...

最新文章

  1. java.lang.NumberFormatException 错误及解决办法
  2. freebsd 运维人员
  3. 无向图求割(找桥)tarjan
  4. css3图片垂直居中
  5. 高性能服务器模型分类
  6. 2011-2-14 | Android Handler
  7. 单应性(同义词直射变换、射影变换和射影性等)(来自wiki)
  8. python计算圆环的面积_基于Python制作美观动态圆环图、饼图
  9. 打印顺丰电子面单SDK调用总结-java
  10. 【js练习】鼠标按下和松开事件
  11. 解决office2016显示图标异常
  12. 一读就错的68个姓氏,第一个就读错了
  13. python编程考试_Python编程练习(一)
  14. 炫酷的时间HTML页面,炫酷css3垂直时间轴特效
  15. 清除本地dns(Mac,win)
  16. AI实战:垂直领域问答机器人QA Bot常见技术架构
  17. 网盘、云盘共享文件搜索引擎链接收藏目录
  18. 第四周网络攻防实践作业
  19. TWS蓝牙耳机热销榜单,2022年好价硬货分享!
  20. 匈牙利算法的Java语言实现

热门文章

  1. Attention机制原理
  2. 基于C++和QT实现的第三人称RPG游戏编辑器设计
  3. 社区价值:福山论自组织、社区、社会资本
  4. H.265中针对scc的工具 -- transformskip
  5. H3C防火墙安全域知识、远程登陆及web页面
  6. Flutter Sliver滚动组件
  7. 学it需要学历吗_学IT需要什么学历
  8. Android配置启动页
  9. java中两个数组的并集_Java数组并集
  10. 《HarmonyOS实战—交互的艺术》