第3章 C51語言編程基礎(chǔ)_第1頁
第3章 C51語言編程基礎(chǔ)_第2頁
第3章 C51語言編程基礎(chǔ)_第3頁
第3章 C51語言編程基礎(chǔ)_第4頁
第3章 C51語言編程基礎(chǔ)_第5頁
已閱讀5頁,還剩148頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 第3章 C51語言編程基礎(chǔ)與語言編程基礎(chǔ)與 Keil Vision3開發(fā)平臺開發(fā)平臺 1單片機應(yīng)用系統(tǒng)日趨復(fù)雜,對單片機應(yīng)用系統(tǒng)日趨復(fù)雜,對程序的可讀性、升級與維護以及模塊化要求越程序的可讀性、升級與維護以及模塊化要求越來越高來越高,對軟件編程要求也越來越高,要求編程人員在短時間內(nèi)編寫出執(zhí),對軟件編程要求也越來越高,要求編程人員在短時間內(nèi)編寫出執(zhí)行效率高、運行可靠的程序代碼。同時,也要方便多個編程人員來進行協(xié)行效率高、運行可靠的程序代碼。同時,也要方便多個編程人員來進行協(xié)同開發(fā)。同開發(fā)。C51C51語言是近年來在語言是近年來在80518051單片機開發(fā)中,普遍使用的程序設(shè)計語言,能單片機開發(fā)

2、中,普遍使用的程序設(shè)計語言,能直接對直接對80518051單片機硬件進行操作,既有高級語言特點,又有匯編語言特點單片機硬件進行操作,既有高級語言特點,又有匯編語言特點,因此,因此在在80518051單片機程序設(shè)計中,得到廣泛使用。單片機程序設(shè)計中,得到廣泛使用。本章介紹本章介紹80518051單片機的單片機的C51C51語言,以及如何使用語言,以及如何使用C51C51語言集成化開發(fā)平臺語言集成化開發(fā)平臺Keil Keil Vision3Vision3,進行,進行C51C51程序設(shè)計與開發(fā)。程序設(shè)計與開發(fā)。23.1 C513.1 C51編程語言簡介編程語言簡介用于用于80518051單片機編程的

3、單片機編程的C C語言,在標(biāo)準(zhǔn)語言,在標(biāo)準(zhǔn)C C基礎(chǔ)上針對基礎(chǔ)上針對80518051硬件特點進行擴硬件特點進行擴展,并向展,并向80518051上移植,經(jīng)多年努力,上移植,經(jīng)多年努力,C51C51已成為公認(rèn)的高效、簡潔的已成為公認(rèn)的高效、簡潔的80518051單片機的實用高級編程語言。與單片機的實用高級編程語言。與80518051匯編語言相比,匯編語言相比,C51C51語言在語言在功能上、結(jié)構(gòu)性、可讀性、可維護性上有明顯優(yōu)勢,易學(xué)易用。功能上、結(jié)構(gòu)性、可讀性、可維護性上有明顯優(yōu)勢,易學(xué)易用。3.1.1 C513.1.1 C51語言與語言與80518051匯編語言比較匯編語言比較與與805180

4、51匯編語言相比,匯編語言相比, C51C51有如下優(yōu)點。有如下優(yōu)點。(1 1)可讀性好)可讀性好。C51C51語言程序比匯編語言程序的可讀性好,編程效率高語言程序比匯編語言程序的可讀性好,編程效率高,程序,程序便于修改、維護以及升級便于修改、維護以及升級。(2 2)模塊化開發(fā)與資源共享模塊化開發(fā)與資源共享。用。用C51C51開發(fā)的程序模塊可不經(jīng)修改,直接開發(fā)的程序模塊可不經(jīng)修改,直接被其他工程所用,使得開發(fā)者能夠很好地被其他工程所用,使得開發(fā)者能夠很好地利用已有的大量標(biāo)準(zhǔn)利用已有的大量標(biāo)準(zhǔn)C C程序資源程序資源與豐富的庫函數(shù),減少重復(fù)勞動,與豐富的庫函數(shù),減少重復(fù)勞動,同時也有利于多個工程師

5、進行協(xié)同開同時也有利于多個工程師進行協(xié)同開發(fā)。發(fā)。(3 3)可移植性好??梢浦残院?。為某種型號單片機開發(fā)的為某種型號單片機開發(fā)的C C語言程序,只需把與硬件語言程序,只需把與硬件相關(guān)的相關(guān)的頭文件頭文件和和編譯鏈接的參數(shù)編譯鏈接的參數(shù)進行適當(dāng)修改,就可方便地移植到其他進行適當(dāng)修改,就可方便地移植到其他型號的單片機上。型號的單片機上。例如例如,為,為80518051單片機編寫的程序通過改寫頭文件以及單片機編寫的程序通過改寫頭文件以及少量的程序行,就可方便地移植到少量的程序行,就可方便地移植到PICPIC單片機上。單片機上。(4 4)生成的代碼效率高。生成的代碼效率高。當(dāng)前較好的當(dāng)前較好的C51C

6、51語言編譯系統(tǒng)編譯出來的代碼語言編譯系統(tǒng)編譯出來的代碼效率只比直接使用匯編語言效率只比直接使用匯編語言低低20%20%左右,如果使用左右,如果使用優(yōu)化編譯選項優(yōu)化編譯選項,最高可,最高可達到達到90%90%左右。左右。43.1.2 C513.1.2 C51語言與標(biāo)準(zhǔn)語言與標(biāo)準(zhǔn)C C語言的比較語言的比較C51C51語言與標(biāo)準(zhǔn)語言與標(biāo)準(zhǔn)C C語言間有許多相同地方,但也有自身特點。不同的嵌入式語言間有許多相同地方,但也有自身特點。不同的嵌入式C C語言編譯系統(tǒng)之所以與標(biāo)準(zhǔn)語言編譯系統(tǒng)之所以與標(biāo)準(zhǔn)C C語言有不同的地方,主要是由于它們所語言有不同的地方,主要是由于它們所針對的硬件系統(tǒng)不同。對于針對的

7、硬件系統(tǒng)不同。對于80518051單片機,目前廣泛使用的是單片機,目前廣泛使用的是C51C51語言。語言。C51C51語言基本語法與標(biāo)準(zhǔn)語言基本語法與標(biāo)準(zhǔn)C C相同,是相同,是在標(biāo)準(zhǔn)在標(biāo)準(zhǔn)C C的基礎(chǔ)上的基礎(chǔ)上進行適合進行適合80518051內(nèi)核單內(nèi)核單片機硬件的擴展片機硬件的擴展。深入理解。深入理解C51C51語言語言對標(biāo)準(zhǔn)對標(biāo)準(zhǔn)C C語言的語言的擴展部分?jǐn)U展部分以及它們以及它們的不同之處,是掌握的不同之處,是掌握C51C51語言的關(guān)鍵之一。語言的關(guān)鍵之一。5C51C51語言與標(biāo)準(zhǔn)語言與標(biāo)準(zhǔn)C C語言語言一些差別一些差別如下。如下。 (1 1)庫函數(shù)不同。)庫函數(shù)不同。標(biāo)準(zhǔn)標(biāo)準(zhǔn)C C中不適合

8、于嵌入式控制器系統(tǒng)的庫函數(shù),被排中不適合于嵌入式控制器系統(tǒng)的庫函數(shù),被排除在除在C51C51語言之外,如字符屏幕和圖形函數(shù)。有些庫函數(shù)必須針對語言之外,如字符屏幕和圖形函數(shù)。有些庫函數(shù)必須針對80518051的硬的硬件特點來做出相應(yīng)的開發(fā)。件特點來做出相應(yīng)的開發(fā)。 例如,例如,在標(biāo)準(zhǔn)在標(biāo)準(zhǔn)C C中,庫函數(shù)中,庫函數(shù)printfprintf和和scanfscanf,常用于屏幕打印和接收字符,常用于屏幕打印和接收字符,而在,而在C51C51語言中,主要用于語言中,主要用于串行口數(shù)據(jù)的收發(fā)串行口數(shù)據(jù)的收發(fā)。 (2 2)數(shù)據(jù)類型有一定區(qū)別)數(shù)據(jù)類型有一定區(qū)別。在。在C51C51中增加幾種中增加幾種80

9、518051單片機的數(shù)據(jù)類型,單片機的數(shù)據(jù)類型,在標(biāo)準(zhǔn)在標(biāo)準(zhǔn)C C的基礎(chǔ)上又?jǐn)U展了的基礎(chǔ)上又?jǐn)U展了4 4種類型。例如,種類型。例如,80518051單片機包含位操作空間和單片機包含位操作空間和豐富的位操作指令,因此,豐富的位操作指令,因此,C51C51語言與標(biāo)準(zhǔn)語言與標(biāo)準(zhǔn)C C語言相比語言相比增加了增加了位類型位類型。6 (3 3)C51C51語言變量存儲模式與標(biāo)準(zhǔn)語言變量存儲模式與標(biāo)準(zhǔn)C C語言中變量存儲模式數(shù)據(jù)不一樣語言中變量存儲模式數(shù)據(jù)不一樣。標(biāo)。標(biāo)準(zhǔn)準(zhǔn)C C最初是為通用計算機設(shè)計的,在通用計算機中只有一個程序和數(shù)據(jù)統(tǒng)一最初是為通用計算機設(shè)計的,在通用計算機中只有一個程序和數(shù)據(jù)統(tǒng)一尋址的

10、內(nèi)存空間,而尋址的內(nèi)存空間,而C51C51語言中語言中變量的存儲模式變量的存儲模式與與80518051單片機的單片機的各種存儲器各種存儲器區(qū)緊密相關(guān)區(qū)緊密相關(guān)。 (4 4)數(shù)據(jù)存儲類型不同)數(shù)據(jù)存儲類型不同。80518051存儲區(qū)可分為存儲區(qū)可分為內(nèi)部數(shù)據(jù)存儲區(qū)、外部數(shù)據(jù)內(nèi)部數(shù)據(jù)存儲區(qū)、外部數(shù)據(jù)存儲區(qū)以及程序存儲區(qū)存儲區(qū)以及程序存儲區(qū)。 內(nèi)部數(shù)據(jù)存儲區(qū)內(nèi)部數(shù)據(jù)存儲區(qū)可分為可分為3 3個不同的個不同的C51C51存儲類型:存儲類型:datadata、idataidata和和bdatabdata。 外部數(shù)據(jù)存儲區(qū)分外部數(shù)據(jù)存儲區(qū)分為為2 2個不同的個不同的C51C51存儲類型:存儲類型:xdata

11、xdata和和p pdatadata。 程序存儲區(qū)程序存儲區(qū)只能讀不能寫,可能在只能讀不能寫,可能在80518051內(nèi)部或者在外部,內(nèi)部或者在外部,C51C51語言提供語言提供的的codecode存儲類型用來訪問程序存儲區(qū)。存儲類型用來訪問程序存儲區(qū)。7 (5 5)標(biāo)準(zhǔn))標(biāo)準(zhǔn)C C語言沒有處理單片機中斷的定義語言沒有處理單片機中斷的定義,而,而C51C51語言中有專門的中語言中有專門的中斷函數(shù)。斷函數(shù)。(6 6)頭文件不同)頭文件不同。C51C51語言頭文件必須把語言頭文件必須把80518051單片機內(nèi)部的外設(shè)硬件資單片機內(nèi)部的外設(shè)硬件資源(如定時器、中斷、源(如定時器、中斷、I/OI/O等)

12、相應(yīng)的等)相應(yīng)的特殊功能寄存器特殊功能寄存器寫入寫入到頭文件到頭文件內(nèi)內(nèi),而標(biāo)準(zhǔn),而標(biāo)準(zhǔn)C C不用。不用。 (7 7)程序結(jié)構(gòu)的差異)程序結(jié)構(gòu)的差異。由于。由于80518051單片機的硬件資源有限,它的編譯系單片機的硬件資源有限,它的編譯系統(tǒng)統(tǒng)不允許太多的程序嵌套不允許太多的程序嵌套。其次,標(biāo)準(zhǔn)。其次,標(biāo)準(zhǔn)C C語言所具備的語言所具備的遞歸特性遞歸特性不被不被C51C51語言支持。語言支持。8但從數(shù)據(jù)運算操作、程序控制語句以及函數(shù)的使用上來說,但從數(shù)據(jù)運算操作、程序控制語句以及函數(shù)的使用上來說,C51C51與標(biāo)準(zhǔn)與標(biāo)準(zhǔn)C C幾幾乎沒有什么明顯差別。如果程序設(shè)計者具備了有關(guān)標(biāo)準(zhǔn)乎沒有什么明顯差別

13、。如果程序設(shè)計者具備了有關(guān)標(biāo)準(zhǔn)C C語言的編程基礎(chǔ)語言的編程基礎(chǔ),只要注意,只要注意C51C51與標(biāo)準(zhǔn)與標(biāo)準(zhǔn)C C不同之處,并熟悉不同之處,并熟悉80518051單片機的硬件結(jié)構(gòu),就能單片機的硬件結(jié)構(gòu),就能較快掌握較快掌握C51C51編程。編程。3.2 C513.2 C51語言程序設(shè)計基礎(chǔ)語言程序設(shè)計基礎(chǔ)本節(jié)在標(biāo)準(zhǔn)本節(jié)在標(biāo)準(zhǔn)C C基礎(chǔ)上,了解掌握基礎(chǔ)上,了解掌握C51C51的數(shù)據(jù)類型和存儲類型、的數(shù)據(jù)類型和存儲類型、C51C51的基本運算的基本運算與流程控制語句、與流程控制語句、C51C51語言構(gòu)造數(shù)據(jù)類型、語言構(gòu)造數(shù)據(jù)類型、C51C51函數(shù)以及函數(shù)以及C51C51程序設(shè)計的其程序設(shè)計的其他一

14、些問題,為他一些問題,為C51C51的程序開發(fā)打下基礎(chǔ)的程序開發(fā)打下基礎(chǔ)。 93.2.1 C513.2.1 C51語言中的數(shù)據(jù)類型與存儲類型語言中的數(shù)據(jù)類型與存儲類型1 1數(shù)據(jù)類型數(shù)據(jù)類型 數(shù)據(jù)是單片機操作的對象,具有一定格式的數(shù)字或數(shù)值,數(shù)據(jù)的不同格數(shù)據(jù)是單片機操作的對象,具有一定格式的數(shù)字或數(shù)值,數(shù)據(jù)的不同格式就稱為式就稱為數(shù)據(jù)類型數(shù)據(jù)類型。 Keil C51 Keil C51支持的基本數(shù)據(jù)類型見支持的基本數(shù)據(jù)類型見表表3-13-1。 針對針對80518051的硬件特點,的硬件特點,C51C51在標(biāo)準(zhǔn)在標(biāo)準(zhǔn)C C基礎(chǔ)上,基礎(chǔ)上,擴展了擴展了4 4種數(shù)據(jù)類型種數(shù)據(jù)類型(見表(見表3-13-1

15、中最后中最后4 4行)。行)。 注意,擴展的注意,擴展的4 4種數(shù)據(jù)類型,不能使用指針來對它們存取。種數(shù)據(jù)類型,不能使用指針來對它們存取。102 2C51C51的擴展數(shù)據(jù)類型的擴展數(shù)據(jù)類型 下面對擴展的下面對擴展的4 4種數(shù)據(jù)類型說明。種數(shù)據(jù)類型說明。 (1 1)位變量位變量bitbit的值的值可以是可以是1 1(truetrue),也可是),也可是0 0(falsefalse)。)。 (2 2)特殊功能寄存器特殊功能寄存器sfrsfr。80518051單片機的特殊功能寄存器分布在片內(nèi)數(shù)單片機的特殊功能寄存器分布在片內(nèi)數(shù)據(jù)存儲區(qū)的地址單元據(jù)存儲區(qū)的地址單元80H80HFFHFFH之間之間,“s

16、frsfr”數(shù)據(jù)類型數(shù)據(jù)類型占用一個內(nèi)存單元。占用一個內(nèi)存單元。利用它可訪問利用它可訪問80518051單片機內(nèi)部的所有特殊功能寄存器。單片機內(nèi)部的所有特殊功能寄存器。 例如:例如:sfr P1=0 x90sfr P1=0 x90這一語句定義了這一語句定義了P1P1端口在片內(nèi)的寄存器,在程序后端口在片內(nèi)的寄存器,在程序后續(xù)的語句中可以續(xù)的語句中可以用用“P1=0 xffP1=0 xff”,使,使P1P1的所有引腳輸出為高電平的語句來操的所有引腳輸出為高電平的語句來操作特殊功能寄存器。作特殊功能寄存器。12(3 3)特殊功能寄存器)特殊功能寄存器sfr16sfr16。 “sfr16sfr16”數(shù)

17、據(jù)類型數(shù)據(jù)類型占用兩個內(nèi)存單元占用兩個內(nèi)存單元,用于操作占兩個字節(jié)的特殊功能寄,用于操作占兩個字節(jié)的特殊功能寄存器。存器。例如例如:“sfr16 DPTR=0 x82sfr16 DPTR=0 x82”語句定義了片內(nèi)語句定義了片內(nèi)1616位數(shù)據(jù)指針寄存器位數(shù)據(jù)指針寄存器DPTRDPTR,其低,其低8 8位字節(jié)地址為位字節(jié)地址為82H82H,高,高8 8位字節(jié)地址為位字節(jié)地址為83H83H。在程序的后續(xù)語句。在程序的后續(xù)語句中就可對中就可對DPTRDPTR進行操作。進行操作。(4 4)特殊功能位)特殊功能位sbitsbit。 sbitsbit是指是指AT89S51AT89S51片內(nèi)特殊功能寄存器的

18、可尋址位。例如:片內(nèi)特殊功能寄存器的可尋址位。例如: sfrsfrPSW=0 xd0PSW=0 xd0;/定義定義PSWPSW寄存器地址為寄存器地址為0 xd00 xd0sbitsbitOV=PSW2OV=PSW2;/定義定義OVOV位為位為PSW.2PSW.2 符號符號“ ”前是特殊功能寄存器名字,前是特殊功能寄存器名字,“ ”后的數(shù)字定義特殊功能寄存器后的數(shù)字定義特殊功能寄存器可尋址位在寄存器中的位置,取值必須是可尋址位在寄存器中的位置,取值必須是0 07 7。 注意,注意,不要把不要把bitbit與與sbitsbit相混淆相混淆。bitbit定義定義普通的位變量普通的位變量,只能是二進制

19、,只能是二進制的的0 0或或1 1。sbitsbit是定義特殊功能寄存器的是定義特殊功能寄存器的可尋址位可尋址位,值是可以進行位尋址的,值是可以進行位尋址的特殊功能寄存器的某位的絕對地址,特殊功能寄存器的某位的絕對地址,例如,例如,PSWPSW寄存器寄存器OVOV位的絕對地址位的絕對地址0 xd20 xd2。上面的例子還涉及到上面的例子還涉及到C51注釋的寫法問題注釋的寫法問題,C51的注釋寫法有兩種:的注釋寫法有兩種:(1)/,兩個斜杠后面跟著的為注釋語句,本寫法只能注釋一行,當(dāng),兩個斜杠后面跟著的為注釋語句,本寫法只能注釋一行,當(dāng)換行時,必須在新行上重新寫兩個斜杠。換行時,必須在新行上重新

20、寫兩個斜杠。(2)/*/,一個斜杠與星號結(jié)合使用,本寫法可注釋任一行,即斜杠星,一個斜杠與星號結(jié)合使用,本寫法可注釋任一行,即斜杠星號與星號斜杠之間的所有文字都作為注釋,即注釋有多行時,只需在注釋號與星號斜杠之間的所有文字都作為注釋,即注釋有多行時,只需在注釋的開始處,加斜杠星號,在注釋的結(jié)尾處,加上星號斜杠即可。的開始處,加斜杠星號,在注釋的結(jié)尾處,加上星號斜杠即可。 加注釋的目的是為了便于讀懂程序,所有注釋都不參與程序編譯,編譯加注釋的目的是為了便于讀懂程序,所有注釋都不參與程序編譯,編譯器在編譯過程中會自動刪去注釋。器在編譯過程中會自動刪去注釋。143 3數(shù)據(jù)存儲類型數(shù)據(jù)存儲類型 在討論

21、在討論C51C51數(shù)據(jù)類型時,須同時提及它的存儲類型,以及它與數(shù)據(jù)類型時,須同時提及它的存儲類型,以及它與80518051單單片機存儲器結(jié)構(gòu)的關(guān)系,因為片機存儲器結(jié)構(gòu)的關(guān)系,因為C51C51定義的任何數(shù)據(jù)類型定義的任何數(shù)據(jù)類型必須以一定的必須以一定的方式,定位在方式,定位在80518051單片機的某一存儲區(qū)中,單片機的某一存儲區(qū)中,否則沒有任何實際意義。否則沒有任何實際意義。 8051 8051有片內(nèi)、片外數(shù)據(jù)存儲區(qū),還有程序存儲區(qū)。有片內(nèi)、片外數(shù)據(jù)存儲區(qū),還有程序存儲區(qū)。 片內(nèi)的數(shù)據(jù)存儲區(qū)是可讀寫的,片內(nèi)的數(shù)據(jù)存儲區(qū)是可讀寫的,80518051的衍生系列最多可有的衍生系列最多可有256256

22、字節(jié)的內(nèi)字節(jié)的內(nèi)部數(shù)據(jù)存儲區(qū)(例如部數(shù)據(jù)存儲區(qū)(例如AT89S52AT89S52單片機),其中低單片機),其中低128128字節(jié)可直接尋址,高字節(jié)可直接尋址,高128128字節(jié)(字節(jié)(80H80HFFHFFH)只能間接尋址,從地址)只能間接尋址,從地址20H20H開始的開始的1616字節(jié)可位尋址。字節(jié)可位尋址。內(nèi)部內(nèi)部數(shù)據(jù)存儲區(qū)可分為數(shù)據(jù)存儲區(qū)可分為3 3個不同的數(shù)據(jù)存儲類型:個不同的數(shù)據(jù)存儲類型:datadata、idataidata和和bdatabdata。 訪問訪問片外數(shù)據(jù)存儲區(qū)片外數(shù)據(jù)存儲區(qū)比訪問比訪問片內(nèi)數(shù)據(jù)存儲區(qū)片內(nèi)數(shù)據(jù)存儲區(qū)慢慢,因為訪問片外數(shù)據(jù)存儲,因為訪問片外數(shù)據(jù)存儲區(qū)要通過

23、對數(shù)據(jù)指針加載地址來間接尋址訪問。區(qū)要通過對數(shù)據(jù)指針加載地址來間接尋址訪問。 C51C51提供兩種不同的數(shù)據(jù)存儲類型提供兩種不同的數(shù)據(jù)存儲類型xdataxdata和和pdatapdata來訪問片外數(shù)據(jù)存儲區(qū)來訪問片外數(shù)據(jù)存儲區(qū)。16程序存儲區(qū)程序存儲區(qū)只能讀不能寫,可能在只能讀不能寫,可能在80518051單片機內(nèi)部或者外部,或外部和單片機內(nèi)部或者外部,或外部和內(nèi)部都有,由內(nèi)部都有,由80518051單片機硬件決定,單片機硬件決定,C51C51提供了提供了codecode存儲類型來訪問程存儲類型來訪問程序存儲區(qū)。序存儲區(qū)。C51C51存儲類型與存儲類型與80518051實際的存儲空間的對應(yīng)關(guān)系

24、見實際的存儲空間的對應(yīng)關(guān)系見表表3-23-2。下面對表下面對表3-23-2各種存儲區(qū)作以說明。各種存儲區(qū)作以說明。(1 1)DATADATA區(qū)。區(qū)。尋址是最快的,應(yīng)把常使用的變量放在該區(qū),但該區(qū)存儲尋址是最快的,應(yīng)把常使用的變量放在該區(qū),但該區(qū)存儲空間有限,空間有限,DATADATA區(qū)除了包含程序變量外,還包含了堆棧和寄存器組。區(qū)除了包含程序變量外,還包含了堆棧和寄存器組。DATADATA區(qū)聲明中的存儲類型標(biāo)識符為區(qū)聲明中的存儲類型標(biāo)識符為datadata,通常指片內(nèi),通常指片內(nèi)RAM128RAM128字節(jié)的內(nèi)字節(jié)的內(nèi)部數(shù)據(jù)存儲的變量,可直接尋址。部數(shù)據(jù)存儲的變量,可直接尋址。1718聲明舉例

25、:聲明舉例:unsigned charunsigned char data data system_status=0;system_status=0;unsigned int unsigned int datadata unit_id8; unit_id8;char char datadata inp_string20 inp_string20; 標(biāo)準(zhǔn)變量和用戶自聲明變量都可存儲在標(biāo)準(zhǔn)變量和用戶自聲明變量都可存儲在DATADATA區(qū)中,只要不超過區(qū)中,只要不超過DATADATA區(qū)的區(qū)的范圍即可,由于范圍即可,由于C51C51用默認(rèn)的寄存器組來傳遞參數(shù),這樣用默認(rèn)的寄存器組來傳遞參數(shù),這樣DAT

26、ADATA區(qū)至少失去區(qū)至少失去8 8字節(jié)空間。字節(jié)空間。 另外,另外,當(dāng)內(nèi)部堆棧溢出當(dāng)內(nèi)部堆棧溢出的時候,程序會莫名其妙地復(fù)位。這是因為的時候,程序會莫名其妙地復(fù)位。這是因為80518051沒有報錯機制,堆棧溢出只能以這種方式表示,因此要留有較大的堆??諞]有報錯機制,堆棧溢出只能以這種方式表示,因此要留有較大的堆??臻g來防止堆棧溢出。間來防止堆棧溢出。 (2 2)BDATABDATA區(qū)。區(qū)。DATADATA中的位尋址區(qū),在該區(qū)中聲明變量就可進行位尋址中的位尋址區(qū),在該區(qū)中聲明變量就可進行位尋址。BDATABDATA區(qū)聲明中的存儲類型標(biāo)識符為區(qū)聲明中的存儲類型標(biāo)識符為bdatabdata,指的是

27、片內(nèi),指的是片內(nèi)RAMRAM可位尋址的可位尋址的161619字節(jié)存儲區(qū)(字節(jié)地址為字節(jié)存儲區(qū)(字節(jié)地址為20H20H2FH2FH)中的)中的128128個位個位。下面是在。下面是在BDATABDATA區(qū)中聲區(qū)中聲明的位變量和使用位變量的例子:明的位變量和使用位變量的例子:unsigned char unsigned char bdatabdata status_byte; status_byte;unsigned int unsigned int bdatabdata status_word; status_word;sbitsbit stat_flag=status_byte4; stat_

28、flag=status_byte4;if(status_word15)if(status_word15) stat_flag=1;stat_flag=1; C51 C51編譯器不允許在編譯器不允許在BDATABDATA區(qū)中聲明區(qū)中聲明floatfloat和和doubledouble型變量。型變量。 (3 3)IDATAIDATA區(qū)區(qū)。該區(qū)使用寄存器作為指針來。該區(qū)使用寄存器作為指針來對片內(nèi)對片內(nèi)RAMRAM進行間接尋址進行間接尋址,常,常用來存放使用比較頻繁的變量。與外部存儲器尋址相比,它的指令執(zhí)行周用來存放使用比較頻繁的變量。與外部存儲器尋址相比,它的指令執(zhí)行周期和代碼長度相對較短。期和代碼

29、長度相對較短。 IDATAIDATA區(qū)區(qū)聲明中的聲明中的存儲類型標(biāo)識符存儲類型標(biāo)識符為為idataidata,指的是片內(nèi),指的是片內(nèi)RAMRAM的的256256字節(jié)的字節(jié)的存儲區(qū),只能間接尋址,速度比直接尋址慢。存儲區(qū),只能間接尋址,速度比直接尋址慢。20聲明舉例如下:聲明舉例如下:unsigned char unsigned char idataidata system_status=0; system_status=0;unsigned int unsigned int idataidata unit_id8; unit_id8;char char idataidata inp_strin

30、g16 inp_string16;float float idataidata out_value; out_value;(4 4)PDATAPDATA區(qū)區(qū)和和XDATAXDATA區(qū)區(qū) 位于片外存儲區(qū),位于片外存儲區(qū),PDATAPDATA區(qū)區(qū)和和XDATAXDATA區(qū)區(qū)聲明中的聲明中的存儲類型標(biāo)識符存儲類型標(biāo)識符分別為分別為pdatapdata和和xdataxdata。 PDATAPDATA區(qū)區(qū)只有只有256256字節(jié),僅指定字節(jié),僅指定256256字節(jié)的外部數(shù)據(jù)存儲區(qū)字節(jié)的外部數(shù)據(jù)存儲區(qū)。 但但XDATAXDATA區(qū)區(qū)最多可達最多可達64KB64KB,對應(yīng)的,對應(yīng)的xdataxdata存儲類

31、型標(biāo)識符可指定存儲類型標(biāo)識符可指定外部數(shù)外部數(shù)據(jù)區(qū)據(jù)區(qū)64KB64KB內(nèi)內(nèi)的任何地址。的任何地址。21 對對PDATAPDATA區(qū)區(qū)的尋址要比對的尋址要比對XDATAXDATA區(qū)區(qū)尋址快尋址快,因為對,因為對PDATAPDATA區(qū)尋址,只需裝區(qū)尋址,只需裝入入8 8位地址,而對位地址,而對XDATAXDATA區(qū)尋址要裝入?yún)^(qū)尋址要裝入1616位地址,所以盡量把外部數(shù)據(jù)存儲位地址,所以盡量把外部數(shù)據(jù)存儲在在PDATAPDATA區(qū)中。區(qū)中。 對對PDATAPDATA區(qū)和區(qū)和XDATAXDATA區(qū)的聲明舉例如下:區(qū)的聲明舉例如下:unsigned char unsigned char xdataxda

32、ta system_status=0; system_status=0;unsigned int unsigned int pdatapdata unit_id8; unit_id8;char char xdataxdata inp_string16 inp_string16;float float pdatapdata out_value; out_value; 由于外部數(shù)據(jù)存儲器與外部由于外部數(shù)據(jù)存儲器與外部I/OI/O口是統(tǒng)一編址的,外部數(shù)據(jù)存儲器地址口是統(tǒng)一編址的,外部數(shù)據(jù)存儲器地址段中除了包含數(shù)據(jù)存儲器地址外,還包含外部段中除了包含數(shù)據(jù)存儲器地址外,還包含外部I/OI/O口的地址。對

33、外部數(shù)據(jù)存口的地址。對外部數(shù)據(jù)存儲器及外部儲器及外部I/OI/O口的尋址將在本章的絕對地址尋址中介紹??诘膶ぶ穼⒃诒菊碌慕^對地址尋址中介紹。22(5 5)程序存儲區(qū))程序存儲區(qū)CODECODE。程序存儲區(qū)。程序存儲區(qū)CODECODE聲明的標(biāo)識符為聲明的標(biāo)識符為codecode,儲存的數(shù)據(jù)是,儲存的數(shù)據(jù)是不可改變的。在不可改變的。在C51C51編譯器中可以用存儲區(qū)類型標(biāo)識符編譯器中可以用存儲區(qū)類型標(biāo)識符codecode來訪問程序存儲區(qū)來訪問程序存儲區(qū)。聲明舉例如下:聲明舉例如下:unsigned char unsigned char codecode a =0 x00,0 x01,0 x02,0

34、 x03,0 x04,0 x05,0 x06, a =0 x00,0 x01,0 x02,0 x03,0 x04,0 x05,0 x06, 0 x07,0 x08; 0 x07,0 x08; 上面介紹了上面介紹了C51C51的數(shù)據(jù)存儲類型,其大小和值域見的數(shù)據(jù)存儲類型,其大小和值域見表表3-33-3。 單片機訪問片內(nèi)單片機訪問片內(nèi)RAMRAM比訪問片外比訪問片外RAMRAM相對快一些,所以相對快一些,所以應(yīng)盡量把頻繁使用的應(yīng)盡量把頻繁使用的變量置于片內(nèi)變量置于片內(nèi)RAMRAM。即采用。即采用datadata、bdatabdata或或idataidata存儲類型,而將容量較大或使存儲類型,而將容

35、量較大或使用不太頻繁的那些變量置于片外用不太頻繁的那些變量置于片外RAMRAM,即采用,即采用pdatapdata或或xdataxdata存儲類型。常量只存儲類型。常量只能采用能采用codecode存儲類型。存儲類型。2324變量存儲類型定義舉例:變量存儲類型定義舉例:(1 1)char char data data a1;a1; / /* *字符變量字符變量a1a1被定義為被定義為datadata型,分配在型,分配在片內(nèi)片內(nèi)RAMRAM低低128128字節(jié)中字節(jié)中* */ /(2 2)float float idataidata x,y; x,y; / /* *浮點變量浮點變量x x和和y

36、y被定義為被定義為idataidata型,定位在型,定位在 片內(nèi)片內(nèi)RAMRAM中,只能用間接尋址方式尋址中,只能用間接尋址方式尋址* */ / (3 3)bit bit bdatabdata p; p; / /* *位變量位變量p p被定義為被定義為bdatabdata型,定位在片內(nèi)型,定位在片內(nèi) RAM RAM中的位尋址區(qū)中的位尋址區(qū)* */ / (4 4)unsigned int unsigned int pdatapdata var1; var1; / /* *無符號整型變量無符號整型變量var1var1定義為定義為pdatapdata型型 ,定位在片外,定位在片外RAMRAM中,相當(dāng)

37、于中,相當(dāng)于RiRi間接尋址間接尋址* */ / (5 5)unsigned char unsigned char xdataxdata a2 4; a2 4; / /* *無符號字符型二維數(shù)組變量無符號字符型二維數(shù)組變量 a24 a24 被定義為被定義為xdataxdata存儲類型,定位在片外存儲類型,定位在片外RAMRAM中,占據(jù)中,占據(jù) 2 24=84=8字節(jié),相當(dāng)于字節(jié),相當(dāng)于DPTRDPTR間接尋址間接尋址* */ / 4 4數(shù)據(jù)存儲模式數(shù)據(jù)存儲模式 如果在變量定義時如果在變量定義時略去存儲類型標(biāo)識符略去存儲類型標(biāo)識符,編譯器會,編譯器會自動默認(rèn)自動默認(rèn)存儲類型。存儲類型。25進一步

38、由進一步由SMALLSMALL、COMPACTCOMPACT和和LARGELARGE存儲模式指令限制。存儲模式指令限制。例如,例如,若聲明若聲明char char var1var1,則在使用,則在使用SMALLSMALL存儲模式存儲模式下,下,var1var1被定位在被定位在datadata存儲區(qū)存儲區(qū),在使用,在使用COMPACTCOMPACT模式模式下,下,var1var1被定位在被定位在idataidata存儲區(qū)存儲區(qū);在;在LARGELARGE模式模式下,下,var1var1被定被定位在位在xdataxdata存儲區(qū)存儲區(qū)中。中。下面對存儲模式作進一步說明。下面對存儲模式作進一步說明。

39、(1 1)SMALLSMALL模式模式。該模式下,。該模式下,所有變量所有變量都默認(rèn)位于都默認(rèn)位于80518051單片機單片機內(nèi)部的數(shù)據(jù)存內(nèi)部的數(shù)據(jù)存儲器儲器,與使用,與使用datadata指定存儲器類型的方式一樣。在此模式下,變量訪問的指定存儲器類型的方式一樣。在此模式下,變量訪問的效率高,但是所有數(shù)據(jù)對象和堆棧效率高,但是所有數(shù)據(jù)對象和堆棧必須使用內(nèi)部必須使用內(nèi)部RAMRAM。(2 2)COMPACTCOMPACT模式模式 本模式下本模式下所有變量所有變量都默認(rèn)在都默認(rèn)在外部數(shù)據(jù)存儲器外部數(shù)據(jù)存儲器的的1 1頁頁(256256字節(jié))內(nèi),這與字節(jié))內(nèi),這與26使用使用pdatapdata指定

40、存儲器類型是一樣的。指定存儲器類型是一樣的。該類型適用于變量不超過該類型適用于變量不超過256256字節(jié)的字節(jié)的情況情況,此限制是由尋址方式?jīng)Q定的,相當(dāng)于使用,此限制是由尋址方式?jīng)Q定的,相當(dāng)于使用數(shù)據(jù)指針數(shù)據(jù)指針RiRi尋址。與尋址。與SMALLSMALL模式相比,模式相比,該存儲模式的效率比較低該存儲模式的效率比較低,對變量訪問的速度也慢一些,對變量訪問的速度也慢一些,但比但比LARGELARGE模式快。模式快。 (3 3)LARGELARGE模式模式 本模式下本模式下所有變量所有變量都都默認(rèn)位于默認(rèn)位于外部數(shù)據(jù)存儲器外部數(shù)據(jù)存儲器,相當(dāng)于用,相當(dāng)于用DPTRDPTR尋址尋址。通過數(shù)據(jù)指針訪

41、問外部數(shù)據(jù)存儲器的效率較低,特別是當(dāng)變量為通過數(shù)據(jù)指針訪問外部數(shù)據(jù)存儲器的效率較低,特別是當(dāng)變量為2 2字節(jié)或更字節(jié)或更多字節(jié)時,該模式要比多字節(jié)時,該模式要比SMALLSMALL和和COMPACTCOMPACT產(chǎn)生更多的代碼。產(chǎn)生更多的代碼。27 在固定的存儲器地址上進行變量傳遞,是在固定的存儲器地址上進行變量傳遞,是C51C51的標(biāo)準(zhǔn)特征之一。的標(biāo)準(zhǔn)特征之一。 在在SMALLSMALL模式下,參數(shù)傳遞是在片內(nèi)數(shù)據(jù)存儲區(qū)中完成的。模式下,參數(shù)傳遞是在片內(nèi)數(shù)據(jù)存儲區(qū)中完成的。LARGELARGE和和COMPACTCOMPACT模式允許參數(shù)在外部存儲器中傳遞。模式允許參數(shù)在外部存儲器中傳遞。C5

42、1C51也支持混合模式。例如,也支持混合模式。例如,在在LARGELARGE模式下,生成的程序可將一些函數(shù)放入模式下,生成的程序可將一些函數(shù)放入SMALLSMALL模式中,從而加快執(zhí)模式中,從而加快執(zhí)行速度。行速度。3.2.2 C513.2.2 C51語言的特殊功能寄存器及位變量定義語言的特殊功能寄存器及位變量定義 介紹介紹C51C51如何對特殊功能寄存器及位變量進行定義并訪問。如何對特殊功能寄存器及位變量進行定義并訪問。1 1特殊功能寄存器的特殊功能寄存器的C51C51定義定義 C51 C51語言允許通過使用語言允許通過使用關(guān)鍵字關(guān)鍵字sfrsfr、sbitsbit或直接引用編譯器提供的頭文

43、或直接引用編譯器提供的頭文件來對特殊功能寄存器(件來對特殊功能寄存器(SFRSFR)進行訪問,)進行訪問, 特殊功能寄存器分布在片內(nèi)特殊功能寄存器分布在片內(nèi)RAMRAM高高128128字節(jié)中,只能采用直接尋址方式。字節(jié)中,只能采用直接尋址方式。(1 1)使用關(guān)鍵字定義使用關(guān)鍵字定義sfrsfr。為能直接訪問特殊功能寄存器。為能直接訪問特殊功能寄存器SFRSFR,C51C51提供了一提供了一種定義方法,即引入關(guān)鍵字種定義方法,即引入關(guān)鍵字sfrsfr,語法如下:,語法如下: sfrsfr 特殊功能寄存器名字特殊功能寄存器名字= =特殊功能寄存器地址;特殊功能寄存器地址;例如:例如: sfr IE

44、=0 xA8; sfr IE=0 xA8;/中斷允許寄存器中斷允許寄存器IEIE地址地址A8HA8H sfr TCON=0 x88; sfr TCON=0 x88;/定時器定時器/ /計數(shù)器控制寄存器地址計數(shù)器控制寄存器地址88H88H sfr SCON=0 x98; sfr SCON=0 x98;/串行口控制寄存器地址串行口控制寄存器地址98H98H在在80518051中,中,要訪問要訪問1616位位SFRSFR,要用關(guān)鍵字要用關(guān)鍵字sfr16sfr16。1616位位SFRSFR的低字節(jié)地址須作為的低字節(jié)地址須作為“sfr16sfr16”的定義地址,例如:的定義地址,例如: 29sfr16

45、DPTR=0 x82sfr16 DPTR=0 x82/DPTR /DPTR 的低的低8 8位地址為位地址為82H82H,高,高8 8位地址為位地址為83H83H(2 2)通過頭文件訪問)通過頭文件訪問SFRSFR。各種各種衍生型衍生型的的80518051單片機的特殊功能寄存器單片機的特殊功能寄存器的數(shù)量與類型有時是不相同的,對其訪問可通過頭文件訪問來進行。的數(shù)量與類型有時是不相同的,對其訪問可通過頭文件訪問來進行。為用戶處理方便,為用戶處理方便,C51C51把把80518051(或(或80528052單片機)常用的特殊功能寄存器和單片機)常用的特殊功能寄存器和其中的可尋址位進行了定義,放在一個

46、其中的可尋址位進行了定義,放在一個reg51.hreg51.h(或或reg52.hreg52.h)的頭文)的頭文件中。件中。當(dāng)用戶要使用時,只需在使用之前用一條當(dāng)用戶要使用時,只需在使用之前用一條預(yù)處理命令預(yù)處理命令#include#include把這個把這個頭文件包含到程序中頭文件包含到程序中,就可使用特殊功能,就可使用特殊功能寄存器名和其中的可尋址位名稱了。用戶可對頭文件進行增減。寄存器名和其中的可尋址位名稱了。用戶可對頭文件進行增減。30頭文件引用舉例如下:頭文件引用舉例如下:#include#include/包含包含80518051單片機的頭文件單片機的頭文件void main(voi

47、d)void main(void) TL0=0 xf0;TL0=0 xf0;/給給T0T0低字節(jié)低字節(jié)TL0TL0設(shè)置時間常數(shù),已在設(shè)置時間常數(shù),已在reg51.hreg51.h中定義中定義 TH0=0 x3f;TH0=0 x3f;/給給T0T0高字節(jié)高字節(jié)TH0TH0設(shè)置時間常數(shù),已在設(shè)置時間常數(shù),已在reg51.hreg51.h中定義中定義 TR0=1;TR0=1;/啟動定時器啟動定時器0 0 (3 3)特殊功能寄存器中的位定義)特殊功能寄存器中的位定義。對。對SFRSFR中的可尋址位的訪問,要使用關(guān)中的可尋址位的訪問,要使用關(guān)鍵字來定義可尋址位,共鍵字來定義可尋址位,共3 3種方法種方法

48、。 sbit 位名位名=特殊功能寄存器特殊功能寄存器位置;位置;例如:例如:sfr PSW=0 xd0sfr PSW=0 xd0; /定義定義PSW PSW 寄存器的字節(jié)地址寄存器的字節(jié)地址0 xd00 xd0sbit CY=PSW7sbit CY=PSW7; /定義定義CYCY位為位為PSW.7PSW.7,地址為,地址為0 xd00 xd0sbit OV=PSW2sbit OV=PSW2; /定義定義OVOV位為位為PSW.2PSW.2,地址為,地址為0 xd20 xd2 sbit 位名位名=字節(jié)地址字節(jié)地址位置;位置; 例如:例如:sbit CY=0 xd07sbit CY=0 xd07;

49、/ CY/ CY位地址為位地址為0 xd70 xd7sbit OV=0 xd02sbit OV=0 xd02;/ OV/ OV位地址為位地址為0 xd20 xd2 sbit 位名位名=位地址位地址;將位的絕對地址賦給變量,位地址必須在將位的絕對地址賦給變量,位地址必須在0 x800 xff。例如:例如:sbit CY=0 xd7sbit CY=0 xd7;/ CY/ CY位地址為位地址為0 xd70 xd7sbit OV=0 xd2sbit OV=0 xd2; / OV/ OV位地址為位地址為0 xd20 xd232【例例】AT89S51AT89S51單片機片內(nèi)單片機片內(nèi)P1P1口的各尋址位的

50、定義如下:口的各尋址位的定義如下:sfr P1=0 x90sfr P1=0 x90; sbit P1_7= P17; sbit P1_7= P17; sbit P1_6= P16; sbit P1_6= P16; sbit P1_5= P15; sbit P1_5= P15; sbit P1_4= P14; sbit P1_4= P14; sbit P1_3= P13; sbit P1_3= P13; sbit P1_2= P12; sbit P1_2= P12; sbit P1_1= P11; sbit P1_1= P11; sbit P1_0= P10;sbit P1_0= P10; 2

51、2位變量的位變量的C51C51定義定義 (1 1)由于)由于80518051可位操作,可位操作,C51C51擴展的擴展的“bitbit”數(shù)據(jù)類型用來定義位變量,數(shù)據(jù)類型用來定義位變量,這是與標(biāo)準(zhǔn)這是與標(biāo)準(zhǔn)C C的不同之處。的不同之處。33C51C51采用關(guān)鍵字采用關(guān)鍵字“bitbit”來定義位變量,一般格式為:來定義位變量,一般格式為:bit bit_name;bit bit_name;例如:例如: bit ov_flag;bit ov_flag;/將將ov_flagov_flag定義為位變量定義為位變量 bit lock_pointer; bit lock_pointer;/將將lock_p

52、ointerlock_pointer定義為位變量定義為位變量(2 2)函數(shù)可以包含類型為)函數(shù)可以包含類型為bitbit的參數(shù),也可將其作為返回值。的參數(shù),也可將其作為返回值。C51C51程序函程序函數(shù)可以包含類型為數(shù)可以包含類型為“bitbit”的參數(shù),也可將其作為返回值。例如:的參數(shù),也可將其作為返回值。例如:bit func(bit b0, bit b1);bit func(bit b0, bit b1); / / 位變量位變量b0b0與與b1b1作為函數(shù)作為函數(shù)funcfunc的參數(shù)的參數(shù) return(b1); return(b1);/ / 位變量位變量b1b1作為作為returnr

53、eturn函數(shù)的返回值函數(shù)的返回值 34(3 3)位變量定義的限制。)位變量定義的限制。位變量位變量不能用來定義指針和數(shù)組不能用來定義指針和數(shù)組。例如:。例如: bit bit * *ptr; / ptr; / 錯誤,不能用位變量來定義指針錯誤,不能用位變量來定義指針 bit array ; bit array ; / / 錯誤,不能用位變量來定義數(shù)組錯誤,不能用位變量來定義數(shù)組array array 定義位變量時,允許定義存儲類型,位變量都被放入一個位段,此段總定義位變量時,允許定義存儲類型,位變量都被放入一個位段,此段總是位于是位于80518051的片內(nèi)的片內(nèi)RAMRAM中,因此其中,因此

54、其存儲類型限制為存儲類型限制為DATADATA或或IDATAIDATA,如果將位如果將位變量定義成其他類型,將會導(dǎo)致編譯時出錯。變量定義成其他類型,將會導(dǎo)致編譯時出錯。353.2.3 C513.2.3 C51語言的絕對地址訪問語言的絕對地址訪問如何對如何對80518051片內(nèi)片內(nèi)RAMRAM、片外、片外RAMRAM及及I/OI/O空間進行訪問,空間進行訪問,C51C51提供提供兩種兩種常用的訪常用的訪問絕對地址的方法。問絕對地址的方法。1 1絕對宏絕對宏編譯器提供了一組宏定義對編譯器提供了一組宏定義對codecode、datadata、pdatapdata和和xdataxdata空間進行絕對尋

55、址空間進行絕對尋址。程序中用程序中用“#include#include”來對來對absacc.habsacc.h中中聲明的宏聲明的宏來訪問絕對地來訪問絕對地址,包括址,包括CBYTECBYTE、CWORDCWORD、DBYTEDBYTE、DWORDDWORD、XBYTEXBYTE、XWORDXWORD、PBYTEPBYTE、PWORDPWORD,具體使用參見,具體使用參見absacc.habsacc.h頭文件。其中:頭文件。其中:36nCBYTECBYTE以字節(jié)形式對以字節(jié)形式對codecode區(qū)尋址;區(qū)尋址;nCWORDCWORD以字形式對以字形式對codecode區(qū)尋址;區(qū)尋址;nDBYT

56、EDBYTE以字節(jié)形式對以字節(jié)形式對datadata區(qū)尋址;區(qū)尋址;nDWORDDWORD以字形式對以字形式對datadata區(qū)尋址;區(qū)尋址;nXBYTEXBYTE以字節(jié)形式對以字節(jié)形式對xdataxdata區(qū)尋址;區(qū)尋址;nXWORDXWORD以字形式對以字形式對xdataxdata區(qū)尋址;區(qū)尋址;nPBYTEPBYTE以字節(jié)形式對以字節(jié)形式對pdatapdata區(qū)尋址;區(qū)尋址;nPWORDPWORD以字形式對以字形式對pdatapdata區(qū)尋址。區(qū)尋址?!纠科瑑?nèi)片內(nèi)RAMRAM、片外、片外RAMRAM及及I/OI/O定義的程序如下:定義的程序如下: #include#include#d

57、efine #define PORTAPORTA XBYTE XBYTE0 xFFC00 xFFC0 / /將將PORTAPORTA定義為外部定義為外部I/OI/O口,口,地址為地址為0 xFFC00 xFFC0,長度,長度8 8位位#define #define NRAMNRAM DBYTE DBYTE0 x500 x50 / /將將NRAMNRAM定義為片內(nèi)定義為片內(nèi)RAMRAM,地址為地址為0 x500 x50,長度,長度8 8位位main( )main( ) PORTA=0 x3d; PORTA=0 x3d; /將數(shù)據(jù)將數(shù)據(jù)3DH3DH寫入地址為寫入地址為0 xffc00 xffc0的

58、外部的外部I/OI/O端口端口PORTAPORTA中中 NRAM=0 x01; NRAM=0 x01; /將數(shù)據(jù)將數(shù)據(jù)01H01H寫入片內(nèi)寫入片內(nèi)RAMRAM的的0 x400 x40單元單元 382 2 _at_ _at_ 關(guān)鍵字關(guān)鍵字關(guān)鍵字關(guān)鍵字 _at_ _at_ 可對指定的存儲器空間的絕對地址訪問,格式如下:可對指定的存儲器空間的絕對地址訪問,格式如下: 存儲器類型存儲器類型 數(shù)據(jù)類型說明符數(shù)據(jù)類型說明符 變量名變量名 _at_ _at_ 地址常數(shù)地址常數(shù)其中,存儲器類型為其中,存儲器類型為C51C51能識別的數(shù)據(jù)類型;數(shù)據(jù)類型為能識別的數(shù)據(jù)類型;數(shù)據(jù)類型為C51C51支持的數(shù)據(jù)支持的數(shù)

59、據(jù)類型;地址常數(shù)用于指定變量的絕對地址,必須位于有效的存儲器空間之類型;地址常數(shù)用于指定變量的絕對地址,必須位于有效的存儲器空間之內(nèi);內(nèi);使用使用 _at_ _at_ 定義的變量必須為定義的變量必須為全局變量全局變量。39【例例】使用關(guān)鍵字使用關(guān)鍵字 _at_ _at_ 實現(xiàn)絕對地址的訪問,程序如下:實現(xiàn)絕對地址的訪問,程序如下:void main(void)void main(void) data unsigned char data unsigned char y1y1 _at_ 0 x50_at_ 0 x50; /; /在在datadata區(qū)定義字節(jié)變量區(qū)定義字節(jié)變量y1y1,地址為,地

60、址為50H50H xdata unsigned int xdata unsigned int y2y2 _at_ 0 x4000_at_ 0 x4000;/;/在在xdataxdata區(qū)定義字變量區(qū)定義字變量y2y2,地址為,地址為 / /4000H4000H y1=0 xff;y1=0 xff; y2=0 x1234;y2=0 x1234; while(1); while(1); 【例例】將片外將片外RAM 2000HRAM 2000H開始的開始的連續(xù)連續(xù)2020字節(jié)清字節(jié)清0 0,程序如下:,程序如下:40 xdata unsigned char buffer20 _at_ 0 x2000;xdata unsigned char buffer20 _at_ 0 x2000;void mai

溫馨提示

  • 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

提交評論