2018-07-24 14:44:14 qq_38405680 阅读数 170

转载自-------21IC

特点:哈佛结构,程序存储器与数据存储器分开,两者各有一个相互独立的64K(0x0000 ~ 0xFFFF)的寻址空间(准确地说,内部数据存储器与外部数据存储器不是一回事)。

程序存储器:

① 用于存放程序(可执行的二进制代码映像文件,包括程序中的数据信息),还包括初始化代码等固件。

② 为只读存储器。注意,这里的“只读”,是指单片机(CPU)在正常工作时对其的访问方式是只读的;而现在大多数单片机的程序存储器(不管是内部还是外部)都采用了FLASH ROM,来取代以前所用的ROM、E2PROM等,可方便地进行在线编程(ISP)。

③ 标准8051的内部程序存储器大小为4KB(0x0000 ~ 0x0FFF);而具体的51核的兼容单片机的内部ROM大小需要参考其Datasheet,例如P89C51RA2xx的内部程序存储器是8K的Flash。

④ 内部、外部存储器统一编址,在软件设计上(指令系统中)没有差别;是否使用外部程序存储器是通过引脚EA在硬件电路上控制的:不使用外部程序存储器时,EA=0(接地);如果扩展了外部程序存储器,则使EA=1,当寻址到内部存储空间以外时,会自动转向外部程序存储器空间(与扩展外部程序存储器有关的还有PSEN和ALE的时序配合,以及P0和P2口用于地址线)。

[注] 一般直接选用内部程序存储器满足代码大小要求的单片机型号,避免扩展外部存储器,造成系统软硬件设计上的复杂和额外开销。

数据存储器:

为RAM。首先必须要强调的是,不管是物理上还是逻辑上,51单片机的内部、外部数据存储器都在不同的地址空间。两者不是一回事,用途也不一样,访问的指令也不同(内部RAM为MOV指令,外部为MOVX)。

1、内部数据存储器(内部RAM)

相当于内存,为程序(进程)中的变量和常量分配存储空间,掉电后内容消失。

标准8051的内部RAM为256B(0x00 ~ 0xFF):其中可供用户自由使用的是低128B(0x00 ~ 0x7F)区域,高128B中定义了26B的特殊功能寄存器(SFR),其余没有定义,因而没有意义。

P89C51RA2xx的片内RAM是512B(片内RAM不等于内部RAM,见释疑2)。

[说明] 关于内部RAM中的SFR,其中不但定义了一些控制字段,还包括累加器(ACC)、程序状态字(PSW)、数据指针(DPTR)、堆栈指针(SP)等,值得注意的是,片上I/O口P0 ~ P3的地址也在这里定义(即有3个特殊功能寄存器的地址实际上是P口的地址)——这是因为51单片机的I/O口与存储器是统一编址的*。

2、外部数据存储器(外部RAM)

上面谈到“I/O口与存储器统一编址”的问题,因此,这里称作外部RAM空间更为合适。在这个64KB地址空间中(0x0000 ~ 0xFFFF),除了可以扩展外部RAM外,还可以扩展外部I/O设备。

外部RAM主要用于存储程序运行时产生的重要数据(如数据采集结果、数据处理结果、系统日志等),这时一般需要外加电源进行掉电保护,以在系统掉电时保存其中的数据信息;也可用于数据的暂时存储,供CPU正常读写操作使用。因此外部RAM主要是使用其“可随机访问、读写方便且高速”的特性。

* 所谓I/O口与存储器统一编址,是指I/O口与主存在同一地址空间,将处理器的可寻址存储空间中专门划出一部分地址空间分配给I/O口使用。这与PC机的x86处理器不同,x86体系结构为I/O口专门定义了独立于存储空间之外的地址空间(事实上,除X86外,其他体系结构的处理器都对I/O口与存储器统一编址,可参考《Linux Device Drivers》)。

释疑1:51只有16根地址线,为什么能同时将程序存储器和外部数据存储器都扩展到64KB呢?即外部即有ROM,又有RAM,如何知道访问的是哪个?

在体系结构上,程序存储器和数据存储器是不同的地址空间,两者的访问是不会相互干扰的,这主要是通过在硬件和指令集设计上来实现的。

在硬件上,访问外部ROM是通过EA和PSEN引脚来控制的;访问外部RAM则是通过WR和RD信号来控制的;

在指令集上,访问外部ROM不需要使用显示指令,是通过PC(指令计数器)来控制取指地址的(跳转指令也可能引起PC跳转);而访问外部RAM则需要在程序设计上使用指令MOVX来执行。另外,访问内部RAM则使用了指令MOV,以区分外部RAM的访问。

释疑2:P89C51RA2xx的片内RAM是512B,是如何组织的?

P89C51RA2xx的片内RAM是512B:其中内部RAM为256B(使用MOV指令访问,定义与标准51相同);另外的256B为XRAM(片内的外部数据存储器),属于外部存储器的范畴,因此用途也同外部RAM,使用MOVX指令访问,当程序中的全局变量或单个局部变量需占较大存储空间时,可以定义为xdata型,保存到XRAM区。注意这个片内的XRAM掉电后其数据也会丢失;另外,如果要扩展外部RAM,则一般是设置XRAM为禁用态。

2016-01-25 11:47:01 baidu_33836580 阅读数 2916

MCS-51 单片机的存储器地址空间如何划分?各地址空间的地址范围和容量如何?
悬赏分:100 | 解决时间:2011-3-19 21:24
------------------------------------------------------
最佳答案:
关于MCS-51 单片机的存储器地址空间,讲起来,要用几页的篇幅。
简单介绍如下:
MCS-51的存储器有片内RAM、片外RAM 和 ROM 三个空间。
--------
片内RAM:
地址范围是00H到7FH (52系列延伸到FFH)。
其中00H到1FH,共32字节,分成四个工作寄存器区,每区有寄存器 R0~R7。
对此区域,可以使用 R0~R7 来操作,代码短捷,但是,只有一个当前工作区是可以这样读写的。
对此区域,也可以使用字节地址,来读写。
--
20H-2FH,共16字节,是位寻址区,共有128个“位”,位地址:00~7FH。
此区域,也可按照字节寻址,来读写。
--
30H-7FH,没有什么特色,只进行字节寻址。
--
80H-FFH,共有128个地址号码,其中离散的分布着21个特殊功能寄存器,必须直接寻址才能读写。
(52系列,在此范围,还有128字节的 RAM,必须间接寻址才能读写)。
对上述空间读写,必须使用 MOV 指令。
--------
片外RAM:
片外RAM的地址范围是0000H到FFFFH,容量即为64KB。
对片外RAM读写,必须使用 MOVX 指令。
--------
ROM:
ROM的地址范围是0000H到FFFFH,容量即为64KB。
其中0000~0FFFH,即4K,在片内,其它在片外。
(对于8031,这64K的ROM,都在片外。)
对ROM读出,必须使用 MOVC 指令。
------------------------------------------------------
回答时间:2011-3-14 17:00
回答者: 做而论道
原题网址:http://zhidao.baidu.com/question/236838392.html
======================================================
另一个问题:
mcs-51单片机片内的ram的寄存器区有多少个单元?
悬赏分:0 | 解决时间:2011-3-19 11:06
------------------------------------------------------
最佳答案:
mcs-51单片机片内的ram的寄存器区,共有32个单元。
分成四个区,每个区都有8个单元,称为R0~R7。
但是只有一个区,是当前工作区,才可以用R0~R7来寻址。
------------------------------------------------------
回答时间:2011-3-19 08:21
回答者: 做而论道
提问者对于答案的评价:xx
原题网址:http://zhidao.baidu.com/question/239605818.html
======================================================
另一个问题:
内部RAM的高128B就是SFR吗?由什么来区分?
悬赏分:5 | 解决时间:2011-3-17 19:00
------------------------------------------------------
最佳答案:
内部RAM的高128B,自然还是RAM。
只有52系列的单片机,内部有256字节的RAM,才有“内部RAM的高128B”的说法。
对于51系列的单片机,内部有128字节的RAM,没有“内部RAM的高128B”的说法。
---------
52系列的单片机,RAM的高128B,地址号码与SFR相同。
虽然地址号码相同,但是它们是完全不同的,RAM就是RAM,SFR就是SFR。
由什么来区分?
高128B的RAM,必须间接寻址;
SFR,必须直接寻址。
---------
51的单片机,根本就没有高128B的RAM,所以不存在区分的问题。
高128B,是21个SFR。
低128B,就是“内部RAM”。
读写SFR,也必须直接寻址。
---------
SFR就是SFR,和内部RAM没有任何关系。
RAM和SFR,不要混着说。
即不要说:内部RAM的高128B就是SFR,同样,
也不要说:SFR的低128B就是内部RAM。
------------------------------------------------------
回答时间:2011-3-11 14:32
回答者: 做而论道
提问者对于答案的评价:谢谢
原题网址:http://zhidao.baidu.com/question/235696245.html
======================================================
另一个问题:
单片机的ROM的容量为4KB。这里的是4KB等于多少bit?
请问:地址空间0000H~0FFFH容量为4KB。0000H~FFFFH容量为64KB,这没错吧?
可是每个地址含有16个二进制位,......我哪里理解错啦?求高手解答!
悬赏分:25 | 解决时间:2011-3-19 13:55
最佳答案:
------------------------------------------------------
每个地址含有16个二进制位,不是的。
每个地址含有8个二进制位。
单片机的数据线,是8条,所以每个地址只有8个二进制位。
单片机的地址线,是16条,所以共有64K个地址。
------------------------------------------------------
回答时间:2011-3-18 23:47 | 我来评论
回答者: 做而论道
提问者对于答案的评价:这么解释我就明白了。
原题网址:http://zhidao.baidu.com/question/239069143.html
======================================================
另一个问题:
在MCS-51单片机系统中,扩展的程序存储器和数据存储器都使用16位地址线和8位数据线,为什么不发生冲突?
-----------------------------------
回答:
扩展片外存储器,使用的是三总线结构,即AB、DB和CB。
楼主仅仅说出了16位地址线和8位数据线,这只是AB和DB。
另外的控制总线(CB)如下:
扩展程序存储器,使用PSEN引线,来控制对其读出;
扩展数据存储器,使用RD和WR引线,来控制对其读写。
因为控制总线不同,所以不发生冲突。
-----------------------------------
回答者: 做而论道 | 2011-3-20 12:18
原题网址:http://zhidao.baidu.com/question/239089025.html
======================================================

2018-04-27 10:08:42 u013407012 阅读数 360

对于电子设计类的学生来说,其实在学校很难通过实例来理解51单片机的存储原理。因为学校的课程很少用到外扩ROM/RAM,大多会采用C语言来进行语言编程。很多人是在工作后才实际接触到51单片机的IP核,才对存储原理以及数据空间有了较为清晰的认识。在本文当中,小编就将为大家介绍51单片机是如何实现存储数据的。
    MCS-51使用哈弗结构,它的程序空间和数据空间是分开编址的,即各自有各自的地址空间,互不重叠。所以即使地址一样,但因为分开编址,所以依然要说哪一个空间内的某地址。而ARM(甚至是x86)这种冯诺依曼结构的MCU/CPU,它的地址空间是统一并且连续的,代码存储器/RAM/CPU寄存器,甚至PC机的显存,都是统一编址的,只是不同功能的存储器占据不同的地址块,各自为政。
    对于51单片机的程序存储器,有片内和片外两部分。而且无论片内程序存储器,还是片外程序存储器,他们的地址是共享的。如果片内为4kROM,地址就是0x0000-0x0FFF,从0x1000-0xFFFF就是外部ROM的地址空间。可外部ROM的0x0000-0x0FFF的这一部分是否被使用呢?这取决于单片机EA引脚的电平值。EA=1时就是使用内部ROM的这一部分,外部ROM的这一部分浪费不用;EA=0时就是使用外部ROM的这一部分,内部ROM浪费不用。从CODE段读取数据要使用汇编的MOVC指令,单片机会根据MOVC指令、EA状态、要读取的地址值,来自动地判断从什么存储器里取数据。
    对于数据存储器,则分为内部数据存储器(IDATA/RAM)和外部数据存储器(XDATA)两个部分,但这两个存储器就不像code存储器那样共享地址空间的了。一般的8051芯片,内部RAM只有128B,从0x00-0x7F,而从0x80-0xFF则是SFR(CPU工作寄存器和各种外设寄存器都在此)的区域。对于8052来说,内部RAM有256B,所以0x80-0xFF是高128B的RAM在使用。可这部分不是SFR专用的吗?是SFR专用,但注意,SFR的访问只能使用“直接寻址方式”(使用特定的汇编指令来实现),区别就在这里。只有通过直接寻址访问的地址才是SFR,否则就是普通的RAM。至于外扩的RAM(XDATA),地址也是从0x0000-0xFFFF的,而且这里的0x0000和内部RAM的0x00是不同的,是完全独立的两个空间。他们的访问方法也是不同的。MCS-51使用MOVX指令,来读写XDATA区。而且,访问XDATA区,是需要DPTR寄存器来辅助的。因为只有DPTR才能装得下十六位的XDATA地址。
    所以MCS-51读写IDATA区的速度是最快的,而且访问方法也是最多的。访问XDATA区的速度相对就要慢很多。MCS-51的堆栈要优先开辟在IDATA区中,并且在IDATA区中开辟的堆栈,可以使用栈指针寄存器SP来控制。如果栈实在太大,只能开辟在XDATA区中,那么CPU的SP寄存器就很难借力,只能由开发者来构造堆栈结构和堆栈指针。既然外部程序空间和数据空间都是0-64K(0x0000-0xFFFF),那么实际上可以为了省事/方便改写程序等原因,外部的CODE和DATA就可以共用一个可擦写存储器了(比如各种RAM什么可擦可写的)。
    比如系统有64K的外扩MEMORY,低32K我用作保存CODE,并让单片机在这32K之中读取程序运行,高32K时作为用户数据的保存处是完全可以的。只是此时本来完全独立的CODE和DATA空间,因为在硬件芯片上共用了一个MEMORY,所以他们之间可能互相影响,程序就能自己改写程序。比如0x0020处是一个指令,通过MOVX把0x0020处改写,那么再利用MOVC把0x0020处读取出来,数据就和原来不一样了。
    容易混淆的症结在于,单片机存储空间是一个逻辑上的概念,是人为划分出来的两个相互独立的空间。而硬件电路上的MEMORY芯片则是现实中的概念,单片机的存储空间最终会落实在电路层面的芯片上,所以逻辑上的存储空间会因为物理上的电路连接而发生重叠。但是在逻辑层面上,这两个空间还是完全独立的。
    各类存储空间名称的定义:
    data:固定指前面0x00-0x7f的128个RAM,可以用a寄存器直接读写的,速度最快,生成的代码也最小。
    idata:固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。idata是用类似C中的指针方式访问的。
    xdata:外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。
    pdata:外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movxACC,@Rx读写。这个比较特殊,而且C51好象有对此BUG,建议少用。
    通过以上的介绍,可以看到51单片机虽然结构简单,但是其存储方式还是十分值得开发者深入研究的。需要注意的是,单片机的存储空间是相对于逻辑而言的,是由人们开发出的独立空间,而硬件电路上的MEMORY芯片则是现实中的概念,两者在某些时候容易出现混淆,需要大家特别注意。
2008-01-18 11:50:00 shi_kunwei 阅读数 2365

       

       

        首先介绍一些基本概念:

        51单片机存储器有数据存储器,程序存储器。数据存储器是为正在运行的程序提供空间,即RAM,程序存储器为程序的存储提供空间,即ROM,刚开始的单片机一旦写入程序就不能修改,后来出现了紫外线擦除(EPROM)、电擦除(EEPROM)和FlashROM

        数据存储器又分片内数据存储器和片外数据存储器,标准的51单片机的片内数据存储器容量是256字节,地址编码00HFFH,其中高128字节(80HFFH)是SFR区(特殊功能寄存器),低128字节(00H7FH)用户数据存储器,在这个128字节中,00H1FH32个字节分给了4组工作寄存器(R0~R7),20H2FH16字节是位寻址区,30H7FH80字节是用户RAM区,可以随意使用。通过51单片机内部的并行扩展总线,51单片机可以访问最多64K范围的外部数据存储器(注:这个说法是有问题的,看后面),由于内部的AB宽度是16位,所以内部数据存储器寻址能力是64K。

    程序存储器也分为片内和片外,由于片内外的AB宽度是16位,所以寻址能力都是64K。

    但是由于I/O端口和外围设备与数据存储器统一编址,暂用了片外数据存储器的地址空间,所以片外数据存储器寻址范围不足64K。

    前面我们分析了存储结构,发现无论是数据存储器和程序存储器,它们片内外的寻址能力都是64K。那他们是如何编址的呢?答案是:统一编址0000H~FFFFH

    你是不是感到很疑惑?如何做到的?

    首先,片内数据存储器和片外数据存储器,对于同一个地址(假设1111F)CPU是如何区分到那个存储器呢?分析一下指令,如果是MOVX那么是到片外数据存储区,如果是MOV则是到片内数据存储区。

    其次,片内数据存储器和片内程序存储器,他们的控制信号不同,访问片内数据存储器信号是Ld等,访问片内程序存储器的控制信号是Emp等。

      第三,片内程序存储器和片外程序存储器,同“首先”

      第四,片外数据存储器和片外程序存储器,同“其次”

        如何扩展呢?

        我们知道P0口有时分复用功能,既可以作为8位数据总线又可以作为低8位地址总线,我们使用地址锁存器把8位的数据总线和低8位的地址总线分开,这样P0提供低8位的地址总线和P2提供的高8位总线构成了16位的外部地址总线,P0提供了8位外部数据总线,加上控制总线,这样就形成了三总线结构。所有外围芯片都是通过这三总线进行扩展。

        可能有这个疑问:P0口如何时分复用的?

       通过内部CBALE控制信号,下降沿时将P0口输出的数据作为地址信息储存,此时P0作为低8位地址总线,在其他时刻P0作为8位数据总线。与外界的通信除了少部分通过P1,全部通过P0

        我们稍微了解一下51单片机的时序单位……

        晶振提供的频率我们称为振荡频率,假设它的周期为T0,一个T0周期称为一个节拍,用字母P表示,振荡频率经过二分频后我们得到振动频率,它的周期为T1(T1=2T0),一个T1周期称为一个状态,用字母S表示,振荡周期经过6分频我们得到ALE控制信号(注:下面有具体介绍),振荡周期经过4分频我们得到PSEN信号(注:下面有具体分析)。定义12个振荡周期为一个机器周期,那么指令周期是什么?有些指令只需要一个机器周期能执行(确切说是:取指令、译指令、执行指令)完,有些需要几个(不管如何,一般指令周期是机器周期的整数倍,通常情况是1~4倍)。

        我们有必要了解一下外部CB, 先介绍ALE控制信号:

        ALE:高电平有效,是振荡频率的6分频,利用下降沿来控制地址锁存器锁存低8位地址A0~A7。一个周期两次有效,第一次是S1P2~S2P1,第二次是S4P2~S5P1。

        然后介绍一下PSEN控制信号:

        PSEN:低电平有效,是振荡频率的4分频,用于访问外部程序存储器。一个周期两次有效,第一次是S1P2~S2P2,第二次是S4P2~S5P2。

    我们通过一个实例来理解它,假设我们访问外部程序存储器。

    PSEN是和外部存储器的OE端口接的(OE是低电平有效),ALE是接地址锁存器(假设是74HC373)的LE脚(高电平有效)。S1P2时刻,ALE上跳为高电平,74HC373的LE脚有效,74HC373内部8个锁存器打开,到S2P1这个下降沿时刻,P0输出的低8位地址被锁存在锁存器中,此时PSEN仍然为高电平,而P0由原来的低8位地址总线转化为数据总线,等待外部程序存储器输出端的数据输入,直到S2P2这个时刻,PSEN为下降沿,由无效转化为有效,这时P2口的高8位地址和锁存的P0的低8位地址组成16位地址,这个地址就是CPU要访问的外部存储器的地址,从这个地址中找出存储的信息,输出这个信息通过P0这个数据总线到达内部总线,最后到达目的地。

    访问外部数据存储器与之类似,不过控制信号不是PSEN,而是WR和RD。

    WRRD:低电平有效,用于访问外部数据存储器的读写控制,当执行MOVX时,这两个信号自动生成。

    

    尽可能避免错误,如果你发现任何错误请联系我,不胜感激 

2017-11-07 16:34:52 u014724434 阅读数 1346

单片机内部存储分为三块

以AVR1280为例,该单片机内部存储有三个部分:

1、内存RAM,运行程序时,将指令和变量拷贝至RAM,运行程序;

2、FLASH,高级的单片机,可将程序存储在此处;

3、EEPROM,一般单片机都将程序存放在此处。

有时候,我们的代码过大,为了避免给RAM造成压力,我们定义数组、变量等可定义存储在EEPROM或者FLASH中,这就给RAM节省了空间。

可以将变量存储于flash为例,可定义变量为:

char __flash test[]="save in flash...";

此时test数组存在于flash中,且test数组值不能更改,相当于常量定义const。

在其他种类单片机中,相应的关键字可能不同于__flash。

单片机的存储空间

阅读数 2206

没有更多推荐了,返回首页