MCS-51存储器的特点

news2024/11/20 9:36:01

目录

1.MCS-51存储器的结构

2.片内数据存储器

(1)片内数据存储器低128B

(2) 片外数据存储器高128B

2.片内数据存储器高128B

3.片内程序存储器


1.MCS-51存储器的结构

如图所示,MCS-51 的存储器在物理结构上分成四个存储空间:片内程序存储器、片外程序存储器、片内数据存储器和片外数据存储器。但从用户使用的角度,即从逻辑上考虑,则有三个存储空间:片内外统一编址的64KB 程序存储器地址空间(0000H~FFFFH),256B 的片内数据存储器地址空间 (00H~FFH)及64KB片外数据存储器地址空间(0000H~FFFFH) 。

CPU 在访问三个不同的逻辑空间时,通过采用不同形式的指令(访问程序存储器使用MOVC 指令、访问片内数据存储器使用 MOV 指令、访问片外数据存储器使用 MOVX 指令)来产生相应的存储器选通信号。

2.片内数据存储器

数据存储器用于存放各种运算的中间结果,用作缓存和数据暂存,以及设置特征标志等,8051的片内数据存储器(RAM)空间较小,仅用 8位地址寻址,最大寻址范围为256个单元(00H~FFH),按使用情况不同可分成低 128B 单元(00H~7FH)和高 128B 单元(80H~FFH)。其中低 128B 单元为真正的RAM存储器,高 128B 单元为特殊功能存器(SFR)区。整个片内RAM区的分布如图所示

(1)片内数据存储器低128B

片内数据存储器低128B按用途不同又分为三个区域:

(1) 通用寄存器区

00H~1FH共32个单元为通用寄存器区,分4组,每组有8个8位的存器R0~R7,如图为通用工作寄存器的地址表。

任意时刻CPU只能选用四个工作寄存器组中的一组作为当前工作寄存器组。因此四组寄存器都用 R0~R7 表示,不会发生冲突。未被选中的工作寄存器区的各个单元,可以作为一般的数据缓冲器使用。
CPU当前使用的工作寄存器区是由程序状态字(PSW)的RS1和RS0设置决定的,PSW中这两位状态和所使用寄存器对应关系如上,通过编程修改RSW中RS1、RS0两位的状态,就能任选一个工作寄存器区作为当前工作寄存器区。

注:单片机复位后自动选择工作寄存器0区

(2) 片外数据存储器高128B

内部RAM的20H~2FH 为位寻址区域。这 16个单元(共16X8=128位)的一位都有一个地址,称为位地址。它们占据位地址空间的 00H~7FH,地址分配如表所示。这16个单元的每一位都可以看作一个软件触发器,用于存放各种程序标志、位控制变量。同样,位寻址区的RAM单元也可以作为一般的数据缓冲器使用。

(3) 用户RAM区

30H~7FH为真正数据缓冲区,可用来暂存用户数据或当作堆栈使用。

在微型机中,堆栈是在内存 RAM 中开辟的一个特定的存储区,专门用来暂时存放数据或断点地址,并按照“先进后出(FILO: First-In Last-Out),后进先出(LIFO:Last-In FirstOut)”的原则进行操作。
MCS-51单片机的堆栈,是在片内RAM低128B中开辟的一个专用区(一般选择30H~7FH作为栈区)。堆栈操作示意图如图所示。堆栈的一端是固定的,称为栈底;另一端是浮动的,称为栈顶。当堆栈中没有数据时,栈顶与栈底重合。当数据进栈时,栈顶会自动地向地址递增的方向变化。一般把堆栈中的数据称为元素,最后进栈的那个元素所在地址就栈顶是栈顶。由于堆栈元素的存入和取出必须遵循FILO和LIFO的原则,因此堆栈的操作总是对栈顶进行的。

2.片内数据存储器高128B

MCS-51单片机内部的I/O口锁存器、串行口数据缓冲器、定时器/计数器以及各种控制寄存器和状态寄存器等统称为特殊功能寄存器,简称为SFR(Special Function Registers)。
MCS-51共有21个SFR,它们离散地分布在片内RAM地址为80H~FFH的高128B区域,且每一个SFR都有一个字节地址,并定义了符号名,其地址分布见表所示

21个SFR并未完全占满 128个单元,若用指令访问未被占用的单元,其操作将是无意义的。对 SFR的访问只能采用直接寻址方式。在21个SFR中,字节地址的低位为8和0的SFR的每一位都具有位地址,可进行位寻址,且大多数可位寻址SFR的每一位都有一个位名。

常见的SFR寄存器:

(1)累加器ACC(Accumulator)
累加器是8位的寄存器,是最重要的特殊功能寄存器,许多指令的操作数取自 ACC,大部分运算结果也存放在ACC中。在指令系统中,累加器ACC的助记符常记为A,在以后叙述时也将ACC简述为A。
(2)寄存器B
寄存器B是8位寄存器,主要用于乘法和除法操作指令。对于其他指令,寄存器 B可作为一般数据寄存器使用。
(3)堆栈指针SP(Stack Pointer)
堆栈指针 SP是一个8位寄存器,用它存放栈顶的地址。进栈时,SP 自动加1,将数据压入SP所指向的单元;出栈时,则将 SP 所指向单元的内容弹出,然后SP 自动减1。因此SP总是指向栈顶。
系统复位后,SP被初始化为 07H,所以第一个压入堆栈的数据存放到 08H单元,即栈区为从07H单元开始的连续存储单元。由于08H~1FH单元为工作存器区1~3,20H~2FH为位寻址区,在程序设计中很可能要用到这些单元,所以用户在编程时最好把 SP 的值改为30H 或更大值,以免栈区与要使用的工作寄存器区或位寻址区发生冲突,造成数据混乱。栈区的大小可用“深度”表示,用户在设定堆栈时应该考虑到堆栈的深度,以便能满足子程序嵌套时的需要。

(4)程序状态字PSW(Program Status Word)

PSW是8位寄存器,用于寄存程序运行的状态信息。其中有些位(如Cy、AC、OV、P等)的状态是更具程序执行结果由硬件自动设置,而有些位(如RS1,RS0等)的状态则由软件设置。程序状态寄存器各位的状态可以用特定的指令来测试,也可以读出。程序状态字PSW格式如下:

Cy:进位标志。
在进行加(或减)法运算时,如果最高位 D7 发生进位(或借位),则Cy=1,否则Cy=0,
在进行位操作时,Cy又是布尔处理机的累加器,指令助记符用C表示。
AC:半进位标志。
当进行加(或减)法运算时,如果低半字节向高半字节产生进位(或借位)时,则AC=1,否则AC=0。AC标志亦用于校正BCD码加法运算的结果,作为BCD码调整指令“DAA”判断的依据之一。
P:奇偶标志位。
该标志位始终跟踪累加器A的奇偶性,如果A中有奇数个1,则标志P=1;否则P=0。

OV:溢出标志位。
进行带符号数的加法(或减法)算术运算时,如果运算结果超出累加器所能表示的范围(-128B~+127B)时,则发生溢出,此时OV=1;否则OV=0。

判断方法:当两个数相加(或相减)时,如果位7(D7)和位6(D6)同时发生进位(或借位),则OV=0,否则OV=1。进行乘法运算时,如果乘积超出累加器A所能表示的范围(0~255),则发生溢出,乘积的高字节必须放置在寄存器 B中,此时OV=1;否则,OV=0。进行除法运算时,如果除数为 0,则除法运算无法进行,此时OV=1;否则,OV=0。
F1F0:用户标志位。
可由用户设定作为软件标志。
RS1、RS0:工作寄存器组选择位。
用以选择当前工作的寄存器组。用户用软件改变RS1和RSO的组合,从而指定当前选用的工作寄存器组,其组合关系见表 。MCS-51单片机复位后,RS1=RS0=0。所以CPU自动选中工作寄存器0组作为当前工作寄存器组。

(5)数据指针DPTR (Data Pointer)

数据指针DPTR是一个16位的特殊功能寄存器,编程时,DPTR既可以作为一个16位寄存器使用,也可以作为两个独立的 8位寄存器分开使用,此时用 DPH表示 DPTR的高节,用DPL表示DPTR的低字节。一般编程时,常用DPTR来存放外RAM 单元(或外部I/O接口)的16位地址,作间接寄存器使用,它可指向外RAM64KB范围内的任一存储单元。
(6)程序计数器PC
程序计数器PC(Program Counter)是16位专用存器,其内容就是下一条要执行的指令首地址。CPU 总是把 PC的内容送往地址总线,作为选择存储单元的地址,以便从指定的存储单元中取出指令,译码和执行。
PC具有自动加1的功能。当CPU 顺序执行指时,PC的内容以增量的规律变化着于是当一条指令取出后,PC 就指向下一条指令。如果不按顺序执行指令,在跳转之前必须将转移的目标地址送往程序计数器,以便从该地址开始执行程序。由此可见,PC实际上是一个地址指示器,改变 PC 中的内容就可以改变指令执行的次序,即改变程序执行的路线当系统复位后,PC=0000H,CPU便从这一固定的入口地址开始执行程序。
PC不在上述的RAM存储器内,为不可寻址的专用寄存器。

3.片内程序存储器

程序存储器用于存放程序代码和表格常数。MCS-51 所支持的最大程序存储器空间为64KB,其地址指针就是16位的程序计数器PC。
对于内部有4KB程序存储器的单片机(8051或8751),EA接Vcc(+5V),当程序计数器PC的值在0000H~0FFFH时,CPU则从内部程序存储器取指令;当PC值大于0FFFH时,则从外部的程序存储器取指令。如果EA接V_{ss}(地),则内部的程序存储器被忽略,CPU总是从外部的程序存储器中取指令。

在程序存储器中,有6个特殊的单元区域:

•0000H~0002H: 复位引导程序区。系统复位后,由于(PC)=0000H,所以单片机总是从0000H 单元开始取指令执行程序。如果不希望程序不是从 0000H 单元开始执行,则必须在该单元区域中存放一条无条件转移指令,以便直接转到要执行的程序位置。

•0003H~000AH:外部中断0中断子程序入口地址区。

•000BH~0012H:定时/计数器0溢出中断子程序入口地址区。

•0013H~001AH:外部中断1中断子程序入口地址区。

•001BH~0022H:定时/计数器1溢出中断子程序入口地址区。

•0023H~002AH:串行口中断子程序入口地址区。

中断响应后,按中断种类由硬件控制 PC 自动转到各中断区的首地址去执行程序。但每个中断入口地址区只有 8个单元,无法放置完整的中断处理子程序,因此,程序员在编程时必须在中断入口区放置一条无条件转移指令,将程序引导到真正的中断处理程序的实际入口位置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1351391.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Clojure 实战(4):编写 Hadoop MapReduce 脚本

Hadoop简介 众所周知,我们已经进入了大数据时代,每天都有PB级的数据需要处理、分析,从中提取出有用的信息。Hadoop就是这一时代背景下的产物。它是Apache基金会下的开源项目,受Google两篇论文的启发,采用分布式的文件…

算法巡练day03Leetcode203移除链表元素707设计链表206反转链表

今日学习的文章视频链接 https://www.bilibili.com/video/BV1nB4y1i7eL/?vd_source8272bd48fee17396a4a1746c256ab0ae https://programmercarl.com/0707.%E8%AE%BE%E8%AE%A1%E9%93%BE%E8%A1%A8.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE 链表理论基础 见我的博…

擎创技术流 |如何使用eBPF监控NAT转换

一、NAT简介 Linux NAT(Network Address Translation)转换是一种网络技术,用于将一个或多个私有网络内的IP地址转换为一个公共的IP地址,以便与互联网通信。 图源于网络 在k8s业务场景中,业务组件之间的关系十分复杂. …

uni-app 前后端调用实例 基于Springboot 上拉分页实现

锋哥原创的uni-app视频教程: 2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中...共计23条视频,包括:第1讲 uni…

音视频通信

文章目录 一、音视频通信流程二、流媒体协议1、RTSP2、RTMP3、HLS4、WebRTC 一、音视频通信流程 音视频通信完整流程有如下几个环节:采集、编码、前后处理、传输、解码、缓冲、渲染等。 每一个细分环节,还有更细分的技术模块。比如,前后处…

【数据结构】二叉搜索(查找/排序)树

一、二叉搜索树基本概念 1、定义 二叉搜索树,又称为二叉排序树,二叉查找树,它满足如下四点性质: 1)空树是二叉搜索树; 2)若它的左子树不为空,则左子树上所有结点的值均小于它根结…

使用宝塔在Linux面板搭建网站,并实现公网远程访问

文章目录 前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 前言 宝塔面板作为简单好用的服务器运维管理面板,它支持Linux/Windows系统,我们可用它来一键配置LAMP/LNMP环境、网站、数据库、FTP等&…

STL map容器与pair类模板(解决扫雷问题)

CSTL之Map容器 - 数据结构教程 - C语言网 (dotcpp.com)https://www.dotcpp.com/course/118CSTL之Pair类模板 - 数据结构教程 - C语言网 (dotcpp.com)https://www.dotcpp.com/course/119 刷到一个扫雷的题目,之前没有玩怎么过扫雷,于是我就去玩了玩…

【计算机设计大赛作品】豆瓣电影数据挖掘可视化—信息可视化赛道获奖项目深入剖析【可视化项目案例-22】

文章目录 一.【计算机设计大赛作品】豆瓣电影数据挖掘可视化—信息可视化赛道获奖项目深入剖析【可视化项目案例-22】1.1 项目主题:豆瓣电影二.代码剖析2.1 项目效果展示2.2 服务端代码剖析2.3 数据分析2.4 数据评分三.寄语四.本案例完整源码下载一.【计算机设计大赛作品】豆瓣…

Go后端开发 -- main函数 变量 常量 函数

Go后端开发 – main函数 & 变量 & 常量 & 函数 文章目录 Go后端开发 -- main函数 & 变量 & 常量 & 函数一、第一个main函数1.创建工程2.main函数解析 二、变量声明1.单变量声明2.多变量声明 三、常量1.常量的定义2.优雅的常量 iota 四、函数1.函数返回…

2024.1.2 安装JDK和Eclipse,并配置java编译环境

2024.1.2 安装JDK和Eclipse,并配置java编译环境 一直对java一知半解,利用春节前一个月时间补补课。 一、安装jdk 首先在oracle官网上下载jdk,这里选jdk17,选择第二项直接安装,第一项是压缩文件,带有一些…

Noisy DQN 跑 CartPole-v1

gym 0.26.1 CartPole-v1 NoisyNet DQN NoisyNet 就是把原来Linear里的w/b 换成 mu sigma * epsilon, 这是一种非常简单的方法,但是可以显著提升DQN的表现。 和之前最原始的DQN相比就是改了两个地方,一个是Linear改成了NoisyLinear,另外一个是在agent在t…

第二十七章 正则表达式

第二十七章 正则表达式 1.正则快速入门2.正则需求问题3.正则底层实现14.正则底层实现25.正则底层实现36.正则转义符7.正则字符匹配8.字符匹配案例19.字符匹配案例211.选择匹配符(|)12.正则限定符{n}{n,m}(1个或者多个)*(0个或者多…

创建x11vnc系统进程

为方便使用vnc,所以寻找到一个比较好用的vnc服务端那就是x11vnc,索性就创建了一个系统进程 一、环境 系统:银河麒麟v4-sp2-server 软件:x11vnc【linux下】、VNCviewer【win下】 二、安装x11vnc 1、挂载光盘源并修改apt源 mou…

生态系统服务构建生态安全格局中的实践技术应用

生态安全是指生态系统的健康和完整情况。生态安全的内涵可以归纳为:一,保持生态系统活力和内外部组分、结构的稳定与持续性;二,维持生态系统生态功能的完整性;三,面临外来不利因素时,生态系统具…

Linux用shell脚本执行乘法口诀表的两种方式

#!/bin/bash # *********************************************************# # # # * Author : 藻头男 # # * QQ邮箱 : 2322944912qq.com # …

【SpringBoot3】1.SpringBoot入门的第一个完整小项目(新手保姆版+教会打包)

目录 1 SpringBoot简单介绍1.1 SpringBoot是什么1.2 主要优点1.3 术语1.3.1 starter(场景启动器) 1.4 官方文档 2 环境说明3 实现代码3.1 新建工程与模块3.2 加入依赖3.3 主程序文件3.4 业务代码3.5 运行测试3.6 部署打包3.7 命令行运行 1 SpringBoot简单…

[足式机器人]Part2 Dr. CAN学习笔记-自动控制原理Ch1-8Lag Compensator滞后补偿器

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-自动控制原理Ch1-8Lag Compensator滞后补偿器 从稳态误差入手(steady state Error) 误差 Error : E ( s ) R ( s ) − X ( s ) R ( s ) − E ( s ) ⋅ K G …

再见2023,你好2024!

大家好,我是老三,本来今天晚上打算出去转一转,陆家嘴打车实在太艰难了,一公里多的路,司机走了四十分钟,还没到,再加上身体不适,咳嗽地比较厉害,所以还是宅在酒店里&#…

.NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法

在.NET 6中,微软官方建议把 System.Drawing.Common 迁移到 SkiaSharp 库。因为System.Drawing.Common 被设计为 Window 技术的精简包装器,因此其跨平台实现欠佳。 SkiaSharp是一个基于谷歌的Skia图形库(Skia.org)的用于.NET平台的…