




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、單片機(jī)第五章:C語(yǔ)言程序設(shè)計(jì)分解單片機(jī)-第五章:C語(yǔ)言程序設(shè)計(jì)分解5.1 C語(yǔ)言與語(yǔ)言與MCS-51 C C語(yǔ)言是一種通用的計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言,代碼語(yǔ)言是一種通用的計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言,代碼效率高,數(shù)據(jù)類(lèi)型和運(yùn)算符豐富,有良好的程序結(jié)效率高,數(shù)據(jù)類(lèi)型和運(yùn)算符豐富,有良好的程序結(jié)構(gòu),適用于各種應(yīng)用系統(tǒng)的程序設(shè)計(jì),是目前使用構(gòu),適用于各種應(yīng)用系統(tǒng)的程序設(shè)計(jì),是目前使用較廣的單片機(jī)編程語(yǔ)言。較廣的單片機(jī)編程語(yǔ)言。 本章重點(diǎn)介紹在單片機(jī)上使用本章重點(diǎn)介紹在單片機(jī)上使用MCS-51 CMCS-51 C語(yǔ)言的語(yǔ)言的特殊數(shù)據(jù)類(lèi)型、存儲(chǔ)模式、程序的結(jié)構(gòu)、混合編特殊數(shù)據(jù)類(lèi)型、存儲(chǔ)模式、程序的結(jié)構(gòu)、混合編程。程。5
2、.1.1 C語(yǔ)言程序開(kāi)發(fā)過(guò)程語(yǔ)言程序開(kāi)發(fā)過(guò)程 一般的一般的C C語(yǔ)言開(kāi)發(fā)套件中,包括編譯器、連接器和符號(hào)轉(zhuǎn)語(yǔ)言開(kāi)發(fā)套件中,包括編譯器、連接器和符號(hào)轉(zhuǎn)換程序。換程序。 編譯器將源程序翻譯為可重定位的目標(biāo)代碼文件編譯器將源程序翻譯為可重定位的目標(biāo)代碼文件( (也可產(chǎn)生也可產(chǎn)生等價(jià)的匯編語(yǔ)言程序等價(jià)的匯編語(yǔ)言程序) );連接器將目標(biāo)代碼文件連接為絕對(duì);連接器將目標(biāo)代碼文件連接為絕對(duì)目標(biāo)文件;符號(hào)轉(zhuǎn)換程序可將絕對(duì)目標(biāo)文件轉(zhuǎn)換為目標(biāo)文件;符號(hào)轉(zhuǎn)換程序可將絕對(duì)目標(biāo)文件轉(zhuǎn)換為Intel Intel HEXHEX格式文件,編程到程序存儲(chǔ)器中運(yùn)行。格式文件,編程到程序存儲(chǔ)器中運(yùn)行。 若使用提供了集成開(kāi)發(fā)環(huán)境若使
3、用提供了集成開(kāi)發(fā)環(huán)境(Integrated Development (Integrated Development EnvironmentEnvironment,IDE)IDE)的套件,則編輯、編譯、連接、符號(hào)的套件,則編輯、編譯、連接、符號(hào)轉(zhuǎn)換、甚至調(diào)試可在一個(gè)窗口中完成。如轉(zhuǎn)換、甚至調(diào)試可在一個(gè)窗口中完成。如American American AutomationAutomation、AuocetAuocet、BSO/TASKINGBSO/TASKING、DUNFIELD DUNFIELD SHAREWARESHAREWARE、KEIL/FranklinKEIL/Franklin等。等。5
4、.1.2 C語(yǔ)言的特點(diǎn)語(yǔ)言的特點(diǎn) C C語(yǔ)言是一種模塊化、結(jié)構(gòu)化程序設(shè)計(jì)語(yǔ)言,符合語(yǔ)言是一種模塊化、結(jié)構(gòu)化程序設(shè)計(jì)語(yǔ)言,符合ANSI ANSI C C標(biāo)準(zhǔn),可以產(chǎn)生緊湊的目標(biāo)碼,具體優(yōu)點(diǎn):標(biāo)準(zhǔn),可以產(chǎn)生緊湊的目標(biāo)碼,具體優(yōu)點(diǎn):(1) (1) 不必詳細(xì)了解單片機(jī)的指令系統(tǒng)不必詳細(xì)了解單片機(jī)的指令系統(tǒng)(2) (2) 僅要求對(duì)僅要求對(duì)MCS-51MCS-51存儲(chǔ)器結(jié)構(gòu)有初步了解存儲(chǔ)器結(jié)構(gòu)有初步了解(3) (3) 寄存器分配、不同存儲(chǔ)器區(qū)域的尋址及數(shù)據(jù)類(lèi)型等寄存器分配、不同存儲(chǔ)器區(qū)域的尋址及數(shù)據(jù)類(lèi)型等細(xì)節(jié)由編譯程序管理細(xì)節(jié)由編譯程序管理(4) (4) 程序具有規(guī)范的結(jié)構(gòu)和固有的模塊化思想程序具有規(guī)范的
5、結(jié)構(gòu)和固有的模塊化思想(5) (5) 運(yùn)算符和關(guān)鍵字用接近于自然語(yǔ)言的方式表示運(yùn)算符和關(guān)鍵字用接近于自然語(yǔ)言的方式表示(6) (6) 提供包含大量標(biāo)準(zhǔn)子程序的函數(shù)庫(kù),具有較強(qiáng)的數(shù)提供包含大量標(biāo)準(zhǔn)子程序的函數(shù)庫(kù),具有較強(qiáng)的數(shù)據(jù)處理能力據(jù)處理能力(7) (7) 在對(duì)執(zhí)行效率要求較高的場(chǎng)合,可以嵌入?yún)R編,也可在對(duì)執(zhí)行效率要求較高的場(chǎng)合,可以嵌入?yún)R編,也可以與匯編語(yǔ)言協(xié)同開(kāi)發(fā)以與匯編語(yǔ)言協(xié)同開(kāi)發(fā)5.1.3 單片機(jī)單片機(jī)C語(yǔ)言的移植語(yǔ)言的移植 C C語(yǔ)言在單片機(jī)中的應(yīng)用移植面臨的具體問(wèn)題:語(yǔ)言在單片機(jī)中的應(yīng)用移植面臨的具體問(wèn)題: (1) MCS-51 (1) MCS-51存儲(chǔ)器的哈佛結(jié)構(gòu),加上內(nèi)部有位尋
6、址空存儲(chǔ)器的哈佛結(jié)構(gòu),加上內(nèi)部有位尋址空間,對(duì)存儲(chǔ)器變量的使用提出了挑戰(zhàn)。間,對(duì)存儲(chǔ)器變量的使用提出了挑戰(zhàn)。 (2) (2) 內(nèi)部的數(shù)據(jù)存儲(chǔ)器和程序存儲(chǔ)器空間相對(duì)太小,而外內(nèi)部的數(shù)據(jù)存儲(chǔ)器和程序存儲(chǔ)器空間相對(duì)太小,而外部還可擴(kuò)展存儲(chǔ)容量,編譯程序如何根據(jù)實(shí)際情況合理使用部還可擴(kuò)展存儲(chǔ)容量,編譯程序如何根據(jù)實(shí)際情況合理使用這些空間這些空間 (3) (3) 內(nèi)部各功能單元采用特殊功能寄存器集中管理,在內(nèi)部各功能單元采用特殊功能寄存器集中管理,在C C語(yǔ)語(yǔ)言中如何實(shí)現(xiàn)寄存器訪問(wèn)言中如何實(shí)現(xiàn)寄存器訪問(wèn) (4) MCS-51 (4) MCS-51單片機(jī)派生種類(lèi)繁多,硬件配置不統(tǒng)一,單片機(jī)派生種類(lèi)繁多,硬
7、件配置不統(tǒng)一,但是要求必須能夠使用但是要求必須能夠使用C C語(yǔ)言操控所有硬件資源語(yǔ)言操控所有硬件資源 (5) MCS-51 (5) MCS-51內(nèi)部只有一個(gè)堆棧,且存儲(chǔ)空間有限,傳統(tǒng)的內(nèi)部只有一個(gè)堆棧,且存儲(chǔ)空間有限,傳統(tǒng)的利用堆棧傳遞參數(shù)的方法難以奏效利用堆棧傳遞參數(shù)的方法難以奏效5.2 單片機(jī)單片機(jī)C語(yǔ)言的擴(kuò)充語(yǔ)言的擴(kuò)充 MCS-51 MCS-51單片機(jī)有著與通用單片機(jī)有著與通用CPUCPU截然不同的體系結(jié)構(gòu)截然不同的體系結(jié)構(gòu)、硬件資源和運(yùn)算特性、硬件資源和運(yùn)算特性 針對(duì)單片機(jī)獨(dú)有的一些功能特點(diǎn),絕大多數(shù)的針對(duì)單片機(jī)獨(dú)有的一些功能特點(diǎn),絕大多數(shù)的MCS-51MCS-51的的C C語(yǔ)言編譯程
8、序?qū)?biāo)準(zhǔn)語(yǔ)言編譯程序?qū)?biāo)準(zhǔn)C C語(yǔ)言進(jìn)行了一些擴(kuò)語(yǔ)言進(jìn)行了一些擴(kuò)充充 C語(yǔ)言運(yùn)算符語(yǔ)言運(yùn)算符算術(shù)運(yùn)算符:算術(shù)運(yùn)算符: +, -, +, -, * *, /, % , /, % 關(guān)系運(yùn)算符:關(guān)系運(yùn)算符: , =, , =, =, =, != 邏輯運(yùn)算符:邏輯運(yùn)算符: !, &, | !, &, | 賦值運(yùn)算符:賦值運(yùn)算符: * *=、/=、%=、+=、-=、=、&=、=、= 、+、- ( (位移動(dòng)、異或、位或位移動(dòng)、異或、位或) )強(qiáng)制運(yùn)算符強(qiáng)制運(yùn)算符強(qiáng)制轉(zhuǎn)換表達(dá)式中的類(lèi)型轉(zhuǎn)換算術(shù)表達(dá)式中的運(yùn)算轉(zhuǎn)換賦值轉(zhuǎn)換 輸出轉(zhuǎn)換 函數(shù)調(diào)用轉(zhuǎn)換 C語(yǔ)言運(yùn)算符語(yǔ)言運(yùn)算符intintunsigned intuns
9、igned intlong intlong intdoubledoublefloatfloatchar, shortchar, short存儲(chǔ)長(zhǎng)度較短存儲(chǔ)長(zhǎng)度較短存儲(chǔ)長(zhǎng)度較長(zhǎng)存儲(chǔ)長(zhǎng)度較長(zhǎng)總趨勢(shì):總趨勢(shì):算術(shù)表達(dá)式中的類(lèi)型轉(zhuǎn)換算術(shù)表達(dá)式中的類(lèi)型轉(zhuǎn)換轉(zhuǎn)換規(guī)則轉(zhuǎn)換規(guī)則5.2.2 數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型位數(shù)位數(shù)字節(jié)數(shù)字節(jié)數(shù)范圍范圍bitbit1 1 0 01 1signed charsigned char8 81 1-128-128+127+127unsigned charunsigned char8 81 10 0255255enumenum枚舉變量枚舉變量 8/168/161/21/2-
10、128-128+127 +127 或或 -32768-32768+32767+32767signed shortsigned short16162 2-32768-32768+32767+32767unsigned shortunsigned short16162 20 06553565535signedsigned intint16162 2-32768-32768+32767+32767unsignedunsigned intint16162 20 06553565535signedsigned longlong32324 4-2147483648-2147483648+21473647+
11、21473647unsigned longunsigned long32324 40 042949672954294967295float/doublefloat/double32/6432/644/84/8 1.175494E-381.175494E-38 3.402823E+383.402823E+38sbitsbit1 1 0 01 1sfrsfr8 81 10 0255255sfr16sfr1616162 20 065535655355.2.2 數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型例:例:unsignedunsignedcharcharin_data;in_data;8 8位位unsigned longu
12、nsigned longlog_time;32log_time;32位位bitbitok_flag;ok_flag;1 1位位5.2.3 存儲(chǔ)器類(lèi)型存儲(chǔ)器類(lèi)型存儲(chǔ)器類(lèi)存儲(chǔ)器類(lèi)型型與硬件存儲(chǔ)器空間的對(duì)應(yīng)關(guān)系與硬件存儲(chǔ)器空間的對(duì)應(yīng)關(guān)系codecode程序存儲(chǔ)器;使用程序存儲(chǔ)器;使用MOVC A+DPTRMOVC A+DPTR指令訪問(wèn)指令訪問(wèn)datadata直接尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)器;訪問(wèn)速度最快直接尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)器;訪問(wèn)速度最快(128(128字節(jié)字節(jié)) )idataidata間接訪問(wèn)的內(nèi)部數(shù)據(jù)存儲(chǔ)器;可以訪問(wèn)所有的內(nèi)間接訪問(wèn)的內(nèi)部數(shù)據(jù)存儲(chǔ)器;可以訪問(wèn)所有的內(nèi)部存儲(chǔ)器空間部存儲(chǔ)器空間(256(2
13、56字節(jié)字節(jié)) )bdatabdata可位尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)器;可以字節(jié)方式也可可位尋址的內(nèi)部數(shù)據(jù)存儲(chǔ)器;可以字節(jié)方式也可以位方式訪問(wèn)以位方式訪問(wèn)(16字節(jié)字節(jié))xdataxdata外部數(shù)據(jù)存儲(chǔ)器外部數(shù)據(jù)存儲(chǔ)器(64KB),通過(guò),通過(guò)MOVX DPTR指指令訪問(wèn)令訪問(wèn)pdatapdata外部數(shù)據(jù)存儲(chǔ)器的一頁(yè)外部數(shù)據(jù)存儲(chǔ)器的一頁(yè)(256字節(jié)字節(jié)),使用,使用MOVX Ri指令訪問(wèn)指令訪問(wèn)5.2.3 存儲(chǔ)器類(lèi)型存儲(chǔ)器類(lèi)型例例 指出以下變量的存儲(chǔ)位置指出以下變量的存儲(chǔ)位置char datachar datavar1var1; ;char codechar codetexttext = ENTER P
14、ARAMETER; = ENTER PARAMETER;unsigned long xdataunsigned long xdataarray100;array100;float idatafloat idatax, y, zx, y, z; ;unsigned int pdataunsigned int pdatadimensiondimension; ;unsigned char xdataunsigned char xdatavector1044;vector1044;char bdatachar bdata flagsflags; ;5.2.4 存儲(chǔ)模式存儲(chǔ)模式模式:模式: 所有的變量
15、默認(rèn)存放于內(nèi)部所有的變量默認(rèn)存放于內(nèi)部RAMRAM中,相當(dāng)于定義時(shí)中,相當(dāng)于定義時(shí)使用了使用了datadata類(lèi)型類(lèi)型 所有對(duì)象所有對(duì)象( (包括堆棧包括堆棧) )必須能夠存入內(nèi)部必須能夠存入內(nèi)部RAMRAM的的128128字節(jié)字節(jié)5.2.4 存儲(chǔ)模式存儲(chǔ)模式模式:模式: 所有變量默認(rèn)存放于外部所有變量默認(rèn)存放于外部RAMRAM的一頁(yè)中,相當(dāng)于定的一頁(yè)中,相當(dāng)于定義時(shí)使用了義時(shí)使用了pdatapdata類(lèi)型類(lèi)型 這種存儲(chǔ)模式可以滿(mǎn)足最多這種存儲(chǔ)模式可以滿(mǎn)足最多256256字節(jié)的變量字節(jié)的變量 對(duì)變量的訪問(wèn)必須使用間接尋址方式對(duì)變量的訪問(wèn)必須使用間接尋址方式 編譯程序產(chǎn)生的機(jī)器碼使用編譯程序產(chǎn)生
16、的機(jī)器碼使用R0R0和和R1R1作為變量的指作為變量的指令操作數(shù)令操作數(shù)5.2.4 存儲(chǔ)模式存儲(chǔ)模式模式:模式: 所有變量默認(rèn)存放于外部所有變量默認(rèn)存放于外部RAMRAM中,最多可以有中,最多可以有64KB64KB,相當(dāng)于定義時(shí)使用了,相當(dāng)于定義時(shí)使用了xdataxdata類(lèi)型類(lèi)型 數(shù)據(jù)指針數(shù)據(jù)指針DPTRDPTR用來(lái)尋址變量用來(lái)尋址變量 這種訪問(wèn)方式效率不高,特別是當(dāng)變量長(zhǎng)度超過(guò)這種訪問(wèn)方式效率不高,特別是當(dāng)變量長(zhǎng)度超過(guò)一個(gè)字節(jié)時(shí)一個(gè)字節(jié)時(shí)5.2.4 存儲(chǔ)模式存儲(chǔ)模式 現(xiàn)在常用的現(xiàn)在常用的C C編譯程序通常允許使用混合模式編譯程序通常允許使用混合模式 不管存儲(chǔ)模式如何,把經(jīng)常使用的變量強(qiáng)制存
17、放于不管存儲(chǔ)模式如何,把經(jīng)常使用的變量強(qiáng)制存放于內(nèi)部?jī)?nèi)部RAMRAM。大塊數(shù)據(jù)則存放于外部。大塊數(shù)據(jù)則存放于外部RAMRAM,而將其指針,而將其指針存放于內(nèi)部存放于內(nèi)部RAMRAM中,可以使用存儲(chǔ)器類(lèi)型說(shuō)明符指定中,可以使用存儲(chǔ)器類(lèi)型說(shuō)明符指定5.2.5 硬件資源訪問(wèn)硬件資源訪問(wèn)1.1.特殊功能寄存器:特殊功能寄存器: 使用使用sfrsfr、sfr16sfr16和和sbitsbit數(shù)據(jù)類(lèi)型訪問(wèn)特殊功能寄數(shù)據(jù)類(lèi)型訪問(wèn)特殊功能寄存器存器 特殊功能寄存器中的位特殊功能寄存器中的位 使用使用sbitsbit類(lèi)型可以定義可位尋址類(lèi)型可以定義可位尋址SFRSFR中的位中的位 sfr sfrP0 = 0 x
18、80;P0 = 0 x80;地址地址 sfr sfrACC = 0 xE0;ACC = 0 xE0;實(shí)際地址實(shí)際地址 sbit sbitCY = 0 xD7;CY = 0 xD7;位地址位地址5.2.5 硬件資源訪問(wèn)硬件資源訪問(wèn)2.2.內(nèi)部?jī)?nèi)部RAMRAM中的位尋址資源中的位尋址資源 定義一個(gè)變量時(shí)若指定了定義一個(gè)變量時(shí)若指定了bdatabdata存儲(chǔ)器類(lèi)型,存儲(chǔ)器類(lèi)型,C C編編譯程序會(huì)在內(nèi)部譯程序會(huì)在內(nèi)部RAMRAM的位尋址區(qū)為其分配存儲(chǔ)空間的位尋址區(qū)為其分配存儲(chǔ)空間 這個(gè)變量中的位也可以單獨(dú)訪問(wèn),但必須先行定這個(gè)變量中的位也可以單獨(dú)訪問(wèn),但必須先行定義義 unsigned char bd
19、ataunsigned char bdatadata8;data8;位尋址區(qū)變量位尋址區(qū)變量 sbit sbitlsb = data80lsb = data80;data8;data8的最低位的最低位5.2.5 硬件資源訪問(wèn)硬件資源訪問(wèn)3.3.指定絕對(duì)地址的變量指定絕對(duì)地址的變量 使用使用_at_at_滿(mǎn)足這一要求,其格式如下。滿(mǎn)足這一要求,其格式如下。 存儲(chǔ)器類(lèi)型存儲(chǔ)器類(lèi)型 變量類(lèi)型變量類(lèi)型 變量名變量名 _at_ _at_ 地址常地址常數(shù)數(shù); ; xdata xdataunsigned char buff _at_ 0 x202X;unsigned char buff _at_ 0 x20
20、2X;5.2.5 硬件資源訪問(wèn)硬件資源訪問(wèn)4.4.存儲(chǔ)器絕對(duì)地址的訪問(wèn)存儲(chǔ)器絕對(duì)地址的訪問(wèn) 中包含了一些宏定義,使用這些宏可以顯示使用存儲(chǔ)器中包含了一些宏定義,使用這些宏可以顯示使用存儲(chǔ)器絕對(duì)地址,如絕對(duì)地址,如#define#defineCBYTECBYTE(unsigned char volatile (unsigned char volatile code code * *) 0) 0) CBYTE CBYTE代表程序存儲(chǔ)器地址代表程序存儲(chǔ)器地址0000H0000H的字節(jié)單元的字節(jié)單元 把每個(gè)存儲(chǔ)區(qū)定義成一個(gè)字節(jié)或字?jǐn)?shù)組,對(duì)指定地址的把每個(gè)存儲(chǔ)區(qū)定義成一個(gè)字節(jié)或字?jǐn)?shù)組,對(duì)指定地址的訪問(wèn)使
21、用數(shù)組元素引用的形式訪問(wèn)使用數(shù)組元素引用的形式5.2.6 指針指針1.1.基于存儲(chǔ)器的指針基于存儲(chǔ)器的指針 與源程序中存儲(chǔ)器類(lèi)型有關(guān),編譯時(shí)即可確定其與源程序中存儲(chǔ)器類(lèi)型有關(guān),編譯時(shí)即可確定其長(zhǎng)度。這種指針的長(zhǎng)度可以為長(zhǎng)度。這種指針的長(zhǎng)度可以為1 1個(gè)字節(jié)個(gè)字節(jié)(data (data * *、idata idata * *、pdata pdata * *) )或或2 2個(gè)字節(jié)個(gè)字節(jié)(code (code * *、xdata xdata * *) ) char chardatadata * *str;str;指向指向datadata字符的指針字符的指針 intintxdata xdata * *
22、numnum; 指向整形數(shù)據(jù)指向整形數(shù)據(jù) longlongcodecode * *pow; pow; 指向長(zhǎng)整形代碼指向長(zhǎng)整形代碼5.2.6 指針指針 char chardatadata * *str;str;指向指向datadata字符的指針字符的指針 intintxdata xdata * *numnum; 指向整形數(shù)據(jù)指向整形數(shù)據(jù) longlongcodecode * *pow; pow; 指向長(zhǎng)整形代碼指向長(zhǎng)整形代碼 上述三個(gè)指針變量長(zhǎng)度分別為上述三個(gè)指針變量長(zhǎng)度分別為1 1、2 2、2 2字節(jié)。指字節(jié)。指針變量自身所占用的存儲(chǔ)位置還能定義針變量自身所占用的存儲(chǔ)位置還能定義 charc
23、hardatadata * *xdataxdatastr;str; intintxdata xdata * *datadatanumnum; longlongcodecode * *idataidatapow; pow; 5.2.6 指針指針2.2.通用指針通用指針 與標(biāo)準(zhǔn)與標(biāo)準(zhǔn)C C語(yǔ)言指針的定義相同語(yǔ)言指針的定義相同 使用使用3 3個(gè)字節(jié)存儲(chǔ)指針內(nèi)容個(gè)字節(jié)存儲(chǔ)指針內(nèi)容( (地址值地址值) )。第一個(gè)字。第一個(gè)字節(jié)存放存儲(chǔ)器類(lèi)型,第二和第三節(jié)分別存放該指針節(jié)存放存儲(chǔ)器類(lèi)型,第二和第三節(jié)分別存放該指針?biāo)笇?duì)象地址的高字節(jié)和低字節(jié)所指對(duì)象地址的高字節(jié)和低字節(jié)5.2.6 指針指針2.2.通用指針通
24、用指針 一般指針包括一般指針包括3 3個(gè)字節(jié):個(gè)字節(jié):1 1個(gè)字節(jié)存儲(chǔ)類(lèi)型和個(gè)字節(jié)存儲(chǔ)類(lèi)型和2 2個(gè)字節(jié)偏移個(gè)字節(jié)偏移地址,即地址,即地址地址+0+1+2內(nèi)容內(nèi)容存儲(chǔ)器類(lèi)型存儲(chǔ)器類(lèi)型偏移地址高偏移地址高位字節(jié)位字節(jié)偏移地址低偏移地址低位字節(jié)位字節(jié) 其中,第一字節(jié)代表了指針的存儲(chǔ)器類(lèi)型,存儲(chǔ)器類(lèi)型其中,第一字節(jié)代表了指針的存儲(chǔ)器類(lèi)型,存儲(chǔ)器類(lèi)型編碼如下:編碼如下:存儲(chǔ)器存儲(chǔ)器類(lèi)型類(lèi)型idataxdatapdatadatacode值值123455.2.6 指針指針 char char* *strstr; ;指向字符的指針指向字符的指針 intint* *numnum; ;指向整形數(shù)據(jù)的指針指向整形
25、數(shù)據(jù)的指針 第第1 1字節(jié)放存儲(chǔ)器類(lèi)型,字節(jié)放存儲(chǔ)器類(lèi)型,2 2、3 3字節(jié)放該指針?biāo)笇?duì)字節(jié)放該指針?biāo)笇?duì)象地址的高、低字節(jié)。象地址的高、低字節(jié)。 xdata xdataintintx x ;x ;x位于外部位于外部RAMRAM中中 int int* *data data pxpx, , * *data data pypy; ; px = &x px = &x ; ;賦值語(yǔ)句,賦值語(yǔ)句,pxpx指向指向x x py = 0 x021234 ; py py = 0 x021234 ; py指向外部指向外部RAMRAM的的1234H1234H單元單元 * *px = 1000px = 1000
26、; ;單元內(nèi)容賦值單元內(nèi)容賦值10001000 * *py = -1py = -1 ; ;單元內(nèi)容賦值單元內(nèi)容賦值FFFFHFFFFH5.3 C語(yǔ)言程序結(jié)構(gòu)語(yǔ)言程序結(jié)構(gòu) 單片機(jī)單片機(jī)C C語(yǔ)言程序與標(biāo)準(zhǔn)語(yǔ)言程序與標(biāo)準(zhǔn)C C程序一樣,具有固有的程序一樣,具有固有的模塊化思想模塊化思想 各種功能由函數(shù)實(shí)現(xiàn)各種功能由函數(shù)實(shí)現(xiàn) 整體上就是一個(gè)函數(shù)逐級(jí)調(diào)用的樹(shù)狀結(jié)構(gòu)整體上就是一個(gè)函數(shù)逐級(jí)調(diào)用的樹(shù)狀結(jié)構(gòu) 程序的入口為程序的入口為mainmain函數(shù),在每個(gè)函數(shù)內(nèi)部可以使函數(shù),在每個(gè)函數(shù)內(nèi)部可以使用結(jié)構(gòu)化程序設(shè)計(jì)技術(shù)的三種結(jié)構(gòu)用結(jié)構(gòu)化程序設(shè)計(jì)技術(shù)的三種結(jié)構(gòu)5.3.1 函數(shù)函數(shù)1.1.函數(shù)定義函數(shù)定義 返回值
27、類(lèi)型返回值類(lèi)型 函數(shù)名稱(chēng)函數(shù)名稱(chēng)( (參數(shù)表參數(shù)表) small | ) small | compact | large reentrant interrupt n compact | large reentrant interrupt n using n using n 若省略返回值類(lèi)型部分,默認(rèn)為整型若省略返回值類(lèi)型部分,默認(rèn)為整型(int)(int) 可以指定該函數(shù)的存儲(chǔ)模式,以取代默認(rèn)值可以指定該函數(shù)的存儲(chǔ)模式,以取代默認(rèn)值 若使用了若使用了usingusing,編譯程序?qū)a(chǎn)生切換工作寄存器組的,編譯程序?qū)a(chǎn)生切換工作寄存器組的代碼代碼 對(duì)于有返回值的函數(shù),不能使用對(duì)于有返回值的函數(shù),
28、不能使用usingusing,因?yàn)榉祷刂凳峭ǎ驗(yàn)榉祷刂凳峭ㄟ^(guò)寄存器傳遞的過(guò)寄存器傳遞的5.3.1 函數(shù)函數(shù)參數(shù)個(gè)數(shù)參數(shù)個(gè)數(shù)charchar或字節(jié)或字節(jié)指針指針intint或或2 2字節(jié)字節(jié)指針指針longlong或或floatfloat通用指針通用指針1 1R7R7R6R6、R7R7R4R4R7R7R1R1R3R32 2R7R7 R5R5R4R4、R5 R6R5 R6、R7R7R4R4R7R7R1R1R3R33 3R7 R5R7 R5 R3R3R2R2、R3R4R3R4、R5 R6R5 R6、R7R7R1R1R3R32.2.參數(shù)傳遞參數(shù)傳遞 參數(shù)用于向函數(shù)傳遞數(shù)據(jù),作為函數(shù)的輸入。參數(shù)用于向
29、函數(shù)傳遞數(shù)據(jù),作為函數(shù)的輸入。 傳統(tǒng)傳統(tǒng)C C語(yǔ)言中參數(shù)是通過(guò)堆棧傳遞的,單片機(jī)中是通過(guò)語(yǔ)言中參數(shù)是通過(guò)堆棧傳遞的,單片機(jī)中是通過(guò)存儲(chǔ)器或寄存器傳遞的。存儲(chǔ)器或寄存器傳遞的。 傳遞參數(shù)的寄存器分配傳遞參數(shù)的寄存器分配5.3.1 函數(shù)函數(shù)3.3.返回值返回值 總是通過(guò)寄存器送回的總是通過(guò)寄存器送回的返回值類(lèi)型返回值類(lèi)型寄存器寄存器描述描述bitbitCYCY標(biāo)志標(biāo)志 charchar,unsigned charunsigned char,或,或1 1字節(jié)字節(jié)指針指針R7R7 intint,unsigned intunsigned int,或,或2 2字節(jié)指針字節(jié)指針R6 & R7R6 & R7最
30、高有效位在最高有效位在R6R6中,最低有效位在中,最低有效位在R7R7中中l(wèi)onglong或或unsigned long unsigned long R4R4R7R7最高有效位在最高有效位在R4R4中,最低有效位在中,最低有效位在R7R7中中floatfloatR4R4R7R73232位位IEEEIEEE格式格式通用指針通用指針R1R1R3R3存儲(chǔ)器類(lèi)型在存儲(chǔ)器類(lèi)型在R3R3中,最高有效位在中,最高有效位在R2R2中中,最低有效位在,最低有效位在R1R1中中5.3.1 函數(shù)函數(shù)4.4.內(nèi)部函數(shù)和外部函數(shù)內(nèi)部函數(shù)和外部函數(shù) 如果一個(gè)函數(shù)只能在其定義的文件中被調(diào)用,稱(chēng)之為內(nèi)部函如果一個(gè)函數(shù)只能在其
31、定義的文件中被調(diào)用,稱(chēng)之為內(nèi)部函數(shù)數(shù) 定義內(nèi)部函數(shù)時(shí),需用定義內(nèi)部函數(shù)時(shí),需用staticstatic存儲(chǔ)類(lèi)說(shuō)明符。存儲(chǔ)類(lèi)說(shuō)明符。 內(nèi)部函數(shù)也稱(chēng)作靜態(tài)函數(shù)內(nèi)部函數(shù)也稱(chēng)作靜態(tài)函數(shù) 定義內(nèi)部函數(shù)可以使它只局限于所在的文件,當(dāng)在不同文定義內(nèi)部函數(shù)可以使它只局限于所在的文件,當(dāng)在不同文件中有同名的函數(shù)時(shí)互不干擾件中有同名的函數(shù)時(shí)互不干擾 允許在其他文件中調(diào)用的函數(shù)為外部函數(shù),可以使用允許在其他文件中調(diào)用的函數(shù)為外部函數(shù),可以使用externextern存儲(chǔ)類(lèi)說(shuō)明符指明。函數(shù)定義時(shí),默認(rèn)為外部函數(shù)。存儲(chǔ)類(lèi)說(shuō)明符指明。函數(shù)定義時(shí),默認(rèn)為外部函數(shù)。5.3.1 函數(shù)函數(shù)5.5.可重入函數(shù)可重入函數(shù) C C編譯
32、程序通常將函數(shù)的局部變量分配在存儲(chǔ)器的固定位編譯程序通常將函數(shù)的局部變量分配在存儲(chǔ)器的固定位置置 如果正在執(zhí)行該函數(shù)時(shí)發(fā)生了中斷,而中斷服務(wù)程序中如果正在執(zhí)行該函數(shù)時(shí)發(fā)生了中斷,而中斷服務(wù)程序中也調(diào)用該函數(shù),先前的局部變量值便會(huì)被破壞。也調(diào)用該函數(shù),先前的局部變量值便會(huì)被破壞。 類(lèi)似的情況在實(shí)現(xiàn)函數(shù)遞歸調(diào)用時(shí)也會(huì)發(fā)生類(lèi)似的情況在實(shí)現(xiàn)函數(shù)遞歸調(diào)用時(shí)也會(huì)發(fā)生 定義為可重入函數(shù)后,編譯程序產(chǎn)生能夠保護(hù)局部變量的定義為可重入函數(shù)后,編譯程序產(chǎn)生能夠保護(hù)局部變量的代碼代碼 reentrant reentrant5.3.1 函數(shù)函數(shù)6.6.中斷處理函數(shù)中斷處理函數(shù) 中斷服務(wù)程序,是中斷服務(wù)程序,是CPUC
33、PU響應(yīng)中斷后要執(zhí)行的一段程序,在響應(yīng)中斷后要執(zhí)行的一段程序,在C C語(yǔ)言中組織成一個(gè)函數(shù)的形式語(yǔ)言中組織成一個(gè)函數(shù)的形式 編寫(xiě)中斷處理函數(shù)時(shí),程序員僅需關(guān)心中斷類(lèi)型號(hào)和編寫(xiě)中斷處理函數(shù)時(shí),程序員僅需關(guān)心中斷類(lèi)型號(hào)和寄存器組的選擇,編譯程序會(huì)自動(dòng)產(chǎn)生中斷向量和返回寄存器組的選擇,編譯程序會(huì)自動(dòng)產(chǎn)生中斷向量和返回地址的入棧及出棧代碼地址的入棧及出棧代碼 interrupt interrupt using using5.3.1 函數(shù)函數(shù)函數(shù)函數(shù) 一些常用的只進(jìn)行簡(jiǎn)單處理的函數(shù),一些常用的只進(jìn)行簡(jiǎn)單處理的函數(shù),LCALLLCALL或或ACALLACALL的執(zhí)行代價(jià)太高的執(zhí)行代價(jià)太高 intrinsi
34、c intrinsic函數(shù)是一類(lèi)用匯編語(yǔ)言代碼實(shí)現(xiàn)的短小函數(shù)是一類(lèi)用匯編語(yǔ)言代碼實(shí)現(xiàn)的短小函數(shù),若有對(duì)函數(shù),若有對(duì)intrinsicintrinsic函數(shù)的調(diào)用,編譯程序?qū)⒑瘮?shù)的調(diào)用,編譯程序?qū)?huì)直接用被調(diào)用函數(shù)代碼替換函數(shù)調(diào)用語(yǔ)句會(huì)直接用被調(diào)用函數(shù)代碼替換函數(shù)調(diào)用語(yǔ)句5.3.2 流程控制流程控制1.1.分支分支 if if語(yǔ)句語(yǔ)句 switch-case switch-case結(jié)構(gòu)結(jié)構(gòu)2.2.循環(huán)循環(huán) goto goto語(yǔ)句語(yǔ)句 while while結(jié)構(gòu)結(jié)構(gòu) dowhile dowhile結(jié)構(gòu)結(jié)構(gòu) for for結(jié)構(gòu)結(jié)構(gòu) break break和和continuecontinue語(yǔ)句語(yǔ)句5.3.3 輸入與輸出輸入與輸出 一些一些C C開(kāi)發(fā)環(huán)境提供了流式輸入開(kāi)發(fā)環(huán)境提供了流式輸入/ /輸出函數(shù),可以實(shí)現(xiàn)通輸出函數(shù),可以實(shí)現(xiàn)通過(guò)串行口或用戶(hù)自定義過(guò)串行口或用戶(hù)自定義I/OI/O接口的輸入接口的輸入/ /輸出操作,例如輸出操作,例如getcharget
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- T/CARSA 1.1-2022基于低空無(wú)人機(jī)的高分衛(wèi)星遙感產(chǎn)品真實(shí)性檢驗(yàn)第1部分:總則
- T/CAPMA 7-2021土種綿羊原毛交易技術(shù)指南
- T/CAPE 12002-2021氣柜密封油
- 電子工程師面試題及答案
- 伊利面試題及答案
- 環(huán)保面試題及答案
- 軍工產(chǎn)品定價(jià)管理制度
- 家長(zhǎng)會(huì)英語(yǔ)老師發(fā)言稿模版
- 小學(xué)語(yǔ)文《橋》教案
- 快畢業(yè)后離開(kāi)學(xué)校協(xié)議書(shū)
- 河南省成人高等教育畢業(yè)生畢業(yè)資格審查表
- 報(bào)修申請(qǐng)表(完整版)
- 師帶徒培養(yǎng)方案范文
- 山東萊陽(yáng)核電項(xiàng)目一期工程水土保持方案
- 臨床醫(yī)學(xué)概論課程的婦產(chǎn)科學(xué)與生殖醫(yī)學(xué)
- 2024年中國(guó)鐵路物資西安有限公司招聘筆試參考題庫(kù)含答案解析
- PDCA降低護(hù)士針刺傷發(fā)生率
- 幼兒園大班美術(shù)《臉部彩繪》
- 2021年安全生產(chǎn)月:安全執(zhí)行力培養(yǎng)專(zhuān)題培訓(xùn)課件
- 陜西碑刻總目提要編纂凡例
- GB/T 3785.1-2023電聲學(xué)聲級(jí)計(jì)第1部分:規(guī)范
評(píng)論
0/150
提交評(píng)論