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数据类型
| 数据类型 | 位 | 字节 | 值的范围 |
| 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 |
例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的数据类型定义位变量示例。
sbitcy = psw^7;/*从已声明的psw中,指定psw.7为cy*/
sbitcy = 0xd0^7;/*整数0xd0为基地址,指定0xd0的第七位为cy*/
在sbit声明中,“^”号右边的表达式定义特殊位在寄存器中的位置,值必须是0~7。










