C51單片機(jī)存儲(chǔ)類型及存儲(chǔ)模式
1.C51存儲(chǔ)類型<?XML:NAMESPACE PREFIX = O />
對(duì)于在片外擴(kuò)充的接口,可以根據(jù)硬件形成的地址,用#define語句進(jìn)行定義,例如:
#define unsigned char xdata adAddr_at_0x2000;/*定義了片外接口地址為2000H*/
C51編譯器支持80C51及其派生系列的體系結(jié)構(gòu),并提供對(duì)80C51所有存儲(chǔ)區(qū)的訪問。每個(gè)變量可以用表1中所列的存儲(chǔ)器類型明確地分配到指定的存儲(chǔ)空間。
表1 C51存儲(chǔ)類型與80C51存儲(chǔ)空間的關(guān)系
數(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 |
下面用實(shí)例說明各種存儲(chǔ)器變量的聲明。
(1)程序存儲(chǔ)器變量:程序存儲(chǔ)器的數(shù)據(jù)不能修改,通常將跳轉(zhuǎn)向量或表格存放在該區(qū),存儲(chǔ)器類型標(biāo)識(shí)符為code。
例如:unsigned char code text[] = “ENTER PARAMETER”;
(2)直接尋址內(nèi)部數(shù)據(jù)存儲(chǔ)器變量:可在一個(gè)機(jī)器周期直接尋址,因此將常用的變量放在data區(qū)。存儲(chǔ)器類型標(biāo)識(shí)符為data。
例如:unsigned char data flag; /*聲明一個(gè)內(nèi)部直接尋址的無符號(hào)字節(jié)變量*/
(3)間接尋址內(nèi)部數(shù)據(jù)存儲(chǔ)器變量:用8位寄存器作為指針尋址內(nèi)部存儲(chǔ)器。存儲(chǔ)器類型標(biāo)識(shí)符為idata。
例如:unsigned char idata buffer[8]; /*聲明一個(gè)內(nèi)部間接尋址的無符號(hào)字節(jié)數(shù)組*/
(4)位尋址內(nèi)部數(shù)據(jù)存儲(chǔ)器變量:是內(nèi)部數(shù)據(jù)存儲(chǔ)器的位尋址區(qū),位變量對(duì)需要位操作的數(shù)據(jù)十分有用,其存儲(chǔ)器類型標(biāo)識(shí)符為bdata。
注意:位尋址變量應(yīng)聲明為全局變量,否則編譯將出錯(cuò)。
例如:unsigned char bdata bStatue; /*定義可位尋址的位變量,在片內(nèi)RAM中*/
sbit statue_0 = bStatue^0; /*定義位變量bStatue的第三位的符號(hào)地址*/
bit數(shù)據(jù)類型可以用來訪問用bdata存儲(chǔ)器類型標(biāo)識(shí)聲明的變量的位。
外部數(shù)據(jù)存儲(chǔ)器的聲明與前面例子相似,這里不再說明。
如果變量聲明中遺漏存儲(chǔ)器類型標(biāo)識(shí)符,則自動(dòng)選擇默認(rèn)的存儲(chǔ)器類型。默認(rèn)的存儲(chǔ)器類型應(yīng)用到所有全局變量、靜態(tài)變量、函數(shù)自變量和不能分配寄存器的自動(dòng)變量。默認(rèn)的存儲(chǔ)器類型取決于編譯時(shí)的存儲(chǔ)器模式。這都是不同于一般C語言的地方。
2.C51的存儲(chǔ)器模式
存儲(chǔ)器模式確定了用于函數(shù)自變量、自動(dòng)變量和無明確存儲(chǔ)類型變量的默認(rèn)存儲(chǔ)器類型??捎镁幾g器控制指令Small,Compact和Large指定編譯時(shí)的存儲(chǔ)器模式。用存儲(chǔ)器類型標(biāo)識(shí)符明確聲明一個(gè)變量,優(yōu)先于默認(rèn)存儲(chǔ)器類型。
(1)Small模式
所有變量默認(rèn)位于80C51內(nèi)部數(shù)據(jù)存儲(chǔ)器,這和使用data存儲(chǔ)器類型標(biāo)識(shí)符明確聲明是相同的。該模式變量訪問非常有效,但所有數(shù)據(jù)對(duì)象和堆棧必須適合內(nèi)部RAM。因?yàn)槭褂玫亩褩?臻g決定于不同函數(shù)嵌套的深度,故對(duì)堆棧的尺寸要求嚴(yán)格。
(2)Compact模式
所有變量默認(rèn)位于外部數(shù)據(jù)存儲(chǔ)器的一頁(256B)內(nèi),這和使用pdata存儲(chǔ)器類型標(biāo)識(shí)符明確聲明是相同的。地址高字節(jié)通常設(shè)置P2,編譯器無法設(shè)置這個(gè)端口,故必須在啟動(dòng)代碼中手工設(shè)置。該模式能容納最多256B的變量,這個(gè)限制是用R0、R1間接尋址造成的。該模式的效率不如Small模式的效率,變量訪問速度不如Small模式的快,但比Large模式快。
(3)Large模式
所有變量默認(rèn)位于外部數(shù)據(jù)存儲(chǔ)器,這和使用xdata存儲(chǔ)器類型標(biāo)識(shí)符明確聲明是相同的。尋址使用數(shù)據(jù)指針(DPRT),變量訪問效率低,特別是對(duì)多字節(jié)變量,該模式的數(shù)據(jù)訪問比Small模式和Compact模式生成的代碼多。
一般經(jīng)常使用Small模式,它可生成最快、最緊湊和最有效的代碼。通??梢悦鞔_指定變量的存儲(chǔ)位置。僅當(dāng)使用Small模式時(shí)不適合應(yīng)用或操作才上升到Compact模式和Large模式。編輯:admin 最后修改時(shí)間:2018-05-08