1.3 特殊功能寄存器

由图1-2可知,片内数据RAM中80H~FFH空间大部用于特殊功能寄存器,表1-1列出了8051单片机的所有特殊功能寄存器。

表1-1 8051单片机的特殊功能寄存器

上述特殊功能寄存器分别用于以下功能单元。

CPU:ACC、B、PSW、SP、DPTR。

并行口:P0、P1、P2、P3。

中断系统:IE、IP。

定时器/计数器:TMOD、TCON、T0(TH0,TL0)、T1(TH1,TL1)。

串行口:SCON、SBUF、PCON。

本书用C语言开发单片机系统时,由于ACC可以位寻址,它常被用于判断字节中各位的状态,例如,要判断某字节第3位是否为1,可将ACC看成一个字节变量,让ACC获取该字节的值,然后直接判断ACC3是否为1,当然需要先有定义sbit ACC3 = ACC^3。

又如PSW寄存器,由于PSW可以位寻址,reg51.h已包含有该寄存器的各位定义,定义片断如下:

        /*  BIT Register  */
        /*  PSW   */
        sbit CY  = 0xD7;
        sbit AC  = 0xD6;
        sbit F0  = 0xD5;
        sbit RS1 = 0xD4;
        sbit RS0 = 0xD3;
        sbit OV  = 0xD2;
        sbit P   = 0xD0;

其中CY和F0仍在C语言程序中直接大量使用,例如,要将字节变量d(10101101)由高位开始逐位串行发送,可对d进行8次左移,并逐次发送CY,即

    for (i = 0 ; i < 8 ; i++)
    {
      d <<= 1;
      DQ = CY;
    }

代码中DQ为某外部芯片接收串行数据的引脚,这段代码利用汇编语言程序中常用的进位标志位CY,可以方便地获取移出的各位。

表1-1中带有*号的特殊功能寄存器是可位寻址的,Keil\c51下头文件reg51.h对P0~P3以外的可位寻址的各寄存器位给出了独立定义,如果要直接引用4个I/O端口的各引脚,需要在程序中用sbit进行单独定义,当然也可以将头文件reg51.h(keil\c51\inc)改成at89x52.h(keil\c51\inc\atmel),4个端口的各引脚在该头文件中均被单独定义,如P0.1被定义为P0_1,尽管其中有些定义对8051单片机是无效的,但这并不影响程序正常编译运行。