数据存储器用来存放运算的中间结果、标志位以及数据的暂存和缓冲。AT89S51单片机的片内数据存储器共有256个数据存储单元,即256B,地址范围为00H~FFH。按其功能可分为两个区:00H~7FH单元组成的低128B的内部数据RAM区和80H~FFH单元组成的高128B的特殊功能寄存器(SFR)区。
1.片内RAM低128B数据存储区
片内RAM中低128B空间可以分成3个区:工作寄存器区、位寻址区及数据缓冲区,片内数据存储器的配置如图1-9所示。
(1)工作寄存器区(00H~1FH)。
寄存器常用于存放操作数及中间结果等,由于它们的功能及使用不做预先规定,因此称为通用寄存器,也叫工作寄存器。工作寄存器区共包含32个单元,地址范围为00H~1FH。这32个单元被平均分成4组,每组包含8个寄存器。4组工作寄存器的组别号分别为0组、1组、2组和3组。每个寄存器均为8位,在同一组内,各个寄存器都以R0~R7作为寄存单元编号。
在任一时刻,CPU只能使用其中的一组寄存器,并且把正在使用的那组寄存器称为当前寄存器组。到底哪一组寄存器是当前寄存器,需要由程序状态字寄存器PSW中RS0和RS1两位的状态组合来决定。其中,RS0是PSW的第3位(PSW.3)的位名称,RS1是PSW中的第4位(PSW.4)的位名称。RS0与RS1的状态与工作寄存器及RAM地址的对应关系见表1-4。如果不对工作寄存器组别进行选择,则系统默认当前工作寄存器为0组工作寄存器。
工作寄存器为CPU提供了就近数据存储的便利,有利于提高单片机的运算速度。此外,使用工作寄存器还能提高程序编制的灵活性,因此在单片机的应用编程中应充分利用这些寄存器,以简化程序设计,提高程序运行的速度。
表1-4 工作寄存器区的选择与地址对照表
(2)位寻址区(20H~2FH)。
内部RAM的20H~2FH单元,既可作为一般RAM单元使用,进行字节操作,也可以对单元中每一位进行位操作,因此把该区称为位寻址区。位寻址区共有16个单元,每个单元8位,共计16×8=128位,位地址为00H~7FH。表1-5为位寻址区的位地址分配表。
表1-5 位寻址区的位地址分配表
在单片机的一般RAM单元只有字节地址,操作时只能8位整体操作,不能按位单独操作。只有位寻址区的各个单元不但有字节地址,而且字节中的每个位都有位地址,所以CPU能直接操作这些位,执行如置“1”、清“0”、求“反”、转移、传送和逻辑运算等操作。我们常称单片机具有布尔处理功能,布尔处理的存储空间指的就是这些位寻址区,当然可位寻址单元除了此区间外,AT89S51在特殊功能寄存器区还离散地分布了83位。
特别需要注意的是,位地址00H~7FH与片内RAM字节地址00H~7FH编址相同,且均由16进制表示,但是CPU不会搞错,因为单片机的指令系统有位操作指令和字节操作指令之分,在位操作指令中的地址是位地址,在字节操作指令中的地址则是字节地址。
(3)数据缓冲区(30H~7FH)。
片内RAM中地址为30H~7FH的80个单元是数据缓冲区,它们用于存放各种数据、中间结果和作堆栈区使用,该区域没有什么特别限制。
2.特殊功能寄存器区(SFR)
内部RAM的高128单元是供给专用寄存器使用的,其单元地址为80H~FFH,每个单元8位。因这些寄存器的功能已作专门规定,故称之为专用寄存器或特殊功能寄存器(Special Function Register,简称为SFR)。特殊功能寄存器一般用于存放相应功能部件的控制命令、状态和数据。它可以反映单片机的运行状态,系统很多功能也是通过特殊功能寄存器来定义和控制程序执行的。AT89S51单片机有21个特殊功能寄存器,每个特殊功能寄存器占有一个RAM单元,它们被离散地分布在片内RAM的80H~FFH地址中,不为SFR占用的RAM单元实际上并不存在,访问它们也是没有意义的。表1-6是特殊功能寄存器分布一览表。
在SFR中,可以位寻址的寄存器有11个,共有位地址88个,其中5个未用,其余83个位地址离散地分布于80H~FFH范围内。在表1-6中带*的特殊功能寄存器是可以位寻址的,它们的字节地址均可被8整除。
在21个SFR中,地址的表示方法有两种:一种是使用物理地址,如累加器A用E0H、B寄存器用F0H、RS0(PSW.3)用D3H等;另一种是采用表1-6中的寄存器标号,如累加器A用ACC、B寄存器用B、PSW.3用RS0等。这两种表示方法中,采用后一种方法比较普遍,因为它们比较容易为人们所记忆。下面对其主要的寄存器作一些简单的介绍,其余部分将在后续章节中叙述。
表1-6 特殊功能寄存器一览表和SFR中的位地址分布情况表(*表示可以位寻址)
续表
(1)累加器ACC。
累加器ACC为8位寄存器,简称A,是最常用的特殊功能寄存器,功能较多,地位很重要。大部分单操作指令的一个操作数取自累加器,很多双操作数指令中的一个操作数也取自累加器。加、减、乘、除法运算的指令,运算结果都存放于累加器A或寄存器B中。大部分的数据操作都会通过累加器A进行,它像一个数据运输中转站,在数据传送过程中,任何两个不能直接实现数据传送的单元之间,通过累加器A中转,都能送达目的地。
(2)寄存器B。(www.xing528.com)
专用于乘、除指令。也可作为普通RAM单元使用。
(3)程序状态字PSW。
PSW为8位寄存器,地址为D0H,可位寻址,存放运算结果的一些特征。每位的含义如表1-7所示。
表1-7 PSW标志位定义
·CY:进位标志,简称为C。表示最近一次操作结果最高位有进位或借位时,由硬件置位;该位也可由软件置位或清除;在布尔处理机中该位还可以作为位累加器使用。
·AC:辅助进位标志。反映两个8位数运算时低4位有没有半进位,即低4位相加(减)有否进(借)位;也可以用于BCD码调整时的判断位,该位可由软件置位或清“0”。
·F0:用户软件标志。提供给用户定义的一个状态标志,可用软件置位或清“0”,控制程序的流向。
·RS1和RS0:工作寄存器区选择控制位,可由软件设置。
·OV:溢出标志。运算结果超出8位二进制(带符号)数所能表示的范围(即在-128~+127之外)时,硬件将该位置“1”;否则清“0”。
·F1:用户软件标志。提供给用户定义的一个状态标志,可用软件置位或清“0”,控制程序的流向。
·P:奇偶标志。若累加器A中的1的个数是奇数,则P置“1”。
(4)数据指针DPTR。
它是16位的特殊功能寄存器,由DPH(83H)、DPL(82H)两个8位寄存器组成,当CPU访问外部RAM时,DPTR作间接地址寄存器用;当CPU访问外部ROM时,DPTR作基址寄存器用。
(5)端口P0~P3。
它是I/O端口的锁存器。系统复位后,P0~P3口为FFH,是4个I/O并行端口映射入SFR中的寄存器。
(6)堆栈指针SP。
SP为8位专用寄存器,它指出堆栈顶部在片内RAM中的位置。下面详细介绍单片机的堆栈。
①堆栈的作用。
堆栈的设置主要是用来解决多级中断、子程序调用等问题,可以用来保护现场,寄存中间结果,并为主、子程序的转换提供有力的依托。
②堆栈的特点。
堆栈区是在内部RAM中开辟的一块数据存储区,原则上可以设在RAM区的00H~7FH,但通常设在数据缓冲区即30H~7FH。该区一端固定,一端活动,活动端被称为栈顶,固定端被称为栈底。且数据只允许从活动端进出。数据存取遵循“先进后出”的原则,且设计为向上生成式(即从低地址向高地址增加),即随着数据不断被送入堆栈,栈顶地址不断增大,堆栈最深128B。
③堆栈的确定。
堆栈存储器的位置是由SP给定的。SP堆栈指针寄存器内所装的数据永远是栈顶地址,即栈顶是随着SP的变化而变化的。但是若堆栈中空无数据时,栈顶和栈底重合,即此时SP中是栈底地址。堆栈中存放的数据越多,栈顶地址比栈底地址也大得越多。SP的内容一旦确定,就意味着栈顶的确定。SP总是指向栈顶中最上面的那个数据。系统复位后,SP的初始值为07H,使得堆栈实际上是从08H开始的。但我们从RAM的结构分布中可知,08H~1FH隶属工作寄存器区1~3,若编程时需要用到这些数据单元,必须对堆栈指针SP进行初始化,以防使用的工作寄存器与堆栈区冲突。
④堆栈的操作。
将一个字节压入堆栈称作进栈,将一个字节从栈顶弹出称为出栈。堆栈的操作有两种方法:第一种是自动方式,即在中断服务程序响应或子程序调用时,返回地址自动进栈。当需要返回执行主程序时,返回的地址自动交给PC,以保证程序从断点处继续执行,这种方式是不需要编程人员干预的。第二种是人工指令方式,使用专有的堆栈操作指令进行进出栈操作。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。