




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 第3章 C51語言編程基礎(chǔ)與語言編程基礎(chǔ)與 Keil Vision3開發(fā)平臺(tái)開發(fā)平臺(tái) 1單片機(jī)應(yīng)用系統(tǒng)日趨復(fù)雜,對(duì)單片機(jī)應(yīng)用系統(tǒng)日趨復(fù)雜,對(duì)程序的可讀性、升級(jí)與維護(hù)以及模塊化要求越程序的可讀性、升級(jí)與維護(hù)以及模塊化要求越來越高來越高,對(duì)軟件編程要求也越來越高,要求編程人員在短時(shí)間內(nèi)編寫出執(zhí),對(duì)軟件編程要求也越來越高,要求編程人員在短時(shí)間內(nèi)編寫出執(zhí)行效率高、運(yùn)行可靠的程序代碼。同時(shí),也要方便多個(gè)編程人員來進(jìn)行協(xié)行效率高、運(yùn)行可靠的程序代碼。同時(shí),也要方便多個(gè)編程人員來進(jìn)行協(xié)同開發(fā)。同開發(fā)。C51C51語言是近年來在語言是近年來在80518051單片機(jī)開發(fā)中,普遍使用的程序設(shè)計(jì)語言,能單片機(jī)開發(fā)
2、中,普遍使用的程序設(shè)計(jì)語言,能直接對(duì)直接對(duì)80518051單片機(jī)硬件進(jìn)行操作,既有高級(jí)語言特點(diǎn),又有匯編語言特點(diǎn)單片機(jī)硬件進(jìn)行操作,既有高級(jí)語言特點(diǎn),又有匯編語言特點(diǎn),因此,因此在在80518051單片機(jī)程序設(shè)計(jì)中,得到廣泛使用。單片機(jī)程序設(shè)計(jì)中,得到廣泛使用。本章介紹本章介紹80518051單片機(jī)的單片機(jī)的C51C51語言,以及如何使用語言,以及如何使用C51C51語言集成化開發(fā)平臺(tái)語言集成化開發(fā)平臺(tái)Keil Keil Vision3Vision3,進(jìn)行,進(jìn)行C51C51程序設(shè)計(jì)與開發(fā)。程序設(shè)計(jì)與開發(fā)。23.1 C513.1 C51編程語言簡(jiǎn)介編程語言簡(jiǎn)介用于用于80518051單片機(jī)編程的
3、單片機(jī)編程的C C語言,在標(biāo)準(zhǔn)語言,在標(biāo)準(zhǔn)C C基礎(chǔ)上針對(duì)基礎(chǔ)上針對(duì)80518051硬件特點(diǎn)進(jìn)行擴(kuò)硬件特點(diǎn)進(jìn)行擴(kuò)展,并向展,并向80518051上移植,經(jīng)多年努力,上移植,經(jīng)多年努力,C51C51已成為公認(rèn)的高效、簡(jiǎn)潔的已成為公認(rèn)的高效、簡(jiǎn)潔的80518051單片機(jī)的實(shí)用高級(jí)編程語言。與單片機(jī)的實(shí)用高級(jí)編程語言。與80518051匯編語言相比,匯編語言相比,C51C51語言在語言在功能上、結(jié)構(gòu)性、可讀性、可維護(hù)性上有明顯優(yōu)勢(shì),易學(xué)易用。功能上、結(jié)構(gòu)性、可讀性、可維護(hù)性上有明顯優(yōu)勢(shì),易學(xué)易用。3.1.1 C513.1.1 C51語言與語言與80518051匯編語言比較匯編語言比較與與805180
4、51匯編語言相比,匯編語言相比, C51C51有如下優(yōu)點(diǎn)。有如下優(yōu)點(diǎn)。(1 1)可讀性好)可讀性好。C51C51語言程序比匯編語言程序的可讀性好,編程效率高語言程序比匯編語言程序的可讀性好,編程效率高,程序,程序便于修改、維護(hù)以及升級(jí)便于修改、維護(hù)以及升級(jí)。(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ù)勞動(dòng),與豐富的庫函數(shù),減少重復(fù)勞動(dòng),同時(shí)也有利于多個(gè)工程師
5、進(jìn)行協(xié)同開同時(shí)也有利于多個(gè)工程師進(jìn)行協(xié)同開發(fā)。發(fā)。(3 3)可移植性好。可移植性好。為某種型號(hào)單片機(jī)開發(fā)的為某種型號(hào)單片機(jī)開發(fā)的C C語言程序,只需把與硬件語言程序,只需把與硬件相關(guān)的相關(guān)的頭文件頭文件和和編譯鏈接的參數(shù)編譯鏈接的參數(shù)進(jìn)行適當(dāng)修改,就可方便地移植到其他進(jìn)行適當(dāng)修改,就可方便地移植到其他型號(hào)的單片機(jī)上。型號(hào)的單片機(jī)上。例如例如,為,為80518051單片機(jī)編寫的程序通過改寫頭文件以及單片機(jī)編寫的程序通過改寫頭文件以及少量的程序行,就可方便地移植到少量的程序行,就可方便地移植到PICPIC單片機(jī)上。單片機(jī)上。(4 4)生成的代碼效率高。生成的代碼效率高。當(dāng)前較好的當(dāng)前較好的C51C
6、51語言編譯系統(tǒng)編譯出來的代碼語言編譯系統(tǒng)編譯出來的代碼效率只比直接使用匯編語言效率只比直接使用匯編語言低低20%20%左右,如果使用左右,如果使用優(yōu)化編譯選項(xiàng)優(yōu)化編譯選項(xiàng),最高可,最高可達(dá)到達(dá)到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語言間有許多相同地方,但也有自身特點(diǎn)。不同的嵌入式語言間有許多相同地方,但也有自身特點(diǎn)。不同的嵌入式C C語言編譯系統(tǒng)之所以與標(biāo)準(zhǔn)語言編譯系統(tǒng)之所以與標(biāo)準(zhǔn)C C語言有不同的地方,主要是由于它們所語言有不同的地方,主要是由于它們所針對(duì)的硬件系統(tǒng)不同。對(duì)于針對(duì)的
7、硬件系統(tǒng)不同。對(duì)于80518051單片機(jī),目前廣泛使用的是單片機(jī),目前廣泛使用的是C51C51語言。語言。C51C51語言基本語法與標(biāo)準(zhǔn)語言基本語法與標(biāo)準(zhǔn)C C相同,是相同,是在標(biāo)準(zhǔn)在標(biāo)準(zhǔn)C C的基礎(chǔ)上的基礎(chǔ)上進(jìn)行適合進(jìn)行適合80518051內(nèi)核單內(nèi)核單片機(jī)硬件的擴(kuò)展片機(jī)硬件的擴(kuò)展。深入理解。深入理解C51C51語言語言對(duì)標(biāo)準(zhǔn)對(duì)標(biāo)準(zhǔn)C C語言的語言的擴(kuò)展部分?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ù)必須針對(duì)語言之外,如字符屏幕和圖形函數(shù)。有些庫函數(shù)必須針對(duì)80518051的硬的硬件特點(diǎn)來做出相應(yīng)的開發(fā)。件特點(diǎn)來做出相應(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單片機(jī)的數(shù)據(jù)類型,單片機(jī)的數(shù)據(jù)類型,在標(biāo)準(zhǔn)在標(biāo)準(zhǔn)C C的基礎(chǔ)上又?jǐn)U展了的基礎(chǔ)上又?jǐn)U展了4 4種類型。例如,種類型。例如,80518051單片機(jī)包含位操作空間和單片機(jī)包含位操作空間和豐富的位操作指令,因此,豐富的位操作指令,因此,C51C51語言與標(biāo)準(zhǔn)語言與標(biāo)準(zhǔn)C C語言相比語言相比增加了增加了位類型位類型。6 (3 3)C51C51語言變量存儲(chǔ)模式與標(biāo)準(zhǔn)語言變量存儲(chǔ)模式與標(biāo)準(zhǔn)C C語言中變量存儲(chǔ)模式數(shù)據(jù)不一樣語言中變量存儲(chǔ)模式數(shù)據(jù)不一樣。標(biāo)。標(biāo)準(zhǔn)準(zhǔn)C C最初是為通用計(jì)算機(jī)設(shè)計(jì)的,在通用計(jì)算機(jī)中只有一個(gè)程序和數(shù)據(jù)統(tǒng)一最初是為通用計(jì)算機(jī)設(shè)計(jì)的,在通用計(jì)算機(jī)中只有一個(gè)程序和數(shù)據(jù)統(tǒng)一尋址的
10、內(nèi)存空間,而尋址的內(nèi)存空間,而C51C51語言中語言中變量的存儲(chǔ)模式變量的存儲(chǔ)模式與與80518051單片機(jī)的單片機(jī)的各種存儲(chǔ)器各種存儲(chǔ)器區(qū)緊密相關(guān)區(qū)緊密相關(guān)。 (4 4)數(shù)據(jù)存儲(chǔ)類型不同)數(shù)據(jù)存儲(chǔ)類型不同。80518051存儲(chǔ)區(qū)可分為存儲(chǔ)區(qū)可分為內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)、外部數(shù)據(jù)內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)、外部數(shù)據(jù)存儲(chǔ)區(qū)以及程序存儲(chǔ)區(qū)存儲(chǔ)區(qū)以及程序存儲(chǔ)區(qū)。 內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)可分為可分為3 3個(gè)不同的個(gè)不同的C51C51存儲(chǔ)類型:存儲(chǔ)類型:datadata、idataidata和和bdatabdata。 外部數(shù)據(jù)存儲(chǔ)區(qū)分外部數(shù)據(jù)存儲(chǔ)區(qū)分為為2 2個(gè)不同的個(gè)不同的C51C51存儲(chǔ)類型:存儲(chǔ)類型:xdata
11、xdata和和p pdatadata。 程序存儲(chǔ)區(qū)程序存儲(chǔ)區(qū)只能讀不能寫,可能在只能讀不能寫,可能在80518051內(nèi)部或者在外部,內(nèi)部或者在外部,C51C51語言提供語言提供的的codecode存儲(chǔ)類型用來訪問程序存儲(chǔ)區(qū)。存儲(chǔ)類型用來訪問程序存儲(chǔ)區(qū)。7 (5 5)標(biāo)準(zhǔn))標(biāo)準(zhǔn)C C語言沒有處理單片機(jī)中斷的定義語言沒有處理單片機(jī)中斷的定義,而,而C51C51語言中有專門的中語言中有專門的中斷函數(shù)。斷函數(shù)。(6 6)頭文件不同)頭文件不同。C51C51語言頭文件必須把語言頭文件必須把80518051單片機(jī)內(nèi)部的外設(shè)硬件資單片機(jī)內(nèi)部的外設(shè)硬件資源(如定時(shí)器、中斷、源(如定時(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單片機(jī)的硬件資源有限,它的編譯系單片機(jī)的硬件資源有限,它的編譯系統(tǒng)統(tǒng)不允許太多的程序嵌套不允許太多的程序嵌套。其次,標(biāo)準(zhǔn)。其次,標(biāo)準(zhǔn)C C語言所具備的語言所具備的遞歸特性遞歸特性不被不被C51C51語言支持。語言支持。8但從數(shù)據(jù)運(yùn)算操作、程序控制語句以及函數(shù)的使用上來說,但從數(shù)據(jù)運(yùn)算操作、程序控制語句以及函數(shù)的使用上來說,C51C51與標(biāo)準(zhǔn)與標(biāo)準(zhǔn)C C幾幾乎沒有什么明顯差別。如果程序設(shè)計(jì)者具備了有關(guān)標(biāo)準(zhǔn)乎沒有什么明顯差別
13、。如果程序設(shè)計(jì)者具備了有關(guān)標(biāo)準(zhǔn)C C語言的編程基礎(chǔ)語言的編程基礎(chǔ),只要注意,只要注意C51C51與標(biāo)準(zhǔn)與標(biāo)準(zhǔn)C C不同之處,并熟悉不同之處,并熟悉80518051單片機(jī)的硬件結(jié)構(gòu),就能單片機(jī)的硬件結(jié)構(gòu),就能較快掌握較快掌握C51C51編程。編程。3.2 C513.2 C51語言程序設(shè)計(jì)基礎(chǔ)語言程序設(shè)計(jì)基礎(chǔ)本節(jié)在標(biāo)準(zhǔn)本節(jié)在標(biāo)準(zhǔn)C C基礎(chǔ)上,了解掌握基礎(chǔ)上,了解掌握C51C51的數(shù)據(jù)類型和存儲(chǔ)類型、的數(shù)據(jù)類型和存儲(chǔ)類型、C51C51的基本運(yùn)算的基本運(yùn)算與流程控制語句、與流程控制語句、C51C51語言構(gòu)造數(shù)據(jù)類型、語言構(gòu)造數(shù)據(jù)類型、C51C51函數(shù)以及函數(shù)以及C51C51程序設(shè)計(jì)的其程序設(shè)計(jì)的其他一
14、些問題,為他一些問題,為C51C51的程序開發(fā)打下基礎(chǔ)的程序開發(fā)打下基礎(chǔ)。 93.2.1 C513.2.1 C51語言中的數(shù)據(jù)類型與存儲(chǔ)類型語言中的數(shù)據(jù)類型與存儲(chǔ)類型1 1數(shù)據(jù)類型數(shù)據(jù)類型 數(shù)據(jù)是單片機(jī)操作的對(duì)象,具有一定格式的數(shù)字或數(shù)值,數(shù)據(jù)的不同格數(shù)據(jù)是單片機(jī)操作的對(duì)象,具有一定格式的數(shù)字或數(shù)值,數(shù)據(jù)的不同格式就稱為式就稱為數(shù)據(jù)類型數(shù)據(jù)類型。 Keil C51 Keil C51支持的基本數(shù)據(jù)類型見支持的基本數(shù)據(jù)類型見表表3-13-1。 針對(duì)針對(duì)80518051的硬件特點(diǎn),的硬件特點(diǎn),C51C51在標(biāo)準(zhǔn)在標(biāo)準(zhǔn)C C基礎(chǔ)上,基礎(chǔ)上,擴(kuò)展了擴(kuò)展了4 4種數(shù)據(jù)類型種數(shù)據(jù)類型(見表(見表3-13-1
15、中最后中最后4 4行)。行)。 注意,擴(kuò)展的注意,擴(kuò)展的4 4種數(shù)據(jù)類型,不能使用指針來對(duì)它們存取。種數(shù)據(jù)類型,不能使用指針來對(duì)它們存取。102 2C51C51的擴(kuò)展數(shù)據(jù)類型的擴(kuò)展數(shù)據(jù)類型 下面對(duì)擴(kuò)展的下面對(duì)擴(kuò)展的4 4種數(shù)據(jù)類型說明。種數(shù)據(jù)類型說明。 (1 1)位變量位變量bitbit的值的值可以是可以是1 1(truetrue),也可是),也可是0 0(falsefalse)。)。 (2 2)特殊功能寄存器特殊功能寄存器sfrsfr。80518051單片機(jī)的特殊功能寄存器分布在片內(nèi)數(shù)單片機(jī)的特殊功能寄存器分布在片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū)的地址單元據(jù)存儲(chǔ)區(qū)的地址單元80H80HFFHFFH之間之間,“s
16、frsfr”數(shù)據(jù)類型數(shù)據(jù)類型占用一個(gè)內(nèi)存單元。占用一個(gè)內(nèi)存單元。利用它可訪問利用它可訪問80518051單片機(jī)內(nèi)部的所有特殊功能寄存器。單片機(jī)內(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ù)類型占用兩個(gè)內(nèi)存單元占用兩個(gè)內(nèi)存單元,用于操作占兩個(gè)字節(jié)的特殊功能寄,用于操作占兩個(gè)字節(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ù)語句中就可對(duì)中就可對(duì)DPTRDPTR進(jìn)行操作。進(jìn)行操作。(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 符號(hào)符號(hào)“ ”前是特殊功能寄存器名字,前是特殊功能寄存器名字,“ ”后的數(shù)字定義特殊功能寄存器后的數(shù)字定義特殊功能寄存器可尋址位在寄存器中的位置,取值必須是可尋址位在寄存器中的位置,取值必須是0 07 7。 注意,注意,不要把不要把bitbit與與sbitsbit相混淆相混淆。bitbit定義定義普通的位變量普通的位變量,只能是二進(jìn)制
19、,只能是二進(jìn)制的的0 0或或1 1。sbitsbit是定義特殊功能寄存器的是定義特殊功能寄存器的可尋址位可尋址位,值是可以進(jìn)行位尋址的,值是可以進(jìn)行位尋址的特殊功能寄存器的某位的絕對(duì)地址,特殊功能寄存器的某位的絕對(duì)地址,例如,例如,PSWPSW寄存器寄存器OVOV位的絕對(duì)地址位的絕對(duì)地址0 xd20 xd2。上面的例子還涉及到上面的例子還涉及到C51注釋的寫法問題注釋的寫法問題,C51的注釋寫法有兩種:的注釋寫法有兩種:(1)/,兩個(gè)斜杠后面跟著的為注釋語句,本寫法只能注釋一行,當(dāng),兩個(gè)斜杠后面跟著的為注釋語句,本寫法只能注釋一行,當(dāng)換行時(shí),必須在新行上重新寫兩個(gè)斜杠。換行時(shí),必須在新行上重新
20、寫兩個(gè)斜杠。(2)/*/,一個(gè)斜杠與星號(hào)結(jié)合使用,本寫法可注釋任一行,即斜杠星,一個(gè)斜杠與星號(hào)結(jié)合使用,本寫法可注釋任一行,即斜杠星號(hào)與星號(hào)斜杠之間的所有文字都作為注釋,即注釋有多行時(shí),只需在注釋號(hào)與星號(hào)斜杠之間的所有文字都作為注釋,即注釋有多行時(shí),只需在注釋的開始處,加斜杠星號(hào),在注釋的結(jié)尾處,加上星號(hào)斜杠即可。的開始處,加斜杠星號(hào),在注釋的結(jié)尾處,加上星號(hào)斜杠即可。 加注釋的目的是為了便于讀懂程序,所有注釋都不參與程序編譯,編譯加注釋的目的是為了便于讀懂程序,所有注釋都不參與程序編譯,編譯器在編譯過程中會(huì)自動(dòng)刪去注釋。器在編譯過程中會(huì)自動(dòng)刪去注釋。143 3數(shù)據(jù)存儲(chǔ)類型數(shù)據(jù)存儲(chǔ)類型 在討論
21、在討論C51C51數(shù)據(jù)類型時(shí),須同時(shí)提及它的存儲(chǔ)類型,以及它與數(shù)據(jù)類型時(shí),須同時(shí)提及它的存儲(chǔ)類型,以及它與80518051單單片機(jī)存儲(chǔ)器結(jié)構(gòu)的關(guān)系,因?yàn)槠瑱C(jī)存儲(chǔ)器結(jié)構(gòu)的關(guān)系,因?yàn)镃51C51定義的任何數(shù)據(jù)類型定義的任何數(shù)據(jù)類型必須以一定的必須以一定的方式,定位在方式,定位在80518051單片機(jī)的某一存儲(chǔ)區(qū)中,單片機(jī)的某一存儲(chǔ)區(qū)中,否則沒有任何實(shí)際意義。否則沒有任何實(shí)際意義。 8051 8051有片內(nèi)、片外數(shù)據(jù)存儲(chǔ)區(qū),還有程序存儲(chǔ)區(qū)。有片內(nèi)、片外數(shù)據(jù)存儲(chǔ)區(qū),還有程序存儲(chǔ)區(qū)。 片內(nèi)的數(shù)據(jù)存儲(chǔ)區(qū)是可讀寫的,片內(nèi)的數(shù)據(jù)存儲(chǔ)區(qū)是可讀寫的,80518051的衍生系列最多可有的衍生系列最多可有256256
22、字節(jié)的內(nèi)字節(jié)的內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)(例如部數(shù)據(jù)存儲(chǔ)區(qū)(例如AT89S52AT89S52單片機(jī)),其中低單片機(jī)),其中低128128字節(jié)可直接尋址,高字節(jié)可直接尋址,高128128字節(jié)(字節(jié)(80H80HFFHFFH)只能間接尋址,從地址)只能間接尋址,從地址20H20H開始的開始的1616字節(jié)可位尋址。字節(jié)可位尋址。內(nèi)部?jī)?nèi)部數(shù)據(jù)存儲(chǔ)區(qū)可分為數(shù)據(jù)存儲(chǔ)區(qū)可分為3 3個(gè)不同的數(shù)據(jù)存儲(chǔ)類型:個(gè)不同的數(shù)據(jù)存儲(chǔ)類型:datadata、idataidata和和bdatabdata。 訪問訪問片外數(shù)據(jù)存儲(chǔ)區(qū)片外數(shù)據(jù)存儲(chǔ)區(qū)比訪問比訪問片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū)片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū)慢慢,因?yàn)樵L問片外數(shù)據(jù)存儲(chǔ),因?yàn)樵L問片外數(shù)據(jù)存儲(chǔ)區(qū)要通過
23、對(duì)數(shù)據(jù)指針加載地址來間接尋址訪問。區(qū)要通過對(duì)數(shù)據(jù)指針加載地址來間接尋址訪問。 C51C51提供兩種不同的數(shù)據(jù)存儲(chǔ)類型提供兩種不同的數(shù)據(jù)存儲(chǔ)類型xdataxdata和和pdatapdata來訪問片外數(shù)據(jù)存儲(chǔ)區(qū)來訪問片外數(shù)據(jù)存儲(chǔ)區(qū)。16程序存儲(chǔ)區(qū)程序存儲(chǔ)區(qū)只能讀不能寫,可能在只能讀不能寫,可能在80518051單片機(jī)內(nèi)部或者外部,或外部和單片機(jī)內(nèi)部或者外部,或外部和內(nèi)部都有,由內(nèi)部都有,由80518051單片機(jī)硬件決定,單片機(jī)硬件決定,C51C51提供了提供了codecode存儲(chǔ)類型來訪問程存儲(chǔ)類型來訪問程序存儲(chǔ)區(qū)。序存儲(chǔ)區(qū)。C51C51存儲(chǔ)類型與存儲(chǔ)類型與80518051實(shí)際的存儲(chǔ)空間的對(duì)應(yīng)關(guān)系
24、見實(shí)際的存儲(chǔ)空間的對(duì)應(yīng)關(guān)系見表表3-23-2。下面對(duì)表下面對(duì)表3-23-2各種存儲(chǔ)區(qū)作以說明。各種存儲(chǔ)區(qū)作以說明。(1 1)DATADATA區(qū)。區(qū)。尋址是最快的,應(yīng)把常使用的變量放在該區(qū),但該區(qū)存儲(chǔ)尋址是最快的,應(yīng)把常使用的變量放在該區(qū),但該區(qū)存儲(chǔ)空間有限,空間有限,DATADATA區(qū)除了包含程序變量外,還包含了堆棧和寄存器組。區(qū)除了包含程序變量外,還包含了堆棧和寄存器組。DATADATA區(qū)聲明中的存儲(chǔ)類型標(biāo)識(shí)符為區(qū)聲明中的存儲(chǔ)類型標(biāo)識(shí)符為datadata,通常指片內(nèi),通常指片內(nèi)RAM128RAM128字節(jié)的內(nèi)字節(jié)的內(nèi)部數(shù)據(jù)存儲(chǔ)的變量,可直接尋址。部數(shù)據(jù)存儲(chǔ)的變量,可直接尋址。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)變量和用戶自聲明變量都可存儲(chǔ)在標(biāo)準(zhǔn)變量和用戶自聲明變量都可存儲(chǔ)在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)部堆棧溢出的時(shí)候,程序會(huì)莫名其妙地復(fù)位。這是因?yàn)榈臅r(shí)候,程序會(huì)莫名其妙地復(fù)位。這是因?yàn)?0518051沒有報(bào)錯(cuò)機(jī)制,堆棧溢出只能以這種方式表示,因此要留有較大的堆??諞]有報(bào)錯(cuò)機(jī)制,堆棧溢出只能以這種方式表示,因此要留有較大的堆棧空間來防止堆棧溢出。間來防止堆棧溢出。 (2 2)BDATABDATA區(qū)。區(qū)。DATADATA中的位尋址區(qū),在該區(qū)中聲明變量就可進(jìn)行位尋址中的位尋址區(qū),在該區(qū)中聲明變量就可進(jìn)行位尋址。BDATABDATA區(qū)聲明中的存儲(chǔ)類型標(biāo)識(shí)符為區(qū)聲明中的存儲(chǔ)類型標(biāo)識(shí)符為bdatabdata,指的是
27、片內(nèi),指的是片內(nèi)RAMRAM可位尋址的可位尋址的161619字節(jié)存儲(chǔ)區(qū)(字節(jié)地址為字節(jié)存儲(chǔ)區(qū)(字節(jié)地址為20H20H2FH2FH)中的)中的128128個(gè)位個(gè)位。下面是在。下面是在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ū)使用寄存器作為指針來對(duì)片內(nèi)對(duì)片內(nèi)RAMRAM進(jìn)行間接尋址進(jìn)行間接尋址,常,常用來存放使用比較頻繁的變量。與外部存儲(chǔ)器尋址相比,它的指令執(zhí)行周用來存放使用比較頻繁的變量。與外部存儲(chǔ)器尋址相比,它的指令執(zhí)行周期和代碼長度相對(duì)較短。期和代碼
29、長度相對(duì)較短。 IDATAIDATA區(qū)區(qū)聲明中的聲明中的存儲(chǔ)類型標(biāo)識(shí)符存儲(chǔ)類型標(biāo)識(shí)符為為idataidata,指的是片內(nèi),指的是片內(nèi)RAMRAM的的256256字節(jié)的字節(jié)的存儲(chǔ)區(qū),只能間接尋址,速度比直接尋址慢。存儲(chǔ)區(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ū) 位于片外存儲(chǔ)區(qū),位于片外存儲(chǔ)區(qū),PDATAPDATA區(qū)區(qū)和和XDATAXDATA區(qū)區(qū)聲明中的聲明中的存儲(chǔ)類型標(biāo)識(shí)符存儲(chǔ)類型標(biāo)識(shí)符分別為分別為pdatapdata和和xdataxdata。 PDATAPDATA區(qū)區(qū)只有只有256256字節(jié),僅指定字節(jié),僅指定256256字節(jié)的外部數(shù)據(jù)存儲(chǔ)區(qū)字節(jié)的外部數(shù)據(jù)存儲(chǔ)區(qū)。 但但XDATAXDATA區(qū)區(qū)最多可達(dá)最多可達(dá)64KB64KB,對(duì)應(yīng)的,對(duì)應(yīng)的xdataxdata存儲(chǔ)類
31、型標(biāo)識(shí)符可指定存儲(chǔ)類型標(biāo)識(shí)符可指定外部數(shù)外部數(shù)據(jù)區(qū)據(jù)區(qū)64KB64KB內(nèi)內(nèi)的任何地址。的任何地址。21 對(duì)對(duì)PDATAPDATA區(qū)區(qū)的尋址要比對(duì)的尋址要比對(duì)XDATAXDATA區(qū)區(qū)尋址快尋址快,因?yàn)閷?duì),因?yàn)閷?duì)PDATAPDATA區(qū)尋址,只需裝區(qū)尋址,只需裝入入8 8位地址,而對(duì)位地址,而對(duì)XDATAXDATA區(qū)尋址要裝入?yún)^(qū)尋址要裝入1616位地址,所以盡量把外部數(shù)據(jù)存儲(chǔ)位地址,所以盡量把外部數(shù)據(jù)存儲(chǔ)在在PDATAPDATA區(qū)中。區(qū)中。 對(duì)對(duì)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ù)存儲(chǔ)器與外部由于外部數(shù)據(jù)存儲(chǔ)器與外部I/OI/O口是統(tǒng)一編址的,外部數(shù)據(jù)存儲(chǔ)器地址口是統(tǒng)一編址的,外部數(shù)據(jù)存儲(chǔ)器地址段中除了包含數(shù)據(jù)存儲(chǔ)器地址外,還包含外部段中除了包含數(shù)據(jù)存儲(chǔ)器地址外,還包含外部I/OI/O口的地址。對(duì)
33、外部數(shù)據(jù)存口的地址。對(duì)外部數(shù)據(jù)存儲(chǔ)器及外部?jī)?chǔ)器及外部I/OI/O口的尋址將在本章的絕對(duì)地址尋址中介紹。口的尋址將在本章的絕對(duì)地址尋址中介紹。22(5 5)程序存儲(chǔ)區(qū))程序存儲(chǔ)區(qū)CODECODE。程序存儲(chǔ)區(qū)。程序存儲(chǔ)區(qū)CODECODE聲明的標(biāo)識(shí)符為聲明的標(biāo)識(shí)符為codecode,儲(chǔ)存的數(shù)據(jù)是,儲(chǔ)存的數(shù)據(jù)是不可改變的。在不可改變的。在C51C51編譯器中可以用存儲(chǔ)區(qū)類型標(biāo)識(shí)符編譯器中可以用存儲(chǔ)區(qū)類型標(biāo)識(shí)符codecode來訪問程序存儲(chǔ)區(qū)來訪問程序存儲(chǔ)區(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ù)存儲(chǔ)類型,其大小和值域見的數(shù)據(jù)存儲(chǔ)類型,其大小和值域見表表3-33-3。 單片機(jī)訪問片內(nèi)單片機(jī)訪問片內(nèi)RAMRAM比訪問片外比訪問片外RAMRAM相對(duì)快一些,所以相對(duì)快一些,所以應(yīng)盡量把頻繁使用的應(yīng)盡量把頻繁使用的變量置于片內(nèi)變量置于片內(nèi)RAMRAM。即采用。即采用datadata、bdatabdata或或idataidata存儲(chǔ)類型,而將容量較大或使存儲(chǔ)類型,而將容
35、量較大或使用不太頻繁的那些變量置于片外用不太頻繁的那些變量置于片外RAMRAM,即采用,即采用pdatapdata或或xdataxdata存儲(chǔ)類型。常量只存儲(chǔ)類型。常量只能采用能采用codecode存儲(chǔ)類型。存儲(chǔ)類型。2324變量存儲(chǔ)類型定義舉例:變量存儲(chǔ)類型定義舉例:(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; / /* *浮點(diǎn)變量浮點(diǎn)變量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; / /* *無符號(hào)整型變量無符號(hào)整型變量var1var1定義為定義為pdatapdata型型 ,定位在片外,定位在片外RAMRAM中,相當(dāng)
37、于中,相當(dāng)于RiRi間接尋址間接尋址* */ / (5 5)unsigned char unsigned char xdataxdata a2 4; a2 4; / /* *無符號(hào)字符型二維數(shù)組變量無符號(hào)字符型二維數(shù)組變量 a24 a24 被定義為被定義為xdataxdata存儲(chǔ)類型,定位在片外存儲(chǔ)類型,定位在片外RAMRAM中,占據(jù)中,占據(jù) 2 24=84=8字節(jié),相當(dāng)于字節(jié),相當(dāng)于DPTRDPTR間接尋址間接尋址* */ / 4 4數(shù)據(jù)存儲(chǔ)模式數(shù)據(jù)存儲(chǔ)模式 如果在變量定義時(shí)如果在變量定義時(shí)略去存儲(chǔ)類型標(biāo)識(shí)符略去存儲(chǔ)類型標(biāo)識(shí)符,編譯器會(huì),編譯器會(huì)自動(dòng)默認(rèn)自動(dòng)默認(rèn)存儲(chǔ)類型。存儲(chǔ)類型。25進(jìn)一步
38、由進(jìn)一步由SMALLSMALL、COMPACTCOMPACT和和LARGELARGE存儲(chǔ)模式指令限制。存儲(chǔ)模式指令限制。例如,例如,若聲明若聲明char char var1var1,則在使用,則在使用SMALLSMALL存儲(chǔ)模式存儲(chǔ)模式下,下,var1var1被定位在被定位在datadata存儲(chǔ)區(qū)存儲(chǔ)區(qū),在使用,在使用COMPACTCOMPACT模式模式下,下,var1var1被定位在被定位在idataidata存儲(chǔ)區(qū)存儲(chǔ)區(qū);在;在LARGELARGE模式模式下,下,var1var1被定被定位在位在xdataxdata存儲(chǔ)區(qū)存儲(chǔ)區(qū)中。中。下面對(duì)存儲(chǔ)模式作進(jìn)一步說明。下面對(duì)存儲(chǔ)模式作進(jìn)一步說明。
39、(1 1)SMALLSMALL模式模式。該模式下,。該模式下,所有變量所有變量都默認(rèn)位于都默認(rèn)位于80518051單片機(jī)單片機(jī)內(nèi)部的數(shù)據(jù)存內(nèi)部的數(shù)據(jù)存儲(chǔ)器儲(chǔ)器,與使用,與使用datadata指定存儲(chǔ)器類型的方式一樣。在此模式下,變量訪問的指定存儲(chǔ)器類型的方式一樣。在此模式下,變量訪問的效率高,但是所有數(shù)據(jù)對(duì)象和堆棧效率高,但是所有數(shù)據(jù)對(duì)象和堆棧必須使用內(nèi)部必須使用內(nèi)部RAMRAM。(2 2)COMPACTCOMPACT模式模式 本模式下本模式下所有變量所有變量都默認(rèn)在都默認(rèn)在外部數(shù)據(jù)存儲(chǔ)器外部數(shù)據(jù)存儲(chǔ)器的的1 1頁頁(256256字節(jié))內(nèi),這與字節(jié))內(nèi),這與26使用使用pdatapdata指定
40、存儲(chǔ)器類型是一樣的。指定存儲(chǔ)器類型是一樣的。該類型適用于變量不超過該類型適用于變量不超過256256字節(jié)的字節(jié)的情況情況,此限制是由尋址方式?jīng)Q定的,相當(dāng)于使用,此限制是由尋址方式?jīng)Q定的,相當(dāng)于使用數(shù)據(jù)指針數(shù)據(jù)指針RiRi尋址。與尋址。與SMALLSMALL模式相比,模式相比,該存儲(chǔ)模式的效率比較低該存儲(chǔ)模式的效率比較低,對(duì)變量訪問的速度也慢一些,對(duì)變量訪問的速度也慢一些,但比但比LARGELARGE模式快。模式快。 (3 3)LARGELARGE模式模式 本模式下本模式下所有變量所有變量都都默認(rèn)位于默認(rèn)位于外部數(shù)據(jù)存儲(chǔ)器外部數(shù)據(jù)存儲(chǔ)器,相當(dāng)于用,相當(dāng)于用DPTRDPTR尋址尋址。通過數(shù)據(jù)指針訪
41、問外部數(shù)據(jù)存儲(chǔ)器的效率較低,特別是當(dāng)變量為通過數(shù)據(jù)指針訪問外部數(shù)據(jù)存儲(chǔ)器的效率較低,特別是當(dāng)變量為2 2字節(jié)或更字節(jié)或更多字節(jié)時(shí),該模式要比多字節(jié)時(shí),該模式要比SMALLSMALL和和COMPACTCOMPACT產(chǎn)生更多的代碼。產(chǎn)生更多的代碼。27 在固定的存儲(chǔ)器地址上進(jìn)行變量傳遞,是在固定的存儲(chǔ)器地址上進(jìn)行變量傳遞,是C51C51的標(biāo)準(zhǔn)特征之一。的標(biāo)準(zhǔn)特征之一。 在在SMALLSMALL模式下,參數(shù)傳遞是在片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū)中完成的。模式下,參數(shù)傳遞是在片內(nèi)數(shù)據(jù)存儲(chǔ)區(qū)中完成的。LARGELARGE和和COMPACTCOMPACT模式允許參數(shù)在外部存儲(chǔ)器中傳遞。模式允許參數(shù)在外部存儲(chǔ)器中傳遞。C5
42、1C51也支持混合模式。例如,也支持混合模式。例如,在在LARGELARGE模式下,生成的程序可將一些函數(shù)放入模式下,生成的程序可將一些函數(shù)放入SMALLSMALL模式中,從而加快執(zhí)模式中,從而加快執(zhí)行速度。行速度。3.2.2 C513.2.2 C51語言的特殊功能寄存器及位變量定義語言的特殊功能寄存器及位變量定義 介紹介紹C51C51如何對(duì)特殊功能寄存器及位變量進(jìn)行定義并訪問。如何對(duì)特殊功能寄存器及位變量進(jìn)行定義并訪問。1 1特殊功能寄存器的特殊功能寄存器的C51C51定義定義 C51 C51語言允許通過使用語言允許通過使用關(guān)鍵字關(guān)鍵字sfrsfr、sbitsbit或直接引用編譯器提供的頭文
43、或直接引用編譯器提供的頭文件來對(duì)特殊功能寄存器(件來對(duì)特殊功能寄存器(SFRSFR)進(jìn)行訪問,)進(jìn)行訪問, 特殊功能寄存器分布在片內(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í)器/ /計(jì)數(shù)器控制寄存器地址計(jì)數(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單片機(jī)的特殊功能寄存器單片機(jī)的特殊功能寄存器的數(shù)量與類型有時(shí)是不相同的,對(duì)其訪問可通過頭文件訪問來進(jìn)行。的數(shù)量與類型有時(shí)是不相同的,對(duì)其訪問可通過頭文件訪問來進(jìn)行。為用戶處理方便,為用戶處理方便,C51C51把把80518051(或(或80528052單片機(jī))常用的特殊功能寄存器和單片機(jī))常用的特殊功能寄存器和其中的可尋址位進(jìn)行了定義,放在一個(gè)
46、其中的可尋址位進(jìn)行了定義,放在一個(gè)reg51.hreg51.h(或或reg52.hreg52.h)的頭文)的頭文件中。件中。當(dāng)用戶要使用時(shí),只需在使用之前用一條當(dāng)用戶要使用時(shí),只需在使用之前用一條預(yù)處理命令預(yù)處理命令#include#include把這個(gè)把這個(gè)頭文件包含到程序中頭文件包含到程序中,就可使用特殊功能,就可使用特殊功能寄存器名和其中的可尋址位名稱了。用戶可對(duì)頭文件進(jìn)行增減。寄存器名和其中的可尋址位名稱了。用戶可對(duì)頭文件進(jìn)行增減。30頭文件引用舉例如下:頭文件引用舉例如下:#include#include/包含包含80518051單片機(jī)的頭文件單片機(jī)的頭文件void main(voi
47、d)void main(void) TL0=0 xf0;TL0=0 xf0;/給給T0T0低字節(jié)低字節(jié)TL0TL0設(shè)置時(shí)間常數(shù),已在設(shè)置時(shí)間常數(shù),已在reg51.hreg51.h中定義中定義 TH0=0 x3f;TH0=0 x3f;/給給T0T0高字節(jié)高字節(jié)TH0TH0設(shè)置時(shí)間常數(shù),已在設(shè)置時(shí)間常數(shù),已在reg51.hreg51.h中定義中定義 TR0=1;TR0=1;/啟動(dòng)定時(shí)器啟動(dòng)定時(shí)器0 0 (3 3)特殊功能寄存器中的位定義)特殊功能寄存器中的位定義。對(duì)。對(duì)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 位名位名=位地址位地址;將位的絕對(duì)地址賦給變量,位地址必須在將位的絕對(duì)地址賦給變量,位地址必須在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單片機(jī)片內(nèi)單片機(jī)片內(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擴(kuò)展的擴(kuò)展的“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; / 錯(cuò)誤,不能用位變量來定義指針錯(cuò)誤,不能用位變量來定義指針 bit array ; bit array ; / / 錯(cuò)誤,不能用位變量來定義數(shù)組錯(cuò)誤,不能用位變量來定義數(shù)組array array 定義位變量時(shí),允許定義存儲(chǔ)類型,位變量都被放入一個(gè)位段,此段總定義位變量時(shí),允許定義存儲(chǔ)類型,位變量都被放入一個(gè)位段,此段總是位于是位于80518051的片內(nèi)的片內(nèi)RAMRAM中,因此其中,因此
54、其存儲(chǔ)類型限制為存儲(chǔ)類型限制為DATADATA或或IDATAIDATA,如果將位如果將位變量定義成其他類型,將會(huì)導(dǎo)致編譯時(shí)出錯(cuò)。變量定義成其他類型,將會(huì)導(dǎo)致編譯時(shí)出錯(cuò)。353.2.3 C513.2.3 C51語言的絕對(duì)地址訪問語言的絕對(duì)地址訪問如何對(duì)如何對(duì)80518051片內(nèi)片內(nèi)RAMRAM、片外、片外RAMRAM及及I/OI/O空間進(jìn)行訪問,空間進(jìn)行訪問,C51C51提供提供兩種兩種常用的訪常用的訪問絕對(duì)地址的方法。問絕對(duì)地址的方法。1 1絕對(duì)宏絕對(duì)宏編譯器提供了一組宏定義對(duì)編譯器提供了一組宏定義對(duì)codecode、datadata、pdatapdata和和xdataxdata空間進(jìn)行絕對(duì)尋
55、址空間進(jìn)行絕對(duì)尋址。程序中用程序中用“#include#include”來對(duì)來對(duì)absacc.habsacc.h中中聲明的宏聲明的宏來訪問絕對(duì)地來訪問絕對(duì)地址,包括址,包括CBYTECBYTE、CWORDCWORD、DBYTEDBYTE、DWORDDWORD、XBYTEXBYTE、XWORDXWORD、PBYTEPBYTE、PWORDPWORD,具體使用參見,具體使用參見absacc.habsacc.h頭文件。其中:頭文件。其中:36nCBYTECBYTE以字節(jié)形式對(duì)以字節(jié)形式對(duì)codecode區(qū)尋址;區(qū)尋址;nCWORDCWORD以字形式對(duì)以字形式對(duì)codecode區(qū)尋址;區(qū)尋址;nDBYT
56、EDBYTE以字節(jié)形式對(duì)以字節(jié)形式對(duì)datadata區(qū)尋址;區(qū)尋址;nDWORDDWORD以字形式對(duì)以字形式對(duì)datadata區(qū)尋址;區(qū)尋址;nXBYTEXBYTE以字節(jié)形式對(duì)以字節(jié)形式對(duì)xdataxdata區(qū)尋址;區(qū)尋址;nXWORDXWORD以字形式對(duì)以字形式對(duì)xdataxdata區(qū)尋址;區(qū)尋址;nPBYTEPBYTE以字節(jié)形式對(duì)以字節(jié)形式對(duì)pdatapdata區(qū)尋址;區(qū)尋址;nPWORDPWORD以字形式對(duì)以字形式對(duì)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_ 可對(duì)指定的存儲(chǔ)器空間的絕對(duì)地址訪問,格式如下:可對(duì)指定的存儲(chǔ)器空間的絕對(duì)地址訪問,格式如下: 存儲(chǔ)器類型存儲(chǔ)器類型 數(shù)據(jù)類型說明符數(shù)據(jù)類型說明符 變量名變量名 _at_ _at_ 地址常數(shù)地址常數(shù)其中,存儲(chǔ)器類型為其中,存儲(chǔ)器類型為C51C51能識(shí)別的數(shù)據(jù)類型;數(shù)據(jù)類型為能識(shí)別的數(shù)據(jù)類型;數(shù)據(jù)類型為C51C51支持的數(shù)據(jù)支持的數(shù)
59、據(jù)類型;地址常數(shù)用于指定變量的絕對(duì)地址,必須位于有效的存儲(chǔ)器空間之類型;地址常數(shù)用于指定變量的絕對(duì)地址,必須位于有效的存儲(chǔ)器空間之內(nèi);內(nèi);使用使用 _at_ _at_ 定義的變量必須為定義的變量必須為全局變量全局變量。39【例例】使用關(guān)鍵字使用關(guān)鍵字 _at_ _at_ 實(shí)現(xiàn)絕對(duì)地址的訪問,程序如下:實(shí)現(xiàn)絕對(duì)地址的訪問,程序如下: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等.壓縮文件請(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025成都市存量房屋買賣合同書
- 2025年中國簡(jiǎn)易腳踏式封口機(jī)市場(chǎng)調(diào)查研究報(bào)告
- 2025年甲基戊烯聚合物項(xiàng)目立項(xiàng)申請(qǐng)報(bào)告模板
- 2025合同范本軟件許可合同樣本模版標(biāo)準(zhǔn)版范本
- 2025年醫(yī)用注射泵項(xiàng)目申請(qǐng)報(bào)告模板
- 大理課件軟件介紹
- 勞務(wù)合同意向協(xié)議書
- 產(chǎn)品經(jīng)理考核題目及答案
- 2025 光伏設(shè)備維護(hù)更新合同
- 腦脊液鼻漏試題及答案
- 廣東省廣州市天河區(qū)2023-2024學(xué)年學(xué)年高一下學(xué)期期末考試數(shù)學(xué)試卷(解析版)
- 上海市2023-2024學(xué)年八年級(jí)下學(xué)期期末數(shù)學(xué)練習(xí)卷(原卷版)
- DL∕T 2024-2019 大型調(diào)相機(jī)型式試驗(yàn)導(dǎo)則
- 人教版小學(xué)數(shù)學(xué)一年級(jí)下冊(cè)第1-4單元教材分析
- 危險(xiǎn)化學(xué)品倉庫安全檢查表
- 2024年咨詢工程師繼續(xù)教育城市軌道交通工程可行性研究報(bào)告編制方法考試答案
- 倉儲(chǔ)管理職位工作手冊(cè)完整版
- 質(zhì)性研究信效度檢驗(yàn)
- 2024年湖南吉利汽車職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫匯編
- 柴油安全技術(shù)說明書
- 2024年廣州市自然資源測(cè)繪有限公司招聘筆試參考題庫附帶答案詳解
評(píng)論
0/150
提交評(píng)論