特殊功能寄存器是80C51单片机中各功能部件对应的寄存器,用于存放相应功能部件的控制命令,状态或数据。

它是80C51单片机中最具有特色的部分,几乎所有80C51系列功能的增加和扩展都是通过增加特殊功能寄存器来达到目的的。英文缩写为SFR,是Special Function Register(特殊功能寄存器)的缩写。

SFR也是一种扩充数据类型,占用一个内存单元,值域为0~255。利用它可以访问51单片机内部的所有特殊功能寄存器。如用sfr P1=0x90这一句定P1为P1端口在片内的寄存器,在后面的语句中我们可以用P1=255(对P1端口的所有引脚置高电平)之类的语句来操作特殊功能寄存器。

SFR的地址空间为80H~FFH,但是仅有21个(80C51子系列)或26个(80C52子系列)字节作为特殊功能寄存器离散分布在这128个字节范围内,其余字节无定义,用户也不能对这些单元进行读/写操作。

在汇编语言程序设计中,比较常用的寄存器有累加器ACC、寄存器B、程序状态寄存器PSW、堆栈寄存器SP和数据指针寄存器DPTR。下面简要介绍这些寄存器。

(1)累加器A(Accumulator)

累加器A的名称是ACC,是指令中用的最多的寄存器,特别是很多算术逻辑运算指令必须使用该寄存器。需要注意的是,ACC和A都可以在指令中代表累加器A,但是指令中的ACC能代表累加器的字节地址,而A则不能。因此,在某些要求使用特殊功能寄存器地址的指令中,不能用A表示累加器。

(2)寄存器B

乘、除法指令必须使用寄存器B。除此之外,B与其他特殊功能寄存器没有差别。(3)程序状态寄存器PSW

PSW(见表2-6)可以记录指令的执行结果状态,比如:加法运算是否产生进位、借位等。PSW中各位的作用如下:

CY:进位标志位,当运算过程中累加器的最高位产生进位或借位时,被置为1,否则被清0。在位操作指令和移位指令中,该位起到类似于累加器A的作用,参与位操作或位运算。

AC:辅助进位标志位,在加、减运算过程中,运算结果的低4位(第3位)向高4位(第4位)产生进位时,该位被置1,否则被清0。

OV:溢出标志位,用于反映有符号数计算过程中是否溢出,0:无溢出,1:有溢出。

F0和F1:F0为用户定义标志位,供用户使用,没有特殊含义;F1为保留位,用户不能使用。

RS1和RS0:用于选择CPU当前使用的工作寄存器区子区,见表2-4。

P:奇偶标志位,反映累加器A中“1”的个数的奇偶性,若“1”的个数为偶数,则P为0,反之,P为1。每条指令执行后,单片机都会自动检测累加器A,并设置P标志位。

(4)堆栈寄存器SP

堆栈在片内RAM区中用于存放数据。堆栈操作有写和读两种,将数据存入堆栈称为“入栈”,从堆栈中读取数据称为“出栈”,入栈、出栈必须遵循“先入后出,后入先出”的原则。所有堆栈操作之前,SP中存放的数值作为一个特殊的地址,该地址指向的字节存储单元被称为“栈底”。堆栈操作后,SP中的地址所指向的存储单元是“栈顶”。

(5)数据指针寄存器DPTR

数据指针寄存器DPTR是一个16位寄存器,包含两个8位寄存器DPH和DPL。访问片外ROM、片外RAM和片外I/O接口时,DPTR可在指令中提供地址。

(6)P0~P3寄存器

P0~P3是单片机的4个8位并行I/O口,表2-2和表2-3中的特殊功能寄存器P0~P3是这4个并行I/O口的端口寄存器。通过这几个寄存器可以读取或设置对应的单片机引脚状态。

(7)其他寄存器

单片机内还有其他一些寄存器,如PCON、SBUF、SCON和TMOD等,与单片机内的硬件接口有关。