版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、單片機(jī)原理及應(yīng)用單片機(jī)原理及應(yīng)用 (C語言版)語言版)第第4章章 單片機(jī)單片機(jī)C語言及程序設(shè)計語言及程序設(shè)計主主 編:編:周國運(yùn)周國運(yùn)本章本章制作:制作:周國運(yùn)周國運(yùn)中國水利水電出版社中國水利水電出版社第第4章章 單片機(jī)單片機(jī)C語言及程序設(shè)計語言及程序設(shè)計4.1 C51概述概述4.2 C51數(shù)據(jù)類型及存儲數(shù)據(jù)類型及存儲4.3 C51變量的定義及數(shù)變量的定義及數(shù)據(jù)存儲區(qū)域據(jù)存儲區(qū)域4.4 C51位變量的定義位變量的定義4.5 C51特殊功能寄存器特殊功能寄存器的定義的定義4.6 C51指令的定義指令的定義4.7 C51的輸入的輸入/輸出輸出4.8 C51函數(shù)的定義函數(shù)的定義4.9 C51與匯編語
2、言與匯編語言混合編程混合編程4.10 C51集成開發(fā)集成開發(fā)軟件軟件Keil C目目 錄錄第第4章章 單片機(jī)單片機(jī)C語言及程序設(shè)計語言及程序設(shè)計本章主要討論本章主要討論C51變量的定義和函數(shù)的定變量的定義和函數(shù)的定義,以及義,以及Keil C軟件的使用等。軟件的使用等。本章內(nèi)容的安排,認(rèn)為讀者已經(jīng)學(xué)習(xí)過本章內(nèi)容的安排,認(rèn)為讀者已經(jīng)學(xué)習(xí)過C語言,具有語言,具有C語言的基本知識,因此,本章語言的基本知識,因此,本章內(nèi)容完全是結(jié)合單片機(jī)來講解,也就是補(bǔ)充內(nèi)容完全是結(jié)合單片機(jī)來講解,也就是補(bǔ)充C語言在單片機(jī)方面的概念、數(shù)據(jù)定義和函語言在單片機(jī)方面的概念、數(shù)據(jù)定義和函數(shù)定義等。數(shù)定義等。通過本章學(xué)習(xí),使
3、讀者能夠比較順利地通過本章學(xué)習(xí),使讀者能夠比較順利地編寫編寫C51程序。程序。 4.1 C51概述概述主要內(nèi)容主要內(nèi)容4.1.1 C語言編程的優(yōu)勢語言編程的優(yōu)勢4.1.2 C51與與ANSI C的區(qū)別的區(qū)別4.1.3 C51擴(kuò)展的關(guān)鍵字?jǐn)U展的關(guān)鍵字4.1 C51概述概述學(xué)習(xí)單片機(jī)學(xué)習(xí)單片機(jī)C語言的必要性語言的必要性隨著單片機(jī)性能的不斷提高,隨著單片機(jī)性能的不斷提高,C語言編譯語言編譯調(diào)試工具的不斷完善,以及現(xiàn)在對單片機(jī)產(chǎn)調(diào)試工具的不斷完善,以及現(xiàn)在對單片機(jī)產(chǎn)品輔助功能的要求、對開發(fā)周期不斷縮短的品輔助功能的要求、對開發(fā)周期不斷縮短的要求,使得要求,使得越來越多的單片機(jī)編程人員轉(zhuǎn)向越來越多的單片
4、機(jī)編程人員轉(zhuǎn)向使用使用C語言語言,因此有必要在單片機(jī)課程中講,因此有必要在單片機(jī)課程中講授授“單片機(jī)單片機(jī)C語言語言”。 “C51”概念:概念:為了與為了與ANSI C區(qū)別,區(qū)別,把把“單片機(jī)單片機(jī)C語言語言”稱為稱為“C51”,也稱為,也稱為“Keil C”。 4.1.1 C語言編程的優(yōu)勢語言編程的優(yōu)勢在編程方面,使用在編程方面,使用C51較匯編語言有諸多較匯編語言有諸多優(yōu)勢:優(yōu)勢:1)編程容易)編程容易 2)容易實(shí)現(xiàn)復(fù)雜的數(shù)值計算)容易實(shí)現(xiàn)復(fù)雜的數(shù)值計算3)容易閱讀與交流)容易閱讀與交流4)容易調(diào)試與維護(hù)程序)容易調(diào)試與維護(hù)程序5)容易實(shí)現(xiàn)模塊化開發(fā))容易實(shí)現(xiàn)模塊化開發(fā) 6)程序可移植性好
5、)程序可移植性好 4.1.2 C語言與語言與ANSI 的區(qū)別的區(qū)別用匯編語言編寫單片機(jī)程序時,必須要用匯編語言編寫單片機(jī)程序時,必須要考慮其存儲器的結(jié)構(gòu)考慮其存儲器的結(jié)構(gòu),尤其要考慮其片內(nèi)數(shù),尤其要考慮其片內(nèi)數(shù)據(jù)存儲器、特殊功能寄存器是否正確合理的據(jù)存儲器、特殊功能寄存器是否正確合理的使用,以及按照實(shí)際地址端口數(shù)據(jù)的處理。使用,以及按照實(shí)際地址端口數(shù)據(jù)的處理。用用C51編寫程序,雖然不像匯編語言那樣編寫程序,雖然不像匯編語言那樣需要具體地組織、分配存儲器資源,但是需要具體地組織、分配存儲器資源,但是C51對數(shù)據(jù)類型和變量的定義,必須要與單對數(shù)據(jù)類型和變量的定義,必須要與單片機(jī)的存儲結(jié)構(gòu)相關(guān)聯(lián)片
6、機(jī)的存儲結(jié)構(gòu)相關(guān)聯(lián),否則編譯器不能正,否則編譯器不能正確地映射定位。確地映射定位。 4.1.2 C語言與語言與ANSI 的區(qū)別的區(qū)別用用C51編寫單片機(jī)程序,與用編寫單片機(jī)程序,與用ANSI C編編寫程序的寫程序的不同之處是不同之處是,需要根據(jù)單片機(jī)存儲需要根據(jù)單片機(jī)存儲器結(jié)構(gòu)及內(nèi)部資源,定義相應(yīng)的數(shù)據(jù)類型和器結(jié)構(gòu)及內(nèi)部資源,定義相應(yīng)的數(shù)據(jù)類型和變量變量。其它的語法規(guī)定、程序結(jié)構(gòu)及程序設(shè)計其它的語法規(guī)定、程序結(jié)構(gòu)及程序設(shè)計方法,都與方法,都與ANSI C相同。所以相同。所以本章主要介本章主要介紹紹C51各種變量的定義、指針定義、函數(shù)定各種變量的定義、指針定義、函數(shù)定義和混合編程義和混合編程。
7、4.1.3 C51擴(kuò)展的關(guān)鍵字?jǐn)U展的關(guān)鍵字由于單片機(jī)在結(jié)構(gòu)及編程上的特殊要求,由于單片機(jī)在結(jié)構(gòu)及編程上的特殊要求,C51有自己的特殊關(guān)鍵字,稱之為有自己的特殊關(guān)鍵字,稱之為C51擴(kuò)展擴(kuò)展的關(guān)鍵字的關(guān)鍵字,下面給出常用的,下面給出常用的C51擴(kuò)展的關(guān)鍵擴(kuò)展的關(guān)鍵字。字。_at_bdatabit codedataidata interruptpdatareentrant sbitsfrsfr16usingvolatilexdata這些關(guān)鍵字在后面會陸續(xù)接觸到,此處這些關(guān)鍵字在后面會陸續(xù)接觸到,此處先不給出它們的含義。先不給出它們的含義。 4.2 C51數(shù)據(jù)類型及存儲數(shù)據(jù)類型及存儲主要內(nèi)容主要內(nèi)容4
8、.2.1 C51的數(shù)據(jù)類型的數(shù)據(jù)類型4.2.2 C51數(shù)據(jù)的存儲數(shù)據(jù)的存儲4.2.1 C51的數(shù)據(jù)類型的數(shù)據(jù)類型表表4-1 C51數(shù)據(jù)類型、長度和數(shù)值范圍數(shù)據(jù)類型、長度和數(shù)值范圍數(shù)據(jù)類型數(shù)據(jù)類型表示方法表示方法長長 度度數(shù)數(shù) 值值 范范 圍圍無符號字符型無符號字符型 unsigned char 1字節(jié)字節(jié) 0255有符號字符型有符號字符型 signed char1字節(jié)字節(jié) - -128127無符號整型無符號整型unsigned int2字節(jié)字節(jié) 065535有符號整型有符號整型signed int2字節(jié)字節(jié) - -3276832767無符號長整型無符號長整型 unsigned long 4字節(jié)
9、字節(jié) 04294967295有符號長整型有符號長整型 signed long4字節(jié)字節(jié) - -21474836482147483647浮點(diǎn)型浮點(diǎn)型float4字節(jié)字節(jié) 1.1755E-383.40E+38特殊功能寄特殊功能寄存器型存器型sfrsfr161字節(jié)字節(jié)2字節(jié)字節(jié)0255065535位類型位類型bit、sbit1位位0或或14.2.1 C51的數(shù)據(jù)類型的數(shù)據(jù)類型數(shù)據(jù)類型轉(zhuǎn)換數(shù)據(jù)類型轉(zhuǎn)換1)自動轉(zhuǎn)換)自動轉(zhuǎn)換轉(zhuǎn)換規(guī)則是向高精度數(shù)據(jù)類型轉(zhuǎn)換、向轉(zhuǎn)換規(guī)則是向高精度數(shù)據(jù)類型轉(zhuǎn)換、向有符號數(shù)據(jù)類型轉(zhuǎn)換有符號數(shù)據(jù)類型轉(zhuǎn)換。如字符型變量與整型。如字符型變量與整型變量相加時,則位變量先轉(zhuǎn)換字符型或整型
10、變量相加時,則位變量先轉(zhuǎn)換字符型或整型數(shù)據(jù),然后相加。數(shù)據(jù),然后相加。2)強(qiáng)制轉(zhuǎn)換)強(qiáng)制轉(zhuǎn)換像像ANSI C一樣,一樣,通過強(qiáng)制類型轉(zhuǎn)換的方通過強(qiáng)制類型轉(zhuǎn)換的方式進(jìn)行轉(zhuǎn)換式進(jìn)行轉(zhuǎn)換。如:。如:unsignedintb;floatc;b=(int)c; 4.2.2 C51數(shù)據(jù)的存儲數(shù)據(jù)的存儲MCS-51單片機(jī)只有單片機(jī)只有bit和和unsigned char兩兩種數(shù)據(jù)類型支持機(jī)器指令種數(shù)據(jù)類型支持機(jī)器指令,而其它類型的數(shù),而其它類型的數(shù)據(jù)都需要轉(zhuǎn)換成據(jù)都需要轉(zhuǎn)換成bit或或unsigned char型進(jìn)行存型進(jìn)行存儲。儲。為了減少單片機(jī)的存儲空間和提高運(yùn)行為了減少單片機(jī)的存儲空間和提高運(yùn)行速度,
11、要盡可能地使用速度,要盡可能地使用unsigned char型數(shù)據(jù)。型數(shù)據(jù)。 一、位變量的存儲一、位變量的存儲bit和和sbit型位變量,直接存于型位變量,直接存于RAM的位的位尋址空間,包括低尋址空間,包括低128位和特殊功能寄存器位和特殊功能寄存器位。位。 4.2.2 C51數(shù)據(jù)的存儲數(shù)據(jù)的存儲二、字符變量的存儲二、字符變量的存儲字符變量字符變量(char):無論是無論是unsigned char數(shù)據(jù)還是數(shù)據(jù)還是signed char數(shù)據(jù),均為數(shù)據(jù),均為1個字個字節(jié),能夠被直接存儲在節(jié),能夠被直接存儲在RAM中,可以存儲中,可以存儲在在00 x7f區(qū)域,也可以存儲在區(qū)域,也可以存儲在0 x
12、800 xff區(qū)區(qū)域,與變量的定義有關(guān)。域,與變量的定義有關(guān)。unsigned char數(shù):數(shù):可直接被可直接被MSC-51接受接受signed char數(shù)據(jù):數(shù)據(jù):用補(bǔ)碼表示。用補(bǔ)碼表示。需要額需要額外的操作外的操作來測試、處理符號位,使用的是兩來測試、處理符號位,使用的是兩種庫函數(shù),代碼量大,運(yùn)算速度降低。種庫函數(shù),代碼量大,運(yùn)算速度降低。4.2.2 C51數(shù)據(jù)的存儲數(shù)據(jù)的存儲三、整型變量的存儲三、整型變量的存儲整型變量整型變量(int):不管是不管是unsigned int數(shù)據(jù)還是數(shù)據(jù)還是signed int數(shù)據(jù),均為數(shù)據(jù),均為2個字節(jié),其個字節(jié),其存存儲方法是高位字節(jié)保存在低地儲方法是
13、高位字節(jié)保存在低地址址(在前面),(在前面),低位字節(jié)保存低位字節(jié)保存在高地址在高地址(在后面)(在后面) 。例如,例如,整型變量的值為整型變量的值為0 x1234,在內(nèi)存,在內(nèi)存中的存放如右圖所示。中的存放如右圖所示。signed int數(shù)據(jù)用補(bǔ)碼表示。數(shù)據(jù)用補(bǔ)碼表示。地址地址低低高高:1234:4.2.2 C51數(shù)據(jù)的存儲數(shù)據(jù)的存儲四、長整型變量的存儲四、長整型變量的存儲長整型變量(長整型變量(long)為)為4個個字節(jié),其存儲方法與整型數(shù)據(jù)字節(jié),其存儲方法與整型數(shù)據(jù)一樣,是一樣,是最高位字節(jié)保存的地最高位字節(jié)保存的地址最低址最低(在最前面),(在最前面),最低位最低位字節(jié)保存的地址最高字
14、節(jié)保存的地址最高(在最后(在最后面)。面)。如長整型變量的值為如長整型變量的值為0 x12345678,在內(nèi),在內(nèi)存中的存放方法如右圖所示。不管是存中的存放方法如右圖所示。不管是unsigned long數(shù)據(jù)還是數(shù)據(jù)還是signed long數(shù)據(jù)。數(shù)據(jù)。地址地址低低高高:12345678:4.2.2 C51數(shù)據(jù)的存儲數(shù)據(jù)的存儲五、浮點(diǎn)型變量的存儲五、浮點(diǎn)型變量的存儲浮點(diǎn)型變量浮點(diǎn)型變量(fload)占)占4個字節(jié),個字節(jié),用指數(shù)用指數(shù)方式表示方式表示,其具體格式與編譯器有關(guān)。,其具體格式與編譯器有關(guān)。對于對于Keil C,采用的是,采用的是IEEE-754標(biāo)準(zhǔn)標(biāo)準(zhǔn),具有具有24位精度,尾數(shù)的最
15、高位始終為位精度,尾數(shù)的最高位始終為1,因,因而不保存。而不保存。具體分布為:具體分布為:1位符號位,位符號位,8位階位階碼位,碼位,23位尾數(shù),如下圖所示。位尾數(shù),如下圖所示。 字節(jié)地址字節(jié)地址0123浮點(diǎn)數(shù)浮點(diǎn)數(shù)內(nèi)容內(nèi)容SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM符號和階碼符號和階碼 尾數(shù)高位尾數(shù)高位尾數(shù)低位尾數(shù)低位4.2.2 C51數(shù)據(jù)的存儲數(shù)據(jù)的存儲符號位符號位S:1表示負(fù)數(shù),表示負(fù)數(shù),0表示正數(shù)。表示正數(shù)。階碼:階碼:用移碼表示。如,實(shí)際階碼用移碼表示。如,實(shí)際階碼- -126用用1表示,實(shí)際階碼表示,實(shí)際階碼0用用127表示,表示,即實(shí)際階即實(shí)際階碼數(shù)加上碼數(shù)加
16、上127得到階碼的表達(dá)數(shù)得到階碼的表達(dá)數(shù)。階碼數(shù)值范圍:階碼數(shù)值范圍:- -126+128。4.2.2 C51數(shù)據(jù)的存儲數(shù)據(jù)的存儲例如浮點(diǎn)數(shù)例如浮點(diǎn)數(shù)- -12.5符號位為符號位為1,12.5的二進(jìn)制數(shù)為的二進(jìn)制數(shù)為1100.1=1.1001E+0011,階碼數(shù)值為階碼數(shù)值為3+127=130=10000010B,尾數(shù)為尾數(shù)為1001。因此,其十六進(jìn)制數(shù)為因此,其十六進(jìn)制數(shù)為0 xC1480000,則存儲結(jié)構(gòu),則存儲結(jié)構(gòu)如右圖所示。如右圖所示。 地址地址低低高高:C1480000:說明:說明:教材中存儲結(jié)構(gòu)是錯的。教材中存儲結(jié)構(gòu)是錯的。4.3 C51變量的定義及數(shù)據(jù)存儲區(qū)域變量的定義及數(shù)據(jù)存儲
17、區(qū)域主要內(nèi)容主要內(nèi)容4.3.1 C51變量的定義變量的定義4.3.2 C51變量的存儲類型變量的存儲類型4.3.3 C51變量的存儲區(qū)域變量的存儲區(qū)域4.3.4 C51變量定義舉例變量定義舉例4.3.5 C51變量的存儲模式變量的存儲模式4.3.6 C51變量的絕對定位變量的絕對定位4.3.1 C51變量的定義變量的定義C51變量定義的一般格式為:變量定義的一般格式為:存儲類型存儲類型數(shù)據(jù)類型數(shù)據(jù)類型 存儲區(qū)存儲區(qū)變量名變量名1=初值初值 ,變量名變量名2=初值初值 ,或或存儲類型存儲類型存儲區(qū)存儲區(qū) 數(shù)據(jù)類型數(shù)據(jù)類型 變量名變量名1=初值初值 ,變量名變量名2=初值初值 ,可見變量可見變量(
18、非位變量)(非位變量)的定義由的定義由4部分組部分組成成,即在變量定義時,指定變量,即在變量定義時,指定變量4種屬性。種屬性。數(shù)據(jù)類型:數(shù)據(jù)類型:在前面的在前面的4.2中已經(jīng)敘述過,中已經(jīng)敘述過,對于變量名也無須多說,對于變量名也無須多說,下面主要解釋下面主要解釋“存存儲類型儲類型”和和“存儲區(qū)存儲區(qū)”等概念等概念。 4.3.2 C51變量的存儲類型變量的存儲類型存儲類型這個屬性我們?nèi)匝赜么鎯︻愋瓦@個屬性我們?nèi)匝赜肁NSI C的的說法說法,盡量不改變原來的含義。,盡量不改變原來的含義。按照按照ANSI C,C語言的變量有語言的變量有4種存儲類種存儲類型型:動態(tài)存儲(動態(tài)存儲(auto)靜態(tài)存儲
19、(靜態(tài)存儲(static)全局存儲(全局存儲(extern)寄存器存儲(寄存器存儲(register) 4.3.2 C51變量的存儲類型變量的存儲類型一、動態(tài)存儲一、動態(tài)存儲動態(tài)(存儲)變量:動態(tài)(存儲)變量:用用auto定義的為動態(tài)定義的為動態(tài)變量,也叫自動變量變量,也叫自動變量。作用范圍:作用范圍:在定義它的函數(shù)內(nèi)或復(fù)合語在定義它的函數(shù)內(nèi)或復(fù)合語句內(nèi)部。句內(nèi)部。當(dāng)定義它的函數(shù)或復(fù)合語當(dāng)定義它的函數(shù)或復(fù)合語句執(zhí)行時,句執(zhí)行時,C51才為變量分配存儲空間,結(jié)才為變量分配存儲空間,結(jié)束時所占用的存儲空間釋放。束時所占用的存儲空間釋放。定義變量時,定義變量時,auto可以省略可以省略,或者說如果,
20、或者說如果省略了存儲類型項(xiàng),則認(rèn)為是動態(tài)變量。省略了存儲類型項(xiàng),則認(rèn)為是動態(tài)變量。動動態(tài)變量一般分配使用寄存器或堆棧態(tài)變量一般分配使用寄存器或堆棧。 4.3.2 C51變量的存儲類型變量的存儲類型二、靜態(tài)存儲二、靜態(tài)存儲靜態(tài)(存儲)變量:靜態(tài)(存儲)變量:用用static定義的為靜定義的為靜態(tài)變量態(tài)變量。分為內(nèi)部靜態(tài)和外部靜態(tài)變量。分為內(nèi)部靜態(tài)和外部靜態(tài)變量。內(nèi)部靜態(tài)變量:內(nèi)部靜態(tài)變量:在函數(shù)體內(nèi)定義的為內(nèi)在函數(shù)體內(nèi)定義的為內(nèi)部靜態(tài)變量部靜態(tài)變量。在函數(shù)內(nèi)可以任意使用和在函數(shù)內(nèi)可以任意使用和修改,函數(shù)運(yùn)行結(jié)束后會一直存在,但在函修改,函數(shù)運(yùn)行結(jié)束后會一直存在,但在函數(shù)外不可見,即在函數(shù)體外得到
21、保護(hù)。數(shù)外不可見,即在函數(shù)體外得到保護(hù)。外部靜態(tài)變量:外部靜態(tài)變量:在函數(shù)體外部定義的為在函數(shù)體外部定義的為外部靜態(tài)變量外部靜態(tài)變量。在定義的文件內(nèi)可以任意使。在定義的文件內(nèi)可以任意使用和修改,外部靜態(tài)變量會一直存在,但在用和修改,外部靜態(tài)變量會一直存在,但在文件外不可見,即在文件外得到保護(hù)。文件外不可見,即在文件外得到保護(hù)。 4.3.2 C51變量的存儲類型變量的存儲類型三、外部存儲三、外部存儲外部(存儲)變量:外部(存儲)變量:用用extern聲明聲明的變量的變量為外部變量為外部變量,是在其它文件定義過的全局變,是在其它文件定義過的全局變量。量。用用extern聲明后,便可以在所聲明聲明后
22、,便可以在所聲明的文件中使用。的文件中使用。需要注意的是:需要注意的是:在定義變量時,即便是在定義變量時,即便是全局變量,也不能使用全局變量,也不能使用extern定義定義。 4.3.2 C51變量的存儲類型變量的存儲類型四、寄存器存儲四、寄存器存儲寄存器(存儲)變量:寄存器(存儲)變量:用用register定義的定義的變量為寄存器變量變量為寄存器變量。寄存器變量存放在寄存器變量存放在CPU的寄存器中的寄存器中,這,這種變量處理速度快,但數(shù)目少。種變量處理速度快,但數(shù)目少。C51中的寄存器變量:中的寄存器變量: C51的編譯器在編的編譯器在編譯時,能夠自動識別程序中使用譯時,能夠自動識別程序中
23、使用頻率高的變頻率高的變量量,并將其,并將其安排為寄存器變量安排為寄存器變量,用戶不用專,用戶不用專門聲明。門聲明。 4.3.3 C51變量的存儲區(qū)域變量的存儲區(qū)域變量的存儲區(qū)屬性是單片機(jī)擴(kuò)展的概念變量的存儲區(qū)屬性是單片機(jī)擴(kuò)展的概念,非常重要,非常重要,它涉及到它涉及到7個新的關(guān)鍵字個新的關(guān)鍵字。MCS-51單片機(jī)有四個存儲空間單片機(jī)有四個存儲空間,分成三,分成三類,它們是片內(nèi)數(shù)據(jù)存儲空間、片外數(shù)據(jù)存類,它們是片內(nèi)數(shù)據(jù)存儲空間、片外數(shù)據(jù)存儲空間和程序存儲空間。儲空間和程序存儲空間。 MCS-51單片機(jī)有更多的存儲區(qū)域:單片機(jī)有更多的存儲區(qū)域:由于由于片內(nèi)數(shù)據(jù)存儲器和片外數(shù)據(jù)存儲器又分成不片內(nèi)數(shù)
24、據(jù)存儲器和片外數(shù)據(jù)存儲器又分成不同的區(qū)域,所以同的區(qū)域,所以單片機(jī)的變量有更多的存儲單片機(jī)的變量有更多的存儲區(qū)域區(qū)域。在定義變量時,必須明確指出在定義變量時,必須明確指出是存放在哪個區(qū)域是存放在哪個區(qū)域。4.3.3 C51變量的存儲區(qū)域變量的存儲區(qū)域表表4-2 C51存儲區(qū)與存儲空間的對應(yīng)關(guān)系存儲區(qū)與存儲空間的對應(yīng)關(guān)系關(guān)鍵字關(guān)鍵字對應(yīng)的存儲空間及范圍對應(yīng)的存儲空間及范圍codeROM空間,空間,64KB全空間全空間data片內(nèi)片內(nèi)RAM,直接尋址,低,直接尋址,低128字節(jié)字節(jié)bdata片內(nèi)片內(nèi)RAM,位尋址區(qū),位尋址區(qū)0 x200 x2f,可字節(jié)訪問,可字節(jié)訪問idata 片內(nèi)片內(nèi)RAM,間
25、接尋址,間接尋址,256字節(jié),與字節(jié),與 Ri 對應(yīng)對應(yīng)pdata片外片外RAM,分頁尋址的,分頁尋址的256字節(jié)字節(jié)(P2不變不變), P2改變可尋址改變可尋址64KB全空間,與全空間,與MOVX Ri 對應(yīng)對應(yīng)xdata片外片外RAM,64KB全空間全空間bit片內(nèi)片內(nèi)RAM位尋找區(qū)位尋找區(qū),位地址位地址0 x000 x7f,128位位4.3.4 C51變量定義舉例變量定義舉例1)定義存儲在)定義存儲在data區(qū)域區(qū)域的的動態(tài)動態(tài)unsigned char變量:變量:unsigned char data sec=0, min=0, hou=0;2)定義存儲在)定義存儲在data區(qū)域區(qū)域的的
26、靜態(tài)靜態(tài)unsigned char變量:變量:static unsigned char data scan_code=0 xfe;3)定義存儲在)定義存儲在data區(qū)域區(qū)域的的靜態(tài)靜態(tài)unsigned int變量:變量:static unsigned int data dd;4.3.4 C51變量定義舉例變量定義舉例4)定義存儲在)定義存儲在bdata區(qū)域區(qū)域的的動態(tài)動態(tài)unsigned char變量:變量:unsigned char bdata operate, operate1;/定義指示操作的可位尋址的變量定義指示操作的可位尋址的變量5)定義存儲在)定義存儲在idata區(qū)域區(qū)域的的動態(tài)動
27、態(tài)unsigned char數(shù)組:數(shù)組:unsigned char idata temp20; 6)定義在)定義在pdata區(qū)域區(qū)域的的動態(tài)動態(tài)有符號有符號int數(shù)數(shù)組:組:int pdata send_data30;/定義存放發(fā)送數(shù)據(jù)的數(shù)組定義存放發(fā)送數(shù)據(jù)的數(shù)組 4.3.4 C51變量定義舉例變量定義舉例7)定義存儲在)定義存儲在xdata區(qū)域區(qū)域的的動態(tài)動態(tài)unsigned int數(shù)組:數(shù)組:unsigned int xdata receiv_buf50;/定義存放接受數(shù)據(jù)的數(shù)組定義存放接受數(shù)據(jù)的數(shù)組8)定義存儲在)定義存儲在code區(qū)域區(qū)域的的unsigned char數(shù)組:數(shù)組:uns
28、igned char code dis_code10=0 x3f, 0 x06, 0 x5b, 0 x4f, 0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f; /定義共陰極數(shù)碼管段碼數(shù)組定義共陰極數(shù)碼管段碼數(shù)組4.3.5 C51變量的存儲模式變量的存儲模式存儲模式:存儲模式:如果在定義變量時缺省了存如果在定義變量時缺省了存儲區(qū)屬性,則編譯器會自動選擇默認(rèn)的存儲儲區(qū)屬性,則編譯器會自動選擇默認(rèn)的存儲區(qū)域,區(qū)域,也就是存儲模式也就是存儲模式。變量的存儲模式也就是程序(或函數(shù))變量的存儲模式也就是程序(或函數(shù))的編譯模式的編譯模式。編譯模式分為三種:編譯模式分為三種:小模式(
29、小模式(small)、)、緊湊模式(緊湊模式(compact)和大模式()和大模式(large)。)。編譯模式由編譯控制命令決定。編譯模式由編譯控制命令決定。存儲模式(編譯模式)決定了變量的默存儲模式(編譯模式)決定了變量的默認(rèn)存儲區(qū)域和參數(shù)的傳遞方法認(rèn)存儲區(qū)域和參數(shù)的傳遞方法。 4.3.5 C51變量的存儲模式變量的存儲模式一、一、small模式模式在在small模式下,變量的默認(rèn)存儲區(qū)域是模式下,變量的默認(rèn)存儲區(qū)域是“data”、“idata”,即未指出存儲區(qū)域的變,即未指出存儲區(qū)域的變量保存到片內(nèi)數(shù)據(jù)存儲器中,并且量保存到片內(nèi)數(shù)據(jù)存儲器中,并且堆棧也安堆棧也安排在該區(qū)域中排在該區(qū)域中。s
30、mall模式的特點(diǎn):模式的特點(diǎn):存儲容量小,但速度存儲容量小,但速度快???。在在small模式下參數(shù)的傳遞:模式下參數(shù)的傳遞:通過寄存器、通過寄存器、堆?;蚱瑑?nèi)數(shù)據(jù)存儲區(qū)完成的。堆?;蚱瑑?nèi)數(shù)據(jù)存儲區(qū)完成的。 4.3.5 C51變量的存儲模式變量的存儲模式二、二、compact模式模式在在compact模式下,變量的默認(rèn)存儲區(qū)域模式下,變量的默認(rèn)存儲區(qū)域是是“pdata”,即未指出存儲區(qū)域的變量保存,即未指出存儲區(qū)域的變量保存到片外數(shù)據(jù)存儲器的一頁中,最大變量數(shù)為到片外數(shù)據(jù)存儲器的一頁中,最大變量數(shù)為256字節(jié),并且字節(jié),并且堆棧也安排在該區(qū)域中堆棧也安排在該區(qū)域中。compact模式的其特點(diǎn):
31、模式的其特點(diǎn):是存儲容量較是存儲容量較small模式大,速度較模式大,速度較small模式稍慢,但比模式稍慢,但比large模式要快。模式要快。在在compact模式下參數(shù)的傳遞:模式下參數(shù)的傳遞:通過片外通過片外數(shù)據(jù)區(qū)的一個固定頁完成的。數(shù)據(jù)區(qū)的一個固定頁完成的。 4.3.5 C51變量的存儲模式變量的存儲模式三、三、large模式模式在在large模式下,變量的默認(rèn)存儲區(qū)域是模式下,變量的默認(rèn)存儲區(qū)域是“xdata”,即未指出存儲區(qū)域的變量保存到,即未指出存儲區(qū)域的變量保存到片外數(shù)據(jù)存儲器,最大變量數(shù)可達(dá)片外數(shù)據(jù)存儲器,最大變量數(shù)可達(dá)64KB,并且并且堆棧也安排在該區(qū)域中堆棧也安排在該區(qū)域
32、中。large模式的特點(diǎn):模式的特點(diǎn):存儲容量大,速度慢存儲容量大,速度慢large模式下參數(shù)的傳遞方式:模式下參數(shù)的傳遞方式:參數(shù)的傳參數(shù)的傳遞也是通過片外數(shù)據(jù)存儲器完成的。遞也是通過片外數(shù)據(jù)存儲器完成的。 4.3.5 C51變量的存儲模式變量的存儲模式C51支持混合模式:支持混合模式:即可以對函數(shù)設(shè)置編即可以對函數(shù)設(shè)置編譯模式,所以在譯模式,所以在large模式下,可以對某些函模式下,可以對某些函數(shù)設(shè)置為數(shù)設(shè)置為compact模式或模式或small模式,從而提模式,從而提高運(yùn)行速度。高運(yùn)行速度。默認(rèn)編譯模式:默認(rèn)編譯模式:如果文件或函數(shù)未指明如果文件或函數(shù)未指明編譯模式,則編譯器按編譯模式
33、,則編譯器按small模式處理模式處理。編譯模式控制命令:編譯模式控制命令: “#pragma small(或或compact、large)”應(yīng)放在文件的開始。應(yīng)放在文件的開始。 4.3.6 C51變量的絕對定位變量的絕對定位C51有三種方式可以對變量有三種方式可以對變量(I/O端口)端口)絕對定位:絕對定位:絕對定位關(guān)鍵字絕對定位關(guān)鍵字_at_ 、指針、庫、指針、庫函數(shù)的絕對定位宏。函數(shù)的絕對定位宏。對于后兩種方式,在對于后兩種方式,在后面指針一節(jié)介紹。后面指針一節(jié)介紹。C51擴(kuò)展的關(guān)鍵字?jǐn)U展的關(guān)鍵字_at_專門用于對變量作專門用于對變量作絕對定位絕對定位,_at_使用在變量的定義中,其格使
34、用在變量的定義中,其格式為:式為:存儲類型存儲類型 數(shù)據(jù)類型數(shù)據(jù)類型 存儲區(qū)存儲區(qū) 變量名變量名1 _at_ 地址常數(shù)地址常數(shù),變量名,變量名2 4.3.6 C51變量的絕對定位變量的絕對定位舉例說明舉例說明_at_的使用方法的使用方法1)對)對data區(qū)域區(qū)域中的中的 unsigned char變量變量aa作絕對定位:作絕對定位:unsigned char data aa _at_ 0 x30;2)對)對pdata區(qū)域區(qū)域中的中的 unsigned int數(shù)組數(shù)組cc作絕對定位:作絕對定位:unsigned int pdata cc10 _at_ 0 x34;3)對)對xdata區(qū)域區(qū)域中的
35、中的 unsigned char變量變量printer_port作絕對定位:作絕對定位:unsigned char xdata printer_port _at_ 0 x7fff; 4.3.6 C51變量的絕對定位變量的絕對定位對變量絕對定位的幾點(diǎn)說明:對變量絕對定位的幾點(diǎn)說明:1)絕對地址變量)絕對地址變量在定義時不能初始化在定義時不能初始化,因此不能對因此不能對code型變量絕對定位;型變量絕對定位;2)絕對地址變量)絕對地址變量只能夠是全局變量只能夠是全局變量,不,不能在函數(shù)中對變量絕對定位;能在函數(shù)中對變量絕對定位;3)絕對地址變量)絕對地址變量多用于多用于I/O端口端口,一般情,一般
36、情況下不對變量作絕對定位;況下不對變量作絕對定位;3)位變量不能使用)位變量不能使用_at_絕對定位。絕對定位。4.4 C51位變量的定義位變量的定義主要內(nèi)容主要內(nèi)容4.4.1 bit型位變量的定義型位變量的定義4.4.2 sbit型位變量的定義型位變量的定義4.4.1 bit型位變量的定義型位變量的定義常說的位變量指的就是常說的位變量指的就是bit型位變量型位變量。C51的的bit型位變量定義的一般格式為:型位變量定義的一般格式為:存儲類型存儲類型 bit 位變量名位變量名1=初值初值 ,位變量名,位變量名2=初值初值 ,bit位變量被保存在位變量被保存在RAM中的位尋址區(qū)中的位尋址區(qū)域域(
37、字節(jié)地址為(字節(jié)地址為0 x200 x2f,16字節(jié))。字節(jié))。例如:例如:bitflag_run,receiv_bit=0;static bit send_bit; 4.4.1 bit型位變量的定義型位變量的定義兩點(diǎn)說明:兩點(diǎn)說明:1)bit型位變量與其它變量一樣,型位變量與其它變量一樣,可以可以作為函數(shù)的形參作為函數(shù)的形參,也可以作為,也可以作為函數(shù)的返回函數(shù)的返回值值,即函數(shù)的類型可以是位型的;,即函數(shù)的類型可以是位型的;2)位變量)位變量不能定義指針不能定義指針,不能定義數(shù)不能定義數(shù)組組。 4.4.2 sbit型位變量的定義型位變量的定義對于能夠按位尋址的特殊功能寄存器、對于能夠按位尋
38、址的特殊功能寄存器、定義在位尋址區(qū)域的變量(字節(jié)型、整型、定義在位尋址區(qū)域的變量(字節(jié)型、整型、長整型),可以對其各位用長整型),可以對其各位用sbit定義位變量。定義位變量。為了方便起見,分開討論為了方便起見,分開討論按位尋址的特按位尋址的特殊功能寄存器中位變量的定義、按位尋址殊功能寄存器中位變量的定義、按位尋址的變量中位變量的定義。的變量中位變量的定義。4.4.2 sbit型位變量的定義型位變量的定義一、特殊功能寄存器中位變量定義一、特殊功能寄存器中位變量定義能夠按位尋址的能夠按位尋址的特殊功能寄存器中位變特殊功能寄存器中位變量定義的一般格式為:量定義的一般格式為:sbit 位變量名位變量
39、名 位地址表達(dá)式位地址表達(dá)式這里的位地址表達(dá)式有三種形式:這里的位地址表達(dá)式有三種形式:直接位地址直接位地址特殊功能寄存器名帶位號特殊功能寄存器名帶位號字節(jié)地址帶位號字節(jié)地址帶位號4.4.2 sbit型位變量的定義型位變量的定義1、用直接位地址定義位變量、用直接位地址定義位變量這種情況下位變量的定義格式為:這種情況下位變量的定義格式為:sbit 位變量名位變量名 位地址常數(shù)位地址常數(shù)這里的位地址常數(shù)范圍為這里的位地址常數(shù)范圍為0 x800 xff,實(shí)際是定義特殊功能寄存器的位實(shí)際是定義特殊功能寄存器的位。例如:。例如:sbitP0_0=0 x80; sbitP1_1=0 x91;sbitRS0
40、=0 xd3; /定義定義PSW的第的第3位位sbitET0=0 xa9; /定義定義IE的第的第1位位 4.4.2 sbit型位變量的定義型位變量的定義2、特殊功能寄存器名帶位號定義、特殊功能寄存器名帶位號定義這時位變量的定義格式為:這時位變量的定義格式為:sbit 位變量名位變量名 特殊功能寄存器名特殊功能寄存器名 位號常數(shù)位號常數(shù)這里的位號常數(shù)為這里的位號常數(shù)為07。例如:。例如:sbitP0_3=P0 3; sbitP1_4=P1 4;sbitOV=PSW 2; /定義定義PSW的第的第2位位sbitES=IE 4; /定義定義IE的第的第4位位 4.4.2 sbit型位變量的定義型位
41、變量的定義3、寄存器地址帶位號定義位變量、寄存器地址帶位號定義位變量在這種情況下位變量的定義格式為:在這種情況下位變量的定義格式為:sbit 位變量名位變量名 特殊功能寄存器地址特殊功能寄存器地址 位號常數(shù)位號常數(shù)這里的位號常數(shù)同上,為這里的位號常數(shù)同上,為07。例如:。例如:sbitP0_6=0 x80 6; sbitP1_7=0 x90 7;sbitAC=0 xd0 6; /定義定義PSW的第的第6位位sbitEA=0 xa8 7;/定義定義IE的第的第7位位 4.4.2 sbit型位變量的定義型位變量的定義4、幾點(diǎn)說明、幾點(diǎn)說明1)用)用sbit定義的位變量,必須能夠按位操作,定義的位變
42、量,必須能夠按位操作,而不能夠?qū)o位操作功能的位定義位變量。而不能夠?qū)o位操作功能的位定義位變量。2)用)用sbit定義位變量,必須放在函數(shù)外面作為定義位變量,必須放在函數(shù)外面作為全局位變量,而不能在函數(shù)內(nèi)部定義。全局位變量,而不能在函數(shù)內(nèi)部定義。3)用)用sbit每次只能定義一個位變量。每次只能定義一個位變量。4)對其它模塊定義的位變量()對其它模塊定義的位變量(bit型或型或 sbit型)型)的引用聲明,都使用的引用聲明,都使用bit。5)用)用sbit定義的是一種絕對定位的位變量(因定義的是一種絕對定位的位變量(因?yàn)槊质桥c確定位地址對應(yīng)的),具有特定的意為名字是與確定位地址對應(yīng)的),具
43、有特定的意義,在應(yīng)用時不能像義,在應(yīng)用時不能像bit型位變量那樣隨便使用。型位變量那樣隨便使用。4.4.2 sbit型位變量的定義型位變量的定義二、二、位尋址區(qū)變量的位尋址區(qū)變量的位定義位定義對對bdata型變量(字節(jié)型、整型、長整型變量(字節(jié)型、整型、長整型)型) ,被保存在,被保存在RAM中的位尋址區(qū),因此中的位尋址區(qū),因此可以對可以對bdata型變量各位作位變量定義型變量各位作位變量定義。這樣,既可以對這樣,既可以對bdata型變量作字節(jié)型變量作字節(jié)(或整型、長整型)操作,也可以作位操(或整型、長整型)操作,也可以作位操作。作。bdata型變量的位定義格式:型變量的位定義格式:sbit
44、位變量名位變量名 bdata型變量名型變量名 位號常數(shù)位號常數(shù) 4.4.2 sbit型位變量的定義型位變量的定義bdata型變量為在此之前應(yīng)該是定義過的型變量為在此之前應(yīng)該是定義過的,位號常數(shù)可以是位號常數(shù)可以是07(8位字節(jié)變量),或位字節(jié)變量),或015(16位整型變量),或位整型變量),或031(32位字位字長整型變量)。例如:長整型變量)。例如:unsigned char bdataoperate;對對operate的低的低4位作位變量定義:位作位變量定義:sbit flag_key=operate 0; /鍵盤標(biāo)志位鍵盤標(biāo)志位sbit flag_dis=operate 1; /顯示標(biāo)
45、志位顯示標(biāo)志位sbit flag_mus=operate 2; /音樂標(biāo)志位音樂標(biāo)志位sbit flag_run=operate 3; /運(yùn)行標(biāo)志位運(yùn)行標(biāo)志位 4.5 C51特殊功能寄存器的定義特殊功能寄存器的定義主要內(nèi)容主要內(nèi)容4.5.1 8位特殊功能寄存器的定義位特殊功能寄存器的定義4.5.2 16位特殊功能寄存器的定義位特殊功能寄存器的定義4.5.1 8位特殊功能寄存器的定義位特殊功能寄存器的定義定義的一般格式為:定義的一般格式為:sfr特殊功能寄存器名特殊功能寄存器名 地址常數(shù)地址常數(shù)地址常數(shù)范圍:地址常數(shù)范圍:0 x800 xff。特殊功能寄存器定義例子(見特殊功能寄存器定義例子(見
46、reg51.h、reg52.h等文件):等文件):sfrP0=0 x80;/定義定義P0寄存器寄存器sfrP1=0 x90;/定義定義P1口寄存器口寄存器sfrPSW=0 xd0;/定義定義PSWsfrIE=0 xa8;/定義定義IE 4.5.2 16位特殊功能寄存器的定義位特殊功能寄存器的定義定義的一般格式為:定義的一般格式為:sfr16 特殊功能寄存器名特殊功能寄存器名 地址常數(shù)地址常數(shù)地址常數(shù)范圍:地址常數(shù)范圍:0 x800 xff。例如(見例如(見reg51.h、reg52.h等文件):等文件):sfr16 DPTR=0 x82;sfr16 T2=0 xcc; /含含TL2和和TH2s
47、fr16 RCAP2=0 xca; /含含RCAP2L/和和RCAP2H, 0 xca為為RCAP2L的地址的地址4.5.2 16位特殊功能寄存器的定義位特殊功能寄存器的定義幾點(diǎn)說明:幾點(diǎn)說明:1)定義特殊功能寄存器中的地址必須)定義特殊功能寄存器中的地址必須在在0 x800 xff范圍內(nèi)。范圍內(nèi)。2)定義特殊功能寄存器,必須放在函)定義特殊功能寄存器,必須放在函數(shù)外面作為全局變量。數(shù)外面作為全局變量。3)用)用sfr或或sfr16每次只能定義一個特殊每次只能定義一個特殊功能寄存器。功能寄存器。4)像)像sbit一樣,用一樣,用sfr或或sfr16定義的是絕定義的是絕對定位的變量(因?yàn)槊质桥c
48、確定地址對對定位的變量(因?yàn)槊质桥c確定地址對應(yīng)的),具有特定的意義,在應(yīng)用時不能應(yīng)的),具有特定的意義,在應(yīng)用時不能像一般變量那樣隨便使用。像一般變量那樣隨便使用。 4.6 C51指針的定義指針的定義主要內(nèi)容主要內(nèi)容4.6.1 通用指針通用指針4.6.2 存儲器專用指針存儲器專用指針4.6.3 指針變換指針變換4.6.4 C51指針應(yīng)用指針應(yīng)用4.6 C51指針的定義指針的定義由于由于MCS-51單片機(jī)有三種不同類型的存單片機(jī)有三種不同類型的存儲空間,并且還有不同的存儲區(qū)域,儲空間,并且還有不同的存儲區(qū)域,因此因此C51指針的內(nèi)容更豐富。指針的內(nèi)容更豐富。指針除了具有像變量的四種屬性(存儲指
49、針除了具有像變量的四種屬性(存儲類型、數(shù)據(jù)類型、存儲區(qū)、變量名)外,類型、數(shù)據(jù)類型、存儲區(qū)、變量名)外,按按存儲區(qū),將指針分為通用指針和不同存儲區(qū)存儲區(qū),將指針分為通用指針和不同存儲區(qū)域的專用指針。域的專用指針。 4.6.1 通用指針通用指針?biāo)^通用指針,就是通過該類指針可以所謂通用指針,就是通過該類指針可以訪問所有的存儲空間訪問所有的存儲空間。在在C51庫函數(shù)中通常使用這種指針來訪庫函數(shù)中通常使用這種指針來訪問。問。通用指針用通用指針用3個字節(jié)來表示:個字節(jié)來表示:第一個字節(jié):表示指針第一個字節(jié):表示指針?biāo)赶虻拇鎯臻g所指向的存儲空間第二個字節(jié):為指針第二個字節(jié):為指針地址的高字節(jié)地址的高
50、字節(jié)第三個字節(jié):為指針第三個字節(jié):為指針地址的低字節(jié)地址的低字節(jié)4.6.1 通用指針通用指針通用指針的定義與一般通用指針的定義與一般C語言指針的定語言指針的定義相同,其格式為:義相同,其格式為:存儲類型存儲類型 數(shù)據(jù)類型數(shù)據(jù)類型 *指針名指針名1,*指針名指針名2 ,例如:例如:unsigned char *cpt;int *dpt;long *lpt;static char *ccpt; 通用指針的特點(diǎn):通用指針的特點(diǎn):定義簡單定義簡單訪問所有空間訪問所有空間訪問速度慢訪問速度慢 4.6.2 存儲器專用指針存儲器專用指針?biāo)^存儲器專用指針,就是通過該類指所謂存儲器專用指針,就是通過該類指針,
51、只能夠訪問規(guī)定的存儲空間區(qū)域針,只能夠訪問規(guī)定的存儲空間區(qū)域。指針本身占用指針本身占用1個字節(jié)(個字節(jié)(data *,idata *,bdata *,pdata *)或)或2個字節(jié)(個字節(jié)(xdata *,code *)。)。存儲器專用指針的一般定義格式為:存儲器專用指針的一般定義格式為:存儲類型存儲類型 數(shù)據(jù)類型數(shù)據(jù)類型 指向存儲區(qū)指向存儲區(qū) *指針存儲區(qū)指針存儲區(qū) 指針名指針名1 ,*指針存儲區(qū)指針存儲區(qū) 指針名指針名2, 4.6.2 存儲器專用指針存儲器專用指針指向存儲區(qū):指向存儲區(qū):是指針變量所指向的數(shù)據(jù)存儲空間區(qū)域。是指針變量所指向的數(shù)據(jù)存儲空間區(qū)域。不能夠缺省不能夠缺省。指針存儲區(qū)
52、:指針存儲區(qū):是指針變量本身所存儲的空間區(qū)域。是指針變量本身所存儲的空間區(qū)域。缺省時認(rèn)為指針存儲區(qū)在默認(rèn)的存儲區(qū)缺省時認(rèn)為指針存儲區(qū)在默認(rèn)的存儲區(qū)域,其默認(rèn)存儲區(qū)域決定于所設(shè)定的編譯域,其默認(rèn)存儲區(qū)域決定于所設(shè)定的編譯模式。模式。指向和指針存儲區(qū),兩者可以是同一個指向和指針存儲區(qū),兩者可以是同一個區(qū)域,但多數(shù)情況下不會是同一個區(qū)域。區(qū)域,但多數(shù)情況下不會是同一個區(qū)域。 4.6.2 存儲器專用指針存儲器專用指針存儲器專用指針例子:存儲器專用指針例子:unsigned char data *cpt1, *cpt2; signed int idata *dpt1, *dpt2;unsigned ch
53、ar pdata *ppt; signed long xdata *lpt1, *lpt2;unsigned char code *ccpt;上面所定義的指針雖然所指向的空間上面所定義的指針雖然所指向的空間不同,但不同,但指針變量本身都存儲在默認(rèn)的存指針變量本身都存儲在默認(rèn)的存儲區(qū)域儲區(qū)域。 4.6.2 存儲器專用指針存儲器專用指針又如:又如:1)unsigned char data *idata cpt1,*idata cpt2; 2)signed int idata *data dpt1, *data dpt2; 3)unsigned char pdata *xdata ppt; 4)si
54、gned long xdata *lpt1, *xdata lpt2; 5)unsigned char code *data ccpt; 綠色關(guān)鍵字綠色關(guān)鍵字為指針?biāo)赶虻拇鎯^(qū)為指針?biāo)赶虻拇鎯^(qū)藍(lán)色關(guān)鍵字藍(lán)色關(guān)鍵字為指針本身所存儲的區(qū)域?yàn)橹羔槺旧硭鎯Φ膮^(qū)域4.6.2 存儲器專用指針存儲器專用指針注意:注意:(1)要區(qū)分指針變量)要區(qū)分指針變量指向的空間指向的空間區(qū)域區(qū)域和指針變量和指針變量本身所存儲的區(qū)域本身所存儲的區(qū)域;(;(2)定義時,定義時,前者不能缺省前者不能缺省,而后者可以缺??;,而后者可以缺??;(3)指針變量的長度指針變量的長度:指向不同的區(qū)域,:指向不同的區(qū)域,占用的字節(jié)數(shù)
55、不同。占用的字節(jié)數(shù)不同。說明:說明:指針變量本身所存儲的區(qū)域,在指針變量本身所存儲的區(qū)域,在定義指針時一般都省略了定義指針時一般都省略了,指針變量本身保,指針變量本身保存在缺省存儲的區(qū)域中。存在缺省存儲的區(qū)域中。定義時,缺省指針存儲的區(qū)域,顯得簡定義時,缺省指針存儲的區(qū)域,顯得簡單,并且對初學(xué)者更容易理解。單,并且對初學(xué)者更容易理解。 4.6.3 指針變換指針變換一、通用指針格式一、通用指針格式 由前面的討論知,通用指針由由前面的討論知,通用指針由3個字節(jié)個字節(jié)組成,組成,第一個字節(jié)為數(shù)據(jù)的存儲區(qū)域,后第一個字節(jié)為數(shù)據(jù)的存儲區(qū)域,后兩個字節(jié)為指針地址兩個字節(jié)為指針地址,第一個字節(jié)的存儲第一個字
56、節(jié)的存儲區(qū)域編碼如表區(qū)域編碼如表4-6所示所示。 表表4-6 通用指針存儲區(qū)域編碼通用指針存儲區(qū)域編碼存儲區(qū)存儲區(qū)idataxdata pdatadatacode編編 碼碼123454.6.3 指針變換指針變換一、指針轉(zhuǎn)換一、指針轉(zhuǎn)換指針轉(zhuǎn)換有兩種途徑,一種是顯式的編指針轉(zhuǎn)換有兩種途徑,一種是顯式的編程轉(zhuǎn)換,另一種是隱式的自動轉(zhuǎn)換程轉(zhuǎn)換,另一種是隱式的自動轉(zhuǎn)換。指針的編程轉(zhuǎn)換:指針的編程轉(zhuǎn)換:(1)通用指針的第)通用指針的第一字節(jié),與專用指針的指向數(shù)據(jù)區(qū)屬性,一字節(jié),與專用指針的指向數(shù)據(jù)區(qū)屬性,二者相互轉(zhuǎn)換;(二者相互轉(zhuǎn)換;(2)通用指針后兩個字節(jié))通用指針后兩個字節(jié)的地址,與專用指針值的轉(zhuǎn)換
57、。的地址,與專用指針值的轉(zhuǎn)換。指針的隱式自動轉(zhuǎn)換:指針的隱式自動轉(zhuǎn)換:由編譯器在進(jìn)行由編譯器在進(jìn)行編譯時自動完成。編譯時自動完成。 4.6.4 C51指針應(yīng)用指針應(yīng)用指針在指針在PC機(jī)上的機(jī)上的C語言中應(yīng)用很廣泛。語言中應(yīng)用很廣泛。在單片機(jī)中,由于不使用操作系統(tǒng),指在單片機(jī)中,由于不使用操作系統(tǒng),指針的應(yīng)用可以獨(dú)立于變量,獨(dú)立地指向所針的應(yīng)用可以獨(dú)立于變量,獨(dú)立地指向所需要訪問的存儲空間位置。需要訪問的存儲空間位置。本節(jié)通過例子來學(xué)習(xí)和認(rèn)識本節(jié)通過例子來學(xué)習(xí)和認(rèn)識C51指針的指針的這種獨(dú)立應(yīng)用性。這種獨(dú)立應(yīng)用性。下面介紹兩種利用指針訪問存儲區(qū)的方下面介紹兩種利用指針訪問存儲區(qū)的方法。也可以訪問
58、函數(shù)。法。也可以訪問函數(shù)。4.6.4 C51指針應(yīng)用指針應(yīng)用二、通過指針定義的宏訪問存儲器二、通過指針定義的宏訪問存儲器1、訪問存儲器宏的定義、訪問存儲器宏的定義用指針定義的、訪問存儲器宏的格式:用指針定義的、訪問存儲器宏的格式: #define 宏名宏名 (數(shù)據(jù)類型數(shù)據(jù)類型 volatile 存儲區(qū)存儲區(qū)*)0)格式中的格式中的數(shù)據(jù)類型數(shù)據(jù)類型主要為無符號的字符主要為無符號的字符型數(shù)、整型;格式中的型數(shù)、整型;格式中的存儲區(qū)域存儲區(qū)域主要使用主要使用data、idata、pdata、xdata和和code類型,不類型,不使用使用bdata存儲區(qū)類型。存儲區(qū)類型。 4.6.4 C51指針應(yīng)用指
59、針應(yīng)用格式中的關(guān)鍵字格式中的關(guān)鍵字“volatile”: “volatile”是單片機(jī)中定義的,其含義是單片機(jī)中定義的,其含義為:為:這種變量在程序執(zhí)行中可被隱含地改這種變量在程序執(zhí)行中可被隱含地改變而編譯器無法檢測到,告知編譯器不要變而編譯器無法檢測到,告知編譯器不要做優(yōu)化處理,使應(yīng)用者能夠得到正確的變做優(yōu)化處理,使應(yīng)用者能夠得到正確的變量值。量值。volatile的應(yīng)用:的應(yīng)用:volatile常用于定義寄存常用于定義寄存器,特別是狀態(tài)寄存器,因?yàn)闋顟B(tài)寄存器器,特別是狀態(tài)寄存器,因?yàn)闋顟B(tài)寄存器的值不是程序員設(shè)置,而是單片機(jī)在運(yùn)行的值不是程序員設(shè)置,而是單片機(jī)在運(yùn)行中中CPU設(shè)置的。設(shè)置的。
60、特別說明:特別說明:“volatile”的含義與教材上的含義與教材上表述不太一致,此處表述直觀更容易理解。表述不太一致,此處表述直觀更容易理解。4.6.4 C51指針應(yīng)用指針應(yīng)用2、庫函數(shù)中訪問存儲器宏的原型、庫函數(shù)中訪問存儲器宏的原型C51編譯器提供了兩組用指針定義的絕對存編譯器提供了兩組用指針定義的絕對存儲器訪問的宏,其原型如下。儲器訪問的宏,其原型如下。 1)按字節(jié)訪問存儲器的宏:)按字節(jié)訪問存儲器的宏:#define CBYTE (unsigned char volatile code*)0)#define DBYTE (unsigned char volatile data*)0)#
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 購銷合同貸款申請技巧分享
- 二年級品德與生活上冊 愛護(hù)我們的生活環(huán)境教案3 北師大版
- 八年級歷史上冊 第六單元 中華民族的抗日戰(zhàn)爭第18課 從九一八事變到西安事變教案 新人教版
- 2024-2025學(xué)年高中物理 第一章 機(jī)械振動 2 單擺教案 教科版選修3-4
- 2023四年級數(shù)學(xué)上冊 1 大數(shù)的認(rèn)識第5課時 將整萬數(shù)改寫成用“萬”作單位的數(shù)教案 新人教版
- 北京中南紅星足球?qū)W校九年級化學(xué)上冊 第三單元 課題1 分子和原子教學(xué)設(shè)計 (新版)新人教版
- 坐班合同協(xié)議書范本(2篇)
- 租的民房租房合同(2篇)
- 裝修管理費(fèi)合同(2篇)
- 浮選 課件 演示
- 2024-2030年飛機(jī)租賃行業(yè)市場發(fā)展分析及發(fā)展趨勢前景預(yù)測報告
- 2024年中級經(jīng)濟(jì)師(金融)《專業(yè)知識與實(shí)務(wù)》考前必刷必練題庫500題(含真題、必會題)
- 2024江蘇省鐵路集團(tuán)限公司春季招聘24人高頻考題難、易錯點(diǎn)模擬試題(共500題)附帶答案詳解
- (2024年)剪映入門教程課件
- 大班-數(shù)學(xué)-加號減號-課件(基礎(chǔ)版)
- 中大班社會領(lǐng)域《我的情緒小屋》課件
- DB44-T 1661-2021《河道管理范圍內(nèi)建設(shè)項(xiàng)目技術(shù)規(guī)程》-(高清現(xiàn)行)
- 藥學(xué)專業(yè)高水平專業(yè)群建設(shè)項(xiàng)目建設(shè)方案
- 北京大學(xué)數(shù)字圖像處理(岡薩雷斯)(課堂PPT)
- 學(xué)校復(fù)學(xué)學(xué)生關(guān)愛幫扶措施
- 《泌尿系統(tǒng)男性生殖》PPT課件.ppt
評論
0/150
提交評論