7.3 C51的扩展数据类型

扩展数据类型不属于ANSIC标准数据类型,是8051单片机和C51编译器所特有的数据类型。这些类型的数据可以对8051的特殊功能寄存器进行操作,但是不能用指针对其进行存取。扩展数据类型如表7.2所示。

7.3 C51的扩展数据类型 - 图1

扩展类型的数据将存放于8051的128字节的特殊功能寄存器区(SFR)寻址区,该区域可位寻址、字节寻址或字寻址。使用扩展数据类型可以控制定时器/计数器、串口、I/O以及其他一些硬件资源。在头文件“reg51.h”中,大量使用了这些扩展数据类型,用户可以查阅其中相关的描述,也可以根据实际需要自定义。下面分别对这几种扩展数据类型进行介绍。

7.3.1 sfr和sfr16型变量

sfr和sfr16主要用于定义8051的特殊功能寄存器。其中sfr用来定义8位特殊功能寄存器,sfr16用来定义16位特殊功能寄存器,其一般形式如下。


sfr特殊功能寄存器名=特殊功能寄存器地址常数;

sfr16特殊功能寄存器名=特殊功能寄存器地址常数;


其中,sfr和sfr16为关键字。特殊功能寄存器的定义示例如下。


sfr P2=0xA0;//定义P2的I/O端口,其地址为A0H

sfr P1=0x90;//定义P1的I/O端口,其地址为90H


该语句用于定义寄存器P2的I/O端口,其地址为A0H;定义寄存器P1的I/O端口,其地址为90H。


sfr16 T2=0xCC;//定义定时器/计数器2,其地址T2L=CCH,T2H=CDH


该语句用于指定52系列单片机Timer2入口地址,其中T2L=0xCC、T2H=0xCD。

在C51语言中,使用sfr和sfr16定义变量时,应注意以下几点。

❑用sfr定义8位特殊功能寄存器时,等号后面必须是常数,不允许带运算符的表达式,且该常数必须位于特殊功能寄存器的地址范围(80H~FFH)之内。

❑sfr16不能用于定义定时器/计数器T0和T1。

❑用sfr16定义16位特殊功能寄存器时,等号后面是其低地址,其相应的高地址一定要位于物理低位地址之上。

❑关键字后的变量名要符合标识符的命名规则,并且尽量具有明确的含义,这样可以大大提高程序的可读性。