数据类型 |
位数 |
字节数 |
值域 |
bit |
1 |
|
0-1 |
Signed char |
8 |
1 |
-128-+127 |
Unsigned char |
8 |
1 |
0-255 |
enum |
8/16 |
1or 2 |
-128-+127 or -32768-+32767 |
Signed short |
16 |
2 |
-32768-+32767 |
Unsigned short |
16 |
2 |
0-65535 |
Signed int |
16 |
2 |
-32768-+32767 |
Signed long |
32 |
4 |
-2147483648 to 2147483647 |
unsigned long |
32 |
4 |
0 to 4294967295 |
float |
32 |
4 |
±1.175494E-38 to ±3.402823E+38 |
Sbit |
1 |
|
0 to 1 |
sfr |
8 |
1 |
0 to 255 |
sfr16 |
16 |
2 |
0 to 65535 |
Bit Types位类型
描述(略)
位变量和位声时存在以下限缺制:
l 禁止中断的函数(用#pragma disable),和使用usigng声明寄存器组(usigng n)的函数不能返回一个位变量。如果这样使用时,Cx51编译器就会报错。
l 位变量不能声明为指针:bit *ptr /*错误的声明*/
l 不能使位变量数组:bit ware [5]; /*错误的声明*/
Bit-addressable Objects可位寻址的对象
可位寻址的对象就是可以位寻址也可以字节寻址的对象。只有占有位寻址空间的数据可以归为这一类。Cx51把用idata声明的变量放在可位寻址区域。
int bdata ibase; /* Bit-addressable int */
char bdata bary [4]; /* Bit-addressable array */
上面两个变量都是可位寻址的变量。所以这单独地访问这两个变量的每一位。使用关键字sbit可以定义新的位变量来访问用badata定义的变量,如:
sbit mybit0 = ibase ^ 0; /* bit 0 of ibase */
sbit mybit15 = ibase ^ 15; /* bit 15 of ibase */
sbit Ary07 = bary[0] ^ 7; /* bit 7 of bary[0] */
sbit Ary37 = bary[3] ^ 7; /* bit 7 of bary[3] */
注意:不可以声明float变量的某一位为位变量。但是可以通过共同体来访问一个float变量的某一位。
位变量的地址是物理地址。位地址0指第一个可位寻址的字节的最低位。整型在内存中的存放是高位字节在前的,所以,整型的第最低位是就是第二个可位寻址字节的最低位,也就是位址的第8位。
Special Function Registers特殊功能寄存器
8051系列微处理器为特殊功能寄存器的存取提供了一个独立的内存区域。它位于地址0x80—0xFF,可以按位,字节,字的方式存取。
在8051系列微处理器中,,SFR的个数和类型是不同的,所以Cx51编译器并没有预定义这些SFR的名字。预定义这些特殊功能寄存器名字的声时文件在包含文件中。每个含文件包括可用的特殊功能寄存器的声明。
Cx51为存取SFR提供了sfr, sfr16,和sbit数据类型。下面解释这几种数据类型。
sfr
SFR的声明方法与其他C语言变量的声明方法相同。如:
sfr P0 = 0x80; /* Port-0, address 80h */
sfr P1 = 0x90; /* Port-1, address 90h */
sfr P2 = 0xA0; /* Port-2, address 0A0h */
sfr P3 = 0xB0; /* Port-3, address 0B0h */
sfr16
许多新型的8051变种使用两个连续的SFR字节来声明一个16bit的值。例如,8052使用地址0XCC和0XCD来做为定时器2的低字节和高字节。Cx51使用sfr16把2个字节的SFR做为一个16bit的SFR来访问。
一个SFR16的两个字节必须连在一起,并且低字节在前,在使用的时候把低字节的地址做为整个SFR16的地址使用。
sbit
在8051的经典应用中,经常会用到特殊功能寄存器的某一个单独的位。Cx51编译器使用不着sbit来声明这种变量。
注意:并不是所有的SFR都是可以位寻址的,只有那些地址可以被8整除的地址是可以位寻址的,也就是说它的地址的最低位必须是0或者是8。计算SFR位地址的方法是把位在特殊功能寄存器字节中的位置加上这一字节的地址。也就是说,访问在SFR地址0XC8第6位的时候,这一位的地址应该是0XCE(0XC8+6)
声时位变量的方法有以下三种:
1:sfr_name ^ int_constant
sfr PSW = 0xD0;
sbit OV = PSW ^ 2;
2。:int_constant ^ int_constant
sbit OV = 0xD0 ^ 2;
3:int_constant
sbit OV = 0xD2;
注意:特殊功能位是一个独立的类声明,不能和其他的位声时相互交换。
用sbit声明的变量不能访问用bdata数据类型定义的变量。
Absolute Variable Location变量的绝对地址
使用并键词_at_可以使变量定位于内存中的一个绝对地址。使用方法:
[memory_space] type variable_name _at_ constant;
这里:
memory_space 变量的内存的空间。如果不声明这一项,使用缺省的内存空间。参见:内存模式。
Type 变量类型
variable_name 变量名
constant 变量所要存储的地址
在关键词_at_后的地址必须在内存的特理边界以内。Cx51会检测变量地址声明的正确性
绝对地址变量声时须遵守以下规则:
1. 绝对地址变量不能初始化(在声明时)
2. Bit类型的变量和函数不能放在绝对地址中
上一篇:C51编译器-语言扩展(3)-指针
下一篇:C51编译器-语言扩展(1)-存储器模型和存储类型
推荐阅读最新更新时间:2024-03-16 15:20