对存储还搞不清楚,先看看这篇文章-从51单片机上去理解存储器

存储器是许多存储单元的集合,存储器单元实际上是时序逻辑电路(锁存器)的一种,按单元号顺序排列。每个单元由若干二进制位构成,以表示存储单元中存放的数值,这种结构和数组的结构非常相似。按存储器的使用类型可分为只读存储器(ROM)和随机存取存储器(RAM)。

1.1 存储单位

  • 位(bit):它是计算机中最小的数据单位。由于计算机采用二进制数,所以1位二进制数称作1bit,例如101011为6bit。

  • 字节(Byte,单位简写为B):8位二进制数称为一个字节,1B=8bit。

  • 字(Word):两个字节构成一个字,即2Byte=1Word。

在单片机中还有一个常用术语:字长。所谓字长是指单片机一次能处理的二进制数的位数。51单片机一次能处理8位二进制数,所以51单片机的字长为8位。

1.2 存储器编址

如下图所示是一个容量为256字节的存储器,内部有256个存储单元,每个存储单元可以存放8位二进制数,为了存取数据方便,需要对每个存储单元进行编号,也即对存储单元编址,编址采用二进制数,对256个存储单元全部编址至少要用到8位二进制数,第1个存储单元编址为00000000,编写程序时为了方便,一般用十六进制数表示,二进制数00000000用十六进制表示就是00H,H表示十六制数,第二个存储单元编址为01H,第256个存储单元编址为FFH(也可以写成0FFH)

 图1 存储器结构

1.3存储器数据读写说明

要对256字节存储器的每个存储单元进行读写,需要8根地址线和8根数据线,先送8位地址选中某个存储单元,再根据读控制或写控制,将选中的存储单元的8位数据从8根数据线送出,或通过8根数据线将8位数据存入选中的存储单元中。以图1 存储器结构为例,当地址总线A7~A0将8位地址00011111(1FH)送入存储器时,会选中内部编址为1FH的存储单元,这时再从读控制线送入一个读控制信号,1FH 存储单元中的数据00010111从8根数据总线D7~D0送出。

1.4 存储器的地址空间说明

MCS-51单片机采用哈佛结构,即程序空间(ROM)和数据空间(RAM)分开编址,它们有各自的地址空间,互不重叠,因此ROM和RAM可以有相同的地址编码为区分同一地址的变量是来自ROM还是RAM,要求编程时定义的任何变量都必须以一定的存储器类型的方式定位在MCS-51单片机的某一存储区中。使用C51编程时,只需用关键字就可定义变量的存储器类型。C51变量的存储器类型见下表所示。

从物理地址空间看,MCS-51单片机的存储器有4个地址空间,分别是4KB的片内ROM、64KB的片外ROM、256B的片内RAM、64KB的片外RAM

ROM(程序存储器)存放程序、表格和始终要保留的常数,相当于计算机系统的硬盘;



2.1 片内外ROM(程序存储器)

8051单片机内部有4KB的程序存储器,如果内部程序存储器不够用(或无内部程序存储器),可以外接程序存储器。8051单片机最大可以外接容量为64KB的程序存储器(ROM),它与片内4KB程序存储器统一编址。 

当单片机的

端接高电平(接电源正极)时,片内、片外程序存储器都可以使用,片内4KB 程序存储器的编址为0000H~0FFFH,片外64KB 程序存储器的编址为1000H~FFFFH,片外程序存储器低4KB存储空间无法使用。

如下图所示:

当单片机的

端接低电平(接地)时,只能使用片外程序存储器,其编址为0000H~FFFFH,片内4KB程序存储器无法使用。

如下图所示: 


2.2 片内外ROM(程序存储器)说明

(1)无论是使用片内ROM还是使用片外ROM,程序的起始地址都是从ROM的0000H单元开始的

(2)尽管单片机可以同时具备内、外ROM,但是在一般情况下,都需要通过

EA的设定来选择其一。 

(3)如果EA=1,当程序超过片内ROM容量(4KB:0000H~0FFFH)时,单片机就会自动转向片外ROM,并且从1000H单元开始执行程序(无法使用片外ROM的低4KB空间)。目前,一般单片机的片内ROM容量都够,因此,很少或没必要扩展片外ROM。

ROM空间一般可以根据用户需要任意安排使用,但ROM中的某些地址被中断程序的入口地址占用。

具体如下表所示:

RAM(数据存储器)存放数据(常量或变量)或运算的结果,相当于计算机的内存;


3.1 片内外RAM(数据存储器)

8051单片机内部有256字节的数据存储器,如果内部数据存储器不够用,可以外接数据存储器。8051单片机最大可以外接容量为64KB的数据存储器(RAM),它与片内256字节数据存储器分开编址

如下图所示:    

当8051单片机连接片外RAM时,片内RAM的00H~FFH存储单元地址与片外RAM的0000H~00FFH存储单元地址相同,为了区分两者,在用汇编语言编程时,读写片外RAM时要用“MOVX”指令(读写片内RAM时要用“MOV”指令),在用C语言编程时,读写RAM时须先声明数据类型(内部数据或外部数据),若读写的数据存放在片内RAM中,要声明数据类型为内部数据类型(如用“data”声明),若读写的数据存放在片外RAM中,应声明数据类型为外部数据类型(如用“xdata”声明),单片机会根据声明的数据类型自动选择读写片内或片外RAM。



3.2  RAM(数据存储器)的分区 

8051单片机内部有128字节的数据存储器(地址为00H~7FH)和128字节的特殊功能寄存器区(地址为80H~FFH),如下图所示。根据功能不同,8051单片机的数据存储器可分为工作寄存器区(0~3组)(32 Bytes)、位寻址区(16 Bytes)、用户RAM区(80 Bytes)、特殊功能寄存器区(128 bytes)。 



3.2.1 工作寄存器区

单片机在工作时需要处理很多数据,有些数据要用来运算,有些要反复调用,有些要用来比较校验等,在处理这些数据时需要有地方能暂时存放这些数据,单片机提供暂存数据的地方就是工作寄存器。8051单片机的工作寄存器区总存储空间为32字节,由0~3组工作寄存器组成,每组有8个工作寄存器(R0~R7),共32个工作寄存器(存储单元),地址编号为00H~1FH,每个工作寄存器可存储一个字节数据(8位),四组工作寄存器的各个寄存器地址编号如下:

单片机上电复位后,默认使用第0组工作寄存器,可以通过编程设置PSW(程序状态字寄存器)的RS1、RS0位的值来换成其他组工作寄存器。当PSW的RS1位=0、RS0位=0时,使用第0组工作寄存器,RS1位=0、RS0位=1时使用第1组工作寄存器,RS1位=1、RS0位=0时使用第2组工作寄存器,RS1位=1、RS0位=1时使用第3组工作寄存器,如下图所示。不使用的工作寄存器可当作一般的数据存储器使用



3.2.2 位寻址区

位寻址区位于工作寄存器区之后,总存储空间为16字节,有16个字节存储单元,字节地址为20H~2FH,每个字节存储单元有8个存储位,一共有16×8=128个存储位,每个位都有地址,称为位地址,利用位地址可以直接对位进行读写。位寻址区的16个字节单元与128个位的地址编号如下图所示,从图中可以看出,字节单元和存储位有部分相同的地址编号,单片机是以指令类型来区分访问地址为字节单元还是位单元,比如用字节指令访问地址20H时,访问的为20H字节单元,可以同时操作该字节单元的8位数,用位指令访问地址20H时,访问的为24H字节单元的D0位,只能操作该位的数据


3.2.3 用户RAM区

用户RAM区又称为数据缓存区,8051单片机的用户RAM区有80个存储单元(字节),地址编号为30H~7FH,用户RAM区一般用来存储随机数据和运算中间结果等。


3.2.4 特殊功能寄存区

特殊功能寄存器简称SFR(Special Function Register),主要用于管理单片机内部各功能部件(如定时器/计数器、I/O 端口、中断控制器和串行通信口等),通过编程设定一些特殊功能寄存器的值,可以让相对应的功能部件进入设定的工作状态

1.特殊功能寄存器的符号、字节地址、位地址和复位值

8051单片机有21个特殊功能寄存器(SFR),见下表1,每个特殊功能寄存器都是一个字节单元(有8位),它们的地址离散分布在80H~FFH 范围内,51单片机规定特殊寄存器只能用直接寻址(直接写出 SFR 的地址或符号)方式访问

21个特殊功能寄存器都能以字节为单位进行访问,其中有一些特殊功能寄存器还可以进行位访问,能访问的位都有符号和位地址,位地址为特殊功能寄存器的字节地址加位号。以特殊功能寄存器P0为例,其字节地址为80H(字节地址值可以被8整除),其P0.0~P0.7位的位地址为80H~87H,访问字节地址80H时可读写8位(P0.0~P0.7位),访问位地址82H时仅可读写P0.2位。

有位地址的特殊寄存器既可以用字节地址访问整个寄存器(8位),也可以用位地址(或位符号)访问寄存器的某个位,无位地址的特殊寄存器只能用字节地址访问整个寄存器。当位地址和字节地址相同时,单片机会根据指令类型来确定该地址的类型。单片机上电复位后,各特殊功能寄存器都有个复位初始值,具体见表1,x表示数值不定(或1或0)。

 表1 8051单片机的21个特殊功能寄存器(SFR)

2.部分特殊功能寄存器介绍

单片机的特殊功能寄存器很多,可以分为特定功能型和通用型对于特定功能型特殊功能寄存器,当往某些位写入不同的值,可以将其控制的功能部件设为不同工作方式,读取某些位的值,可以了解相应功能部件的工作状态;通用型特殊功能寄存器主要用于运算、寻址和反映运算结果状态

下面介绍一些通用型特殊功能寄存器。

(1)累加器(ACC)

累加器又称ACC,简称A,是一个8位寄存器,其字节地址为E0H。累加器是单片机中使用最频繁的寄存器,在进行算术或逻辑运算时,数据大多数先进入ACC,运算完成后,结果大多数也送入ACC。

(2)寄存器B

寄存器B主要用于乘、除运算,其字节地址是F0H。在乘法运算时,一个数存放在A(累加器)中,另一个数存放在B中,运算结果得到的积(16位)的高字节存放在B中,低字节存放在A中;在除法运算时,被除数存取自A,除数取自B,运算结果得到商(8位)和余数(8位),商存放在A中,余数存放在B中

(3)数据指针寄存器(DPTR)

数据指针寄存器(DPTR)简称数据指针,是一个16位寄存器,由DPH和DPL两个8位寄存器组成,地址分别为83H、82H。DPTR主要在单片机访问片外RAM时使用,用于存放片外RAM的16位地址,DPH保存高8位地址,DPL保存低8位地址。

(4)堆栈指针寄存器(SP)

人们在洗碗碟时,通常是将洗完的碗碟一只一只由下往上堆起来,使用时则是将碗碟从上往下一只一只取走。这个过程有两个要点:一是这些碗碟的堆放是连续的;二是先堆放的后取走,后堆放的先取走。单片机的堆栈与上述情况类似。堆栈是指在单片机数据存储器中划分出的一个连续的存储空间,这个存储空间存取数据时具有“先进后出,后进先出”的特点。在存储器存取数据时,首先根据地址选中某个单元,再将数据存入或取出。如果有一批数据要连续存入存储器,比如将5个数据(每个数据为8位)依次存入地址为30H~34H的5个存储单元中,按一般的操作方法是:先选中地址为30H的存储单元,再将第1个数据存入该单元,然后选中地址为31H的存储单元,再将第2个数据存入该单元……显然这样存取数据比较麻烦,采用堆栈可以很好地解决这个问题。

在数据存储器中划分堆栈的方法是:通过编程的方法设置堆栈指针寄存器(SP)的值,如让SP=2FH,SP就将存储器地址为2FH的存储单元设为堆栈的栈顶地址,2FH单元后面的连续存储单元就构成了堆栈,如下图所示。堆栈设置好后,就可以将数据按顺序依次存入堆栈或从堆栈中取出,在堆栈中存取数据按照“先进后出,后进先出”的规则进行。

需要注意的是,堆栈指针寄存器(SP)中的值并不是堆栈的第一个存储单元的地址,而是前一个单元的地址,例如SP=2FH,那么堆栈的第一个存储单元的地址是30H,第1个数据存入30H单元。单片机通电复位后,SP的初始值为07H,这样堆栈第一个存储单元的地址就为08H,由于08H~1FH地址已划分给1~3组工作寄存器,在需要用到堆栈时,通常在编程时设SP=2FH,这样就将堆栈设置在数据存储器的用户RAM区(30H~7FH)

(5)程序状态字寄存器(PSW)

程序状态字寄存器(PSW)的地址是 D0H,它是一个状态指示寄存器(又称标志寄存器),用来指示系统的工作状态。PSW是一个8位寄存器,可以存储8位数,各位代表不同的功能。程序状态字寄存器(PSW)的字节地址、各位地址和各位功能如下图所示。

D7位(C):进位标志位。当单片机进行加、减运算时,若运算结果最高位有进位或借位时,C位置1,无进位或借位时,C位置0。在进行位操作时,C用作位操作累加器。

D6位(AC):半进位标志位。单片机进行加、减运算时,当低半字节的D3位向高半字节的D4位有进位或借位时,AC位置1,否则AC位置0。

D5位(F0):用户标志位0。用户可设定的标志位,可置1或置0。

D4位(RS1)、D3位(RS0):工作寄存器组选择位。这两位有4种组合状态,用来控制工作寄存器区(00H~1FH)4组中的某一组寄存器进入工作状态。

D2位(OV):溢出标志位。在进行有符号数运算时,若运算结果超出−128~+127范围,OV=1,否则OV=0;当进行无符号数乘法运算时,若运算结果超出255,OV=1,否则OV=0;当进行无符号数除法运算时,若除数为0,OV=1,否则OV=0。

D1位(F1):用户标志位1。同F0位,用户可设定的标志位,可置1或置0。

D0位(P):奇偶校验位。该位用于对累加器A中的数据进行奇偶校验,当累加器A中“1”的个数为奇数值时,P=1,若累加器A中的“1”的个数为偶数值时,P=0。51系列单片机总是保持累加器A与P中“1”的总个数为偶数值,比如累加器A中有3个“1”,即“1”的个数为奇数值,那么 P 应为“1”,这样才能让两者“1”的总个数为偶数值,这种校验方式称作偶校验。

来源:CSDN

https://blog.csdn.net/qq_37324376/article/details/119968934


版权归原作者所有,如有侵权,请联系删除。


推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

关注公众号,后台回复「1024」获取学习资料网盘链接。

欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~

嵌入式Linux

微信扫描二维码,关注我的公众号

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

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

相关文章

继续泼冷水 Ubuntu决定放弃支持安腾

在今年早些时候微软宣布下一代windows server操作系统不再支持英特尔安腾架构,给本就前途堪忧的安腾泼了一盆冷水。如今Ubuntu(重要的一款以桌面应用为主的Linux操作系统)也决定不再支持英特尔安腾架构。而另一方面,安腾在硬件厂商…

给不起钱的大公司,算不上大公司

这是昨天给一位同学聊职业规划中说的一句话。这位同学在每次做选择前都会跟我聊下,感觉职业规划咨询跟卖菜差不多,那些觉得我的建议不错的同学,总是会在一年两年后继续找我,挺好的,喜欢跟大家一起沟通吹水并一起成长的…

粉丝回馈,8000元大礼包免费相送

9月开学季,福利送不停,果哥又给大家送福利了,价值8000元豪礼相送!一、 前言非常感谢大家对我公众号的支持,暑假也结束了。这次邀请了3个不错的公众号朋友,同时也是电子嵌入式领域的优质公众号,一…

[Drupal] How to get the real path of a node, no matter it is a path or a url alias

Just test the code as below: 代码 $urisubstr(request_uri(),1,strlen(request_uri()));$uri_arrayarray();if(!($pathdrupal_lookup_path(source,$uri))) {$uri_arrayexplode(/,$uri); }else{$uri_arrayexplode(/,$path); }var_dump($uri_array);Have fun!

图文讲解5G调制,特别通俗易懂!

大家好,今天我们来聊聊调制。说到调制,我想很多同学马上会联想到这些关键词:BPSK、QPSK、调幅、调相、QAM、星座图……众所周知,调制和解调是通信基本业务流程中的重要组成部分。没有它们,我们的移动通信根本无法实现。…

2018 Multi-University Training Contest 3

好像克拉丽丝小姐姐题解写的超详细我都没啥好说的了 Problem A. Ascending Rating 仔细一看m是固定的单调DQ就好了 1 #include <bits/stdc.h>2 using namespace std;3 typedef long long LL;4 const int maxn 1e7 10;5 int st, ed, deq[maxn];6 int a[maxn];7 8 inline…

内核抢占,让世界变得更美好 | Linux 内核

大家好&#xff0c;我是老吴。今天要分享的是抢占相关的基础知识。本文以内核抢占为引子&#xff0c;概述一下 Linux 抢占的图景。我尽量避开细节问题和源码分析。什么是内核抢占&#xff1f;别急&#xff0c;咱们慢慢来。先理解抢占 (preemption) 这个概念&#xff1a;involun…

ESXI3.5 单网卡实现iSCSi连接

其实这个也没啥好说的&#xff0c;只是很多文章都是建议大家在做ESXI方案时&#xff0c;要配置专用的设备卡/网络卡来接 SAN设备&#xff0c;由于环境限制&#xff0c;我这里是用Openfiler2.3来当SAN用&#xff01; 步骤: 1.直接启用 iSCSI Software Adapter 连接 2.启动 i…

体制内工作了十几年,跳出来学嵌入式合适吗?

这说的不是我&#xff0c;是我原公司的一个朋友&#xff0c;他原来的同事。我这个朋友原来毕业是在体制内工作&#xff0c;但学习的是电子专业&#xff0c;后因为体制内不适应&#xff0c;或者说是体制内太轻松了&#xff0c;就出来折腾嵌入式。这一折腾就是快十来年&#xff0…

适合嵌入式的C++开源项目-Workflow

在来腾讯之前&#xff0c;我是没有真正用C开发过一个完整的项目的&#xff0c;然后&#xff0c;赶鸭子上架&#xff0c;鹅厂的人特别喜欢用C&#xff0c;而且用的特别好。我这次推荐一个开源的C项目&#xff0c;希望喜欢C&#xff0c;或者想往C方向发展的同学可以看看。面向过程…

几段失败的代码

1、下面一段代码将注释和代码混在了一起&#xff0c;不认真看还真不知道。高亮显示后&#xff1a;2、看到这种多层嵌套恶心到头大。3、据说某俄国特工经过九死一生偷到了NASA的太空火箭发射程序的源代码的最后一页&#xff0c;代码是&#xff1a;)))))))))))))))))))))))))))))…

java 发送邮件添加附件_java邮件自动发送时添加网络附件

查了很多资料都是使用本地资源作为附件发送。但是数据和程序分开时&#xff0c;还需要先下载数据&#xff0c;保存到本地再发送邮件。查了很多资料后&#xff0c;发现apach提供了很好的一个commons-mail.jar包&#xff0c;做了很好的封装&#xff0c;简单易用。下载地址是http:…

Excel 取消Internet及网络路径自动替换为超链接

Excel 取消Internet及网络路径自动替换为超链接&#xff1a; 1.文件 》选项 》校对 点击自动更正选项 2. 自动更正 配置修改 点击“键入时自动套用格式”tab页&#xff0c;取消勾选 internet及网络路径替换为超链接 转载于:https://www.cnblogs.com/byronliu029/p/9408468.htm…

那些喝吐的酒~

酒逢知己千杯少我喝不了酒&#xff0c;但是高兴的时候也能喝两杯。入职腾讯&#xff0c;参加了两次部门聚会&#xff0c;都离不开喝酒&#xff0c;吃饭喝酒这事&#xff0c;大家都很开心&#xff0c;那种眼前朦胧&#xff0c;胆子很肥的感觉特别好。领导们也很给面子&#xff0…

实时内核(Core)和实时操作系统(RTOS)有何不同?

大家都知道什么是实时操作系统&#xff0c;但是&#xff0c;大家熟知的实时操作系统&#xff0c;站在更广的角度来看&#xff0c;其实它就是一个实时内核。一、实时内核和实时操作系统一个实时内核是管理微处理器&#xff08;MPU&#xff09;、微控制器&#xff08;MCU&#xf…

linux java远程调试_idea远程linux代码调试

如果线上代码出现问题&#xff0c;如何用本地idea排查问题查找问题&#xff1f;第一步&#xff1a;保证本地代码与线上代码一致&#xff1b;第二步&#xff1a;在线上tomcat文件中/tomcat/bin/catalina.sh文件中添加如下配置找到下面一行信息#----- Execute The Requested Comm…

[文档]. Xilinx - 编写有效的Testbenches

This application note is written for logic designers who are new to HDL verification flows, and who do not have extensive testbench-writing experience. 下载

mysql inner join where_详解mysql 使用left join添加where条件的问题分析

当前需求&#xff1a;有group和factor两张表&#xff0c;一个group对应多个factor&#xff0c;现在想查询有效的group和对应的有效的factor&#xff0c;两个表都有isDel逻辑删除标志。最开始的错误写法一&#xff1a;SELECT g.*,f.* FROM groups g LEFT JOIN factor f ON f.gro…

误打误撞的模板字符串

前情回顾&#xff1a;之所以用到模板字符串呢&#xff0c;是在这样一个场景中用到一个类似微信发朋友圈时选择图片时的一个场景&#xff0c;如图所示 当时脑抽是怎么想的呢&#xff0c;其实也很简单&#xff0c;当时想的就是新建div嘛&#xff0c;然后append到父容器就ok啦&…

java类型转换方法_Java中基本数据类型转换的方法

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼一、自动类型转换(隐式类型转换)整型、实型(常量)、字符型数据可以混合运算。运算中&#xff0c;不同类型的数据先转化为同一类型&#xff0c;然后进行运算。转换从低级到高级。自动转换有以下规律&#xff1a;小的类型自动转化为大…