
2.4 存储器
存储器是单片机的主要组成部分,用于存储程序和数据。这些程序和数据在存储器中是以二进制代码表示的。要理解单片机的工作原理首先应了解存储器的结构。AT89S51/52单片机的芯片内部有数据存储器RAM和程序存储器ROM两类存储器,即片内RAM和片内ROM,而且与通用计算机不同的是,单片机采用的是程序存储器和数据存储器分开的结构,即哈佛结构。
2.4.1 存储器结构
AT89S51/52系列单片机的存储器结构采用哈佛结构,即程序存储器和数据存储器在物理结构上是分开的,而程序存储器和数据存储器又有片内和片外之分,即AT89S51/52系列单片机的存储器在物理上可分为4个存储空间:片内程序存储器、片外程序存储器、片内数据存储器和片外数据存储器。AT89S51单片机存储器空间分布及其地址范围如图2-4所示。
这种结构在物理上是把程序存储器和数据存储器分开的,但在逻辑上,即从用户使用的角度上考虑,AT89S51单片机有3个存储空间:片内外统一编址的64KB的程序存储地址空间(用16位地址);片内数据存储器地址空间,寻址范围为00~FFH;片外数据存储器地址空间,寻址范围为64KB。
由图2-4可以看出,片内程序存储器的地址空间(0000~0FFFH)与片外存储器的低地址空间是重叠的,片内数据存储器的地址空间(00~FFH)与片外数据存储器的低地址空间是重叠的。AT89S51单片机通过采用不同的访问指令,产生不同存储空间的选通信号,从而可以访问这3个不同的逻辑空间。在访问程序存储器时使用“MOVC”指令助记符,访问片内数据存储器使用“MOV”指令助记符,访问片外数据存储器使用“MOVX”指令助记符。
图2-4 AT89S51单片机存储空间分布图
2.4.2 程序存储器
AT89S51/52单片机的程序存储器主要用于存储编制好的程序和数据表格,一般由Flash EPROM组成。程序存储器可以分为片内和片外两个部分,是统一编址的。
1.程序存储器的结构和地址分配
AT89S51芯片内部有4KB Flash EPROM存储单元,其地址范围为0000H~0FFFH,即内部程序存储器。通过片外16位地址总线最多可以扩展到64KB(0000H~0FFFFH)地址空间,这也是由程序计数器PC的位数来决定的。我们知道,单片机是通过控制器中的程序计数器PC作为指针来访问程序存储器的,PC有16位,它可以直接寻址的范围是216,即64KB(0000H~0FFFFH)。AT89S52芯片内部有8KB Flash ROM存储单元,其地址范围为0000H~1FFFH。
在扩展外部程序存储器时,如果引脚信号为高电平时,则对ROM的读操作是从内部程序存储器开始,可延续至外部程序存储器,即当地址为0000H~0FFFH时,访问内部Flash EPROM(对于AT89S51而言),当地址为1000H~0FFFFH时,则访问外部程序存储器;而如果
A引脚信号为低电平时,对ROM的读操作限定在外部程序存储器,即不论地址是0000H~0FFFH还是1000H~0FFFFH,都是访问外部程序存储器。
AT89S51/52单片机的片内程序存储器与片外程序存储器是统一编址的,即逻辑上是统一的,但在物理上却是分开的。
在访问外部程序存储器时,还产生外部程序存储器读选通控制信号,而在访问内部程序存储器时,不产生
信号。
2.程序存储器的入口地址
在程序存储器中有7个特殊地址,也称为程序入口地址,使用时应予以注意。这7个入口地址分别如下。
1)0000H:主程序入口地址,单片机上电复位后自动从此地址执行指令。
2)0003H:外部中断0中断服务程序入口地址。
3)000BH:定时器0中断服务程序入口地址。
4)0013H:外部中断1中断服务程序入口地址。
5)001BH:定时器1中断服务程序入口地址。
6)0023H:串行口中断服务程序入口地址。
7)002BH:定时器2中断服务程序入口地址(仅AT89S52有)。
在上述地址中,其中一组的地址单元是0000H~0002H。系统复位后,(PC)=0000H。单片机从0000H单元开始取指令执行程序。一般在这3个单元中存储一条无条件转移指令,以便直接转去执行指定的主程序入口地址。
其余的地址单元是中断源的中断服务程序地址区,又称为中断入口地址。
中断响应后,系统按中断种类,自动转到各中断源的首地址去执行程序。因此在中断地址区中理应存放中断服务程序。但通常情况下,8个单元难以存放一个完整的中断服务程序,因此通常也是从中断地址区首地址开始存放一条无条件转移指令,以便中断响应后,通过中断地址区,再转到中断服务程序的实际入口地址去执行。
上述特殊单元除可以作为中断服务程序入口外,在不开放中断源时也可以作为一般的程序存储器使用。
2.4.3 数据存储器
单片机的数据存储器主要用于存储经常要修改的运算中间结果、数据暂存或标志位等,通常都是由随机访问存储器RAM(Random Access Memory)组成的。数据存储器可以分为片内和片外两个部分,片内数据存储器与片外数据存储器不论在逻辑上还是在物理上都是分开的,它们是通过不同的寻址方式来区分的。
AT89S51的内部RAM共有256个单元,地址为8位,寻址范围为00~FFH。通常把这256个单元按其功能划分为两部分:低128个单元(单元地址范围为00H~7FH)和高128个单元(单元地址范围为80H~0FFH)。其中低128个单元能作为数据存储器供用户使用,而高128个单元则被特殊功能寄存器SFR占用,如图2-5所示。
图2-5 AT89S51/52单片机片内数据存储器的结构
AT89S52单片机供用户使用的数据存储器比AT89S51多128个单元,共有256个单元。即除了低128个单元和高128个单元的SFR以外,还有高128个单元的片内数据存储器。这样,高128单元的数据存储器与SFR的地址是重合的。AT89S51/52单片机是通过不同的寻址方式加以区分的。在访问高128B片内数据存储器时,采用间接寻址方式;在访问特殊功能寄存器SFR时,采用直接寻址方式;在访问低128B片内数据存储器时,两种寻址方式都可以采用。
1.内部数据存储器低128单元
内部数据存储器真正供用户使用的是低128单元RAM,地址范围是00H~7FH,对其访问可采用直接寻址和间接寻址的方式。按其用途可以划分为3个区域,如图2-6所示。其中00H~1FH地址空间为通用工作寄存器区,20H~2FH地址空间为位寻址区,30H~7FH地址空间为用户RAM区。
图2-6 片内数据存储器的配置
(1)通用工作寄存器区
AT89S51系列单片机共有4组通用工作寄存器,每组有8个寄存器单元,各组都以R0~R7作为工作寄存器单元编号。通用工作寄存器常用于存储操作数或中间结果等,有时也叫工作寄存器。4组通用工作寄存器占据内部RAM的00H~1FH单元地址。
在任一时刻,CPU只能使用其中的一组工作寄存器,并且把正在使用的那组工作寄存器称为当前工作寄存器组。到底是哪一组,由程序状态字寄存器PSW中RS1、RS0位的状态组合来决定,见表2-5。而其余的工作寄存器则作为一般数据存储器使用。
表2-5 工作寄存器地址表
通用工作寄存器为CPU提供了数据存储的便利,有利于提高单片机的运算速度。此外,使用通用寄存器还能提高程序编制的灵活性,因此在单片机的应用编程中应充分利用这些寄存器,以简化程序设计,提高程序运行速度。
(2)位寻址区
位寻址区的地址范围为20H~2FH,既可以作为一般RAM单元使用,进行字节操作,也可以对单元中的每一位进行位操作,因此把该区称为位寻址区。位寻址区共有16个RAM单元,总计128位,位地址范围为00H~7FH,见表2-6。
表2-6 RAM位寻址区位地址表
AT89S51单片机具有布尔处理机功能,布尔处理机的存储空间是指这个位寻址区和特殊功能寄存器SFR中的可寻址位。位寻址区的位地址表见表2-6,可以进行字节操作和位操作。可以使用两种方式访问位寻址区:一种是以位地址的形式,如5EH即表示字节2BH的第6位;另一种是以存储单元地址加位的形式(点号操作符)表示,如2BH.6即表示位5EH。
(3)用户RAM区
在内部RAM低128单元中,通用寄存器占用32个单元,位寻址区占用16个单元,剩下80个单元就是供用户使用的一般RAM区,其单元地址为30H~7FH。对用户RAM区的使用没有任何规定或限制,但应当提及,在一般应用中常把堆栈开辟在此区中。
2.内部数据存储器高128单元
AT89S51单片机只有256B内部数据存储器,其中低128B为供用户使用的数据存储器,对其访问可采用直接寻址和间接寻址的方式;高128B用作特殊功能寄存器SFR,对其访问只能采用直接寻址方式。
而AT89S52单片机则有384B内部数据存储器,供用户使用的数据存储器为256B,地址范围为00H~0FFH。对于低128B数据存储器可采用直接寻址和间接寻址的方式;而对于高128B数据存储器,为了与特殊功能寄存器SFR区分开来,只能采用间接寻址方式访问。另外还有高128B用作特殊功能寄存器SFR,对其访问只能采用直接寻址方式。可见AT89S52单片机比AT89S51单片机多128B内部数据存储器。
3.外部数据存储器
外部数据存储器最多可以扩展至64KB。由第3章的指令系统可知,访问片外RAM只能使用MOVX指令,以DPTR作为间址寄存器,由于DPTR是16位的,因此访问的片外RAM最多为216,即64KB。
这里还要提到的是,由图2-4可知,片内RAM与片外RAM的低地址部分(00H~0FFH)是重叠的,但是它们却是两个地址空间。区分这两个地址空间的方法是使用不用的寻址指令助记符,访问片内RAM使用“MOV”指令,访问片外RAM使用“MOVX”指令。其寻址方式也是不同的,访问片外RAM只能使用寄存器间接寻址的方式,即@Ri或@DPTR,而访问片内RAM则可以使用直接寻址、寄存器间接寻址等多种方式。
在访问外部数据存储器时,CPU将会发出读信号和写信号
。
2.4.4 特殊功能寄存器(SFR)
特殊功能寄存器(SFR)主要用于管理片内和片外的功能部件。AT89S51/52单片机对特殊功能寄存器采取与片内RAM统一编址的方法进行管理,可以直接寻址,其中有些寄存器还可以进行位寻址。
AT89S51共有26个特殊功能寄存器,它们的地址分配在80H~0FFH中,可以进行字节寻址,有些SFR可以进行位寻址,这些寄存器的名称、符号及单元地址列于表2-7中。
这26个特殊功能寄存器不连续地分布在内部RAM高128单元之中。尽管还有许多空闲地址,但用户并不能使用,如果对这些单元进行读操作,得到的是一些随机数,写入无效。对特殊功能寄存器只能使用直接寻址方式,在指令中既可使用寄存器符号表示,也可使用寄存器单元地址表示。
特殊功能寄存器中有11个寄存器是可以进行位寻址的,一般从80H开始每隔8个单元有一个可以进行位寻址的寄存器,其地址可以被8整除。特殊功能寄存器的可寻址位构成位处理机的部分存储空间,如表2-7中所列。AT89S51单片机布尔处理机的存储空间就是由片内数据存储器的位寻址区和特殊功能寄存器SFR中的可寻址位共同组成的。
表2-7 AT89S51/52特殊功能寄存器地址表
(续)
注:∗表示仅AT89S52所有。
AT89S51共有26个特殊功能寄存器,现把其中部分寄存器介绍如下,其余的将在以后章节中陆续说明。
1.B寄存器
B寄存器是一个8位寄存器,主要用于乘除运算。在乘法运算时,B是乘数,乘法操作后,乘积的高8位存于B中。在除法运算时,B是除数,除法操作后,余数存于B中。此外,B寄存器也可作为一般数据寄存器使用,其地址为0F0H。
2.双数据指针DPTR
数据指针DPTR为16位寄存器。编程时,DPTR既可以按16位寄存器使用,也可以分为两个8位寄存器分开使用,即高位字节DPH和低位字节DPL。
DPTR通常在访问外部数据存储器时做间址寄存器使用,也可以用在变址寻址方式中,用DPTR做基址寄存器,用于对程序存储器的访问。由于外部数据存储器的寻址范围为64KB,故把DPTR设计为16位。为更方便地对16位地址的片内、片外数据存储器和外部扩展I/O器件进行访问,在AT89S51/52中提供了两个16位的数据指针寄存器DP0和DP1。DP0位于特殊功能寄存器SFR中的地址为82H、83H,DP1位于SFR中的地址为84H、85H。可以通过辅助寄存器AUXR1的DPS位选择DP0或者DP1。
3.辅助寄存器AUXR1
辅助寄存器AUXR1的地址为0A2H,用于选择数据指针,其各位定义格式见表2-8。
表2-8 辅助寄存器AUXR1各位的定义
DPS为数据指针选择位。
DPS=0,选择DPTR寄存器为DP0L、DP0H;
DPS=1,选择DPTR寄存器为DP1L、DP1H。
单片机复位后数据指针寄存器默认选择DP0。
4.堆栈及堆栈指针
堆栈是一种数据结构,所谓堆栈就是只允许在其一端进行数据插入和数据删除操作的线性表。数据插入堆栈称为入栈(PUSH),从堆栈中读出数据称为出栈(POP)。堆栈的最大特点是后进先出LIFO(Last In First Out),先入栈的数据由于存储在栈的底部,因此后出栈;而后入栈的数据存储在栈的顶部,因此先出栈。
堆找主要是为子程序调用和中断操作而设立的,用于保护断点地址和保护现场。在单片机中无论是执行子程序调用还是执行中断操作,最终都要返回主程序。为此需要预先把主程序的断点地址保护起来,为程序的正确返回做准备。单片机在转去执行子程序或中断服务程序以后,可能要使用单片机中的某些寄存器单元,这样就会破坏这些寄存器单元中原有的内容。为了能在子程序或中断服务程序中使用这些寄存器单元,又能在返回主程序之后恢复这些寄存器单元的原有内容,在转中断服务程序之前把单片机中各有关寄存器单元的内容保存起来,这就是现场保护。为了使计算机能进行多级中断嵌套及多重子程序嵌套,还要求堆栈具有足够的容量或者足够的堆栈深度。
不论是数据进栈还是数据出栈,都是对堆栈的栈顶单元进行的。为了指示栈顶地址,设置堆栈指针SP(Stack Pointer),SP的内容就是堆栈栈顶的存储单元地址。由于AT89S51/52单片机堆栈设在内部数据存储器RAM中,通过一个8位地址就可以访问。因此其SP是一个8位寄存器,也是一个特殊功能寄存器。系统复位后,SP的内容为07H,一般在程序设计时把SP值初始化为30H。SP的内容一经确定,堆栈的位置也就跟着确定下来,由于SP可初始化为不同值,因此堆栈位置是浮动的。AT89S51/52单片机的堆栈属于向上生长型堆栈,栈底在低地址单元。数据进栈时,SP的内容加1,指针上移,后写入数据;数据出栈时,先读出数据,SP的内容减1,指针下移。
AT89S51/52单片机的堆栈只能开辟在芯片的内部数据存储器中,主要优点是操作速度快,但堆栈容量有限。由于堆找的占用,会减少内部RAM的用户可利用单元数。堆栈的使用有两种方式,一种是自动方式,即在调用子程序或中断时,返回地址(断点)自动进栈。程序返回时,断点再自动弹回PC。这种堆栈操作无须用户干预,称为自动方式。另一种是指令方式,即使用专用的堆栈操作指令,进行入栈出栈操作,可用于传送数据。
5.端口P0~P3
端口P0~P3为4个8位特殊功能寄存器,分别对应I/O端口P0~P3的锁存器。在AT89S51/52单片机中,不设专门的端口操作指令,而是把I/O端口当作一般特殊功能寄存器来操作,使用方便。