C51編譯器-語言擴(kuò)展(2)-數(shù)據(jù)類型
掃描二維碼
隨時(shí)隨地手機(jī)看文章
Data Types數(shù)據(jù)類型
數(shù)據(jù)類型
位數(shù)
字節(jié)數(shù)
值域
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位類型
描述(略)
位變量和位聲時(shí)存在以下限缺制:
l 禁止中斷的函數(shù)(用#pragma disable),和使用usigng聲明寄存器組(usigng n)的函數(shù)不能返回一個(gè)位變量。如果這樣使用時(shí),Cx51編譯器就會(huì)報(bào)錯(cuò)。
l 位變量不能聲明為指針:bit *ptr /*錯(cuò)誤的聲明*/
l 不能使位變量數(shù)組:bit ware [5]; /*錯(cuò)誤的聲明*/
Bit-addressable Objects可位尋址的對(duì)象
可位尋址的對(duì)象就是可以位尋址也可以字節(jié)尋址的對(duì)象。只有占有位尋址空間的數(shù)據(jù)可以歸為這一類。Cx51把用idata聲明的變量放在可位尋址區(qū)域。
int bdata ibase; /* Bit-addressable int */
char bdata bary [4]; /* Bit-addressable array */
上面兩個(gè)變量都是可位尋址的變量。所以這單獨(dú)地訪問這兩個(gè)變量的每一位。使用關(guān)鍵字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變量的某一位為位變量。但是可以通過共同體來訪問一個(gè)float變量的某一位。
位變量的地址是物理地址。位地址0指第一個(gè)可位尋址的字節(jié)的最低位。整型在內(nèi)存中的存放是高位字節(jié)在前的,所以,整型的第最低位是就是第二個(gè)可位尋址字節(jié)的最低位,也就是位址的第8位。
Special Function Registers特殊功能寄存器
8051系列微處理器為特殊功能寄存器的存取提供了一個(gè)獨(dú)立的內(nèi)存區(qū)域。它位于地址0x80—0xFF,可以按位,字節(jié),字的方式存取。
在8051系列微處理器中,,SFR的個(gè)數(shù)和類型是不同的,所以Cx51編譯器并沒有預(yù)定義這些SFR的名字。預(yù)定義這些特殊功能寄存器名字的聲時(shí)文件在包含文件中。每個(gè)含文件包括可用的特殊功能寄存器的聲明。
Cx51為存取SFR提供了sfr, sfr16,和sbit數(shù)據(jù)類型。下面解釋這幾種數(shù)據(jù)類型。
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變種使用兩個(gè)連續(xù)的SFR字節(jié)來聲明一個(gè)16bit的值。例如,8052使用地址0XCC和0XCD來做為定時(shí)器2的低字節(jié)和高字節(jié)。Cx51使用sfr16把2個(gè)字節(jié)的SFR做為一個(gè)16bit的SFR來訪問。
一個(gè)SFR16的兩個(gè)字節(jié)必須連在一起,并且低字節(jié)在前,在使用的時(shí)候把低字節(jié)的地址做為整個(gè)SFR16的地址使用。
sbit
在8051的經(jīng)典應(yīng)用中,經(jīng)常會(huì)用到特殊功能寄存器的某一個(gè)單獨(dú)的位。Cx51編譯器使用不著sbit來聲明這種變量。
注意:并不是所有的SFR都是可以位尋址的,只有那些地址可以被8整除的地址是可以位尋址的,也就是說它的地址的最低位必須是0或者是8。計(jì)算SFR位地址的方法是把位在特殊功能寄存器字節(jié)中的位置加上這一字節(jié)的地址。也就是說,訪問在SFR地址0XC8第6位的時(shí)候,這一位的地址應(yīng)該是0XCE(0XC8+6)
聲時(shí)位變量的方法有以下三種:
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;
注意:特殊功能位是一個(gè)獨(dú)立的類聲明,不能和其他的位聲時(shí)相互交換。
用sbit聲明的變量不能訪問用bdata數(shù)據(jù)類型定義的變量。
Absolute Variable Location變量的絕對(duì)地址
使用并鍵詞_at_可以使變量定位于內(nèi)存中的一個(gè)絕對(duì)地址。使用方法:
[memory_space]type variable_name_at_constant;
這里:
memory_space變量的內(nèi)存的空間。如果不聲明這一項(xiàng),使用缺省的內(nèi)存空間。參見:內(nèi)存模式。
Type變量類型
variable_name變量名
constant變量所要存儲(chǔ)的地址
在關(guān)鍵詞_at_后的地址必須在內(nèi)存的特理邊界以內(nèi)。Cx51會(huì)檢測(cè)變量地址聲明的正確性
絕對(duì)地址變量聲時(shí)須遵守以下規(guī)則:
1. 絕對(duì)地址變量不能初始化(在聲明時(shí))
2. Bit類型的變量和函數(shù)不能放在絕對(duì)地址中