單片機的C語言編程_第1頁
單片機的C語言編程_第2頁
單片機的C語言編程_第3頁
單片機的C語言編程_第4頁
單片機的C語言編程_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、 單片機的單片機的C C語言編程稱為語言編程稱為C51C51編程編程,應(yīng)用,應(yīng)用C51C51編程具有以下優(yōu)點:編程具有以下優(yōu)點: (1 1)C51C51編譯器編譯器管理內(nèi)部寄存器和存貯器的分配,編程時,無需管理內(nèi)部寄存器和存貯器的分配,編程時,無需考慮不同存儲器的尋址和數(shù)據(jù)類型等細(xì)節(jié)問題考慮不同存儲器的尋址和數(shù)據(jù)類型等細(xì)節(jié)問題; (2 2)程序有規(guī)范的結(jié)構(gòu),可分成不同的函數(shù),這種方式具有良)程序有規(guī)范的結(jié)構(gòu),可分成不同的函數(shù),這種方式具有良好的好的模塊化結(jié)構(gòu),使已編好程序容易移植模塊化結(jié)構(gòu),使已編好程序容易移植; (3 3)有豐富的)有豐富的子程序庫子程序庫可直接引用,可直接引用,具有較強的數(shù)

2、據(jù)處理能力具有較強的數(shù)據(jù)處理能力,從而大大減少用戶編程的工作量;從而大大減少用戶編程的工作量; (4 4)C C語言和匯編語言可以交叉使用語言和匯編語言可以交叉使用。 匯編語言程序代碼短、運行速度快、但復(fù)雜運算編程耗時。匯編語言程序代碼短、運行速度快、但復(fù)雜運算編程耗時。用用匯編語言編寫與硬件有關(guān)的部分程序匯編語言編寫與硬件有關(guān)的部分程序,用用C C語言編寫與硬件無關(guān)的語言編寫與硬件無關(guān)的運算部分程序運算部分程序,充分發(fā)揮兩種語言的長處,提高開發(fā)效率。,充分發(fā)揮兩種語言的長處,提高開發(fā)效率。 第第4 4章章 單片機的單片機的C C語言編程語言編程4.1 C514.1 C51程序結(jié)構(gòu)特點程序結(jié)構(gòu)

3、特點 同標(biāo)準(zhǔn)同標(biāo)準(zhǔn)C C一樣,一樣,C51C51的程序是由函數(shù)組成。的程序是由函數(shù)組成。C C語言的函數(shù)以語言的函數(shù)以“”開始,以開始,以“”結(jié)束。結(jié)束。 其中必須有一個其中必須有一個主函數(shù)主函數(shù)mainmain()(),程序的執(zhí)行從主函數(shù),程序的執(zhí)行從主函數(shù)main() main() 開始,調(diào)用其開始,調(diào)用其他函數(shù)后返回主函數(shù)他函數(shù)后返回主函數(shù)main()main(),最后,最后在主函數(shù)中結(jié)束整個程序在主函數(shù)中結(jié)束整個程序, ,而不管函數(shù)的排列而不管函數(shù)的排列順序如何。順序如何。 C C語言的語句規(guī)則:語言的語句規(guī)則: 1.1.每個變量必須先說明后引用。每個變量必須先說明后引用。 2.C2.

4、C語言程序一行可以書寫多條語句,但每個語句必須以語言程序一行可以書寫多條語句,但每個語句必須以“;”結(jié)尾,一個語句也可以多行書寫。結(jié)尾,一個語句也可以多行書寫。 3.C3.C語言的注釋用語言的注釋用/ /* * */ /表示。表示。 4.“”4.“”花括號必須成對花括號必須成對,位置隨意,多個花括號可同行書寫,位置隨意,多個花括號可同行書寫,也可逐行書寫。也可逐行書寫。 C C語言程序的組成結(jié)構(gòu):語言程序的組成結(jié)構(gòu): 全局變量全局變量說明說明 / /* *可被各函數(shù)引用可被各函數(shù)引用* */ / mainmain( ) /( ) /* *主函數(shù)主函數(shù)* */ / 局部變量局部變量說明說明 /

5、/* *只在本函數(shù)引用只在本函數(shù)引用* */ /執(zhí)行語句執(zhí)行語句( (包括函數(shù)調(diào)用語句包括函數(shù)調(diào)用語句); ); fun1fun1( (形式參數(shù)表形式參數(shù)表) /) /* *函數(shù)函數(shù)1 1* */ / 形式參數(shù)說明形式參數(shù)說明 局部變量說明局部變量說明 執(zhí)行語句執(zhí)行語句( (包括調(diào)用其他函數(shù)語句包括調(diào)用其他函數(shù)語句) ) funnfunn( (形式參數(shù)表形式參數(shù)表) /) /* *函數(shù)函數(shù)n n* */ / 形式參數(shù)說明形式參數(shù)說明 局部變量說明局部變量說明 執(zhí)行語句執(zhí)行語句 標(biāo)識符標(biāo)識符用來標(biāo)識源程序中某個對象的名字,這些對象可以是用來標(biāo)識源程序中某個對象的名字,這些對象可以是語句、數(shù)據(jù)類型

6、、函數(shù)、變量、數(shù)組等。語句、數(shù)據(jù)類型、函數(shù)、變量、數(shù)組等。標(biāo)識符區(qū)分大小寫,標(biāo)識符區(qū)分大小寫,第一個字符必須是字母或下劃線。第一個字符必須是字母或下劃線。 C51C51中有些庫函數(shù)的標(biāo)識符是以下劃線開頭的,所以中有些庫函數(shù)的標(biāo)識符是以下劃線開頭的,所以一般不一般不要以下劃線開頭命名標(biāo)識符要以下劃線開頭命名標(biāo)識符。 C51C51編譯器規(guī)定標(biāo)識符只有編譯器規(guī)定標(biāo)識符只有3232個字符在編譯時有效個字符在編譯時有效,因此在,因此在編寫源程序時標(biāo)識符的長度不要超過編寫源程序時標(biāo)識符的長度不要超過3232個字符個字符。 關(guān)鍵字關(guān)鍵字是編程語言保留的特殊標(biāo)識符,是編程語言保留的特殊標(biāo)識符,在在C C語言的

7、程序編寫語言的程序編寫中不允許標(biāo)識符與關(guān)鍵字相同中不允許標(biāo)識符與關(guān)鍵字相同。 Keil C51 Keil C51編譯器的關(guān)鍵字除了有編譯器的關(guān)鍵字除了有ANSI CANSI C標(biāo)準(zhǔn)的標(biāo)準(zhǔn)的3232個關(guān)鍵字個關(guān)鍵字外還根據(jù)外還根據(jù)5151單片機的特點單片機的特點擴展了相關(guān)的關(guān)鍵字?jǐn)U展了相關(guān)的關(guān)鍵字。4.2 C514.2 C51的標(biāo)識符和關(guān)鍵字的標(biāo)識符和關(guān)鍵字關(guān)鍵字用途說明auto存儲種類說明用以說明局部變量,缺省值為此break程序語句退出最內(nèi)層循環(huán)體case程序語句switch語句中的選擇項char數(shù)據(jù)類型說明單字節(jié)整型數(shù)或字符型數(shù)據(jù)const存儲類型說明在程序執(zhí)行過程中不可更改的常量值con

8、tinue程序語句轉(zhuǎn)向下一次循環(huán)default程序語句switch語句中的失敗選擇項do程序語句構(gòu)成dowhile循環(huán)結(jié)構(gòu)double數(shù)據(jù)類型說明雙精度浮點數(shù)else程序語句構(gòu)成ifelse選擇結(jié)構(gòu)enum數(shù)據(jù)類型說明枚舉extern存儲種類說明在其他程序模塊中說明了的全局變量float數(shù)據(jù)類型說明單精度浮點數(shù)for程序語句構(gòu)成for循環(huán)結(jié)構(gòu)goto程序語句構(gòu)成goto轉(zhuǎn)移結(jié)構(gòu)if程序語句構(gòu)成ifelse選擇結(jié)構(gòu)ANSI CANSI C標(biāo)準(zhǔn)關(guān)鍵字(標(biāo)準(zhǔn)關(guān)鍵字(1 1)ANSI CANSI C標(biāo)準(zhǔn)關(guān)鍵字(標(biāo)準(zhǔn)關(guān)鍵字(2 2)關(guān)鍵字用途說明int數(shù)據(jù)類型說明基本整型數(shù)long數(shù)據(jù)類型說明長整型數(shù)r

9、egister存儲種類說明使用CPU內(nèi)部寄存的變量return程序語句函數(shù)返回short數(shù)據(jù)類型說明短整型數(shù)signed數(shù)據(jù)類型說明有符號數(shù),二進制數(shù)據(jù)的最高位為符號位sizeof運算符計算表達式或數(shù)據(jù)類型的字節(jié)數(shù)static存儲種類說明靜態(tài)變量struct數(shù)據(jù)類型說明結(jié)構(gòu)類型數(shù)據(jù)switch程序語句構(gòu)成switch選擇結(jié)構(gòu)typedef數(shù)據(jù)類型說明重新進行數(shù)據(jù)類型定義union數(shù)據(jù)類型說明聯(lián)合類型數(shù)據(jù)unsigned數(shù)據(jù)類型說明無符號數(shù)據(jù)void數(shù)據(jù)類型說明無類型數(shù)據(jù)volatile數(shù)據(jù)類型說明該變量在程序執(zhí)行中可被隱含地改變while程序語句構(gòu)成while和dowhile循環(huán)結(jié)構(gòu)Keil

10、C51Keil C51編譯器擴展的關(guān)鍵字(編譯器擴展的關(guān)鍵字(1 1)關(guān)鍵字用途說明_at_地址定位為變量定義存儲空間絕對地址alien函數(shù)特性說明聲明與PL/M51兼容的函數(shù)bdata存儲器類型說明可位尋址的內(nèi)部RAMbit位標(biāo)量聲明聲明一個位標(biāo)量或位類型的函數(shù)code存儲器類型說明程序存儲器空間compact存儲器模式使用外部分頁RAM的存儲模式data存儲器類型說明直接尋址的8051內(nèi)部數(shù)據(jù)存儲器idata存儲器類型說明間接尋址的8051內(nèi)部數(shù)據(jù)存儲器interrupt中斷函數(shù)聲明定義一個中斷函數(shù)large存儲器模式使用外部RAM的存儲模式pdata存儲器類型說明“分頁”尋址的8051外

11、部數(shù)據(jù)存儲器_priority_多任務(wù)優(yōu)先聲明RTX51的任務(wù)優(yōu)先級reentrant再入函數(shù)聲明定義一個再入函數(shù)sbit位變量聲明聲明一個可位尋址變量sfr特殊功能寄存器聲明聲明一個特殊功能寄存器(8位)Keil C51Keil C51編譯器擴展的關(guān)鍵字(編譯器擴展的關(guān)鍵字(2 2)關(guān)鍵字用途說明sfr16特殊功能寄存器聲明聲明一個16位的特殊功能寄存器small存儲器模式內(nèi)部RAM的存儲模式_task_任務(wù)聲明定義實時多任務(wù)函數(shù)using寄存器組定義定義8051的工作寄存器組xdata存儲器類型說明8051外部數(shù)據(jù)存儲器4.3 C514.3 C51的數(shù)據(jù)類型的數(shù)據(jù)類型 C51C51的數(shù)據(jù)有

12、常量和變量之分。的數(shù)據(jù)有常量和變量之分。 常量常量 在程序運行中在程序運行中其值不變其值不變的量。的量。 變量變量 在程序運行中其值可以改變的量。在程序運行中其值可以改變的量。 定義一個變量,編譯系統(tǒng)就會自動為它安排一個存貯區(qū),具定義一個變量,編譯系統(tǒng)就會自動為它安排一個存貯區(qū),具體的地址值體的地址值 ,用戶不必在意。,用戶不必在意。 一個變量由一個變量由變量名變量名和和變量值變量值構(gòu)成構(gòu)成. . 變量名:存貯單元地址的符號表示。變量名:存貯單元地址的符號表示。 變量的值:變量所在地址單元存放的內(nèi)容。變量的值:變量所在地址單元存放的內(nèi)容。 數(shù)據(jù)類型:數(shù)據(jù)的長度。數(shù)據(jù)類型:數(shù)據(jù)的長度。 C51C

13、51編譯器支持?jǐn)?shù)據(jù)類型編譯器支持?jǐn)?shù)據(jù)類型 數(shù)數(shù) 據(jù)據(jù) 類類 型型長長 度度值值 域域位位 型型bit1Bit0或或1字字符符型型signed char1Byte-128+127unsigned char1Byte0255 整整 形形signed int2Byte-32768+32767unsigned int2Byte065535signed long4Byte-2147483648+2147483647unsigned long4Byte04294967295實型實型Float4Byte1.176E-383.40E+38指針型指針型data/idata/ pdata1Byte 1字節(jié)地址字節(jié)

14、地址code/xdata2Byte2字節(jié)地址字節(jié)地址通用指針通用指針3Byte其中其中1字節(jié)為儲存器類型編碼,字節(jié)為儲存器類型編碼,2,3字節(jié)為地字節(jié)為地址偏移量址偏移量訪問訪問SFR的數(shù)據(jù)類的數(shù)據(jù)類型型sbit1Bit0 或或 1sfr1Byte0255sfr162Byte06553520:471120:471220:471320:471420:471520:471620:471720:4718對位變量的定義對位變量的定義C51對位變量的定義方法有三種:對位變量的定義方法有三種: 1. 定義定義bit類型變量類型變量 如如 bit mnbit mn;mnmn為位變量,其值只能是為位變量,其值

15、只能是“0 0”或或“1 1”,其位,其位地址地址C51C51自行安排在可位尋址區(qū)的自行安排在可位尋址區(qū)的bdatabdata區(qū)。區(qū)。 2.采用采用字節(jié)尋址變量字節(jié)尋址變量.位位的方法的方法 如如 bdata int ibasebdata int ibase; /*ibase定義為整型變量定義為整型變量*/ sbit mybit=ibase15sbit mybit=ibase15; /*mybit定義為定義為 ibase的的D15位位*/ 這里位是運算符這里位是運算符 “” 相當(dāng)于匯編中的相當(dāng)于匯編中的 “”,其后的最大取,其后的最大取值依賴于該位所在的變量的類型,如定義為值依賴于該位所在的變

16、量的類型,如定義為char最大值只能為最大值只能為7。 3.對特殊功能寄存器的位的定義對特殊功能寄存器的位的定義 方法方法1:使用頭文件及:使用頭文件及sbit定義符;多用于無位名的可尋址位。定義符;多用于無位名的可尋址位。 如如 #include #include sbit P1_1=P11sbit P1_1=P11; /*P1_1為為P1口的第口的第1位位*/ sbit ac=ACC7sbit ac=ACC7; /*ac定義為累加器定義為累加器A的第的第7位位*/方法方法2:使用頭文件:使用頭文件reg51.h,再直接用位名稱。,再直接用位名稱。 例如例如 #include #includ

17、e RS1=1 RS1=1; RS0=0RS0=0; 方法方法3:用字節(jié)地址位表示:用字節(jié)地址位表示 如如 sbit OV=0 xD02sbit OV=0 xD02;方法方法4:用寄存器名:用寄存器名.位定義位定義 如如 sfr PSW=0 xd0sfr PSW=0 xd0; / /* *定義定義PSWPSW地址為地址為d0Hd0H* */ / sbit CY=PSW7 sbit CY=PSW7; / /* *CYCY為為PSWPSW7 7* */ / 20:4721-應(yīng)用實例應(yīng)用實例 C5l C5l編譯器除了能支持以上這些基本數(shù)據(jù)類型之外,編譯器除了能支持以上這些基本數(shù)據(jù)類型之外,還能支持一

18、些復(fù)雜的組合型數(shù)據(jù)類型,如數(shù)組類型、還能支持一些復(fù)雜的組合型數(shù)據(jù)類型,如數(shù)組類型、指針類型、結(jié)構(gòu)類型、聯(lián)合類型等這些復(fù)雜的數(shù)據(jù)類指針類型、結(jié)構(gòu)類型、聯(lián)合類型等這些復(fù)雜的數(shù)據(jù)類型。型。 使用頭文件使用頭文件 C51建有頭文件建有頭文件 reg51.h、 reg52.h ,在該頭文件中對,在該頭文件中對51或或52系列單片機所有的特殊功能寄存器的進行了系列單片機所有的特殊功能寄存器的進行了sfr定義,定義,對特殊功能寄存器的有位名稱的可尋址位進行了對特殊功能寄存器的有位名稱的可尋址位進行了sbit定義,因定義,因此,只要用包含語句此,只要用包含語句#include 就可以直接引用特就可以直接引用特

19、殊功能寄存器名,或直接引用位名稱。殊功能寄存器名,或直接引用位名稱。 要特別注意:在引用時特殊功能寄存器或者位名稱必須要特別注意:在引用時特殊功能寄存器或者位名稱必須大寫。大寫。 4.4 4.4 數(shù)據(jù)的存儲類型和存儲模式數(shù)據(jù)的存儲類型和存儲模式 同同ANSI CANSI C一樣,一樣,C51C51規(guī)定變量必須先定義后使用。規(guī)定變量必須先定義后使用。C51C51對對變量的進行定義的格式如下:變量的進行定義的格式如下: 存儲種類存儲種類 數(shù)據(jù)類型數(shù)據(jù)類型 存儲器類型存儲器類型 變量名表變量名表 其中,存儲種類和存儲器類型是可選項。其中,存儲種類和存儲器類型是可選項。存儲類型是存儲類型是C51C51

20、中增加的。中增加的。一、變量的存儲種類一、變量的存儲種類 按變量的有效作用范圍可以將其劃分為局部變量和全局變按變量的有效作用范圍可以將其劃分為局部變量和全局變量;還可以按變量的的存儲方式為其劃分存儲種類。量;還可以按變量的的存儲方式為其劃分存儲種類。 在在C C語言中變量有四種存儲種類,即自動語言中變量有四種存儲種類,即自動(auto)(auto)、外部、外部(extern)(extern)、靜態(tài)、靜態(tài)(static)(static)和寄存器和寄存器(register)(register)。二、數(shù)據(jù)的存儲類型二、數(shù)據(jù)的存儲類型 C51C51是面向是面向8XX518XX51系列單片機及硬件控制系

21、統(tǒng)的開發(fā)語言,系列單片機及硬件控制系統(tǒng)的開發(fā)語言,它定義的它定義的任何變量必須以一定的存儲類型的方式定位任何變量必須以一定的存儲類型的方式定位在在8XX518XX51的的某一存儲區(qū)中某一存儲區(qū)中,否則便沒有意義。因此在定義變量類型時,還,否則便沒有意義。因此在定義變量類型時,還必須定義它的存儲類型,必須定義它的存儲類型,C51C51的變量有如下幾種存儲類型:的變量有如下幾種存儲類型:存儲器類型存儲器類型 描描 述述 data直接尋址內(nèi)部數(shù)據(jù)存儲區(qū)直接尋址內(nèi)部數(shù)據(jù)存儲區(qū),00H-7FH(128 Byte)bdata可為尋址內(nèi)部數(shù)據(jù)存儲區(qū)可為尋址內(nèi)部數(shù)據(jù)存儲區(qū),20H-2FH,允許位與字節(jié)混合訪問

22、允許位與字節(jié)混合訪問(16 Byte)idata間接尋址內(nèi)部數(shù)據(jù)存儲區(qū)間接尋址內(nèi)部數(shù)據(jù)存儲區(qū),可訪問全部內(nèi)部地址空間可訪問全部內(nèi)部地址空間00H-FFH(256 Byte)pdata分頁分頁(256Byte)外部數(shù)據(jù)存儲區(qū)外部數(shù)據(jù)存儲區(qū),由操作碼由操作碼MOVX Ri 訪問訪問xdata外部數(shù)據(jù)存儲區(qū)外部數(shù)據(jù)存儲區(qū)(64KB),由操作碼由操作碼 MOVX DPTR 訪問訪問code程序存儲區(qū)程序存儲區(qū)(64KB),由操作碼由操作碼 MOVC A+DPTR 訪問訪問 如果在變量定義時省略了存儲器類型標(biāo)識符,如果在變量定義時省略了存儲器類型標(biāo)識符,C51C51編譯器編譯器會選擇默認(rèn)的存儲器類型。默

23、認(rèn)的存儲器類型由會選擇默認(rèn)的存儲器類型。默認(rèn)的存儲器類型由SMALLSMALL、COMPACTCOMPACT和和LARGELARGE存儲模式指令決定。存儲模式指令決定。1 1)datadata區(qū)區(qū) 對對datadata區(qū)的尋址是最快的,所以應(yīng)該把使用頻率高的變量區(qū)的尋址是最快的,所以應(yīng)該把使用頻率高的變量放在放在datadata區(qū),由于空間有限,必須注意使用區(qū),由于空間有限,必須注意使用datadata區(qū),區(qū),datadata區(qū)除區(qū)除了包含程序變量外,還包含了堆棧和寄存器組了包含程序變量外,還包含了堆棧和寄存器組datadata區(qū)。區(qū)。 在在SMALLSMALL存儲模式下,未說明存儲器類型時,

24、變量默認(rèn)被存儲模式下,未說明存儲器類型時,變量默認(rèn)被定位在定位在datadata區(qū)。區(qū)。2 2)bdatabdata區(qū)區(qū) 當(dāng)在當(dāng)在DATADATA區(qū)的位尋址區(qū)定義變量,這個變量就可進行位尋區(qū)的位尋址區(qū)定義變量,這個變量就可進行位尋址,并且聲明位變量。這對狀態(tài)寄存器來說十分有用,因為它址,并且聲明位變量。這對狀態(tài)寄存器來說十分有用,因為它可以單獨使用變量的每一位,而不一定要用位變量名引用位變可以單獨使用變量的每一位,而不一定要用位變量名引用位變量。量。 3 3)idataidata區(qū)區(qū) idata idata區(qū)也可以存放使用比較頻繁的變量,使用寄存器作區(qū)也可以存放使用比較頻繁的變量,使用寄存器作

25、為指針進行尋址。在寄存器中設(shè)置為指針進行尋址。在寄存器中設(shè)置8 8位地址進行間接尋址,與位地址進行間接尋址,與外部存儲器尋址比較,它的指令執(zhí)行周期和代碼長度都比較短。外部存儲器尋址比較,它的指令執(zhí)行周期和代碼長度都比較短。 4 4)pdatapdata和和xdataxdata區(qū)區(qū) 在這兩個區(qū)聲明變量和在其他區(qū)的語法是一樣的,在這兩個區(qū)聲明變量和在其他區(qū)的語法是一樣的,pdatapdata區(qū)只有區(qū)只有256B256B,而,而xdataxdata區(qū)可達區(qū)可達65536B 65536B 5 5)codecode區(qū)區(qū) code code區(qū)即區(qū)即80C5180C51的程序代碼區(qū),所以代碼區(qū)的數(shù)的程序代碼

26、區(qū),所以代碼區(qū)的數(shù)據(jù)是不可改變的,據(jù)是不可改變的,80C5180C51的代碼區(qū)不可重寫。一般代的代碼區(qū)不可重寫。一般代碼區(qū)中可存放數(shù)據(jù)表,跳轉(zhuǎn)向量和狀態(tài)表。碼區(qū)中可存放數(shù)據(jù)表,跳轉(zhuǎn)向量和狀態(tài)表。 如果用戶不對變量的存貯類型定義,則編譯器承如果用戶不對變量的存貯類型定義,則編譯器承認(rèn)默認(rèn)存貯類型,默認(rèn)的存貯類型由編譯控制命令的認(rèn)默認(rèn)存貯類型,默認(rèn)的存貯類型由編譯控制命令的存貯的模式部分決定。存貯的模式部分決定。例例: : data char var; /*字符變量字符變量var定位在片內(nèi)定位在片內(nèi)RAM區(qū)區(qū)*/char code MSG=ENTER PARAMETER: /*字符數(shù)組定位在程序存

27、貯區(qū)字符數(shù)組定位在程序存貯區(qū)*/ unsigned long xdata array100; /* 無符號長型數(shù)組定位在片外無符號長型數(shù)組定位在片外 RAM區(qū),每區(qū),每 元素占元素占4bytes*/ float idata x,y,z; /*實型變量實型變量x,y,z,定位在片內(nèi)用間址訪問的內(nèi)部,定位在片內(nèi)用間址訪問的內(nèi)部RAM區(qū)區(qū)*/ bit lock; /*位變量位變量Lock定位在片內(nèi)定位在片內(nèi)RAM可位尋址區(qū)可位尋址區(qū)*/unsigned int pdata dimension; /* 無符號整型變量無符號整型變量 dimension定位在分頁的外部定位在分頁的外部RAM區(qū)區(qū) */ u

28、nsigned char xdata vector 1044; /* 無符號字符型三無符號字符型三 維數(shù)組,維數(shù)組, 定位在片外定位在片外RAM區(qū)區(qū)*/ 三、數(shù)據(jù)的存儲模式三、數(shù)據(jù)的存儲模式 在固定的存貯器地址進行變量參數(shù)傳遞是在固定的存貯器地址進行變量參數(shù)傳遞是C51C51的一個標(biāo)準(zhǔn)特征,的一個標(biāo)準(zhǔn)特征,定義了變量、參數(shù)傳遞區(qū)的存貯器模式,也就是默認(rèn)了變量和參數(shù)定義了變量、參數(shù)傳遞區(qū)的存貯器模式,也就是默認(rèn)了變量和參數(shù)傳遞區(qū)存貯器類型、無需再對變量和參數(shù)傳遞區(qū)的存貯器類型進行傳遞區(qū)存貯器類型、無需再對變量和參數(shù)傳遞區(qū)的存貯器類型進行說明。說明。 存貯器模式?jīng)Q定了變量的默認(rèn)存貯器類型、參數(shù)傳遞

29、區(qū)和無明存貯器模式?jīng)Q定了變量的默認(rèn)存貯器類型、參數(shù)傳遞區(qū)和無明確存貯區(qū)類型的說明。確存貯區(qū)類型的說明。 有三種存貯器模式:有三種存貯器模式:SMALLSMALL、LARGELARGE和和COMPACTCOMPACT存儲器模式存儲器模式 描描 述述 SMALL參數(shù)及局部變量放入可直接尋址的內(nèi)部數(shù)據(jù)存儲參數(shù)及局部變量放入可直接尋址的內(nèi)部數(shù)據(jù)存儲區(qū)(區(qū)(128 Byte,默認(rèn)存儲器類型是默認(rèn)存儲器類型是DATA)COMPACT參數(shù)及局部變量放入分頁外部數(shù)據(jù)存儲區(qū)(最大參數(shù)及局部變量放入分頁外部數(shù)據(jù)存儲區(qū)(最大256Byte,默認(rèn)存儲類型是默認(rèn)存儲類型是PDATA)LARGE參數(shù)及局部變量直接放入外部

30、數(shù)據(jù)存儲器(最大參數(shù)及局部變量直接放入外部數(shù)據(jù)存儲器(最大64KB,默認(rèn)存儲器類型為,默認(rèn)存儲器類型為XDATA)1 1小小(SMALL)(SMALL)模式模式 所有變量都默認(rèn)在所有變量都默認(rèn)在80518051的內(nèi)部數(shù)據(jù)存儲器中。這和用的內(nèi)部數(shù)據(jù)存儲器中。這和用datadata顯式定義變量起到相同的作用。顯式定義變量起到相同的作用。 2 2緊湊緊湊(COMPACT)(COMPACT)模式模式 此模式中,所有變量都默認(rèn)在此模式中,所有變量都默認(rèn)在80518051的外部數(shù)據(jù)存儲器的一的外部數(shù)據(jù)存儲器的一頁中。頁中。 3 3大大(LARGE)(LARGE)模式模式 在大模式下,所有的變量都默認(rèn)在外部

31、存儲器中在大模式下,所有的變量都默認(rèn)在外部存儲器中(xdata)(xdata)。 例如:例如: 設(shè)設(shè)C語言源程序為語言源程序為PROR.C,若使程序中的變量類型和參,若使程序中的變量類型和參數(shù)傳遞區(qū)數(shù)傳遞區(qū)限定在外部數(shù)據(jù)存貯區(qū)限定在外部數(shù)據(jù)存貯區(qū) ,有兩種方法有兩種方法: 方法方法1:在程序的第一句加預(yù)處理命令:在程序的第一句加預(yù)處理命令 #pragma compact。 方法方法2:用:用C51對對PROR.C進行編譯時,使用編譯控制命令進行編譯時,使用編譯控制命令: C51 PROR.C COMPACT。 如果在變量說明時略去存貯器類型標(biāo)志符,編譯如果在變量說明時略去存貯器類型標(biāo)志符,編譯

32、器會自動選擇默認(rèn)的存貯器類型。默認(rèn)的存器會自動選擇默認(rèn)的存貯器類型。默認(rèn)的存 貯器類型貯器類型進一步由控制指令進一步由控制指令SMALL、COMPACT和和LARGE限限制。制。例:例:如果聲明如果聲明char var,則默認(rèn),則默認(rèn) 的存貯器模式為的存貯器模式為SMALL,var放在放在data存貯區(qū);存貯區(qū);如果使用如果使用COMPACT模式,模式,var放入放入idata存貯區(qū)存貯區(qū) ;使用使用LARGE模式,模式,var被放入外部存貯區(qū)被放入外部存貯區(qū)(xdata存貯存貯區(qū)區(qū))。 四、對存貯器和外接四、對存貯器和外接I/OI/O口的絕對地址訪問口的絕對地址訪問 C51對存貯器和外接對存

33、貯器和外接I/O口的絕對地址訪問可以通過指針訪問,口的絕對地址訪問可以通過指針訪問,也可以通過函數(shù)訪問。也可以通過函數(shù)訪問。 1. 對存貯器的絕對地址訪問對存貯器的絕對地址訪問 利用絕對地址訪問的頭文件利用絕對地址訪問的頭文件absacc.h可對不同的存貯區(qū)進行訪可對不同的存貯區(qū)進行訪問。該頭文件的函數(shù)有問。該頭文件的函數(shù)有: CBYTE CBYTE (訪問訪問code區(qū)字符型區(qū)字符型) DBYTE DBYTE (訪問訪問data區(qū)字符型區(qū)字符型) PBYTE PBYTE (訪問訪問pdata或或I/O) XBYTEXBYTE (訪問訪問xdata或或I/O) 還有還有CWORD、DWORD、PWORD和和XWORD四個函數(shù),

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論