购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.1 片内存储器组织结构

3.1.1 存储器类型

在如图 1-2所示的P89V51内部的基本结构中,有两块存储器:RAM和快速存储器(Flash)。

(1)RAM

RAM是Random-Access Memory的缩写,意为随机读写存储器,说白了,就是随便什么时候都可以对其进行读或写操作,但RAM中的内容在掉电(关机)后就不复存在,也即开机后RAM中的内容是随机的,因而这一类存储器又被称为易失性存储器,这类存储器主要用于存储数据。

(2)ROM

与此相对的是只读存储器(Read Only Memory,ROM),这类存储器只能采用特殊的方法或特殊的工具才能把数据写进去,如采用烧录器等装置。一般说来,单片机本身不能对片内的ROM进行写入。又由于ROM是非易失性的存储器,即在关闭电源之后已写入的数据不会丢失,所以,在单片机中ROM经常作为程序存储器。

常见的ROM有 4种。

①可编程序的只读存储器(Programmable Read Only Memory,PROM)。这是一种最先出现的ROM,它只能写入一次,不允许修改或再次写入。这一类ROM目前仍在应用,主要用于已成熟的较大批量生产的产品中的单片机。

②可擦可编程只读存储器(Erasable Programmable Read Only Memory,EPROM)。这是一种可以多次写入、用紫外线擦除的ROM,主要用于小批量生产的单片机应用系统或研发单片机应用产品时采用。早年Intel公司生产的 87C51片内就是采用EPROM。自从电可擦可编程只读存储器(Electrically Erasable Programmable Read Only Memory,EEPROM)和Flash Memory(快速存储器或闪存)出现后,EPROM就渐渐消逝了。

③ EEPROM。类似EPROM,但它不用紫外线擦除,而只要用电就可擦除。但其写入和擦除的速度较慢。目前仍然有应用。

④ Flash Memory。与EEPROM类似,但其读写的速度要快得多,密度(集成度)也要高,自从它出现后迅速取代EPROM和EEPROM,在单片机中广泛应用。P89V51片内就是采用 16 KB(P89V51RB2)、32 KB(P89V51RC2)或 64 KB(P89V51RD2)的Flash Memory作为程序存储器。

3.1.2 存储器组织

P89V51的存储器组织有几个不同的存储空间,如图 3-1所示。每个存储空间都具有连续的字节地址空间,其地址都是从 0开始至最大存储范围的字节地址,即它们的地址是全部重叠的。它们之间是利用指令的寻址方式不同而区别开来的。

图 3-1 P89V51的存储器组织

虚线框的左边是P89V51的外部程序存储器区,虚线框的右边是P89V51的外部数据存储器区。虚线框内是P89V51的片内存储器,虚线框外是片外的存储器。

1.程序存储器(CODE)区

P89V51的程序存储器区又分为片内和片外两个区。

P89V51的片内程序存储器区(ICODE)是快速存储器(Flash Memory,简称Flash),可以多次擦写,特别适合于开发程序量不大的新产品或学习用。P80V51的片内Flash有16KB、32KB和 64KB,分别对应P89V51RB,P89V51RC和P89V51RD (后面遇有类似的情况时不再说明)。

P89V51的片外程序存储器区(XCODE)有 16位寻址空间(即 16位地址线),可达64KB。代码段是只读的,当要对外接存储器件如EPROM进行寻址时,单片机会产生一个信号。但这并不意味着片外程序存储器区一定要用一个EPROM。目前一般使用EEPROM作为外接存储器,可以被外围器件或P89V51进行改写,这使系统更新更加容易,新的软件可以通过ISP或IAP方式下载到EEPROM中,而不用拆下它装入一个新的EEPROM。另外,带电池的SRAMs也可用来代替EPROM,它可以像EEPROM一样进行程序的更新,并且没有像EEPROM那样读写次数的限制,但是当电源耗尽时,存储在SRAMs中的程序也随之丢失。

P89V51内部的Flash分为两块(Block):Block 0和Block 1。Block0又由 128、256或512簇组成,每簇128B。新出厂的P89V51的Block0中包含有ISP/IAP的程序,但也可以用于写入用户程序。需要将用户程序覆盖到Block 0时,是通过设置SWR位(Software Reset Bit,软件复位位,由于它为特殊寄存器FCF的第 1位,又可记为FCF.1)和BSEL位(Bank Select Bit,程序存储器块选择位,由于它为特殊寄存器FCF的第 0位,又可记为FCF.0)来实现,参见表 3-1。

表 3-1 程序存储器块的选择

说明:引导程序是用于实现ISP/IAP等功能,驻留在单片机内,通常在单片机出厂前就已经烧写在单片机内的程序。

2.数据存储器(DATA)区

P89V51的数据存储器(DATA)区包括片内低 128B的内部RAM (地址 00H~ 7FH)、高128B的内部RAM (地址 80H~ FFH)、特殊寄存器区、扩展 768B EXTRAM (地址 000H~2FFH)和外部 64KB的RAM (XDATA)(地址 80H~ FFH)5部分。

(1)片内低 128B RAM区

片内低 128B主要是作为数据段称为IDATA区,指令用一个或两个周期来访问数据段访问DATA区,比访问其他RAM,如高 128B的内部RAM和片外XDATA区要快,因为它采用直接寻址方式,而访问高 128B的内部RAM和XDATA须采用间接寻址,如必须先初始化DPTR。通常把使用比较频繁的变量或局部变量存储在DATA段中,但是必须节省使用DA TA段,因为它的空间毕竟有限。

在数据段中也可通过R0和R1采用间接寻址访问,R0和R1被作为数据区的指针,将要读或写的字节的地址放入R0或R1中,根据源操作数和目的操作数的不同执行指令需要一个或两个周期。

片内前 128字节的DATA区又可以分为如图 3-2所示的几个区域。其中:

①工作寄存器组。地址从 00H~ 1FH,每 8个单元为 1组,共有 4个组。00H~ 07H为第零组(0组),08H~ 0FH为第一组(1组),10H~ 17H为第二组(2组),18H~1FH为第三组(3组)。单片机复位时默认第零组为当前工作寄存器组,即读、写R0时是从 00H单元进行读、写操作,读、写R1时是从 01H单元进行读、写操作,……,读、写R7时是从 07H单元进行读、写操作。通过PSW (程序状态寄存器)中的RS0、RS1位可以设置当前工作寄存器组,当前工作寄存器组与RS0、RS1的关系,参见表 3-2。执行了以下两条指令:

图 3-2 片内数据存储器

表 3-2 当前工作寄存器组与RS0、RS1的关系

则把第三组设置为当前工作寄存器组,如果这时执行,

则把立即数 3AH写入到 1FH单元中。

②可位寻址区。地址从 20H~ 2FH共 16个单元中的每一位都可以直接寻址,即可以对这些单元中的某一位进行读、写操作而不会影响该单元中的其他位,也可以把这些单元中的某一位作为标志,用指令对其进行判断。这些位都有自己的位地址,如图 3-3所示。

图 3-3 可位寻址区

如果这时执行,

把位地址 00H (字节地址 20H单元的第 0位)置为 1。

把位地址 77H (字节地址 20H单元的第 7位)清除为 0。

(2)片内高 128B RAM区

片内高128B RAM区也称为IDATA区。因为IDATA区的地址和SFRs(特殊寄存器区)的地址是重叠的,通过区分所访问的存储区来解决地址重叠问题。SFRs只能通过直接寻址来访问,而IDATA区只能通过间接寻址来访问。例如:

作用完全一样,都是写入立即数#0FH到DPL。而

是写入立即数#0FH到IDATA中的 82H单元。

(3)片内特殊寄存器RAM区

在片内高 128B RAM区还有地址与前面介绍的RAM寄存器完全一样,但不能间接寻址,只能直接寻址的RAM,这些寄存器就是下面即将介绍的特殊功能寄存器。

中断系统和外部功能控制寄存器位于从地址 80H开始的内部RAM中。这些寄存器被称做SFR (Special Function Registers,特殊功能寄存器),其中很多寄存器都可位寻址(可通过名字进行引用)。例如,要对中断使能寄存器中的EA位进行寻址,可使用EA,或IE.7,或 0AFH来访问。SFRs控制定时器/计数器、串行口、中断源及中断优先级等,这些寄存器的寻址方式和DATA中的其他字节和位一样。SFR的分布如图 3-4所示。

图 3-4 SFR的分布

(4)片内扩展RAM区(EXTRAM)

P89V51片内扩展 768B RAM。为了兼容传统的 80C51单片机,片内扩展RAM可通过设置辅助寄存器AUXR (地址为 8EH)禁止,还可以在ISP下载程序时选择关闭内部扩展RAM。

AUXR中的各位定义如下:

注意:该寄存器不可位操作,其复位值为 00H。

AUXR中的各位的说明参见表 3-3。

表 3-3 AUXR中的各位的说明

(5)XDATA区

P89V51的最后一个存储空间为 64KB,和片外CODE区一样采用 16位地址寻址,称做外部数据存储器区,简称XDATA区。这个区通常包括一些RAM,如SRAM,或一些需要通过总线接口的外围器件。对XDATA的读写操作需要至少两个指令周期,只能使用DPTR、R0或R1间接寻址。例如:

这两组指令都是完成把A中的数据写入XDATA单元。而

则把XDATA单元中的数据读到A中。 0GO87Mi9ICmQj//3aO7wODJ7Gcp4yfGUnU+MChRPfnIwkeUtNZdDy7helKS0m4KE

点击中间区域
呼出菜单
上一章
目录
下一章
×