單片機(jī)八語(yǔ)言編程_第1頁(yè)
單片機(jī)八語(yǔ)言編程_第2頁(yè)
單片機(jī)八語(yǔ)言編程_第3頁(yè)
單片機(jī)八語(yǔ)言編程_第4頁(yè)
單片機(jī)八語(yǔ)言編程_第5頁(yè)
已閱讀5頁(yè),還剩132頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、單片機(jī)八語(yǔ)言編程第1頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二第章單片機(jī)編程語(yǔ)言3.1 單片機(jī)編程語(yǔ)言概述3.2C51語(yǔ)言第2頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二3.1 單片機(jī)編程語(yǔ)言概述 51單片機(jī)的編程語(yǔ)言可以是匯編語(yǔ)言,也可以是高級(jí)語(yǔ)言,如由C語(yǔ)言演變而成的C51語(yǔ)言等。匯編語(yǔ)言產(chǎn)生的目標(biāo)代碼短,占用的存儲(chǔ)空間小,執(zhí)行速度快,能充分發(fā)揮單片機(jī)的硬件功能。但對(duì)于復(fù)雜的應(yīng)用來(lái)講使用匯編語(yǔ)言編程復(fù)雜,程序的可讀性和可移植性不強(qiáng)。高級(jí)語(yǔ)言產(chǎn)生的目標(biāo)代碼長(zhǎng),占用的存儲(chǔ)空間大,執(zhí)行速度慢。但這是相對(duì)于匯編語(yǔ)言來(lái)講的,其實(shí)C語(yǔ)言在大多數(shù)情況下的機(jī)器代碼生成效率和匯

2、編語(yǔ)言相當(dāng),但可讀性和可移植性卻遠(yuǎn)遠(yuǎn)超過(guò)匯編語(yǔ)言,編程效率也大大高于匯編語(yǔ)言。 第3頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二3.1 單片機(jī)編程語(yǔ)言概述如果應(yīng)用系統(tǒng)的存儲(chǔ)空間比較小,且對(duì)實(shí)時(shí)性的要求很高,則應(yīng)選用匯編語(yǔ)言編程。如果系統(tǒng)的存儲(chǔ)空間比較大,且對(duì)實(shí)時(shí)性的要求不是很高,則C51語(yǔ)言是理想的編程語(yǔ)言。如果系統(tǒng)中有部分模塊對(duì)實(shí)時(shí)性的要求很高,而其它模塊對(duì)實(shí)時(shí)性的要求不是很高,則可以將兩種語(yǔ)言結(jié)合,程序的主體部分使用C51編程,對(duì)實(shí)時(shí)性的要求高的模塊用匯編語(yǔ)言編程,然后將匯編語(yǔ)言程序模塊嵌入到C51語(yǔ)言程序當(dāng)中。無(wú)論是高級(jí)語(yǔ)言還是匯編語(yǔ)言寫(xiě)的源程序都必須轉(zhuǎn)換成目標(biāo)程序(機(jī)器語(yǔ)

3、言),單片機(jī)才能執(zhí)行。目前很多公司都將編輯器、匯編器、編譯器、連接/定位器、符號(hào)轉(zhuǎn)換程序做成了軟件包,稱(chēng)為集成開(kāi)發(fā)環(huán)境,如Keil uVision、Silicon Laboratories IDE等。第4頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二3.2C51語(yǔ)言早期的嵌入式系統(tǒng)的硬件的功能相對(duì)較弱,軟件的規(guī)模相對(duì)較小,一般不超過(guò)8K。硬件工程師通常要同時(shí)進(jìn)行軟、硬件設(shè)計(jì),所以一般采用匯編語(yǔ)言來(lái)進(jìn)行程序設(shè)計(jì)。匯編程序的主要缺點(diǎn)是可讀性和可維護(hù)性較差(特別當(dāng)程序沒(méi)有很好的進(jìn)行注釋時(shí)),代碼的可重用性也比較低。目前的嵌入式系統(tǒng)硬件性能和軟件的規(guī)模都有了很大的提高,一般采用C 語(yǔ)言進(jìn)行

4、嵌入式系統(tǒng)程序設(shè)計(jì)。第5頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二使用C語(yǔ)言有以下的優(yōu)點(diǎn):C 語(yǔ)言具有結(jié)構(gòu)化和模塊化特點(diǎn),便于閱讀和維護(hù)。C 語(yǔ)言可移植性好,很多微控制器都支持C 編譯器。功能化的代碼能夠很方便的從一個(gè)工程移植到另一個(gè)工程,從而減少了開(kāi)發(fā)時(shí)間。C 語(yǔ)言編寫(xiě)的程序比匯編語(yǔ)言編寫(xiě)的程序更符合人們的思考習(xí)慣,開(kāi)發(fā)者可以更專(zhuān)心的考慮算法,而不是考慮一些細(xì)節(jié)問(wèn)題。這樣可以減少編程錯(cuò)誤出現(xiàn)的機(jī)率,從而提高開(kāi)發(fā)效率,減少調(diào)試的時(shí)間。C 語(yǔ)言和微控制器是相對(duì)獨(dú)立的,開(kāi)發(fā)者不必知道處理器的具體內(nèi)部結(jié)構(gòu)和處理過(guò)程。當(dāng)基于新型的微控制器開(kāi)發(fā)程序時(shí),可以很快上手,減少學(xué)習(xí)時(shí)間和程序開(kāi)發(fā)

5、時(shí)間。第6頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二盡管C語(yǔ)言有以上的優(yōu)點(diǎn),但這并不是說(shuō)匯編語(yǔ)言過(guò)時(shí)了。很多系統(tǒng)特別是實(shí)時(shí)嵌入式系統(tǒng)都是采用C 和匯編語(yǔ)言進(jìn)行混合編程。對(duì)實(shí)時(shí)響應(yīng)時(shí)間有很?chē)?yán)格要求的應(yīng)用系統(tǒng),使用匯編語(yǔ)言成了開(kāi)發(fā)者的唯一選擇。C51語(yǔ)言是一種專(zhuān)門(mén)為8051單片機(jī)設(shè)計(jì)的高級(jí)語(yǔ)言C編譯器,支持符合ANSI標(biāo)準(zhǔn)的C語(yǔ)言程序設(shè)計(jì),同時(shí)針對(duì)8051單片機(jī)的自身特點(diǎn)做了一些特殊擴(kuò)展。如果有C/C+語(yǔ)言的基礎(chǔ),C51語(yǔ)言能夠很快掌握!第7頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二標(biāo)識(shí)符、關(guān)鍵字標(biāo)識(shí)符與關(guān)鍵字是C語(yǔ)言的基本組成部分。 標(biāo)識(shí)符C語(yǔ)言中的標(biāo)識(shí)符(ide

6、ntifier)是由一個(gè)或多個(gè)字符組成的序列,標(biāo)識(shí)符可以作為變量名、函數(shù)名、數(shù)組名、類(lèi)型名或文件名。標(biāo)識(shí)符的第一個(gè)字符必須是字母或下劃線(xiàn),隨后的字符必須是字母、數(shù)字或下劃線(xiàn)。不同的編譯器定義的標(biāo)識(shí)符的有效長(zhǎng)度不完全相同,但不會(huì)少于8個(gè)字符。為了程序移植方便,標(biāo)識(shí)符的長(zhǎng)度最好不超過(guò)8個(gè)字符。注意1:C語(yǔ)言區(qū)分字母的大小寫(xiě),這和匯編語(yǔ)言是不同的。例如:var 和Var 是兩個(gè)不同的標(biāo)識(shí)符。注意2:C51編譯器6.0以上版本支持標(biāo)識(shí)符的有效長(zhǎng)度為256,超過(guò)部分 忽略。 第8頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二 關(guān)鍵字關(guān)鍵字(key word)是一種具有固定名稱(chēng)和特定含義的標(biāo)識(shí)

7、符,又稱(chēng)為保留字(reserved word)。這些標(biāo)識(shí)符系統(tǒng)已經(jīng)做了定義,有特定的功能。用戶(hù)自定義的標(biāo)識(shí)符不能和關(guān)鍵字同名。ANSI C語(yǔ)言定義了32個(gè)關(guān)鍵字 。第9頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二ANSI C關(guān)鍵字autodogotosignedunsignedbreakdoubleifsizeofvoidcaseelseintstaticvolatilecharenumlongstructwhileconstexternregisterswitchcontinuefloatreturntypedefdefaultforshortunion第10頁(yè),共137頁(yè),2

8、022年,5月20日,2點(diǎn)34分,星期二ANSI C關(guān)鍵字程序控制語(yǔ)句: break case continue default do else for goto if return switch volatile while存儲(chǔ)種類(lèi)說(shuō)明: auto const extern register static數(shù)據(jù)類(lèi)型說(shuō)明: char double enum float int long short signed struct typedef union unsigned void運(yùn)算符: sizeof第11頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二擴(kuò)展關(guān)鍵字命令作用include

9、讀外部文件,用指向包含文件目錄中的文件,用“”指向當(dāng)前目錄中的文件define定義預(yù)處理宏或常數(shù)undef撤銷(xiāo)預(yù)處理宏或常數(shù)定義if條件編譯判斷,若表達(dá)式為真,則開(kāi)始條件編譯分支ifdef條件編譯判斷,若命名已經(jīng)定義,則開(kāi)始條件編譯分支ifndef條件編譯判斷,若命名未定義,則開(kāi)始條件編譯分支elif如果此前的if、ifdef、ifndef或elif未發(fā)生,并且表達(dá)式為真,則開(kāi)始條件編譯else如果此前的if、ifdef、ifndef或elif未發(fā)生,則開(kāi)始條件編譯endif結(jié)束此前的if、ifdef、ifndef、elif或else開(kāi)始的條件編譯分支。error輸出用戶(hù)定義的出錯(cuò)消息分支li

10、ne說(shuō)明行號(hào)和可選的文件名,常用于出錯(cuò)消息中說(shuō)明出錯(cuò)位置pragma說(shuō)明編譯命令,可以是命令行形式中的編譯參數(shù)第12頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二C51關(guān)鍵字關(guān)鍵字用途說(shuō)明_at_地址定位為變量進(jìn)行存儲(chǔ)器絕對(duì)空間地址定位alien函數(shù)特性聲明用以聲明與PL/M51兼容的函數(shù)bdata存儲(chǔ)器類(lèi)型聲明可位尋址的8051內(nèi)部數(shù)據(jù)存儲(chǔ)器bit位變量聲明聲明位變量或位類(lèi)型函數(shù)code存儲(chǔ)器類(lèi)型聲明8051程序存儲(chǔ)器空間compact存儲(chǔ)器模式指定使用8051外部分頁(yè)尋址數(shù)據(jù)存儲(chǔ)空間data存儲(chǔ)器類(lèi)型聲明直接尋址的8051內(nèi)部數(shù)據(jù)存儲(chǔ)器far存儲(chǔ)器類(lèi)型聲明8051外部數(shù)據(jù)存儲(chǔ)器

11、idata存儲(chǔ)器類(lèi)型聲明間接尋址的8051內(nèi)部數(shù)據(jù)存儲(chǔ)器interrupt中斷函數(shù)聲明定義中斷服務(wù)函數(shù)(未完,見(jiàn)下頁(yè))第13頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二C51關(guān)鍵字large存儲(chǔ)器模式指定使用8051外部數(shù)據(jù)存儲(chǔ)空間pdata存儲(chǔ)器類(lèi)型聲明分頁(yè)尋址的8051外部數(shù)據(jù)存儲(chǔ)器_priority_多任務(wù)優(yōu)先聲明規(guī)定RTX51或RTX51 Tiny的任務(wù)優(yōu)先級(jí)reentrant可重入函數(shù)聲明定義可重入函數(shù)sbit位變量聲明聲明可位尋址的特殊功能位sfr特殊功能寄存器聲明聲明8位的特殊功能寄存器sfr16特殊功能寄存器聲明聲明16位的特殊功能寄存器small存儲(chǔ)器模式指定使

12、用8051內(nèi)部數(shù)據(jù)存儲(chǔ)空間_task_任務(wù)聲明定義實(shí)時(shí)多任務(wù)函數(shù)using寄存器組定義定義8051的工作寄存器組xdata存儲(chǔ)器類(lèi)型聲明8051外部數(shù)據(jù)存儲(chǔ)器第14頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二可重入函數(shù)可重入(reentrant)函數(shù)可以由多于一個(gè)任務(wù)并發(fā)使用,而不必?fù)?dān)心數(shù)據(jù)錯(cuò)誤。相反, 不可重入(non-reentrant)函數(shù)不能由超過(guò)一個(gè)任務(wù)所共享,除非能確保函數(shù)的互斥(或者使用信號(hào)量,或者在代碼的關(guān)鍵部分禁用中斷)??芍厝牒瘮?shù)可以在任意時(shí)刻被中斷,稍后再繼續(xù)運(yùn)行,不會(huì)丟失數(shù)據(jù)。可重入函數(shù)要么使用本地變量,要么在使用全局變量時(shí)保護(hù)自己的數(shù)據(jù) 可重入函數(shù): 不

13、為連續(xù)的調(diào)用持有靜態(tài)數(shù)據(jù)。 不返回指向靜態(tài)數(shù)據(jù)的指針;所有數(shù)據(jù)都由函數(shù)的調(diào)用者提供。 使用本地?cái)?shù)據(jù),或者通過(guò)制作全局?jǐn)?shù)據(jù)的本地拷貝來(lái)保護(hù)全局?jǐn)?shù)據(jù)。 絕不調(diào)用任何不可重入函數(shù)。 第15頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二在C51中,還使用了/* */和/符號(hào)進(jìn)行注釋。在/* */符號(hào)中的所有字符均表示注釋說(shuō)明。在/符號(hào)后的該行所有剩余文字均表示注釋說(shuō)明。注釋的語(yǔ)句主要用來(lái)說(shuō)明程序的功能,增加程序的可閱讀性和可維護(hù)性,注釋不影響程序的功能,也不會(huì)在編譯后的程序中出現(xiàn),即不影響運(yùn)行文件的大小。第16頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二C語(yǔ)言的運(yùn)算符符號(hào)意義

14、說(shuō)明+加法運(yùn)算或表示正數(shù)-減法運(yùn)算或表示負(fù)數(shù)*乘法運(yùn)算/除法運(yùn)算當(dāng)2個(gè)整數(shù)相除時(shí),結(jié)果為整數(shù),小數(shù)部分舍去。%模運(yùn)算(求余)參加運(yùn)算的均應(yīng)為整數(shù)。+自增操作數(shù)據(jù)值加1-自減操作數(shù)據(jù)值減1第17頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二例:設(shè)x的初值為4 y=x+; 結(jié)果: x=5 ,y=4解釋?zhuān)簒+先使用x的值,然后x的值再自增。y=+x; 結(jié)果:y=5, x=5解釋?zhuān)?xx的值先自增,然后再使用x的值。y=x-; 結(jié)果:y=4, x=3解釋?zhuān)簒-先使用x的值,然后x的值再自減。y=-x; 結(jié)果:y=3, x=3解釋?zhuān)?xx的值先自減,然后再使用x的值。第18頁(yè),共137頁(yè),2

15、022年,5月20日,2點(diǎn)34分,星期二邏輯運(yùn)算符符號(hào)含義大于=大于等于=等于小于=小于等于!=不等于&邏輯與,二個(gè)操作數(shù)均為真時(shí),其值為真,否則為假|(zhì)邏輯或,二個(gè)操作數(shù)均為假時(shí),其值為假,否則為真!邏輯非,一元運(yùn)算符,操作數(shù)為真,其值為假,操作數(shù)為假,其值為真注意:等于運(yùn)算符用兩個(gè)等號(hào)表示。一個(gè)等號(hào)表示賦值操作。 第19頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二位運(yùn)算符符號(hào)含義&按位與|按位或按位異或按位取反。一元運(yùn)算符右移操作。右邊移出的位舍去,左邊移入的位對(duì)無(wú)符號(hào)數(shù)補(bǔ)0;對(duì)有符號(hào)數(shù)補(bǔ)符號(hào)位第20頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二例:unsigned

16、 char x=0 x55 ; unsigned char y=0 x37 ; unsigned char z;z=x&y ; 則z=0 x15z=x|y ; 則z=0 x77z=xy ; 則z=0 x62z=x; 則z=0 xAAz=x1;則z=0 x2A第21頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二例:unsigned char x=0 x95 ; signed char y=0 x95 ; unsigned char z;z=x1;則z=0 x4Az=y1;則z=0 xCA第22頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二賦值運(yùn)算符通常把=稱(chēng)為賦值運(yùn)算符。

17、它是二元運(yùn)算符,左邊必須是個(gè)變量或數(shù)組元素(稱(chēng)為左值)右邊是表達(dá)式(稱(chēng)為右值)。當(dāng)左值和右值的數(shù)據(jù)類(lèi)型不一致時(shí),數(shù)據(jù)會(huì)自動(dòng)進(jìn)行數(shù)據(jù)類(lèi)型轉(zhuǎn)換。除了=之外,C語(yǔ)言還提供了10種復(fù)合賦值運(yùn)算符,它們的功能是對(duì)左值和右值進(jìn)行相關(guān)運(yùn)算后,將運(yùn)算結(jié)果賦給左值。復(fù)合賦值運(yùn)算符如下所示:+= -= *= /= %= = &= = !=其中前5種是算術(shù)運(yùn)算,后5種是位操作位算。第23頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二逗號(hào)運(yùn)算符逗號(hào)運(yùn)算符的作用是把幾個(gè)表達(dá)式串在一起,成為逗號(hào)表達(dá)式。格式如下:表達(dá)式1,表達(dá)式2,表達(dá)式n注意:逗號(hào)運(yùn)算符的運(yùn)算順序是從左至右,最右邊表達(dá)式的值是整個(gè)逗號(hào)表達(dá)式

18、的值。例如:x=(y=5,z=y+3); 則該語(yǔ)句執(zhí)行完成后y=5,z=8,x=8。第24頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二條件運(yùn)算符條件運(yùn)算符用?與:來(lái)替代簡(jiǎn)單的if-else條件語(yǔ)句。該運(yùn)算符是三元運(yùn)算符。格式如下:表達(dá)式1?表達(dá)式2:表達(dá)式3該運(yùn)算符的功能是若表達(dá)式1為真,則執(zhí)行表達(dá)式2,否則執(zhí)行表達(dá)式3。例如:z=ab?3:5;由于ab的值為假,所以z=5。 第25頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二強(qiáng)制類(lèi)型轉(zhuǎn)換運(yùn)算符在C語(yǔ)言程序的表達(dá)式或變量賦值運(yùn)算中,有時(shí)會(huì)出現(xiàn)運(yùn)算對(duì)象的數(shù)據(jù)類(lèi)型不一致的情況,C語(yǔ)言允許對(duì)參與操作的標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型進(jìn)行隱式轉(zhuǎn)

19、換和顯示轉(zhuǎn)換。隱式轉(zhuǎn)換由系統(tǒng)自動(dòng)按以下優(yōu)先級(jí)進(jìn)行:bit char int long floatsigned unsigned其中,箭頭方向僅表示數(shù)據(jù)類(lèi)型級(jí)別的高低,轉(zhuǎn)換時(shí)由低向高進(jìn)行,而不是數(shù)據(jù)轉(zhuǎn)換時(shí)的順序。例如:char變量和long變量進(jìn)行運(yùn)算,char變量無(wú)需先轉(zhuǎn)換為int然后再轉(zhuǎn)換成long,而是直接由char轉(zhuǎn)換成long。第26頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二某些時(shí)候需要按用戶(hù)的需要進(jìn)行某些數(shù)據(jù)類(lèi)型轉(zhuǎn)換,可使用強(qiáng)制類(lèi)型轉(zhuǎn)換符進(jìn)行顯式轉(zhuǎn)換。強(qiáng)制轉(zhuǎn)換符的功能是將表達(dá)式結(jié)果轉(zhuǎn)換成指定的數(shù)據(jù)類(lèi)型,強(qiáng)制類(lèi)型轉(zhuǎn)換符的運(yùn)算符號(hào)為()。格式為:(類(lèi)型名)(表達(dá)式)例如:

20、 (int)(7.2/2) 將7.2/2的結(jié)果轉(zhuǎn)換為整型,即3。第27頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二sizeof運(yùn)算符C語(yǔ)言中可以用sizeof運(yùn)算符計(jì)算數(shù)據(jù)類(lèi)型變量以及表達(dá)式的字節(jié)數(shù)。它的一般使用形式為:sizeof(表達(dá)式)或sizeof(數(shù)據(jù)類(lèi)型)注意:sizeof是一種特殊的運(yùn)算符,不是函數(shù)。實(shí)際上字節(jié)數(shù)的計(jì)算是在程序編譯時(shí)完成的,而不是在程序執(zhí)行的過(guò)程中才計(jì)算出來(lái)的。 第28頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二其它運(yùn)算符* :指針運(yùn)算符。作用是通過(guò)指針變量間接訪(fǎng)問(wèn)指針變量所指向的變量,對(duì)其進(jìn)行數(shù)據(jù)存取操作。& :取地址運(yùn)算符。作用是獲

21、取變量所占用的存儲(chǔ)單元的地址。 :下標(biāo)運(yùn)算符。作用是用來(lái)獲取數(shù)組的指定單元。- :指向結(jié)構(gòu)成員運(yùn)算符。作用是用結(jié)構(gòu)變量的指針來(lái)訪(fǎng)問(wèn)結(jié)構(gòu)中的成員變量。. :結(jié)構(gòu)成員運(yùn)算符,作用是用結(jié)構(gòu)變量來(lái)訪(fǎng)問(wèn)結(jié)構(gòu)中的成員變量。 第29頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二運(yùn)算優(yōu)先級(jí)優(yōu)先級(jí)符號(hào)含義運(yùn)算對(duì)象個(gè)數(shù)結(jié)合方向1()圓括號(hào)自左向右 下標(biāo)運(yùn)算符-指向結(jié)構(gòu)成員運(yùn)算符.結(jié)構(gòu)成員運(yùn)算符2!邏輯非運(yùn)算符單操作數(shù)自右向左按位取反操作符+自增運(yùn)算符-自減運(yùn)算符-負(fù)號(hào)運(yùn)算符(類(lèi)型)類(lèi)型轉(zhuǎn)換運(yùn)算符*指針運(yùn)算符&取地址運(yùn)算符sizeof長(zhǎng)度運(yùn)算符第30頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星

22、期二優(yōu)先級(jí)符號(hào)含義運(yùn)算對(duì)象個(gè)數(shù)結(jié)合方向3*乘法運(yùn)算符雙操作符自左向右/除法運(yùn)算符%求余運(yùn)算符4+加法運(yùn)算符雙操作符自左向右-減法運(yùn)算符5右移運(yùn)算符6、=關(guān)系運(yùn)算符雙操作符自左向右7=等于運(yùn)算符雙操作符自左向右!=不等于運(yùn)算符第31頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二優(yōu)先級(jí)符號(hào)含義運(yùn)算對(duì)象個(gè)數(shù)結(jié)合方向8&按位與運(yùn)算符雙操作符自左向右9按位異或運(yùn)算符雙操作符自左向右10|按位或運(yùn)算符雙操作符自左向右11&邏輯與運(yùn)算符雙操作符自左向右12|邏輯或運(yùn)算符雙操作符自左向右13?:條件運(yùn)算符三操作符自右向左14=、+=、-=、*=、/=、%=、=、&=、=、|=賦值運(yùn)算符雙操作符自左

23、向右15,逗號(hào)運(yùn)算符自左向右第32頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二數(shù)據(jù)類(lèi)型C語(yǔ)言中的數(shù)據(jù)根據(jù)是否允許數(shù)據(jù)值在程序執(zhí)行過(guò)程中發(fā)生變化,分為常量和變量。常量又稱(chēng)為標(biāo)量,它的值在程序執(zhí)行過(guò)程中不能改變。變量是一種在程序執(zhí)行過(guò)程中,其值能不斷變化的量。使用一個(gè)變量前必須進(jìn)行定義。在C51中變量定義的格式如下: 存儲(chǔ)種類(lèi) 數(shù)據(jù)類(lèi)型 存儲(chǔ)器類(lèi)型 變量名表;第33頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二基本數(shù)據(jù)類(lèi)型C語(yǔ)言的基本數(shù)據(jù)類(lèi)型有char、int、short、long、float和double。對(duì)C51編譯器來(lái)說(shuō):short類(lèi)型與int類(lèi)型相同double類(lèi)

24、型與float類(lèi)型相同。第34頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二存儲(chǔ)區(qū)域8051系列微處理器采用了哈佛體系結(jié)構(gòu),即程序存儲(chǔ)區(qū)和數(shù)據(jù)存儲(chǔ)區(qū)是分離的。8051系列微處理器提供了三種不同類(lèi)型的存儲(chǔ)區(qū)域(memory areas), 程序存儲(chǔ)區(qū)(program memory)內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)(internal data memory)外部數(shù)據(jù)存儲(chǔ)區(qū)(external data memory)這三種存儲(chǔ)區(qū)域均從地址0開(kāi)始編址,通過(guò)采用不同的尋址指令來(lái)解決地址重疊的問(wèn)題。 第35頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二第36頁(yè),共137頁(yè),2022年,5月20日,2

25、點(diǎn)34分,星期二程序存儲(chǔ)區(qū)(program memory)程序存儲(chǔ)區(qū),也稱(chēng)為CODE 區(qū),常用來(lái)存放可執(zhí)行代碼。代碼區(qū)的地址位數(shù)為16 位,即尋址空間可達(dá)64K。一般情況,程序存儲(chǔ)區(qū)是只讀的,除了保存可執(zhí)行代碼,還可用于保存各種常量值,查找表等固定的數(shù)據(jù)結(jié)構(gòu)。第37頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)(internal data memory)內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)(internal data memory),共256個(gè)字節(jié)。這部分主要是作為程序的數(shù)據(jù)段。該區(qū)域的前128 字節(jié),稱(chēng)為DATA 區(qū)。該區(qū)可采用直接尋址方式來(lái)訪(fǎng)問(wèn)。DATA區(qū)也可通過(guò)用R0 和R1存放要操

26、作的數(shù)據(jù)地址,采用間接尋址來(lái)訪(fǎng)問(wèn)。該區(qū)域的后128個(gè)字節(jié),即從地址80H 開(kāi)始的內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū),用做特殊功能寄存器區(qū)(special function register memory),簡(jiǎn)稱(chēng)SFR。這些特殊功能寄存器用來(lái)控制計(jì)時(shí)器,計(jì)數(shù)器,串行I/O,I/O端口和外設(shè)的工作。只能直接尋址注意:特殊功能寄存器并未占用特殊功能寄存器區(qū)的所有地址單元,即特殊功能寄存器是離散分布。第38頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)的DATA區(qū)又可以細(xì)分為三個(gè)子段:第一個(gè)子段包含四個(gè)寄存器組,每個(gè)寄存器組包含8個(gè)寄存器,四個(gè)寄存器組共32 個(gè)字節(jié)??稍谌魏螘r(shí)候通過(guò)修改PSW

27、寄存器的RS1 和RS0兩個(gè)位標(biāo)志來(lái)選擇四組寄存器的任意一組作為當(dāng)前工作寄存器組。第二個(gè)子段叫做位尋址段BDATA, 包括16 個(gè)字節(jié),共128 位,每一位都可單獨(dú)尋址。這16 個(gè)字節(jié)也可像數(shù)據(jù)段中其它字節(jié)一樣按字節(jié)進(jìn)行尋址。第三個(gè)子段為一般的數(shù)據(jù)存儲(chǔ)器,僅能按字節(jié)尋址,共80個(gè)字節(jié)。第39頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二說(shuō)明:某些系列的單片機(jī)(如8052) 有額外的128 字節(jié)的內(nèi)部RAM, 同樣位于從80H 開(kāi)始的內(nèi)部數(shù)據(jù)存儲(chǔ)地址空間中,稱(chēng)為IDATA區(qū)。IDATA 區(qū)的地址和SFR的地址是重疊的,必須使用不同的尋址方式的指令來(lái)解決地址重疊問(wèn)題。SFR區(qū)只能通過(guò)直

28、接尋址來(lái)訪(fǎng)問(wèn), IDATA 區(qū)只能通過(guò)間接尋址來(lái)訪(fǎng)問(wèn)。第40頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二外部數(shù)據(jù)存儲(chǔ)區(qū)(external data memory)外部數(shù)據(jù)存儲(chǔ)區(qū),也稱(chēng)為XDATA 區(qū)。XDATA區(qū)和CODE 區(qū)一樣也采用16 位地址尋址,即尋址空間可達(dá)64KB。該區(qū)通常包括一些通用數(shù)據(jù)存儲(chǔ)器或者一些需要通過(guò)總線(xiàn)接口訪(fǎng)問(wèn)的外圍器件。訪(fǎng)問(wèn)外部數(shù)據(jù)區(qū)比訪(fǎng)問(wèn)內(nèi)部數(shù)據(jù)區(qū)要慢,因?yàn)樵L(fǎng)問(wèn)外部數(shù)據(jù)區(qū)時(shí),必須先將要訪(fǎng)問(wèn)單元的16位地址裝載到數(shù)據(jù)指針寄存器DPTR中,然后才能通過(guò)DPTR采用間接訪(fǎng)問(wèn)方式來(lái)訪(fǎng)問(wèn)該單元。第41頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二C5

29、1使用兩種修飾符來(lái)表示外部數(shù)據(jù)區(qū):xdata , pdataxdata 用來(lái)說(shuō)明外部數(shù)據(jù)空間的所有64KB的地址空間。pdata 用來(lái)指向外部數(shù)據(jù)空間中的大小為一頁(yè)(256字節(jié))的數(shù)據(jù)存儲(chǔ)空間。注意:某些新型的8051芯片有更大的XRAM(如16M的XRAM),一般用far類(lèi)型來(lái)描述這些區(qū)域??梢苑謩e用 far 和const far 來(lái)訪(fǎng)問(wèn)位于擴(kuò)充RAM空間中的變量和擴(kuò)充ROM空間中的常量。第42頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二注意:某些單片機(jī)芯片提供了片內(nèi)的XRAM空間,這種空間也使用和傳統(tǒng)的外部數(shù)據(jù)空間相同的指令來(lái)訪(fǎng)問(wèn)。這種XRAM空間,通常使用芯片專(zhuān)用的SFR配

30、置寄存器來(lái)使能,它和傳統(tǒng)外部存儲(chǔ)空間占用相同的地址空間。第43頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二存儲(chǔ)器類(lèi)型C51編譯器允許8051微處理器使用各種類(lèi)型的存儲(chǔ)區(qū)域??梢栽谧兞柯暶鲿r(shí)使用存儲(chǔ)器類(lèi)型(memory types)來(lái)指定變量所希望占用的存儲(chǔ)區(qū)域。內(nèi)部數(shù)據(jù)區(qū)的訪(fǎng)問(wèn)速度比外部數(shù)據(jù)區(qū)的訪(fǎng)問(wèn)速度高很多。因而一般將經(jīng)常使用的變量放在內(nèi)部數(shù)據(jù)區(qū),將大的或不常使用的變量放在外部數(shù)據(jù)區(qū)。第44頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二存儲(chǔ)器類(lèi)型存儲(chǔ)區(qū)域大小對(duì)應(yīng)的匯編語(yǔ)句描述code程序存儲(chǔ)區(qū)64KBMOVC A,A+DPTR用來(lái)說(shuō)明常量data直接尋址的內(nèi)部數(shù)據(jù)存

31、儲(chǔ)區(qū)128BMOV XX,#ADDR訪(fǎng)問(wèn)速度快idata間接尋址的內(nèi)部數(shù)據(jù)區(qū)256BMOV XX,Rn可訪(fǎng)問(wèn)整個(gè)內(nèi)部數(shù)據(jù)區(qū)域bdata位尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)16B(128b)可使用位尋址或字節(jié)尋址來(lái)訪(fǎng)問(wèn)這一區(qū)域xdata外部數(shù)據(jù)存儲(chǔ)或64KBMOVX A,DPTR使用DPTR來(lái)訪(fǎng)問(wèn)外部數(shù)據(jù)存儲(chǔ)器far擴(kuò)充的RAM和ROM使用用戶(hù)定義的專(zhuān)用例程或特殊芯片指令擴(kuò)展命令pdata分頁(yè)的外部數(shù)據(jù)存儲(chǔ)區(qū)256BMOVX A,Rn利用R0,R1來(lái)訪(fǎng)問(wèn)分頁(yè)的外部數(shù)據(jù)存儲(chǔ)器第45頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二聲明變量時(shí)可以說(shuō)明變量的存儲(chǔ)器類(lèi)型,如下例所示:/內(nèi)部數(shù)據(jù)區(qū)的字符型變量。

32、 char data var1;/在程序區(qū)中定義字串char code text = ENTER PARAMETER:; /外部數(shù)據(jù)區(qū)的長(zhǎng)度為100的無(wú)符號(hào)長(zhǎng)整形數(shù)組unsigned long xdata array100; /內(nèi)部數(shù)據(jù)區(qū),間接尋址方式訪(fǎng)問(wèn)的浮點(diǎn)變量float idata x,y,z; /外部數(shù)據(jù)區(qū),分頁(yè)存儲(chǔ)區(qū)中的無(wú)符號(hào)整型變量unsigned int pdata dimension;/外部數(shù)據(jù)區(qū),無(wú)符號(hào)字符類(lèi)型的三維數(shù)組變量unsigned char xdata vector1044;/內(nèi)部數(shù)據(jù)區(qū),可位操作的字符變量char bdata flags; 說(shuō)明:聲明變量時(shí)存儲(chǔ)區(qū)修

33、飾符和數(shù)據(jù)類(lèi)型修飾符的位置可以互換,即char data x; 和 data char x; 是完全等效的。不過(guò)從兼容性考慮,建議使用前一種格式。第46頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二存儲(chǔ)模式(memory models)如果在變量聲明時(shí)未聲明變量的存儲(chǔ)器類(lèi)型,則該變量的存儲(chǔ)器類(lèi)型,由程序的存儲(chǔ)模式來(lái)決定。小模式(small model)緊湊模式(compact model)大模式(large model)注意:除非應(yīng)用在特殊的場(chǎng)合,否則SMALL存儲(chǔ)模式可以提供最快和最有效的代碼。 第47頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二小模式(small

34、model)在小模式下,所有未聲明存儲(chǔ)器類(lèi)型的變量,缺省駐留在內(nèi)部數(shù)據(jù)區(qū),即這種方式和用data進(jìn)行顯式說(shuō)明一樣。在這種存儲(chǔ)模式下,變量的訪(fǎng)問(wèn)是最有效。但是所有的數(shù)據(jù)對(duì)象(包括堆棧)都必須放在內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)中。第48頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二緊湊模式(compact model)在緊湊模式下,所有未聲明存儲(chǔ)器類(lèi)型的變量,缺省駐留在外部數(shù)據(jù)區(qū)的一個(gè)頁(yè)上,即這種方式和用pdata顯示說(shuō)明一樣。該模式利用R0和R1寄存器來(lái)進(jìn)行間接尋址(R0, R1),此時(shí)最大可尋址256字節(jié)的存儲(chǔ)區(qū)域。這種方式的存取速度比小模式慢,但比大模式快。在緊湊模式下使用了超過(guò)256字節(jié)的外部

35、數(shù)據(jù)存儲(chǔ)區(qū),那么訪(fǎng)問(wèn)單元的高8位地址(即頁(yè)地址)必須由端口P2來(lái)輸出。 開(kāi)發(fā)人員必須在鏈接時(shí)為PDATA設(shè)置合適的開(kāi)始地址。第49頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二大模式(large model)在大模式下,所有未聲明存儲(chǔ)器類(lèi)型的變量,缺省時(shí)駐留在外部數(shù)據(jù)存儲(chǔ)區(qū),即和用xdata顯示說(shuō)明一樣。此時(shí)最大可尋址64K字節(jié)的存儲(chǔ)區(qū)域。此時(shí)使用數(shù)據(jù)指針寄存器(DPTR)來(lái)進(jìn)行間接尋址。使用這種尋址方式效率低,生成的代碼比小模式或緊湊模式下生成的代碼要長(zhǎng)。第50頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二動(dòng)態(tài)存儲(chǔ)分配對(duì)大多數(shù)應(yīng)用來(lái)說(shuō),應(yīng)盡可能在編譯的時(shí)候確定所需要的

36、內(nèi)存空間,但是對(duì)于有些需要使用動(dòng)態(tài)結(jié)構(gòu),如樹(shù)和鏈表的應(yīng)用來(lái)說(shuō),這種方式就不再適用了,這時(shí)必須要使用動(dòng)態(tài)存儲(chǔ)分配。動(dòng)態(tài)存儲(chǔ)分配的實(shí)現(xiàn):用戶(hù)需要聲明一個(gè)字節(jié)數(shù)組作為堆,數(shù)組的大小根據(jù)所需要?jiǎng)討B(tài)內(nèi)存的大小來(lái)決定。該數(shù)組的存儲(chǔ)器類(lèi)型必須被聲明為XDATA,因?yàn)閹?kù)函數(shù)使用具體指針來(lái)進(jìn)行內(nèi)存尋址。將指向堆首地址的指針和堆的大小傳遞給初始化函數(shù)init_mempool ,該函數(shù)將設(shè)置一些內(nèi)部變量并對(duì)動(dòng)態(tài)存儲(chǔ)空間進(jìn)行初始化。初始化工作完成后就可在程序中調(diào)用malloc 和free等C語(yǔ)言動(dòng)態(tài)分配函數(shù)。第51頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二C51語(yǔ)言支持以下幾種動(dòng)態(tài)分配的函數(shù):mall

37、oc:申請(qǐng)內(nèi)存空間。調(diào)用時(shí)將所申請(qǐng)的內(nèi)存空間的大小傳遞給函數(shù),函數(shù)返回一個(gè)內(nèi)存空間指針。如果操作失敗,返回的指針值為NULL。calloc:計(jì)算并申請(qǐng)內(nèi)存空間。調(diào)用時(shí)將所申請(qǐng)的變量數(shù)目和變量所占用的大小傳遞給函數(shù),函數(shù)返回一個(gè)內(nèi)存空間指針。如果操作失敗,返回的指針值為NULL。realloc:重新分配內(nèi)存空間。調(diào)用時(shí)將一個(gè)已經(jīng)申請(qǐng)的內(nèi)存指針和新的內(nèi)存空間大小傳遞給函數(shù),函數(shù)返回一個(gè)內(nèi)存空間指針。如果操作失敗,返回的指針值為NULL。free:釋放內(nèi)存空間。調(diào)用時(shí)將一個(gè)已經(jīng)申請(qǐng)的內(nèi)存指針傳遞給函數(shù),函數(shù)將釋放該內(nèi)存空間。第52頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二C51中的特

38、殊數(shù)據(jù)類(lèi)型C51中有幾種ANSI C所沒(méi)有的特殊數(shù)據(jù)類(lèi)型,這些數(shù)據(jù)類(lèi)型是和存儲(chǔ)區(qū)域和存儲(chǔ)器類(lèi)型的概念密切相關(guān)的。 位變量可位尋址的對(duì)象特殊功能寄存器第53頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二位變量位變量(Bit Types)是指用一個(gè)二進(jìn)制位表示的變量。位數(shù)據(jù)類(lèi)型可以用來(lái)說(shuō)明變量,參數(shù)表,函數(shù)返回值等。位數(shù)據(jù)變量聲明和基本的數(shù)據(jù)類(lèi)型聲明一樣。所有的位變量都存儲(chǔ)在內(nèi)部數(shù)據(jù)區(qū)的位尋址段中。因?yàn)樵摱沃挥?6個(gè)字節(jié)長(zhǎng),所以在一個(gè)作用域內(nèi)最多只能聲明128個(gè)位變量。注意:由于位變量只能存儲(chǔ)在內(nèi)部數(shù)據(jù)存儲(chǔ)區(qū)的位變量區(qū)內(nèi),因此只能使用data 和idata兩種存儲(chǔ)器類(lèi)型修飾符,其它存儲(chǔ)

39、器類(lèi)型是非法的。第54頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二例3.15 位變量的使用static bit done_flag = 0; /* 位變量 */bit testfunc ( /*位函數(shù)返回類(lèi)型 */bit flag1, /*位類(lèi)型參數(shù) */bit flag2 )return (0); /* 位類(lèi)型返回值 */第55頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二位變量定義或聲明時(shí)必須遵循以下規(guī)則:禁止中斷的函數(shù)(#pragma disable)和顯式定義寄存器組( using n )的函數(shù)不能返回位變量。函數(shù)在這種情況下返回位變量時(shí),編譯器將產(chǎn)生一個(gè)錯(cuò)誤

40、信息。不能將指針聲明為指向一個(gè)位類(lèi)型。bit *ptr; /*非法語(yǔ)句 */不能聲明位類(lèi)型的數(shù)組bit ware 5; /*非法語(yǔ)句*/第56頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二可位尋址的對(duì)象可位尋址的對(duì)象(Bit-addressable Objects)是指可以同時(shí)用字節(jié)(字)尋址和位尋址方式進(jìn)行訪(fǎng)問(wèn)的對(duì)象。只有當(dāng)數(shù)據(jù)對(duì)象占據(jù)8051內(nèi)部數(shù)據(jù)區(qū)的可位尋址區(qū)時(shí),才是一個(gè)可位尋址對(duì)象。C51使用bdata存儲(chǔ)器類(lèi)型來(lái)聲明可位尋址對(duì)象。例如:int bdata ibase;/*可位尋址的整形變量 */char bdata bary 4; /* 可位尋址的字符形數(shù)組 */注意:

41、聲明為bdata存儲(chǔ)器類(lèi)型的變量必須為全局變量,不能是局部變量。由于bdata區(qū)為16個(gè)字節(jié),因此可尋址對(duì)象所占存儲(chǔ)空間不能大于16個(gè)字節(jié)。第57頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二上例中的ibase和bary 是可位尋址對(duì)象。因此,這些變量的位可以單獨(dú)的訪(fǎng)問(wèn)和更改??墒褂胹bit關(guān)鍵字聲明位變量來(lái)訪(fǎng)問(wèn)用bdata聲明變量的指定位。sbit mybit0 = ibase 0; /* */sbit mybit15 = ibase 15; /* */sbit ary07 = bary0 7; /* bit 7 of bary0 */sbit ary37 = bary3 7;

42、/* bit 7 of bary3 */表達(dá)式中在符號(hào)后的表達(dá)式定義了位的位置。該表達(dá)式必須是一個(gè)常量。表達(dá)式的取值范圍由變量聲明中的基變量的數(shù)據(jù)類(lèi)型來(lái)決定。對(duì)char 和unsigned char 類(lèi)型,范圍為0-7;對(duì)int, unsigned int, short, unsigned short,為0-15;對(duì)long 和unsigned long 為0-31。第58頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二下面的例子,采用了位尋址,字節(jié)尋址,字尋址來(lái)改變可位尋址對(duì)象的值。ary37 = 1;/* set bit 7 in bary3 */bary3 = a;/* Byt

43、e addressing */ibase = -1;/* Word addressing */mybit15 = 0; /* */可位尋址對(duì)象不僅可以是基本變量類(lèi)型,還可以是結(jié)構(gòu)或聯(lián)合這樣的復(fù)雜數(shù)據(jù)類(lèi)型。第59頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二例3.16以復(fù)雜數(shù)據(jù)類(lèi)型為基變量的可位尋址對(duì)象union lftfloat mf;long ml;bdata struct badchar m1;union lft u; tcp;sbit tcpf31 = tcp.u.ml 31; /* */sbit tcpm10 = tcp.m1 0;sbit tcpm17 = tcp.m1

44、7;第60頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二說(shuō)明:位變量用基地址加位偏移來(lái)獲取實(shí)際的物理地址。物理地址位地址0指向第一個(gè)字節(jié)的0位,8指向第2個(gè)字節(jié)的0位。8051中整型變量存儲(chǔ)時(shí)是高字節(jié)在低地址(第1個(gè)字節(jié)),低字節(jié)在高地址(第2個(gè)字節(jié))。即整型的0位在第2個(gè)字節(jié)的0位上,這個(gè)地址用sbit 來(lái)標(biāo)識(shí)時(shí)是位置8。第61頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二例3.17 位變量與整型變量的對(duì)應(yīng)關(guān)系bdata int iData;/位尋址變量必須為全局變量sbit bTest1=iData8;sbit bTest2=iData0;main()iData=0

45、;bTest1=1;/iData=1;iData=0;bTest2=1;/iData=256;第62頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二特殊功能寄存器8051系列的微控制器提供了一個(gè)獨(dú)立的內(nèi)存區(qū),用來(lái)存放特殊功能寄存器(special function register, SFR)。SFR用來(lái)在程序中控制定時(shí)器,計(jì)數(shù)器,串行I/O,端口I/O操作,以及外設(shè)的操作。SFR駐留在地址0X80到0XFF空間,可按字節(jié)尋址或按字尋址,某些寄存器還可以按位尋址。8051系列微控制器中SFR的個(gè)數(shù)和類(lèi)型是變化的。C51沒(méi)有預(yù)先定義SFR的名字,而是提供了許多8051兼容芯片的包含文件

46、,這些文件對(duì)芯片的SFR進(jìn)行了定義。CX51編譯器用sfr,sfr16,sbit來(lái)進(jìn)行SFR定義。第63頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二sfr:定義8位特殊功能寄存器sfr可以用來(lái)定義8051單片機(jī)的8位特殊功能寄存器。sfr占用一個(gè)字節(jié)內(nèi)存單元,取值范圍是0 255。SFR的聲明和C變量的聲明格式是一樣的,只不過(guò)使用的修飾符不是char 或int 而是sfr。例如:sfr P0 = 0 x80; /* Port-0, address 80h */sfr P1 = 0 x90; /* Port-1, address 90h */sfr P2 = 0 xA0; /* P

47、ort-2, address 0A0h */sfr P3 = 0 xB0; /* Port-3, address 0B0h */P0,P1,P2,P3是sfr聲明的特殊功能寄存器的名稱(chēng)。特殊功能寄存器名稱(chēng)是一個(gè)合法的C標(biāo)識(shí)符。等號(hào)后的地址必須是數(shù)值常量,不允許使用帶運(yùn)算符的表達(dá)式。第64頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二sfr16:定義16位特殊功能寄存器8051芯片可以將兩個(gè)8位SFR作為一個(gè)16位寄存器來(lái)訪(fǎng)問(wèn)。條件是這兩個(gè)SFR必須處在相鄰地址上,并且是低字節(jié)在高字節(jié)地址的前面。C51提供了sfr16數(shù)據(jù)類(lèi)型來(lái)進(jìn)行16位特殊功能寄存器的聲明,聲明時(shí)低字節(jié)地址被用來(lái)作

48、為sfr16的地址。例如:sfr16 T2 = 0 xCC; /* Timer 2: T2L 0CCh, T2H 0CDh */sfr16 RCAP2 = 0 xCA;/* RCAP2L 0CAh, RCAP2H 0CBh */在這個(gè)例子中,T2和RCAP2被聲明為16位的特殊功能寄存器。sfr16聲明和sfr聲明的規(guī)則相同。第65頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二sbit:定義特殊功能位sbit用來(lái)訪(fǎng)問(wèn)SFR中的可尋址位和其它可位尋址對(duì)象的可尋址位。在8051應(yīng)用中,經(jīng)常需要對(duì)SFR中的可尋址位(特殊功能位)進(jìn)行獨(dú)立訪(fǎng)問(wèn)。可以用sbit數(shù)據(jù)類(lèi)型來(lái)將SFR中的可尋址位聲

49、明為特殊功能位。sbit EA = 0 xAF;上例中將EA定義為地址0XAF,對(duì)8051而言這是中斷使能寄存器(IE)的中斷許可位。第66頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二有三種方法來(lái)聲明位地址:方法一: sfr_name int_constant,即SFR寄存器名整形常量。這種方法使用已經(jīng)定義的sfr作為sbit的基地址。該SFR的地址必須能被8整除,符號(hào)后的表達(dá)式定義了可尋址位的位地址。位地址必須是0-7之間的數(shù)。sfr PSW = 0 xD0;/聲明寄存器名sfr IE = 0 xA8;sbit OV = PSW 2;/聲明特殊功能位sbit CY = PSW

50、7;sbit EA = IE 7;第67頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二方法二: int_constant int_constant,即整形常量整形常量。這種方法使用整形常數(shù)作為基地址。該地址必須可以被8整除,符號(hào)后的表達(dá)式定義了可尋址位的位地址。位地址必須是0-7之間的數(shù)。sbit OV = 0 xD0 2;sbit CY = 0 xD0 7;sbit EA = 0 xA8 7;方法三:int_constant用絕對(duì)位地址來(lái)聲明sbit。sbit OV = 0 xD2;sbit CY = 0 xD7;sbit EA = 0 xAF;第68頁(yè),共137頁(yè),2022年,

51、5月20日,2點(diǎn)34分,星期二注意:sbit、bit和位域是三種不同的數(shù)據(jù)類(lèi)型。使用sbit聲明時(shí),基對(duì)象必須可位尋址變量或者是可以位尋址的特殊功能寄存器。類(lèi)型訪(fǎng)問(wèn)對(duì)象sbit可位尋址變量或可位尋址的特殊功能寄存器bit可位尋址區(qū)中的位,共128位位域?qū)⒆止?jié),整型,長(zhǎng)整型的某幾個(gè)位作為一個(gè)數(shù)據(jù)存儲(chǔ)單元,進(jìn)行獨(dú)立訪(fǎng)問(wèn)。第69頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二絕對(duì)變量地址開(kāi)發(fā)者有時(shí)候希望把變量存儲(chǔ)在指定的地址單元中??捎?_at_ 關(guān)鍵詞來(lái)將變量定位在一個(gè)絕對(duì)的內(nèi)存地址單元。使用方法如下:數(shù)據(jù)類(lèi)型 存儲(chǔ)器類(lèi)型 變量名 _at_ 變量所在絕對(duì)地址;在 _at_ 后面的絕對(duì)地址

52、必須符合存儲(chǔ)器類(lèi)型的物理邊界限制,即不超過(guò)存儲(chǔ)區(qū)域的最大可尋址范圍,該地址必須為常數(shù)。第70頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二絕對(duì)變量定位遵循以下約束:絕對(duì)變量不能初始化。類(lèi)型為bit的函數(shù)和變量不能用絕對(duì)地址定位。絕對(duì)變量必須是全局變量,不能是局部變量。第71頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二例3.18struct linkstruct link idata *next;char code *test;struct link list idata _at_ 0 x40; /* list at idata 0 x40 */char xdata t

53、ext256 _at_ 0 xE000; /* array at xdata 0 xE000 */int xdata i1 _at_ 0 x8000; /* i1 at xdata 0 x8000 */void main ( void ) list.next = (void *) 0;i1 = 0 x1234;text 0 = a;第72頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二有時(shí)需要在不同的模塊之間調(diào)用變量,可使用下列的語(yǔ)句來(lái)在另一個(gè)源文件中訪(fǎng)問(wèn)上例中用 _at_修飾的變量。例3.19struct linkstruct link idata *next;char code

54、*test;extern struct link idata list;/* list at idata 0 x40 */extern char xdata text256; /* array at xdata 0 xE000 */extern int xdata i1; /* int at xdata 0 x8000 */第73頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二數(shù)組和指針數(shù)組是一個(gè)由同種類(lèi)型的變量組成的集合,它保存在連續(xù)的存儲(chǔ)區(qū)域中,第一個(gè)元素保存在最低地址中,最末一個(gè)元素保存在最高地址中。數(shù)組可以是一維的也可以是多維的。數(shù)組的定義方式如下:數(shù)據(jù)類(lèi)型 數(shù)組名常量1常量

55、2常量n;這里的n是數(shù)組的維數(shù)。在定義時(shí)可以進(jìn)行數(shù)組元素的初始化,初始化的值放在 中,每個(gè)元素值用逗號(hào)分開(kāi)。如果是對(duì)多維數(shù)組進(jìn)行初始化,還可以使用 將元素維的大小分成組。第74頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二例如:char a23=0,1,2,3,4,5;char a23=0,1,2,3,4,5;以上兩條語(yǔ)句的功能是相同的,執(zhí)行完成后各元素的值如下: (設(shè)初始地址為ADDR)地址對(duì)應(yīng)元素對(duì)應(yīng)值A(chǔ)DDRa000ADDR+1a011ADDR+2a022ADDR+3a103ADDR+4a114ADDR+5a125第75頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期

56、二對(duì)于特殊的字符串?dāng)?shù)組,初始化時(shí)不僅可以采用每個(gè)元素分別賦值,還可以以字符串的形式賦值。如char array20=”hello world”;還可以使維數(shù)的大小為空,由初始化字串的長(zhǎng)度決定數(shù)組的長(zhǎng)度。如char array =”hello world”;上例中,數(shù)組array的長(zhǎng)度為12個(gè)字節(jié)(字符串賦值時(shí)會(huì)增加一個(gè)0字符,作為字符串的結(jié)束標(biāo)志)。第76頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二注意:C語(yǔ)言中的數(shù)組元素的下標(biāo)總是從0開(kāi)始的。多維數(shù)組在內(nèi)存中保存時(shí),下標(biāo)1變化最慢,下標(biāo)n變化最快。第77頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二指針與地址的概念程

57、序中的變量經(jīng)過(guò)編譯處理后都對(duì)應(yīng)著內(nèi)存中的一個(gè)地址。編譯器根據(jù)變量的類(lèi)型,為其分配不同大小的內(nèi)存單元來(lái)存放變量的數(shù)據(jù)。所謂指針,就是某個(gè)變量所占用存儲(chǔ)單元的首地址。用來(lái)存放指針值的變量稱(chēng)為指針變量。指針變量的定義格式如下:類(lèi)型說(shuō)明符 *指針變量名其中:“*”表示定義的是指針變量,類(lèi)型說(shuō)明符表示該指針變量指向的變量的類(lèi)型。第78頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二C51的指針和標(biāo)準(zhǔn)C中的指針功能相同。但是由于8051體系結(jié)構(gòu)的特殊性,C51提供了兩種不同類(lèi)型的指針:通用指針(Generic Pointers)具體指針(Memory-specific Pointers)。通用指

58、針的聲明是和標(biāo)準(zhǔn)C中的指針聲明是相同的,例如:char *s; /* 指向字符類(lèi)型的指針 */int *numptr; /* 指向整型類(lèi)型的指針*/long *state;/* 指向長(zhǎng)整型類(lèi)型的指針 */第79頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二通用指針總是占用三個(gè)字節(jié)。第1個(gè)字節(jié)保存存儲(chǔ)器類(lèi)型編碼值,第2個(gè)字節(jié)保存地址的高字節(jié),第3 個(gè)字節(jié)保存地址的低字節(jié)。許多C51的庫(kù)例程使用這種指針類(lèi)型,通用指針類(lèi)型可以訪(fǎng)問(wèn)任何存儲(chǔ)區(qū)域內(nèi)變量。 存儲(chǔ)器類(lèi)型idata/data/bdataxdatapdatacode編碼值0 x000 x010 xFE0 xFF第80頁(yè),共137頁(yè),

59、2022年,5月20日,2點(diǎn)34分,星期二具體指針是在聲明時(shí)指定了存儲(chǔ)器類(lèi)型的指針,是指向特定存儲(chǔ)區(qū)域中的指針變量。char data *str; /* ptr to string in data */int xdata *numtab; /* ptr to int(s) in xdata */long code *powtab; /* ptr to long(s) in code */具體指針不需要保存存儲(chǔ)器類(lèi)型字節(jié)。具體指針可以保存在一個(gè)字節(jié)(idata, data, bdata, pdata類(lèi)型指針)或2個(gè)字節(jié)(code 和xdata類(lèi)型指針)中。具體指針可以用來(lái)訪(fǎng)問(wèn)8051聲明的存儲(chǔ)區(qū)

60、內(nèi)的變量。具體指針的效率高,但靈活性較差。 第81頁(yè),共137頁(yè),2022年,5月20日,2點(diǎn)34分,星期二指定具體指針本身的存儲(chǔ)類(lèi)型的定義例:char data * xdata ptr; /* ptr in xdata to data char */int xdata * data numtab; /* numtab in data to xdata int */long code * idata powtab; /* powtab in idata to code long */注意:本例中變量定義時(shí)使用了兩個(gè)存儲(chǔ)器類(lèi)型,*前的存儲(chǔ)器類(lèi)型修飾指針指向的數(shù)據(jù),*后的存儲(chǔ)器類(lèi)型修飾指針本身,即

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論