c51支持c語言的所有標(biāo)準(zhǔn)數(shù)據(jù)類型,除此之外,還加入了用于專門訪問80c51硬件的數(shù)據(jù)類型,如:bit、sbit、sfr和sfrl6。這些數(shù)據(jù)類型在ansic中是沒有的。
bit:聲明位變量,其值為0或1。
sbit:聲明可位尋址變量中的某個(gè)位變量,其值為0或1
sfr:聲明特殊功能寄存器,地址范圍為:0~255。
sfr16:同上,地址范圍為0~65535。
c51編譯器支持表5-1列出的數(shù)據(jù)類型。除了這些變量類型外,變量能被組合到結(jié)構(gòu)、聯(lián)合和數(shù)組中。兼容ansic標(biāo)準(zhǔn)的數(shù)據(jù)類型可通過指針訪問,但擴(kuò)展的bit、sbit、sfr和sfrl6數(shù)據(jù)類型專用于訪問80c51的特殊功能寄存器,故不能通過指針進(jìn)行訪問。
表5-1 c51數(shù)據(jù)類型
數(shù)據(jù)類型
位
字節(jié)
值的范圍
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個(gè)特殊功能寄存器,它們在片內(nèi)ram安排了絕對地址,80c51的芯片說明中已經(jīng)為它們用預(yù)定義標(biāo)識符起了名字。c51要做的就是承認(rèn)這些標(biāo)識符并將其與絕對地址聯(lián)系起來。可以用sfr與sfr16兩種標(biāo)識符。
例5.1 用sfr數(shù)據(jù)類型定義特殊功能寄存器示例。
sfr scon = 0x98; /*聲明scon為串口控制器,地址為0x98*/
sfr p0 = 0x80; /*聲明p0為特殊功能寄存器,地址為0x80*/
sfr tmod = 0x89; /*聲明tmod為定時(shí)器/計(jì)數(shù)器的模式寄存器,地址為0x89*/
sfr psw = 0xd0; /*聲明psw為特殊功能寄存器,地址為0xd0*/
說明:sfr之后的寄存器名稱必須大寫,定義之后可以直接對這些寄存器賦值。
在許多80c51派生系列中可用兩個(gè)連續(xù)地址的特殊功能寄存器指定一個(gè)16位值,如:
sfr16 t2 = 0xcdcc /*聲明t2為16位特殊功能寄存器,地址為0cch(低字節(jié))和0cdh(高字節(jié))*/
例5.2 用 sbit的數(shù)據(jù)類型定義位變量示例。
sbit cy = psw^7; /*從已聲明的psw中,指定psw.7為cy*/
sbit cy = 0xd0^7;/*整數(shù)0xd0為基地址,指定0xd0的第七位為cy*/
在sbit聲明中,“^”號右邊的表達(dá)式定義特殊位在寄存器中的位置,值必須是0~7。