C51支持C语言的所有标准数据类型,除此之外,还加入了用于专门访问80C51硬件的数据类型,如:bit、sbit、sfr和sfrl6。这些数据类型在ANSIC中是没有的。
bit:声明位变量,其值为0或1。
sbit:声明可位寻址变量中的某个位变量,其值为0或1
sfr:声明特殊功能寄存器,地址范围为:0~255。
sfr16:同上,地址范围为0~65535。
C51编译器支持表5-1列出的数据类型。除了这些变量类型外,变量能被组合到结构、联合和数组中。兼容ANSIC标准的数据类型可通过指针访问,但扩展的bit、sbit、sfr和sfrl6数据类型专用于访问80C51的特殊功能寄存器,故不能通过指针进行访问。
表5-1 C51数据类型
数据类型<?XML:NAMESPACE PREFIX = O /> |
位 |
字节 |
值的范围 |
char |
8 |
1 |
-128~127 |
unsigned char |
8 |
1 |
0~255 |
enum |
16 |
2 |
-32768~32767 |
short |
16 |
2 |
-32768~32767 |
unsigned short |
16 |
2 |
0~65535 |
int |
16 |
2 |
-32768~32767 |
unsigned int |
16 |
2 |
0~65535 |
long |
32 |
4 |
-2147483648~2147483647 |
unsigned long |
32 |
4 |
0~4294967295 |
float |
32 |
4 |
±1.175494E-38~±3.402823E+38 |
bit |
1 |
- |
0,1 |
sbit |
1 |
- |
0,1 |
sfr |
8 |
1 |
0~255 |
sfr16 |
16 |
2 |
0~65535 |
80C51有21个特殊功能寄存器,它们在片内RAM安排了绝对地址,80C51的芯片说明中已经为它们用预定义标识符起了名字。C51要做的就是承认这些标识符并将其与绝对地址联系起来。可以用sfr与sfr16两种标识符。
例5.1 用sfr数据类型定义特殊功能寄存器示例。
sfr SCON = 0x98; /*声明SCON为串口控制器,地址为0x98*/
sfr P0 = 0x80; /*声明P0为特殊功能寄存器,地址为0x80*/
sfr TMOD = 0x89; /*声明TMOD为定时器/计数器的模式寄存器,地址为0x89*/
sfr PSW = 0xD0; /*声明PSW为特殊功能寄存器,地址为0xD0*/
说明:sfr之后的寄存器名称必须大写,定义之后可以直接对这些寄存器赋值。
在许多80C51派生系列中可用两个连续地址的特殊功能寄存器指定一个16位值,如:
sfr16 T2 = 0xCDCC /*声明T2为16位特殊功能寄存器,地址为0CCH(低字节)和0CDH(高字节)*/
例5.2 用 sbit的数据类型定义位变量示例。
sbit CY = PSW^7; /*从已声明的PSW中,指定PSW.7为CY*/
sbit CY = 0xD0^7;/*整数0xD0为基地址,指定0xD0的第七位为CY*/