單片機(jī)C語言及程序設(shè)計(jì)_第1頁
單片機(jī)C語言及程序設(shè)計(jì)_第2頁
單片機(jī)C語言及程序設(shè)計(jì)_第3頁
單片機(jī)C語言及程序設(shè)計(jì)_第4頁
單片機(jī)C語言及程序設(shè)計(jì)_第5頁
已閱讀5頁,還剩167頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、 單片機(jī)單片機(jī)C語言及程序設(shè)計(jì)語言及程序設(shè)計(jì)1.1 C51概述概述1.2 C51數(shù)據(jù)類型及存儲(chǔ)數(shù)據(jù)類型及存儲(chǔ)1.3 C51變量的定義及數(shù)變量的定義及數(shù)據(jù)存儲(chǔ)區(qū)域據(jù)存儲(chǔ)區(qū)域1.4 C51位變量的定義位變量的定義1.5 C51特殊功能寄存器特殊功能寄存器的定義的定義1.6 C51指令的定義指令的定義1.7 C51的輸入的輸入/輸出輸出1.8 C51函數(shù)的定義函數(shù)的定義1.9 C51與匯編語言與匯編語言混合編程混合編程1.10 C51集成開發(fā)集成開發(fā)軟件軟件Keil C目目 錄錄本章主要討論本章主要討論C51變量的定義和函數(shù)的定變量的定義和函數(shù)的定義,以及義,以及Keil C軟件的使用等。軟件的使用

2、等。本章內(nèi)容的安排,認(rèn)為讀者已經(jīng)學(xué)習(xí)過本章內(nèi)容的安排,認(rèn)為讀者已經(jīng)學(xué)習(xí)過C語言,具有語言,具有C語言的基本知識(shí),因此,本章語言的基本知識(shí),因此,本章內(nèi)容完全是結(jié)合單片機(jī)來講解,也就是補(bǔ)充內(nèi)容完全是結(jié)合單片機(jī)來講解,也就是補(bǔ)充C語言在單片機(jī)方面的概念、數(shù)據(jù)定義和函語言在單片機(jī)方面的概念、數(shù)據(jù)定義和函數(shù)定義等。數(shù)定義等。通過本章學(xué)習(xí),使讀者能夠比較順利地通過本章學(xué)習(xí),使讀者能夠比較順利地編寫編寫C51程序。程序。 1.1 C51概述概述主要內(nèi)容主要內(nèi)容1.1.1 C語言編程的優(yōu)勢(shì)語言編程的優(yōu)勢(shì)1.1.2 C51與與ANSI C的區(qū)別的區(qū)別1.1.3 C51擴(kuò)展的關(guān)鍵字?jǐn)U展的關(guān)鍵字1.1 C51概述

3、概述學(xué)習(xí)單片機(jī)學(xué)習(xí)單片機(jī)C語言的必要性語言的必要性隨著單片機(jī)性能的不斷提高,隨著單片機(jī)性能的不斷提高,C語言編譯語言編譯調(diào)試工具的不斷完善,以及現(xiàn)在對(duì)單片機(jī)產(chǎn)調(diào)試工具的不斷完善,以及現(xiàn)在對(duì)單片機(jī)產(chǎn)品輔助功能的要求、對(duì)開發(fā)周期不斷縮短的品輔助功能的要求、對(duì)開發(fā)周期不斷縮短的要求,使得要求,使得越來越多的單片機(jī)編程人員轉(zhuǎn)向越來越多的單片機(jī)編程人員轉(zhuǎn)向使用使用C語言語言,因此有必要在單片機(jī)課程中講,因此有必要在單片機(jī)課程中講授授“單片機(jī)單片機(jī)C語言語言”。 “C51”概念:概念:為了與為了與ANSI C區(qū)別,區(qū)別,把把“單片機(jī)單片機(jī)C語言語言”稱為稱為“C51”,也稱為,也稱為“Keil C”。 1

4、.1.1 C語言編程的優(yōu)勢(shì)語言編程的優(yōu)勢(shì)在編程方面,使用在編程方面,使用C51較匯編語言有諸多較匯編語言有諸多優(yōu)勢(shì):優(yōu)勢(shì):1)編程容易)編程容易 2)容易實(shí)現(xiàn)復(fù)雜的數(shù)值計(jì)算)容易實(shí)現(xiàn)復(fù)雜的數(shù)值計(jì)算3)容易閱讀與交流)容易閱讀與交流4)容易調(diào)試與維護(hù)程序)容易調(diào)試與維護(hù)程序5)容易實(shí)現(xiàn)模塊化開發(fā))容易實(shí)現(xiàn)模塊化開發(fā) 6)程序可移植性好)程序可移植性好 1.1.2 C語言與語言與ANSI 的區(qū)別的區(qū)別用匯編語言編寫單片機(jī)程序時(shí),必須要用匯編語言編寫單片機(jī)程序時(shí),必須要考慮其存儲(chǔ)器的結(jié)構(gòu)考慮其存儲(chǔ)器的結(jié)構(gòu),尤其要考慮其片內(nèi)數(shù),尤其要考慮其片內(nèi)數(shù)據(jù)存儲(chǔ)器、特殊功能寄存器是否正確合理的據(jù)存儲(chǔ)器、特殊功能

5、寄存器是否正確合理的使用,以及按照實(shí)際地址端口數(shù)據(jù)的處理。使用,以及按照實(shí)際地址端口數(shù)據(jù)的處理。用用C51編寫程序,雖然不像匯編語言那樣編寫程序,雖然不像匯編語言那樣需要具體地組織、分配存儲(chǔ)器資源,但是需要具體地組織、分配存儲(chǔ)器資源,但是C51對(duì)數(shù)據(jù)類型和變量的定義,必須要與單對(duì)數(shù)據(jù)類型和變量的定義,必須要與單片機(jī)的存儲(chǔ)結(jié)構(gòu)相關(guān)聯(lián)片機(jī)的存儲(chǔ)結(jié)構(gòu)相關(guān)聯(lián),否則編譯器不能正,否則編譯器不能正確地映射定位。確地映射定位。 用用C51編寫單片機(jī)程序,與用編寫單片機(jī)程序,與用ANSI C編編寫程序的寫程序的不同之處是不同之處是,需要根據(jù)單片機(jī)存儲(chǔ)需要根據(jù)單片機(jī)存儲(chǔ)器結(jié)構(gòu)及內(nèi)部資源,定義相應(yīng)的數(shù)據(jù)類型和器結(jié)

6、構(gòu)及內(nèi)部資源,定義相應(yīng)的數(shù)據(jù)類型和變量變量。其它的語法規(guī)定、程序結(jié)構(gòu)及程序設(shè)計(jì)其它的語法規(guī)定、程序結(jié)構(gòu)及程序設(shè)計(jì)方法,都與方法,都與ANSI C相同。所以相同。所以本章主要介本章主要介紹紹C51各種變量的定義、指針定義、函數(shù)定各種變量的定義、指針定義、函數(shù)定義和混合編程義和混合編程。 1.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 codedataid

7、ata interruptpdatareentrant sbitsfrsfr16usingvolatilexdata這些關(guān)鍵字在后面會(huì)陸續(xù)接觸到,此處這些關(guān)鍵字在后面會(huì)陸續(xù)接觸到,此處先不給出它們的含義。先不給出它們的含義。 1.2 C51數(shù)據(jù)類型及存儲(chǔ)數(shù)據(jù)類型及存儲(chǔ)主要內(nèi)容主要內(nèi)容1.2.1 C51的數(shù)據(jù)類型的數(shù)據(jù)類型1.2.2 C51數(shù)據(jù)的存儲(chǔ)數(shù)據(jù)的存儲(chǔ)表表4-1 C51數(shù)據(jù)類型、長(zhǎng)度和數(shù)值范圍數(shù)據(jù)類型、長(zhǎng)度和數(shù)值范圍數(shù)據(jù)類型數(shù)據(jù)類型表示方法表示方法長(zhǎng)長(zhǎng) 度度數(shù)數(shù) 值值 范范 圍圍無符號(hào)字符型無符號(hào)字符型 unsigned char 1字節(jié)字節(jié) 0255有符號(hào)字符型有符號(hào)字符型 signe

8、d char1字節(jié)字節(jié) - -128127無符號(hào)整型無符號(hào)整型unsigned int2字節(jié)字節(jié) 065535有符號(hào)整型有符號(hào)整型signed int2字節(jié)字節(jié) - -3276832767無符號(hào)長(zhǎng)整型無符號(hào)長(zhǎng)整型 unsigned long 4字節(jié)字節(jié) 04294967295有符號(hào)長(zhǎng)整型有符號(hào)長(zhǎng)整型 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或或1數(shù)據(jù)類型轉(zhuǎn)換數(shù)據(jù)類

9、型轉(zhuǎn)換1)自動(dòng)轉(zhuǎn)換)自動(dòng)轉(zhuǎn)換轉(zhuǎn)換規(guī)則是向高精度數(shù)據(jù)類型轉(zhuǎn)換、向轉(zhuǎn)換規(guī)則是向高精度數(shù)據(jù)類型轉(zhuǎn)換、向有符號(hào)數(shù)據(jù)類型轉(zhuǎn)換有符號(hào)數(shù)據(jù)類型轉(zhuǎn)換。如字符型變量與整型。如字符型變量與整型變量相加時(shí),則位變量先轉(zhuǎn)換字符型或整型變量相加時(shí),則位變量先轉(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; 1.2.2 C51數(shù)據(jù)的存儲(chǔ)數(shù)據(jù)的存儲(chǔ)MCS-51單片機(jī)只有單片機(jī)只有bit和和unsigned char兩兩種數(shù)據(jù)類型支持機(jī)器指令種數(shù)據(jù)

10、類型支持機(jī)器指令,而其它類型的數(shù),而其它類型的數(shù)據(jù)都需要轉(zhuǎn)換成據(jù)都需要轉(zhuǎn)換成bit或或unsigned char型進(jìn)行存型進(jìn)行存儲(chǔ)。儲(chǔ)。為了減少單片機(jī)的存儲(chǔ)空間和提高運(yùn)行為了減少單片機(jī)的存儲(chǔ)空間和提高運(yùn)行速度,要盡可能地使用速度,要盡可能地使用unsigned char型數(shù)據(jù)。型數(shù)據(jù)。 一、位變量的存儲(chǔ)一、位變量的存儲(chǔ)bit和和sbit型位變量,直接存于型位變量,直接存于RAM的位的位尋址空間,包括低尋址空間,包括低128位和特殊功能寄存器位和特殊功能寄存器位。位。 二、字符變量的存儲(chǔ)二、字符變量的存儲(chǔ)字符變量字符變量(char):無論是無論是unsigned char數(shù)據(jù)還是數(shù)據(jù)還是sign

11、ed char數(shù)據(jù),均為數(shù)據(jù),均為1個(gè)字個(gè)字節(jié),能夠被直接存儲(chǔ)在節(jié),能夠被直接存儲(chǔ)在RAM中,可以存儲(chǔ)中,可以存儲(chǔ)在在00 x7f區(qū)域,也可以存儲(chǔ)在區(qū)域,也可以存儲(chǔ)在0 x800 xff區(qū)區(qū)域,與變量的定義有關(guān)。域,與變量的定義有關(guān)。unsigned char數(shù):數(shù):可直接被可直接被MSC-51接受接受signed char數(shù)據(jù):數(shù)據(jù):用補(bǔ)碼表示。用補(bǔ)碼表示。需要額需要額外的操作外的操作來測(cè)試、處理符號(hào)位,使用的是兩來測(cè)試、處理符號(hào)位,使用的是兩種庫函數(shù),代碼量大,運(yùn)算速度降低。種庫函數(shù),代碼量大,運(yùn)算速度降低。三、整型變量的存儲(chǔ)三、整型變量的存儲(chǔ)整型變量整型變量(int):不管是不管是uns

12、igned int數(shù)據(jù)還是數(shù)據(jù)還是signed int數(shù)據(jù),均為數(shù)據(jù),均為2個(gè)字節(jié),其個(gè)字節(jié),其存存儲(chǔ)方法是高位字節(jié)保存在低地儲(chǔ)方法是高位字節(jié)保存在低地址址(在前面),(在前面),低位字節(jié)保存低位字節(jié)保存在高地址在高地址(在后面)(在后面) 。例如,例如,整型變量的值為整型變量的值為0 x1234,在內(nèi)存,在內(nèi)存中的存放如右圖所示。中的存放如右圖所示。signed int數(shù)據(jù)用補(bǔ)碼表示。數(shù)據(jù)用補(bǔ)碼表示。地址地址低低高高:1234:四、長(zhǎng)四、長(zhǎng)整型變量的存儲(chǔ)整型變量的存儲(chǔ)長(zhǎng)整型變量(長(zhǎng)整型變量(long)為)為4個(gè)個(gè)字節(jié),其存儲(chǔ)方法與整型數(shù)據(jù)字節(jié),其存儲(chǔ)方法與整型數(shù)據(jù)一樣,是一樣,是最高位字節(jié)保

13、存的地最高位字節(jié)保存的地址最低址最低(在最前面),(在最前面),最低位最低位字節(jié)保存的地址最高字節(jié)保存的地址最高(在最后(在最后面)。面)。如長(zhǎng)整型變量的值為如長(zhǎng)整型變量的值為0 x12345678,在內(nèi),在內(nèi)存中的存放方法如右圖所示。不管是存中的存放方法如右圖所示。不管是unsigned long數(shù)據(jù)還是數(shù)據(jù)還是signed long數(shù)據(jù)。數(shù)據(jù)。地址地址低低高高:12345678:五、浮點(diǎn)五、浮點(diǎn)型變量的存儲(chǔ)型變量的存儲(chǔ)浮點(diǎn)型變量浮點(diǎn)型變量(fload)占)占4個(gè)字節(jié),個(gè)字節(jié),用指數(shù)用指數(shù)方式表示方式表示,其具體格式與編譯器有關(guān)。,其具體格式與編譯器有關(guān)。對(duì)于對(duì)于Keil C,采用的是,采用

14、的是IEEE-754標(biāo)準(zhǔn)標(biāo)準(zhǔn),具有具有24位精度,尾數(shù)的最高位始終為位精度,尾數(shù)的最高位始終為1,因,因而不保存。而不保存。具體分布為:具體分布為:1位符號(hào)位,位符號(hào)位,8位階位階碼位,碼位,23位尾數(shù),如下圖所示。位尾數(shù),如下圖所示。 字節(jié)地址字節(jié)地址0123浮點(diǎn)數(shù)浮點(diǎn)數(shù)內(nèi)容內(nèi)容SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM符號(hào)和階碼符號(hào)和階碼 尾數(shù)高位尾數(shù)高位尾數(shù)低位尾數(shù)低位符號(hào)位符號(hào)位S:1表示負(fù)數(shù),表示負(fù)數(shù),0表示正數(shù)。表示正數(shù)。階碼:階碼:用移碼表示。如,實(shí)際階碼用移碼表示。如,實(shí)際階碼- -126用用1表示,實(shí)際階碼表示,實(shí)際階碼0用用127表示,表示,即實(shí)際階即

15、實(shí)際階碼數(shù)加上碼數(shù)加上127得到階碼的表達(dá)數(shù)得到階碼的表達(dá)數(shù)。階碼數(shù)值范圍:階碼數(shù)值范圍:- -126+128。例如浮點(diǎn)數(shù)例如浮點(diǎn)數(shù)- -12.5符號(hào)位為符號(hào)位為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,則存儲(chǔ)結(jié)構(gòu),則存儲(chǔ)結(jié)構(gòu)如右圖所示。如右圖所示。 地址地址低低高高:C1480000:說明:說明:教材中存儲(chǔ)結(jié)構(gòu)是錯(cuò)的。教材中存儲(chǔ)結(jié)構(gòu)是錯(cuò)的。1.3 C51變量的定義及數(shù)據(jù)存儲(chǔ)區(qū)域變量的定義及數(shù)據(jù)存儲(chǔ)區(qū)域主要內(nèi)容主要內(nèi)

16、容1.3.1 C51變量的定義變量的定義1.3.2 C51變量的存儲(chǔ)類型變量的存儲(chǔ)類型1.3.3 C51變量的存儲(chǔ)區(qū)域變量的存儲(chǔ)區(qū)域1.3.4 C51變量定義舉例變量定義舉例1.3.5 C51變量的存儲(chǔ)模式變量的存儲(chǔ)模式1.3.6 C51變量的絕對(duì)定位變量的絕對(duì)定位1.3.1 C51變量的定義變量的定義C51變量定義的一般格式為:變量定義的一般格式為:存儲(chǔ)類型存儲(chǔ)類型數(shù)據(jù)類型數(shù)據(jù)類型 存儲(chǔ)區(qū)存儲(chǔ)區(qū)變量名變量名1=初值初值 ,變量名變量名2=初值初值 ,或或存儲(chǔ)類型存儲(chǔ)類型存儲(chǔ)區(qū)存儲(chǔ)區(qū) 數(shù)據(jù)類型數(shù)據(jù)類型 變量名變量名1=初值初值 ,變量名變量名2=初值初值 ,可見變量可見變量(非位變量)(非位變

17、量)的定義由的定義由4部分組部分組成成,即在變量定義時(shí),指定變量,即在變量定義時(shí),指定變量4種屬性。種屬性。數(shù)據(jù)類型:數(shù)據(jù)類型:在前面的在前面的4.2中已經(jīng)敘述過,中已經(jīng)敘述過,對(duì)于變量名也無須多說,對(duì)于變量名也無須多說,下面主要解釋下面主要解釋“存存儲(chǔ)類型儲(chǔ)類型”和和“存儲(chǔ)區(qū)存儲(chǔ)區(qū)”等概念等概念。 1.3.2 C51變量的存儲(chǔ)類型變量的存儲(chǔ)類型存儲(chǔ)類型這個(gè)屬性我們?nèi)匝赜么鎯?chǔ)類型這個(gè)屬性我們?nèi)匝赜肁NSI C的的說法說法,盡量不改變?cè)瓉淼暮x。,盡量不改變?cè)瓉淼暮x。按照按照ANSI C,C語言的變量有語言的變量有4種存儲(chǔ)類種存儲(chǔ)類型型:動(dòng)態(tài)存儲(chǔ)(動(dòng)態(tài)存儲(chǔ)(auto)靜態(tài)存儲(chǔ)(靜態(tài)存儲(chǔ)(sta

18、tic)全局存儲(chǔ)(全局存儲(chǔ)(extern)寄存器存儲(chǔ)(寄存器存儲(chǔ)(register) 一、動(dòng)態(tài)存儲(chǔ)一、動(dòng)態(tài)存儲(chǔ)動(dòng)態(tài)(存儲(chǔ))變量:動(dòng)態(tài)(存儲(chǔ))變量:用用auto定義的為動(dòng)態(tài)定義的為動(dòng)態(tài)變量,也叫自動(dòng)變量變量,也叫自動(dòng)變量。作用范圍:作用范圍:在定義它的函數(shù)內(nèi)或復(fù)合語在定義它的函數(shù)內(nèi)或復(fù)合語句內(nèi)部。句內(nèi)部。當(dāng)定義它的函數(shù)或復(fù)合語當(dāng)定義它的函數(shù)或復(fù)合語句執(zhí)行時(shí),句執(zhí)行時(shí),C51才為變量分配存儲(chǔ)空間,結(jié)才為變量分配存儲(chǔ)空間,結(jié)束時(shí)所占用的存儲(chǔ)空間釋放。束時(shí)所占用的存儲(chǔ)空間釋放。定義變量時(shí),定義變量時(shí),auto可以省略可以省略,或者說如果,或者說如果省略了存儲(chǔ)類型項(xiàng),則認(rèn)為是動(dòng)態(tài)變量。省略了存儲(chǔ)類型項(xiàng),

19、則認(rèn)為是動(dòng)態(tài)變量。動(dòng)動(dòng)態(tài)變量一般分配使用寄存器或堆棧態(tài)變量一般分配使用寄存器或堆棧。 二、靜態(tài)存儲(chǔ)二、靜態(tài)存儲(chǔ)靜態(tài)(存儲(chǔ))變量:靜態(tài)(存儲(chǔ))變量:用用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é)束后會(huì)一直存在,但在函修改,函數(shù)運(yùn)行結(jié)束后會(huì)一直存在,但在函數(shù)外不可見,即在函數(shù)體外得到保護(hù)。數(shù)外不可見,即在函數(shù)體外得到保護(hù)。外部靜態(tài)變量:外部靜態(tài)變量:在函數(shù)體外部定義的為在函數(shù)體外部定義的為外

20、部靜態(tài)變量外部靜態(tài)變量。在定義的文件內(nèi)可以任意使。在定義的文件內(nèi)可以任意使用和修改,外部靜態(tài)變量會(huì)一直存在,但在用和修改,外部靜態(tài)變量會(huì)一直存在,但在文件外不可見,即在文件外得到保護(hù)。文件外不可見,即在文件外得到保護(hù)。 三、外部存儲(chǔ)三、外部存儲(chǔ)外部(存儲(chǔ))變量:外部(存儲(chǔ))變量:用用extern聲明聲明的變量的變量為外部變量為外部變量,是在其它文件定義過的全局變,是在其它文件定義過的全局變量。量。用用extern聲明后,便可以在所聲明聲明后,便可以在所聲明的文件中使用。的文件中使用。需要注意的是:需要注意的是:在定義變量時(shí),即便是在定義變量時(shí),即便是全局變量,也不能使用全局變量,也不能使用ex

21、tern定義定義。 四、寄存器存儲(chǔ)四、寄存器存儲(chǔ)寄存器(存儲(chǔ))變量:寄存器(存儲(chǔ))變量:用用register定義的定義的變量為寄存器變量變量為寄存器變量。寄存器變量存放在寄存器變量存放在CPU的寄存器中的寄存器中,這,這種變量處理速度快,但數(shù)目少。種變量處理速度快,但數(shù)目少。C51中的寄存器變量:中的寄存器變量: C51的編譯器在編的編譯器在編譯時(shí),能夠自動(dòng)識(shí)別程序中使用譯時(shí),能夠自動(dòng)識(shí)別程序中使用頻率高的變頻率高的變量量,并將其,并將其安排為寄存器變量安排為寄存器變量,用戶不用專,用戶不用專門聲明。門聲明。 1.3.3 C51變量的存儲(chǔ)區(qū)域變量的存儲(chǔ)區(qū)域變量的存儲(chǔ)區(qū)屬性是單片機(jī)擴(kuò)展的概念變量

22、的存儲(chǔ)區(qū)屬性是單片機(jī)擴(kuò)展的概念,非常重要,非常重要,它涉及到它涉及到7個(gè)新的關(guān)鍵字個(gè)新的關(guān)鍵字。MCS-51單片機(jī)有四個(gè)存儲(chǔ)空間單片機(jī)有四個(gè)存儲(chǔ)空間,分成三,分成三類,它們是片內(nèi)數(shù)據(jù)存儲(chǔ)空間、片外數(shù)據(jù)存類,它們是片內(nèi)數(shù)據(jù)存儲(chǔ)空間、片外數(shù)據(jù)存儲(chǔ)空間和程序存儲(chǔ)空間。儲(chǔ)空間和程序存儲(chǔ)空間。 MCS-51單片機(jī)有更多的存儲(chǔ)區(qū)域:?jiǎn)纹瑱C(jī)有更多的存儲(chǔ)區(qū)域:由于由于片內(nèi)數(shù)據(jù)存儲(chǔ)器和片外數(shù)據(jù)存儲(chǔ)器又分成不片內(nèi)數(shù)據(jù)存儲(chǔ)器和片外數(shù)據(jù)存儲(chǔ)器又分成不同的區(qū)域,所以同的區(qū)域,所以單片機(jī)的變量有更多的存儲(chǔ)單片機(jī)的變量有更多的存儲(chǔ)區(qū)域區(qū)域。在定義變量時(shí),必須明確指出在定義變量時(shí),必須明確指出是存放在哪個(gè)區(qū)域是存放在哪個(gè)區(qū)域

23、。表表1-2 C51存儲(chǔ)區(qū)與存儲(chǔ)空間的對(duì)應(yīng)關(guān)系存儲(chǔ)區(qū)與存儲(chǔ)空間的對(duì)應(yīng)關(guān)系關(guān)鍵字關(guān)鍵字對(duì)應(yīng)的存儲(chǔ)空間及范圍對(duì)應(yīng)的存儲(chǔ)空間及范圍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,間接尋址,間接尋址,256字節(jié),與字節(jié),與 Ri 對(duì)應(yīng)對(duì)應(yīng)pdata片外片外RAM,分頁尋址的,分頁尋址的256字節(jié)字節(jié)(P2不變不變), P2改變可尋址改變可尋址64KB全空間,與全空間,與MOVX Ri 對(duì)應(yīng)對(duì)應(yīng)xdata片外片外RAM,64KB

24、全空間全空間bit片內(nèi)片內(nèi)RAM位尋找區(qū)位尋找區(qū),位地址位地址0 x000 x7f,128位位1.3.4 C51變量定義舉例變量定義舉例1)定義存儲(chǔ)在)定義存儲(chǔ)在data區(qū)域區(qū)域的的動(dòng)態(tài)動(dòng)態(tài)unsigned char變量:變量:unsigned char data sec=0, min=0, hou=0;2)定義存儲(chǔ)在)定義存儲(chǔ)在data區(qū)域區(qū)域的的靜態(tài)靜態(tài)unsigned char變量:變量:static unsigned char data scan_code=0 xfe;3)定義存儲(chǔ)在)定義存儲(chǔ)在data區(qū)域區(qū)域的的靜態(tài)靜態(tài)unsigned int變量:變量:static unsigne

25、d int data dd;4)定義存儲(chǔ)在)定義存儲(chǔ)在bdata區(qū)域區(qū)域的的動(dòng)態(tài)動(dòng)態(tài)unsigned char變量:變量:unsigned char bdata operate, operate1;/定義指示操作的可位尋址的變量定義指示操作的可位尋址的變量5)定義存儲(chǔ)在)定義存儲(chǔ)在idata區(qū)域區(qū)域的的動(dòng)態(tài)動(dòng)態(tài)unsigned char數(shù)組:數(shù)組:unsigned char idata temp20; 6)定義在)定義在pdata區(qū)域區(qū)域的的動(dòng)態(tài)動(dòng)態(tài)有符號(hào)有符號(hào)int數(shù)數(shù)組:組:int pdata send_data30;/定義存放發(fā)送數(shù)據(jù)的數(shù)組定義存放發(fā)送數(shù)據(jù)的數(shù)組 7)定義存儲(chǔ)在)定義存儲(chǔ)

26、在xdata區(qū)域區(qū)域的的動(dòng)態(tài)動(dòng)態(tài)unsigned int數(shù)組:數(shù)組:unsigned int xdata receiv_buf50;/定義存放接受數(shù)據(jù)的數(shù)組定義存放接受數(shù)據(jù)的數(shù)組8)定義存儲(chǔ)在)定義存儲(chǔ)在code區(qū)域區(qū)域的的unsigned char數(shù)組:數(shù)組:unsigned 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ù)組1.3.5 C51變量的存儲(chǔ)模式變量的存儲(chǔ)模式存儲(chǔ)模式:存儲(chǔ)模式:如果在定義變量時(shí)缺省了存如果在定

27、義變量時(shí)缺省了存儲(chǔ)區(qū)屬性,則編譯器會(huì)自動(dòng)選擇默認(rèn)的存儲(chǔ)儲(chǔ)區(qū)屬性,則編譯器會(huì)自動(dòng)選擇默認(rèn)的存儲(chǔ)區(qū)域,區(qū)域,也就是存儲(chǔ)模式也就是存儲(chǔ)模式。變量的存儲(chǔ)模式也就是程序(或函數(shù))變量的存儲(chǔ)模式也就是程序(或函數(shù))的編譯模式的編譯模式。編譯模式分為三種:編譯模式分為三種:小模式(小模式(small)、)、緊湊模式(緊湊模式(compact)和大模式()和大模式(large)。)。編譯模式由編譯控制命令決定。編譯模式由編譯控制命令決定。存儲(chǔ)模式(編譯模式)決定了變量的默存儲(chǔ)模式(編譯模式)決定了變量的默認(rèn)存儲(chǔ)區(qū)域和參數(shù)的傳遞方法認(rèn)存儲(chǔ)區(qū)域和參數(shù)的傳遞方法。 一、一、small模式模式在在small模式下,變

28、量的默認(rèn)存儲(chǔ)區(qū)域是模式下,變量的默認(rèn)存儲(chǔ)區(qū)域是“data”、“idata”,即未指出存儲(chǔ)區(qū)域的變,即未指出存儲(chǔ)區(qū)域的變量保存到片內(nèi)數(shù)據(jù)存儲(chǔ)器中,并且量保存到片內(nèi)數(shù)據(jù)存儲(chǔ)器中,并且堆棧也安堆棧也安排在該區(qū)域中排在該區(qū)域中。small模式的特點(diǎn):模式的特點(diǎn):存儲(chǔ)容量小,但速度存儲(chǔ)容量小,但速度快???。在在small模式下參數(shù)的傳遞:模式下參數(shù)的傳遞:通過寄存器、通過寄存器、堆棧或片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū)完成的。堆棧或片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū)完成的。 二、二、compact模式模式在在compact模式下,變量的默認(rèn)存儲(chǔ)區(qū)域模式下,變量的默認(rèn)存儲(chǔ)區(qū)域是是“pdata”,即未指出存儲(chǔ)區(qū)域的變量保存,即未指出存儲(chǔ)區(qū)域的變量

29、保存到片外數(shù)據(jù)存儲(chǔ)器的一頁中,最大變量數(shù)為到片外數(shù)據(jù)存儲(chǔ)器的一頁中,最大變量數(shù)為256字節(jié),并且字節(jié),并且堆棧也安排在該區(qū)域中堆棧也安排在該區(qū)域中。compact模式的其特點(diǎn):模式的其特點(diǎn):是存儲(chǔ)容量較是存儲(chǔ)容量較small模式大,速度較模式大,速度較small模式稍慢,但比模式稍慢,但比large模式要快。模式要快。在在compact模式下參數(shù)的傳遞:模式下參數(shù)的傳遞:通過片外通過片外數(shù)據(jù)區(qū)的一個(gè)固定頁完成的。數(shù)據(jù)區(qū)的一個(gè)固定頁完成的。 三、三、large模式模式在在large模式下,變量的默認(rèn)存儲(chǔ)區(qū)域是模式下,變量的默認(rèn)存儲(chǔ)區(qū)域是“xdata”,即未指出存儲(chǔ)區(qū)域的變量保存到,即未指出存儲(chǔ)區(qū)

30、域的變量保存到片外數(shù)據(jù)存儲(chǔ)器,最大變量數(shù)可達(dá)片外數(shù)據(jù)存儲(chǔ)器,最大變量數(shù)可達(dá)64KB,并且并且堆棧也安排在該區(qū)域中堆棧也安排在該區(qū)域中。large模式的特點(diǎn):模式的特點(diǎn):存儲(chǔ)容量大,速度慢存儲(chǔ)容量大,速度慢large模式下參數(shù)的傳遞方式:模式下參數(shù)的傳遞方式:參數(shù)的傳參數(shù)的傳遞也是通過片外數(shù)據(jù)存儲(chǔ)器完成的。遞也是通過片外數(shù)據(jù)存儲(chǔ)器完成的。 C51支持混合模式:支持混合模式:即可以對(duì)函數(shù)設(shè)置編即可以對(duì)函數(shù)設(shè)置編譯模式,所以在譯模式,所以在large模式下,可以對(duì)某些函模式下,可以對(duì)某些函數(shù)設(shè)置為數(shù)設(shè)置為compact模式或模式或small模式,從而提模式,從而提高運(yùn)行速度。高運(yùn)行速度。默認(rèn)編譯模式

31、:默認(rèn)編譯模式:如果文件或函數(shù)未指明如果文件或函數(shù)未指明編譯模式,則編譯器按編譯模式,則編譯器按small模式處理模式處理。編譯模式控制命令:編譯模式控制命令: “#pragma small(或或compact、large)”應(yīng)放在文件的開始。應(yīng)放在文件的開始。 1.3.6 C51變量的絕對(duì)定位變量的絕對(duì)定位C51有三種方式可以對(duì)變量有三種方式可以對(duì)變量(I/O端口)端口)絕對(duì)定位:絕對(duì)定位:絕對(duì)定位關(guān)鍵字絕對(duì)定位關(guān)鍵字_at_ 、指針、庫、指針、庫函數(shù)的絕對(duì)定位宏。函數(shù)的絕對(duì)定位宏。對(duì)于后兩種方式,在對(duì)于后兩種方式,在后面指針一節(jié)介紹。后面指針一節(jié)介紹。C51擴(kuò)展的關(guān)鍵字?jǐn)U展的關(guān)鍵字_at_

32、專門用于對(duì)變量作專門用于對(duì)變量作絕對(duì)定位絕對(duì)定位,_at_使用在變量的定義中,其格使用在變量的定義中,其格式為:式為:存儲(chǔ)類型存儲(chǔ)類型 數(shù)據(jù)類型數(shù)據(jù)類型 存儲(chǔ)區(qū)存儲(chǔ)區(qū) 變量名變量名1 _at_ 地址常數(shù)地址常數(shù),變量名,變量名2 舉例說明舉例說明_at_的使用方法的使用方法1)對(duì))對(duì)data區(qū)域區(qū)域中的中的 unsigned char變量變量aa作絕對(duì)定位:作絕對(duì)定位:unsigned char data aa _at_ 0 x30;2)對(duì))對(duì)pdata區(qū)域區(qū)域中的中的 unsigned int數(shù)組數(shù)組cc作絕對(duì)定位:作絕對(duì)定位:unsigned int pdata cc10 _at_ 0 x

33、34;3)對(duì))對(duì)xdata區(qū)域區(qū)域中的中的 unsigned char變量變量printer_port作絕對(duì)定位:作絕對(duì)定位:unsigned char xdata printer_port _at_ 0 x7fff; 對(duì)變量絕對(duì)定位的幾點(diǎn)說明:對(duì)變量絕對(duì)定位的幾點(diǎn)說明:1)絕對(duì)地址變量)絕對(duì)地址變量在定義時(shí)不能初始化在定義時(shí)不能初始化,因此不能對(duì)因此不能對(duì)code型變量絕對(duì)定位;型變量絕對(duì)定位;2)絕對(duì)地址變量)絕對(duì)地址變量只能夠是全局變量只能夠是全局變量,不,不能在函數(shù)中對(duì)變量絕對(duì)定位;能在函數(shù)中對(duì)變量絕對(duì)定位;3)絕對(duì)地址變量)絕對(duì)地址變量多用于多用于I/O端口端口,一般情,一般情況下不

34、對(duì)變量作絕對(duì)定位;況下不對(duì)變量作絕對(duì)定位;3)位變量不能使用)位變量不能使用_at_絕對(duì)定位。絕對(duì)定位。1.4 C51位變量的定義位變量的定義主要內(nèi)容主要內(nèi)容1.4.1 bit型位變量的定義型位變量的定義1.4.2 sbit型位變量的定義型位變量的定義1.4.1 bit型位變量的定義型位變量的定義常說的位變量指的就是常說的位變量指的就是bit型位變量型位變量。C51的的bit型位變量定義的一般格式為:型位變量定義的一般格式為:存儲(chǔ)類型存儲(chǔ)類型 bit 位變量名位變量名1=初值初值 ,位變量名,位變量名2=初值初值 ,bit位變量被保存在位變量被保存在RAM中的位尋址區(qū)中的位尋址區(qū)域域(字節(jié)地址

35、為(字節(jié)地址為0 x200 x2f,16字節(jié))。字節(jié))。例如:例如:bitflag_run,receiv_bit=0;static bit send_bit; 兩點(diǎn)說明:兩點(diǎn)說明:1)bit型位變量與其它變量一樣,型位變量與其它變量一樣,可以可以作為函數(shù)的形參作為函數(shù)的形參,也可以作為,也可以作為函數(shù)的返回函數(shù)的返回值值,即函數(shù)的類型可以是位型的;,即函數(shù)的類型可以是位型的;2)位變量)位變量不能定義指針不能定義指針,不能定義數(shù)不能定義數(shù)組組。 1.4.2 sbit型位變量的定義型位變量的定義對(duì)于能夠按位尋址的特殊功能寄存器、對(duì)于能夠按位尋址的特殊功能寄存器、定義在位尋址區(qū)域的變量(字節(jié)型、整

36、型、定義在位尋址區(qū)域的變量(字節(jié)型、整型、長(zhǎng)整型),可以對(duì)其各位用長(zhǎng)整型),可以對(duì)其各位用sbit定義位變量。定義位變量。為了方便起見,分開討論為了方便起見,分開討論按位尋址的特按位尋址的特殊功能寄存器中位變量的定義、按位尋址殊功能寄存器中位變量的定義、按位尋址的變量中位變量的定義。的變量中位變量的定義。一、特殊功能寄存器中位變量定義一、特殊功能寄存器中位變量定義能夠按位尋址的能夠按位尋址的特殊功能寄存器中位變特殊功能寄存器中位變量定義的一般格式為:量定義的一般格式為:sbit 位變量名位變量名 位地址表達(dá)式位地址表達(dá)式這里的位地址表達(dá)式有三種形式:這里的位地址表達(dá)式有三種形式:直接位地址直接

37、位地址特殊功能寄存器名帶位號(hào)特殊功能寄存器名帶位號(hào)字節(jié)地址帶位號(hào)字節(jié)地址帶位號(hào)1、用直接位地址定義位變量、用直接位地址定義位變量這種情況下位變量的定義格式為:這種情況下位變量的定義格式為:sbit 位變量名位變量名 位地址常數(shù)位地址常數(shù)這里的位地址常數(shù)范圍為這里的位地址常數(shù)范圍為0 x800 xff,實(shí)際是定義特殊功能寄存器的位實(shí)際是定義特殊功能寄存器的位。例如:。例如:sbitP0_0=0 x80; sbitP1_1=0 x91;sbitRS0=0 xd3; /定義定義PSW的第的第3位位sbitET0=0 xa9; /定義定義IE的第的第1位位 2、特殊功能寄存器名帶位號(hào)定義、特殊功能寄存

38、器名帶位號(hào)定義這時(shí)位變量的定義格式為:這時(shí)位變量的定義格式為:sbit 位變量名位變量名 特殊功能寄存器名特殊功能寄存器名 位號(hào)常數(shù)位號(hào)常數(shù)這里的位號(hào)常數(shù)為這里的位號(hào)常數(shù)為07。例如:。例如:sbitP0_3=P0 3; sbitP1_4=P1 4;sbitOV=PSW 2; /定義定義PSW的第的第2位位sbitES=IE 4; /定義定義IE的第的第4位位 3、寄存器地址帶位號(hào)定義位變量、寄存器地址帶位號(hào)定義位變量在這種情況下位變量的定義格式為:在這種情況下位變量的定義格式為:sbit 位變量名位變量名 特殊功能寄存器地址特殊功能寄存器地址 位號(hào)常數(shù)位號(hào)常數(shù)這里的位號(hào)常數(shù)同上,為這里的位號(hào)

39、常數(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、幾點(diǎn)說明、幾點(diǎn)說明1)用)用sbit定義的位變量,必須能夠按位操作,定義的位變量,必須能夠按位操作,而不能夠?qū)o位操作功能的位定義位變量。而不能夠?qū)o位操作功能的位定義位變量。2)用)用sbit定義位變量,必須放在函數(shù)外面作為定義位變量,必須放在函數(shù)外面作為全局位變量,而不能在函數(shù)內(nèi)部定義。全局位變量,而不能在函數(shù)內(nèi)部定義。3)用)用sbit每次只能定義一個(gè)位變量。每次

40、只能定義一個(gè)位變量。4)對(duì)其它模塊定義的位變量()對(duì)其它模塊定義的位變量(bit型或型或 sbit型)型)的引用聲明,都使用的引用聲明,都使用bit。5)用)用sbit定義的是一種絕對(duì)定位的位變量(因定義的是一種絕對(duì)定位的位變量(因?yàn)槊质桥c確定位地址對(duì)應(yīng)的),具有特定的意為名字是與確定位地址對(duì)應(yīng)的),具有特定的意義,在應(yīng)用時(shí)不能像義,在應(yīng)用時(shí)不能像bit型位變量那樣隨便使用。型位變量那樣隨便使用。二、二、位尋址區(qū)變量的位尋址區(qū)變量的位定義位定義對(duì)對(duì)bdata型變量(字節(jié)型、整型、長(zhǎng)整型變量(字節(jié)型、整型、長(zhǎng)整型)型) ,被保存在,被保存在RAM中的位尋址區(qū),因此中的位尋址區(qū),因此可以對(duì)可以對(duì)

41、bdata型變量各位作位變量定義型變量各位作位變量定義。這樣,既可以對(duì)這樣,既可以對(duì)bdata型變量作字節(jié)型變量作字節(jié)(或整型、長(zhǎng)整型)操作,也可以作位操(或整型、長(zhǎng)整型)操作,也可以作位操作。作。bdata型變量的位定義格式:型變量的位定義格式:sbit 位變量名位變量名 bdata型變量名型變量名 位號(hào)常數(shù)位號(hào)常數(shù) bdata型變量為在此之前應(yīng)該是定義過的型變量為在此之前應(yīng)該是定義過的,位號(hào)常數(shù)可以是位號(hào)常數(shù)可以是07(8位字節(jié)變量),或位字節(jié)變量),或015(16位整型變量),或位整型變量),或031(32位字位字長(zhǎng)整型變量)。例如:長(zhǎng)整型變量)。例如:unsigned char bda

42、taoperate;對(duì)對(duì)operate的低的低4位作位變量定義:位作位變量定義:sbit flag_key=operate 0; /鍵盤標(biāo)志位鍵盤標(biāo)志位sbit flag_dis=operate 1; /顯示標(biāo)志位顯示標(biāo)志位sbit flag_mus=operate 2; /音樂標(biāo)志位音樂標(biāo)志位sbit flag_run=operate 3; /運(yùn)行標(biāo)志位運(yùn)行標(biāo)志位 1.5 C51特殊功能寄存器的定義特殊功能寄存器的定義主要內(nèi)容主要內(nèi)容1.5.1 8位特殊功能寄存器的定義位特殊功能寄存器的定義1.5.2 16位特殊功能寄存器的定義位特殊功能寄存器的定義1.5.1 8位特殊功能寄存器的定義位特殊

43、功能寄存器的定義定義的一般格式為:定義的一般格式為:sfr特殊功能寄存器名特殊功能寄存器名 地址常數(shù)地址常數(shù)地址常數(shù)范圍:地址常數(shù)范圍:0 x800 xff。特殊功能寄存器定義例子(見特殊功能寄存器定義例子(見reg51.h、reg52.h等文件):等文件):sfrP0=0 x80;/定義定義P0寄存器寄存器sfrP1=0 x90;/定義定義P1口寄存器口寄存器sfrPSW=0 xd0;/定義定義PSWsfrIE=0 xa8;/定義定義IE 1.5.2 16位特殊功能寄存器的定義位特殊功能寄存器的定義定義的一般格式為:定義的一般格式為:sfr16 特殊功能寄存器名特殊功能寄存器名 地址常數(shù)地址

44、常數(shù)地址常數(shù)范圍:地址常數(shù)范圍:0 x800 xff。例如(見例如(見reg51.h、reg52.h等文件):等文件):sfr16 DPTR=0 x82;sfr16 T2=0 xcc; /含含TL2和和TH2sfr16 RCAP2=0 xca; /含含RCAP2L/和和RCAP2H, 0 xca為為RCAP2L的地址的地址幾點(diǎn)說明:幾點(diǎn)說明:1)定義特殊功能寄存器中的地址必須)定義特殊功能寄存器中的地址必須在在0 x800 xff范圍內(nèi)。范圍內(nèi)。2)定義特殊功能寄存器,必須放在函)定義特殊功能寄存器,必須放在函數(shù)外面作為全局變量。數(shù)外面作為全局變量。3)用)用sfr或或sfr16每次只能定義一

45、個(gè)特殊每次只能定義一個(gè)特殊功能寄存器。功能寄存器。4)像)像sbit一樣,用一樣,用sfr或或sfr16定義的是絕定義的是絕對(duì)定位的變量(因?yàn)槊质桥c確定地址對(duì)對(duì)定位的變量(因?yàn)槊质桥c確定地址對(duì)應(yīng)的),具有特定的意義,在應(yīng)用時(shí)不能應(yīng)的),具有特定的意義,在應(yīng)用時(shí)不能像一般變量那樣隨便使用。像一般變量那樣隨便使用。 1.6 C51指針的定義指針的定義主要內(nèi)容主要內(nèi)容1.6.1 通用指針通用指針1.6.2 存儲(chǔ)器專用指針存儲(chǔ)器專用指針1.6.3 指針變換指針變換1.6.4 C51指針應(yīng)用指針應(yīng)用1.6 C51指針的定義指針的定義由于由于MCS-51單片機(jī)有三種不同類型的存單片機(jī)有三種不同類型的存

46、儲(chǔ)空間,并且還有不同的存儲(chǔ)區(qū)域,儲(chǔ)空間,并且還有不同的存儲(chǔ)區(qū)域,因此因此C51指針的內(nèi)容更豐富。指針的內(nèi)容更豐富。指針除了具有像變量的四種屬性(存儲(chǔ)指針除了具有像變量的四種屬性(存儲(chǔ)類型、數(shù)據(jù)類型、存儲(chǔ)區(qū)、變量名)外,類型、數(shù)據(jù)類型、存儲(chǔ)區(qū)、變量名)外,按按存儲(chǔ)區(qū),將指針分為通用指針和不同存儲(chǔ)區(qū)存儲(chǔ)區(qū),將指針分為通用指針和不同存儲(chǔ)區(qū)域的專用指針。域的專用指針。 1.6.1 通用指針通用指針?biāo)^通用指針,就是通過該類指針可以所謂通用指針,就是通過該類指針可以訪問所有的存儲(chǔ)空間訪問所有的存儲(chǔ)空間。在在C51庫函數(shù)中通常使用這種指針來訪庫函數(shù)中通常使用這種指針來訪問。問。通用指針用通用指針用3個(gè)字節(jié)

47、來表示:個(gè)字節(jié)來表示:第一個(gè)字節(jié):表示指針第一個(gè)字節(jié):表示指針?biāo)赶虻拇鎯?chǔ)空間所指向的存儲(chǔ)空間第二個(gè)字節(jié):為指針第二個(gè)字節(jié):為指針地址的高字節(jié)地址的高字節(jié)第三個(gè)字節(jié):為指針第三個(gè)字節(jié):為指針地址的低字節(jié)地址的低字節(jié)通用指針的定義與一般通用指針的定義與一般C語言指針的定語言指針的定義相同,其格式為:義相同,其格式為:存儲(chǔ)類型存儲(chǔ)類型 數(shù)據(jù)類型數(shù)據(jù)類型 *指針名指針名1,*指針名指針名2 ,例如:例如:unsigned char *cpt;int *dpt;long *lpt;static char *ccpt; 通用指針的特點(diǎn):通用指針的特點(diǎn):定義簡(jiǎn)單定義簡(jiǎn)單訪問所有空間訪問所有空間訪問速度慢訪

48、問速度慢 1.6.2 存儲(chǔ)器專用指針存儲(chǔ)器專用指針?biāo)^存儲(chǔ)器專用指針,就是通過該類指所謂存儲(chǔ)器專用指針,就是通過該類指針,只能夠訪問規(guī)定的存儲(chǔ)空間區(qū)域針,只能夠訪問規(guī)定的存儲(chǔ)空間區(qū)域。指針本身占用指針本身占用1個(gè)字節(jié)(個(gè)字節(jié)(data *,idata *,bdata *,pdata *)或)或2個(gè)字節(jié)(個(gè)字節(jié)(xdata *,code *)。)。存儲(chǔ)器專用指針的一般定義格式為:存儲(chǔ)器專用指針的一般定義格式為:存儲(chǔ)類型存儲(chǔ)類型 數(shù)據(jù)類型數(shù)據(jù)類型 指向存儲(chǔ)區(qū)指向存儲(chǔ)區(qū) *指針存儲(chǔ)區(qū)指針存儲(chǔ)區(qū) 指針名指針名1 ,*指針存儲(chǔ)區(qū)指針存儲(chǔ)區(qū) 指針名指針名2, 指向存儲(chǔ)區(qū):指向存儲(chǔ)區(qū):是指針變量所指向的數(shù)據(jù)

49、存儲(chǔ)空間區(qū)域。是指針變量所指向的數(shù)據(jù)存儲(chǔ)空間區(qū)域。不能夠缺省不能夠缺省。指針存儲(chǔ)區(qū):指針存儲(chǔ)區(qū):是指針變量本身所存儲(chǔ)的空間區(qū)域。是指針變量本身所存儲(chǔ)的空間區(qū)域。缺省時(shí)認(rèn)為指針存儲(chǔ)區(qū)在默認(rèn)的存儲(chǔ)區(qū)缺省時(shí)認(rèn)為指針存儲(chǔ)區(qū)在默認(rèn)的存儲(chǔ)區(qū)域,其默認(rèn)存儲(chǔ)區(qū)域決定于所設(shè)定的編譯域,其默認(rèn)存儲(chǔ)區(qū)域決定于所設(shè)定的編譯模式。模式。指向和指針存儲(chǔ)區(qū),指向和指針存儲(chǔ)區(qū),兩者可以是同一個(gè)兩者可以是同一個(gè)區(qū)域,但多數(shù)情況下不會(huì)是同一個(gè)區(qū)域。區(qū)域,但多數(shù)情況下不會(huì)是同一個(gè)區(qū)域。 存儲(chǔ)器專用指針例子:存儲(chǔ)器專用指針例子:unsigned char data *cpt1, *cpt2; signed int idata *dp

50、t1, *dpt2;unsigned char pdata *ppt; signed long xdata *lpt1, *lpt2;unsigned char code *ccpt;上面所定義的指針雖然所指向的空間上面所定義的指針雖然所指向的空間不同,但不同,但指針變量本身都存儲(chǔ)在默認(rèn)的存指針變量本身都存儲(chǔ)在默認(rèn)的存儲(chǔ)區(qū)域儲(chǔ)區(qū)域。 又如又如:1)unsigned char data *idata cpt1,*idata cpt2; 2)signed int idata *data dpt1, *data dpt2; 3)unsigned char pdata *xdata ppt; 4)si

51、gned long xdata *lpt1, *xdata lpt2; 5)unsigned char code *data ccpt; 綠色關(guān)鍵字綠色關(guān)鍵字為指針?biāo)赶虻拇鎯?chǔ)區(qū)為指針?biāo)赶虻拇鎯?chǔ)區(qū)藍(lán)色關(guān)鍵字藍(lán)色關(guān)鍵字為指針本身所存儲(chǔ)的區(qū)域?yàn)橹羔槺旧硭鎯?chǔ)的區(qū)域注意:注意:(1)要區(qū)分指針變量)要區(qū)分指針變量指向的空間指向的空間區(qū)域區(qū)域和指針變量和指針變量本身所存儲(chǔ)的區(qū)域本身所存儲(chǔ)的區(qū)域;(;(2)定義時(shí),定義時(shí),前者不能缺省前者不能缺省,而后者可以缺??;,而后者可以缺??;(3)指針變量的長(zhǎng)度指針變量的長(zhǎng)度:指向不同的區(qū)域,:指向不同的區(qū)域,占用的字節(jié)數(shù)不同。占用的字節(jié)數(shù)不同。說明:說明:指針

52、變量本身所存儲(chǔ)的區(qū)域,在指針變量本身所存儲(chǔ)的區(qū)域,在定義指針時(shí)一般都省略了定義指針時(shí)一般都省略了,指針變量本身保,指針變量本身保存在缺省存儲(chǔ)的區(qū)域中。存在缺省存儲(chǔ)的區(qū)域中。定義時(shí),缺省指針存儲(chǔ)的區(qū)域,顯得簡(jiǎn)定義時(shí),缺省指針存儲(chǔ)的區(qū)域,顯得簡(jiǎn)單,并且對(duì)初學(xué)者更容易理解。單,并且對(duì)初學(xué)者更容易理解。 1.6.3 指針變換指針變換一、通用指針格式一、通用指針格式 由前面的討論知,通用指針由由前面的討論知,通用指針由3個(gè)字節(jié)個(gè)字節(jié)組成,組成,第一個(gè)字節(jié)為數(shù)據(jù)的存儲(chǔ)區(qū)域,后第一個(gè)字節(jié)為數(shù)據(jù)的存儲(chǔ)區(qū)域,后兩個(gè)字節(jié)為指針地址兩個(gè)字節(jié)為指針地址,第一個(gè)字節(jié)的存儲(chǔ)第一個(gè)字節(jié)的存儲(chǔ)區(qū)域編碼如表區(qū)域編碼如表4-6所

53、示所示。 表表1-6 通用指針存儲(chǔ)區(qū)域編碼通用指針存儲(chǔ)區(qū)域編碼存儲(chǔ)區(qū)存儲(chǔ)區(qū)idataxdata pdatadatacode編編 碼碼12345一、指針轉(zhuǎn)換一、指針轉(zhuǎn)換指針轉(zhuǎn)換有兩種途徑,一種是顯式的編指針轉(zhuǎn)換有兩種途徑,一種是顯式的編程轉(zhuǎn)換,另一種是隱式的自動(dòng)轉(zhuǎn)換程轉(zhuǎn)換,另一種是隱式的自動(dòng)轉(zhuǎn)換。指針的編程轉(zhuǎn)換:指針的編程轉(zhuǎn)換:(1)通用指針的第)通用指針的第一字節(jié),與專用指針的指向數(shù)據(jù)區(qū)屬性,一字節(jié),與專用指針的指向數(shù)據(jù)區(qū)屬性,二者相互轉(zhuǎn)換;(二者相互轉(zhuǎn)換;(2)通用指針后兩個(gè)字節(jié))通用指針后兩個(gè)字節(jié)的地址,與專用指針值的轉(zhuǎn)換。的地址,與專用指針值的轉(zhuǎn)換。指針的隱式自動(dòng)轉(zhuǎn)換:指針的隱式自動(dòng)轉(zhuǎn)換

54、:由編譯器在進(jìn)行由編譯器在進(jìn)行編譯時(shí)自動(dòng)完成。編譯時(shí)自動(dòng)完成。 1.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ú)立地指向所需要訪問的存儲(chǔ)空間位置。需要訪問的存儲(chǔ)空間位置。本節(jié)通過例子來學(xué)習(xí)和認(rèn)識(shí)本節(jié)通過例子來學(xué)習(xí)和認(rèn)識(shí)C51指針的指針的這種獨(dú)立應(yīng)用性。這種獨(dú)立應(yīng)用性。下面介紹兩種利用指針訪問存儲(chǔ)區(qū)的方下面介紹兩種利用指針訪問存儲(chǔ)區(qū)的方法。也可以訪問函數(shù)。法。也可以訪問函數(shù)。二、通過指針定義的宏訪問存儲(chǔ)器二、通過指針

55、定義的宏訪問存儲(chǔ)器1、訪問存儲(chǔ)器宏的定義、訪問存儲(chǔ)器宏的定義用指針定義的、訪問存儲(chǔ)器宏的格式:用指針定義的、訪問存儲(chǔ)器宏的格式: #define 宏名宏名 (數(shù)據(jù)類型數(shù)據(jù)類型 volatile 存儲(chǔ)區(qū)存儲(chǔ)區(qū)*)0)格式中的格式中的數(shù)據(jù)類型數(shù)據(jù)類型主要為無符號(hào)的字符主要為無符號(hào)的字符型數(shù)、整型;格式中的型數(shù)、整型;格式中的存儲(chǔ)區(qū)域存儲(chǔ)區(qū)域主要使用主要使用data、idata、pdata、xdata和和code類型,不類型,不使用使用bdata存儲(chǔ)區(qū)類型。存儲(chǔ)區(qū)類型。 格式中的關(guān)鍵字格式中的關(guān)鍵字“volatile”: “volatile”是單片機(jī)中定義的,其含義是單片機(jī)中定義的,其含義為:為:這

56、種變量在程序執(zhí)行中可被隱含地改這種變量在程序執(zhí)行中可被隱含地改變而編譯器無法檢測(cè)到,告知編譯器不要變而編譯器無法檢測(cè)到,告知編譯器不要做優(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è)置的。特別說明:特別說明:“volatile”的含義與教材上的含義與教材上表述不太一致,此處表述直觀更容易理解。表述不太一致,此處表述直觀更容

57、易理解。2、庫函數(shù)中訪問存儲(chǔ)器宏的原型、庫函數(shù)中訪問存儲(chǔ)器宏的原型C51編譯器提供了兩組用指針定義的絕對(duì)存編譯器提供了兩組用指針定義的絕對(duì)存儲(chǔ)器訪問的宏,其原型如下。儲(chǔ)器訪問的宏,其原型如下。 1)按字節(jié)訪問存儲(chǔ)器的宏:)按字節(jié)訪問存儲(chǔ)器的宏:#define CBYTE (unsigned char volatile code*)0)#define DBYTE (unsigned char volatile data*)0)#define PBYTE(unsigned char volatile pdata*)0)#define XBYTE (unsigned char volatile xd

58、ata*)0) 2)按整型雙字節(jié)訪問存儲(chǔ)器的宏:)按整型雙字節(jié)訪問存儲(chǔ)器的宏:#define CWORD (unsigned int volatile code*)0) #define DWORD (unsigned int volatile data*)0)#define PWORD (unsigned int volatile pdata*)0)#define XWORD (unsigned int volatile xdata*)0)無無idata型型,不能訪問片內(nèi),不能訪問片內(nèi)RAM高高128字節(jié)字節(jié)區(qū)域(區(qū)域(0 x800 xff),需要時(shí)可以自己定義。),需要時(shí)可以自己定義。這些宏

59、定義原型放在這些宏定義原型放在absacc.h文件中文件中,使,使用時(shí)需要用預(yù)處理命令把該頭文件包含到文用時(shí)需要用預(yù)處理命令把該頭文件包含到文件中,形式為:件中,形式為:#include 。 3、絕對(duì)訪問存儲(chǔ)器宏的應(yīng)用、絕對(duì)訪問存儲(chǔ)器宏的應(yīng)用使用宏定義訪問存儲(chǔ)器的形式類似于數(shù)組使用宏定義訪問存儲(chǔ)器的形式類似于數(shù)組。1)按字節(jié)訪問存儲(chǔ)器宏的形式)按字節(jié)訪問存儲(chǔ)器宏的形式宏名宏名地址地址即數(shù)組中的下標(biāo)就是存儲(chǔ)器的地址即數(shù)組中的下標(biāo)就是存儲(chǔ)器的地址,因此,因此使用起來非常方便。例如:使用起來非常方便。例如:DBYTE0 x30=48;/給片內(nèi)給片內(nèi)RAM送數(shù)據(jù)送數(shù)據(jù)XBYTE0 x0002=0 x3

60、6; /給片外給片外RAM送數(shù)據(jù)送數(shù)據(jù)dis_buf0=CBYTETABLE+5; /從從CODE區(qū)讀取數(shù)據(jù)區(qū)讀取數(shù)據(jù)2)按整型數(shù)訪問存儲(chǔ)器宏的形式)按整型數(shù)訪問存儲(chǔ)器宏的形式宏名宏名下標(biāo)下標(biāo)由于整型數(shù)占兩個(gè)字節(jié),所以由于整型數(shù)占兩個(gè)字節(jié),所以下標(biāo)與地址下標(biāo)與地址的關(guān)系為:地址的關(guān)系為:地址=下標(biāo)下標(biāo)2。由于數(shù)組中的下標(biāo)與存儲(chǔ)器的地址是倍數(shù)由于數(shù)組中的下標(biāo)與存儲(chǔ)器的地址是倍數(shù)關(guān)系,使用時(shí)要注意。例如:關(guān)系,使用時(shí)要注意。例如:DWORD0 x20=0 x1234; /給給0 x40、0 x41送數(shù)送數(shù)XWORD0 x0002=0 x5678;/給給4、5單元送數(shù)單元送數(shù)通過指針定義的宏訪問存儲(chǔ)

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論