80C51存储结构

  • 80C51存储结构
    • 总体分类
    • 片内片外的存储空间结构图
    • 程序存储器ROM
      • ROM作用
      • 不同型号单片机的ROM设计
      • 通过EA引脚的电平选择片内ROM还是片外ROM
      • 片内ROM低地址内存空间的特殊功能
    • 数据存储器RAM
      • RAM作用
      • RAM分区说明
      • RAM空间分布图(80C51低128位和高128位问题)
        • 80C51:
        • 工作寄存器区:
        • 位寻址区:
        • 用户RAM区:
        • 高128单元:
        • 80C52:
  • 总结
    • 网友对80C51高128位疑惑的解答:
  • 指针有关的特殊功能寄存器
    • 数据指针(DPTR)
    • 堆栈指针
    • 程序计数器(指向下一条指令的地址)

总体分类

1.80C51的存储器的物理结构为哈佛结构,它将程序存储器ROM数据存储器RAM分开。

普林斯顿结构是指程序存储器地址空间与数据存储器地址空间合并的单片机结构

从物理地址空间上看,80C51单片机有4个存储器地址空间,即片内数据存储器(片内RAM)、片内程序存储器(片内ROM)、片外数据存储器(片外RAM)和片外程序存储器(片外ROM)

片内片外的存储空间结构图

因为RAM和ROM是分开的,所以它们的起始地址和终止地址没有必然关系

片内RAM:00H ~ 7FH:0000 0000 ~ 0111 1111(二进制) =》 0 ~ 127(十进制) =》 共128B(B是字节)(快速计算方法: 27 = 128)

片内ROM:0000H ~ 0FFFH:0000 0000 0000 0000 ~ 0000 1111 1111 1111(二进制) =》 0 ~ 4095(十进制) =》 共4096B(B是字节) =》 写成4KB**(快速计算方法: 212 = 4096)**

片外RAM:0000H ~ FFFFH:0000 0000 0000 0000 ~ 1111 1111 1111 1111(二进制) =》 0 ~ 65535(十进制)=》 共65536B(B是字节) =》 写成64KB**(快速计算方法: 216 = 65536)**

片外ROM:1000H ~ FFFFH:0001 0000 0000 0000 ~ 1111 1111 1111 1111(二进制) =》 4096 ~ 65535(十进制)=》 共61439B(B是字节) =》 写成60KB

程序存储器ROM

ROM作用

80C51单片机的程序存储器ROM主要用来存放程序、常数、数组或表格等,80C51内有4KB的掩膜ROM

不同型号单片机的ROM设计

不同型号的51内核单片机的ROM设计有可能不相同,这都是厂家自己设置的,既然型号都不同了,那么ROM的种类或大小也会不同,如

87C51内部有4KB的EPROM,AT89S51内部有4KB的Flash EEROM,并具有ISP功能,而80C31内部没有程序存储器ROM

通过EA引脚的电平选择片内ROM还是片外ROM

EA引脚的功能是:选择片内ROM还是片外ROM

如果EA 接高电平时,程序计数器(PC)是在0000H ~ 0FFFH的地址范围内移动,也就是先执行片内ROM里的程序,当超过片内ROM的最大地址0FFFH时,PC会自动跳到片外ROM去执行片外的程序,地址范围是1000H ~ FFFFH;因为0FFFH加1后地址就是1000H

如果EA 接低电平时,只能去片外ROM里执行程序,此时的片外地址可以从0000H开始编址,就是说不与片内ROM一起编址的化,片外ROM的地址就从0000H开始,到FFFFH结束

片内ROM低地址内存空间的特殊功能

在片内ROM地址里,低地址中有6块内存空间是具有特殊功能的,每一块可以是3个内存单元,也可以是8个内存单元

  1. 0000H ~ 0002H:单片机复位后的程序入口地址(3个单元)

  2. 0003H ~ 000AH:外部中断0(INT0)的中断服务程序入口地址(8个单元)

  3. 000BH ~ 0012H:定时器0(T0)的中断服务程序入口地址(8个单元)

  4. 0013H ~001AH:外部中断1(INT1)的中断服务程序入口地址(8个单元)

  5. 001BH ~ 0022H:定时器1(T1)的中断服务程序入口地址(8个单元)

  6. 0023H ~002AH:串行口的中断服务程序入口地址(8个单元)

中断服务程序不就是平时写程序时的中断处理函数嘛,如定时器计数溢出时,会跑到中断处理函数去执行,形式一般为:void Timer0_Rountine() interrupt 1{ }

特殊功能图如下,每个地址都是从一个格子的左下角开始

第一组特珠单元是0000H ~ 0002H,3个单元不可能安排长程序,因此,系统复位后,(PC) = 0000H.80C51单片机从0000H单元开始取指令执行程序。如果程序不从0000H单元开始,应在这3个单元中存放一条无条件转移指令(LJMP),以便直接转去执行指定的程序。

第二组特殊单元是0003H ~ 002AH,共40个单元。这40个单元被均匀地分为5段,作为5个中断源的中断地址区。中断响应后,按中断种类,自 动转到各中断区的首地址去执行程序,因此,在中断地址区中应存放中断服务程序。但通常情况下,8个单元难以存下一个完整的中断服务程序,因此通常也是从中断地址区首地址开始存放一条无条件转移指令,以便中断响应后,通过中断地址区,再转到中断服务程序的实际入口地址。

数据存储器RAM

RAM作用

80C51数据存储器RAM主要用来存放运算的中间结果数据等。

RAM分区说明

80C51(51子系列):片内数据存储器RAM只有128B,地址范围为00H ~ 7FH;

80C52(52子系列):片内数据存储器RAM有256B,地址范围为00H ~ FFH;这256B地址又分两个部分,低128B(00H ~7FH)RAM区,与80C51的RAM区相同,高128B(80H ~ FFH)RAM区,需要注意的是高12B RAM区的地址与**特殊功能寄存器(SFR)**区重叠

如何区分要访问的是RAM区还是SFR寄存器区

访问RAM:寄存器间接寻址

访问特殊功能寄存器SFR:直接寻址方式

两者都可扩展片外RAM,最多可扩至64KB存储单元,地址范围为0000H ~ FFFFH

RAM空间分布图(80C51低128位和高128位问题)

80C51:

注意:

这里会有个疑惑:80C51的片内RAM只有128B,为什么有些教材上会有80C51低128B和高128B的说法呢?

答:低128位的空间才是80C51真正的RAM,上图中工作寄存器区+位寻址区+用户RAM区才是80C51的片内RAM区,00H ~ 7FH,共128B;

而位于该256B总空间里高128位的特殊功能寄存器(SFR)区,编址范围是80H ~ FFH,这与真正的片内RAM区编址连续但不重叠,不是80C51的RAM区,换种说法就是,SFR只是刚好被放在了80H ~FFH的地址范围内,与片内RAM在物理上是相互独立的,两者互不相干,RAM区完成RAM区的工作,SFR区完成SFR区的工作,只因SFR的地址范围是80H ~FFH,在叫法上,称其是在高128B;很多教材都没说明白,看书时就越看越懵。

工作寄存器区:

80C51 单片机内部 RAM 的00H~1FH地址单元,共32B,分成4组工作寄存器,每组8个工作寄存单元。

寄存器0组:地址00H ~ 07H(R0~R7)。

寄存器1组:地址08H ~ 0FH(R0~R7)。

寄存器2组:地址10H ~ 17H(R0~R7)。

寄存器3组:地址18H ~ 1FH(R0~ R7)。

各组都以R0 ~ R7作为工作寄存单元编号。由于它们的功能及使用不作预先规定,因此称之为通用寄存器。4组通用寄存器在任一时刻,CPU 只能使用其中的一组工作寄存器,并且把正在使用的那组寄存器称为当前寄存器组。到底是哪一组,由程序状态字(PSW)寄存器中RS1、RSO位的状态组合来决定。

位寻址区:

内部RAM的20H ~ 2FH地址单元,既可作为一般RAM单元使用,进行字节操作,也可以对单元中的每一位进行位操作,因此把该区称为位寻址区。位寻址区共有16个RAM单元,计128位,而每一位都赋予了一个位地址,位地址范围为00H~7FH。程序设计时,常将程序状态标志、位控制变量设在位寻址区内。这种位寻址能力是80C51的一个重要特点。

用户RAM区:

地址为30H ~7FH,共80B,这就是供用户使用的一般RAM区。这个区域的操作指令非常丰富,数据处理方便、灵活。对用户RAM区的使用没有任何规定或限制,但一般应用中常把堆栈设置在此区中。

高128单元:

高128单元是供给专用寄存器使用的,它们分布在其单元地址为80H~FFH的空间。因这些寄存器的功能已作专门规定,故称之为专用寄存器(SpecialFunction Register) ,也可称为特殊功能寄存器(SFR)。访问SFR,只允许使用直接寻址方式

80C52:

80C52的片内RAM总共256B,低128位与51的一样,不同的是80C52的高128位也是片内RAM区,与下面的低128位RAM属性一样,但功能不同

注意:

特殊功能寄存器SFR的编址范围还是 80H ~FFH,与52的片内RAM高128位地址重叠了,意思是在80H ~ FFH这片地址范围内,既可以把其看作是片内RAM ,也可以看作是SFR,那在使用时如何区分寻址是使用的RAM还是特殊功能寄存器呢?

答:通过不同的寻址方式来区别片内RAM和SFR,若访问的是RAM区,则用寄存器间接寻址;若访问的是SFR区,则用直接寻址方式

总结

80C51单片机片内的地址分配:
0 ~127:RAM --可以直接寻址,也可以间接寻址
128 ~ 255:有21个特殊功能寄存器SFR --只可以直接寻址,不属于RAM

80C52单片机片内的地址分配:
0~127:RAM; --可以直接寻址,也可以间接寻址
128~255:RAM; --只可以间接寻址
128~255:有21个特殊功能寄存器SFR。 --只可以直接寻址

片外数据存储器RAM与程序存储器ROM的地址空间是重叠的,但不会发生冲突。因为它们是两个独立的地址空间,使用不同的指令访问,控制信号也不同。访问程序存储器时,用PSEN信号选通,而访向片外数据存储器时,由RD (读)和WR (写)选通信号。

网友对80C51高128位疑惑的解答:

1.简单来说,就是片内RAM和特殊功能寄存器在物理上是相互独立的。就像51子系列内部RAM没有高128B,但它任然有特殊功能寄存器,因为特殊功能寄存器并不是高128B的存储单元,只是因为其地址编码在80H~0FFH,所以说它在高128B,52子系列拥有高128B,并不是说高128B的片内RAM的部分单元用于充当特殊功能寄存器,RAM就是RAM,特殊功能寄存器有独立的存储空间

2.51单片机内部RAM是256字节,高128字节被SFR占用,为什么一般认为内部RAM为128字节呢,是为了区分SFR和低128字节空间,两者寻址方式不一样。至于为什么不一样取决于要分辨51单片机和52单片机,52单片机高位128不是作为SFR,属于内部RAM,但是规定只能使用间接寻址(区分51内部RAM高128位)

指针有关的特殊功能寄存器

数据指针(DPTR)

数据指针为16位寄存器,用来存放16位地址。DPTR既可以按16位寄存器使用,也可以按两个8位寄存器分开使用,即:

DPH——DPTR 高8位字节。

DPL——DPTR 低8位字节。

DPTR通常在访问片外RAMROM存储器作地址指针使用,用间接寻址或变址寻址可对片外的64KB范围的RAM或ROM数据进行操作。

堆栈指针

堆栈指针(Stack Pointer,SP)是一个8位寄存器,它总是指向栈顶。80C51单片机在编程序时常将堆栈设在内部RAM30H ~ 7FH中。堆栈是一个特殊的存储区,用来暂存数据和地址,它是按“先进后出”的原则存取数据的。堆栈共有两种操作:进栈和出栈。80C51单片机系统复位后,SP的内容为07H,从而复位后堆栈实际上是从08H单元开始的。但08H ~ 1FH单元分别属于工作寄存器1 ~ 3组,如程序要用到这些区,最好把SP值改为1FH或更大的值。一般在内部RAM的30H~ 7FH单元中开辟堆栈。SP的内容一经确定,堆栈的位置也就跟着确定下来,由于SP可设置为不同值,因此堆栈位置是浮动的

程序计数器(指向下一条指令的地址)

程序计数器(ProgramCounter,PC)是一个16位的计数器,其作用是控制程序的执行顺序;其内容为将要执行指令的地址,寻址范围达64KB。PC有自动加1功能,从而实现程序的顺序执行。PC没有地址,是不可寻址的,因此用户无法对它进行读写,但可以通过转移、调用、返回等指令改变其内容,以实现程序的转移。因地址不在SFR(专用寄存器)之内,一般不计作专用寄存器。

80C51的存储结构,这次一定,一定懂相关推荐

  1. 这一篇让你弄懂线性表的链式存储结构

    线性表的链式存储结构以及单链表概念 本篇内容是线性表链式存储结构的相关概念 这里有几篇线性表的干货供大家讨论学习: 这里是吐血总结的线性表顺序存储结构 这里是单链表的各种操作,超详细~ 双向链表.循环 ...

  2. 第五天学习--存储结构与磁盘划分

    章节简述: Linux系统中颇具特色的文件存储结构常常搞得新手头晕脑胀,本章将从Linux系统中的文件存储结构开始,讲述文件系统层次化标准(FHS,Filesystem Hierarchy Stand ...

  3. 《MYSQL是怎样运行的》笔记|配置文件|系统变量|字符集|InnoDB存储结构|数据页结构|索引结构与使用|数据目录|表空间|连表原理|查询优化|BufferPool|事务|redo与undo|锁

    <MYSQL是怎样运行的>笔记 前记: 历时15天,笔记+看书.完成于2022.2.5. 本书是讲具体的数据库实现,而数据库系统概念见:https://blog.csdn.net/qq_4 ...

  4. 6.存储结构与磁盘划分

    第6章 存储结构与磁盘划分 章节简述: Linux系统中颇具特色的文件存储结构常常搞得新手头晕脑胀,本章将从Linux系统中的文件存储结构开始,讲述文件系统层次化标准(FHS,Filesystem H ...

  5. linux 存储结构与磁盘划分详解

    Linux系统中颇具特色的文件存储结构常常搞得新手头晕脑胀,本章将从Linux系统中的文件存储结构开始,讲述文件系统层次化标准(FHS,Filesystem Hierarchy Standard).u ...

  6. Oracle物理存储结构--文件

    原文地址:[基础]Oracle物理存储结构--文件作者:诗意方式 1 数据文件 3.查询数据文件参数 要将数据文件置为脱机状态,可以通过下列语句实现,如将SCOTT对象的数据文件置为脱机状态: SQL ...

  7. 从零开始学数据结构和算法(二)线性表的链式存储结构

    链表 链式存储结构 定义 线性表的链式存储结构的特点是用一组任意的存储单元的存储线性表的数据元素,这组存储单元是可以连续的,也可以是不连续的. 种类 结构图 单链表 应用:MessageQueue 插 ...

  8. 【模型解读】GoogLeNet中的inception结构,你看懂了吗

    文章首发于微信公众号<与有三学AI> [模型解读]GoogLeNet中的inception结构,你看懂了吗 这是深度学习模型解读第3篇,本篇我们将介绍GoogLeNet v1到v3. 作者 ...

  9. [转帖]真TM长的:SQL Server 2008存储结构——GAM和SGAM、PFS结构、IAM结构、DCMBCM

    谈到GAM和SGAM,我们不得不从数据库的页和区说起. https://blog.csdn.net/snowfoxmonitor/article/details/49991015 一个数据库由用户定义 ...

最新文章

  1. IE8 Beta2 AJAX 的更新篇之XDR(二)(IE8 Beta2 Hand-on Lab-XDR)
  2. 对于出差的看法_我对于挑选背包的一些小建议
  3. python实现图的数据存储_Neo4j推出基于Python的嵌入式图数据存储
  4. 01背包问题:回溯法和限界分支、递归和迭代方式
  5. 1035:等差数列末项计算
  6. JS获取本周、本季度、本月、上月的开端日期、停止日期
  7. PHP安装ZIP扩展
  8. 56 - I. 数组中数字出现的次数
  9. [10.2模拟] book
  10. 大四去NTT面试软件实习生的个人总结
  11. 时间与运动-MATHLAB机器人学、机器视觉与控制
  12. 揭秘朋友圈发现的一个裂变引流套路
  13. HTML的简要学习---超链接(待补充)
  14. 什么是编程?什么是编程语言?
  15. 什么是嵌入式服务器?为什么要使用嵌入式服务器? -- java面试
  16. 记离职同事给我们的建议之一:关于人员培养方面的思考
  17. 换掉 Java 8 Java 1718 新特性真香
  18. layui引入第三方依赖
  19. 看阿玛尼迪迪的总结后的自感
  20. springBoot整合spring security+JWT实现单点登录与权限管理前后端分离--筑基中期

热门文章

  1. C语言入门常写的三个代码
  2. 圣诞节计算机老师贺卡祝福语,关于圣诞节的贺卡祝福语送给老师(最新)
  3. 广州技能入户计算机证书,广州职称入户可以考哪些证书?推荐四种证书!
  4. 好分数阅卷3.0_好分数阅卷教师版
  5. 智能公交电子站牌为你报告实时交通信息,让出行更方便
  6. Qt编写安防视频监控系统44-视频上传
  7. 【推荐收藏】C++函数大全
  8. 如何实现条码中间的几位流水号自动列印
  9. vue watch 监听不到变化_vue watch 监听路由变化
  10. 32 php 手摇泵_手摇泵基本原理及使用教程