特殊功能寄存器(sfr)的地址在80h~ffh范围内,与通用ram的高128b地址在逻辑上是重合的,可用不同的寻址方式加以区分。sfr的地址离散的分布在80h~ffh的空间中。mcs51系列单片机有21个sfr,具体见表24。
表2-4 mcs-51系列单片机的sfr
(续)
注:*号标注的单位可以位寻址,位地址范围为80h~7fh之间。
这些sfr,可以以字节寻址,部分也可以位寻址。可位寻址寄存器的地址是8的整倍数。有11个可位寻址寄存器,如累加器(0e0h)、串行口控制寄存器(98h)等。sfr的位定义和地址见表2-5。
表2-5 sfr的位定义及地址
(续)
表2-5中最左边是地址,最右边一列是字节地址,中间的是sfr位地址。其规律是,在位寻址时,某sfr的字节地址,就是该sfr最低位(d0)的位地址,其他位地址依次递增。这些sfr的功能如下所述。
1.累加器(acc)(0e0h)
累加器(acc)的助记符是a,当对累加器的位进行操作时,常用符号是acc,如累加器的d0位,表示为“acc.0”。它是一个工作最繁忙的专用寄存器。大部分单操作数指令的操作数取自累加器(a)。很多双操作数指令的一个操作数也取自于它。加、减、乘、除算术运算指令的结果都存放在累加器(a)或寄存器(b)中。
2.寄存器(b)(0f0h)
寄存器(b)可以作为一般寄存器使用。但在乘、除指令中,寄存器(b)有专门的用途。乘法指令中的两个操作数,一个是累加器(a),另一个必须是寄存器(b)。运算结果存放在寄存器(b)中。除法指令中,被除数是累加器(a),除数是寄存器(b),商数存放于累加器(a),余数存放于寄存器(b)中。
3.程序状态字寄存器(psw)(0d0h)
程序状态字寄存器(psw)是一个8位寄存器。它包含了程序状态信息和一些可控制位。该寄存器各位的含义见表26。
表2-6 psw各位的含义
(1)cy(psw.7)进位标志。在执行某些算术和逻辑指令时,可以被硬件或软件置位或清除。在位处理器中,它被认为是位累加器。它的重要性相当于字节处理中的累加器(a)。
(2)ac(psw.6)辅助进位标志位。在加、减运算中,当低4位向高4位有进位或借位时,ac由硬件置位,否则ac位被清零。在bcd码运算时要十进制调整,也要用到ac位状态进行判断。(www.xing528.com)
(3)f0(psw.5)用户定义的标志位。用户可根据需要用软件方法对该位进行置位或复位,以控制程序的流程。
(4)rs1、rs0(psw.4、psw.3)选择当前工作区控制位。可用软件对它们置“1”或置“0”,以选择或确定当前工作寄存器区。rs1、rs0与工作寄存器区的关系见表27。
表2-7 rs1、rs0与工作寄存器区的关系
(5)ov(psw.2)溢出标志位,当执行算术指令时,反映带符号数的运算结果是否溢出,溢出时由硬件置ov=1,否则ov=0。溢出和进位是两种不同的概念。对8位运算而言,溢出是指两个带符号数运算时,结果超出了累加器(a)所能表示的带符号数的范围(-128~127)。而进位是两个无符号数最高位(d7)相加(或相减)有进位(或有借位)时cy的变化。还有无符号数乘法指令mul的执行结果也会影响溢出标志位。置于累加器(a)和寄存器(b)的两个乘数的积超过255(0ffh)时,ov=1,否则ov=0。此积的高8位放在寄存器(b)内,低8位放在累加器(a)内。因此ov=0只意味着乘积结果,只从累加器(a)中取得即可,否则要从寄存器(b)中取得乘积。除法指令div也会影响溢出标志位。当除数为0时,0v=1,否则ov=0。
(6)f1(psw.1)同f0。
(7)p(psw.0)奇偶标志位,执行每条指令都由硬件来置位或清“0”,以表示累加器(a)中为“1”的个数的奇偶性。若累加器(a)中“1”的个数为奇数,则p=1,否则p=0。此标志位对串行通信中的数据传输校验有重要意义。常用p作为发送一个符号的奇偶校验位,以增加通信的可靠性。
堆栈指针sp是一个8位的sfr,介绍sp前要先介绍堆栈的概念。堆栈是指数据只允许在其一端进出的一段存储空间。数据写入时称入栈或压栈;数据读出时称出栈或弹栈。堆栈数据写入和读出遵守“先入后出,后进先出”的规则。要实现这一功能,需要有一个特殊的地址指针。sp就是这一特殊的地址指针。堆栈有两种类型:一种是数据的出入口在堆栈顶端,另一种是数据的出入口在堆栈底端。所以sp也有两种类型:一种是指针指向栈顶的,另一种是指针指向栈底的。mcs51系列单片机的sp是指向栈顶的。复位时,sp=07h,根据sp是指向栈顶的特点,堆栈正落在工作寄存器1区,在切换工作寄存器区时正冲突,所以一般设置sp=30h或以上的空间。但sp不能设置在ram的顶端,因为sp是向上发展的,一定要留有足够使用空间。
5.数据指针寄存器(dptr)(83h、82h)
数据指针寄存器(dptr)是一个16位专用寄存器。其高位字节寄存器用dph表示,低位字节寄存器用dpl表示。它既可以是一个16位专用寄存器(dptr),有16位数的加“1”功能,也可以拆开,作为两个独立的8位寄存器dph和dpl使用。dptr是继程序计数器(pc)以外的第二个16位寄存器。它的主要用途是保持16位的地址,并有加“1”功能,常用于基址加变址间址寄存器寻址方式,寻址片外64kb的数据存储器或程序存储器空间。
6.p0~p3端口寄存器(80h,90h,0a0h,0b0h)
专用寄存器p0、p1、p2和p3分别是i/o端口p0~p3的8位锁存器,均为可位寻址寄存器。
7.定时/计数器(t0、t1和t2)
51子系列单片机有两个16位定时/计数器t0和t1,52子系列比51子系列多一个16位定时/计数器t2。t0、t1和t2都是由两个独立的8位寄存器组成的16位寄存器。只有在作定时/计数器使用时,它们有16位数的加“1”功能,其他情况均不能把t0、t1和t2当作一个16位的寄存器对待。
8.串行数据缓冲器(sbuf)(99h)
串行数据缓冲器(sbuf)是用于串行通信,存放欲发送和已接收数据。它在逻辑上是一个寄存器,而在物理上是两个寄存器,一个是发送缓冲寄存器,另一个是接收缓冲寄存器。两个物理寄存器使用同一个逻辑地址,不混淆的原因是:当写入sbuf时,是指向发送数据缓冲器;当读sbuf时,是取自接收缓冲寄存器。
其他ip、tmod、t2con、scon和pcon等控制寄存器,将在后面有关章节中介绍。
9.程序计数器(pc)
程序计数器(pc)不属于特殊功能寄存器,编程不能对它进行访问。它是一个16位程序地址寄存器,专门用于存放下一条要执行指令的地址,可寻址0000h~0ffffh范围(64kb)的程序存储器空间。当一条指令被取出后,程序计数器(pc)的内容会自动增量,指向下一条要执行指令的地址。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。