版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第2章 MSP430單片機(jī)原理與C語(yǔ)言基礎(chǔ)MSP430系列超低功耗單片機(jī)有200多種型號(hào),TI 公司用3 4位數(shù)字表示其型號(hào)。其中第一位數(shù)字表示大系列,如MSP430F1xx系列、MSP430F2xx系列、MSP430F4xx系列、MSP430F5xx系列等。在每個(gè)大系列中,又分若干子系列,單片機(jī)型號(hào)中的第二位數(shù)字表示子系列號(hào),一般子系列越大,所包含的功能模塊越多。最后12 位數(shù)字表示存儲(chǔ)容量,數(shù)字越大表示 RAM 和 ROM 容量越大。430 家族中還有針對(duì)熱門(mén)應(yīng)用而設(shè)計(jì)的一系列專用單片機(jī)。如 SP430FW4xx 系列水表專用單片機(jī)、MSP430FG4xx 系列醫(yī)療儀器專用單片機(jī)、MSP4
2、30FE4xx 系列電能計(jì)量專用單片機(jī)等。這些專用單片機(jī)都是在同型號(hào)的通用單片機(jī)上增加專用模塊而構(gòu)成的。最新的MSP430型號(hào)列表可以通過(guò) TI 公司網(wǎng)站下載。在開(kāi)發(fā)單片機(jī)應(yīng)用系統(tǒng)時(shí),第一步就是單片機(jī)的選型,選擇合適的單片機(jī)型號(hào)往往就能事半功倍。單片機(jī)選型基本方法是選擇功能模塊最接近項(xiàng)目需求的系列,然后根據(jù)程序復(fù)雜程度估算存儲(chǔ)器和 RAM 空間,并留有適當(dāng)?shù)挠嗔?,最終決定選用的單片機(jī)型號(hào)。本章節(jié)以MSP430F249單片機(jī)為學(xué)習(xí)目標(biāo),介紹單片機(jī)的基本結(jié)構(gòu)和工作原理,讀者可以舉一反三、觸類(lèi)旁通,而不必每種型號(hào)都去學(xué)習(xí)卻無(wú)法深入掌握。2.1 MSP430F249單片機(jī)基本結(jié)構(gòu)與原理2.1.1MSP
3、430F249的主要結(jié)構(gòu)特點(diǎn)l 供電電壓范圍 1.8V3.6V。l 超低功耗:活動(dòng)狀態(tài)270uA(1MHz,2.2V);待機(jī)模式0.3uA;關(guān)機(jī)模式0.1uA。l 16位RISC精簡(jiǎn)指令集處理器。l 時(shí)鐘系統(tǒng):多種時(shí)鐘源,可靈活使用。時(shí)鐘頻率達(dá)到16MHz;具有內(nèi)部振蕩器;可外接32kHz低頻晶振;外接時(shí)鐘輸入。l 12位A/D轉(zhuǎn)換器,內(nèi)部參考電壓,采用保持電路。l 16位定時(shí)器A,3個(gè)捕獲/比較寄存器。l 16位定時(shí)器B,7個(gè)捕獲/比較寄存器。l 4個(gè)通用串口:USCI_A0和USCI_A1、USCI_B0和USCI_B1(I2C、SPI)。l 60kB+256B的flash程序存儲(chǔ)器,2k
4、B的RAM數(shù)據(jù)存儲(chǔ)器。l 64引腳QFP封裝。MSP430F249單片機(jī)的芯片封裝形式如圖2.1所示,各引腳的功能描述如表2-1所列。2.1.2 MSP430F249單片機(jī)的基本結(jié)構(gòu)MSP430F24x系列單片機(jī)功能結(jié)構(gòu)示意圖如圖2.2所示。(1)CPU簡(jiǎn)介MSP430單片機(jī)的CPU為16位RISC精簡(jiǎn)指令集的處理器,只有27條正交匯編指令和7種尋址方式。RISC處理器基本上是為高級(jí)語(yǔ)言所設(shè)計(jì)的,編譯程序?qū)φ恢噶钕到y(tǒng)很容易做到最優(yōu)化,利于產(chǎn)生高效緊湊的代碼。MSP430CPU中集成了16個(gè)16位通用寄存器R0R15,其中R0R3分別復(fù)用為程序指針PC、堆棧指針SP、狀態(tài)寄存器SR和常數(shù)發(fā)生器
5、CG1/CG2。這些寄存器之間的操作只需要一個(gè)CPU周期。1)程序計(jì)數(shù)器(PC指針)也就是CPU專用寄存器R0,PC指針是一個(gè)16位寄存器,可以尋址64kB的空間。MSP430單片機(jī)的指令長(zhǎng)度以字(16位)為最小單位,而程序存儲(chǔ)器單元以字節(jié)(8位)為單位,所以PC的值總是偶數(shù)。圖2.1 MSP430F249單片機(jī)引腳圖圖2.2 MSP430F24x系列單片機(jī)功能結(jié)構(gòu)示意圖表2-1MSP430F249單片機(jī)引腳描述引腳名稱引腳號(hào)說(shuō)明AVCC64模擬電源正端,僅用于ADC12模塊AVSS62模擬電源負(fù)端,僅用于ADC12模塊DVCC1電源正端,1.83.6VDVSS63電源負(fù)端P1.0/TACLK
6、/CAOUT12通用數(shù)字I/O/定時(shí)器_A時(shí)鐘信號(hào)輸入/比較器A輸出P1.1/TA013通用數(shù)字I/O/定時(shí)器_A比較out0輸出或捕獲CCI0A輸入/BSLP1.2/TA114通用數(shù)字I/O/定時(shí)器_A比較out1輸出或捕獲CCI1A輸入P1.3/TA215通用數(shù)字I/O/定時(shí)器_A比較out2輸出或捕獲CCI2A輸入P1.4/SMCLK16通用數(shù)字I/O/SMCLK輸出P1.5/TA017通用數(shù)字I/O/定時(shí)器_A比較out0輸出P1.6/TA118通用數(shù)字I/O/定時(shí)器_A比較out1輸出P1.7/TA219通用數(shù)字I/O/定時(shí)器_A比較out2輸出P2.0/ACLK/CA220通用數(shù)字
7、I/O/ACLK輸出/比較器A輸入P2.1/TAINCLK/CA321通用數(shù)字I/O/定時(shí)器A時(shí)鐘信號(hào)INCLK/比較器A輸入P2.2/CAOUT/TA0/CA422通用數(shù)字I/O/定時(shí)器A捕獲CCI0B輸入/比較器A輸出/BSL接收/比較器A輸入P2.3/CA0/TA123通用數(shù)字I/O/比較器A輸入/定時(shí)器A比較out1輸出P2.4/CA1/TA224通用數(shù)字I/O/比較器A輸入/定時(shí)器A比較out2輸出P2.5/ROSE/CA525通用數(shù)字I/O/DCO外部電阻輸入/比較器A輸入P2.6/ADC12CLK/CA626通用數(shù)字I/O/ADC12轉(zhuǎn)換時(shí)鐘/比較器A輸入P2.7/TA0/CA7
8、27通用數(shù)字I/O/定時(shí)器A比較out0輸出/比較器A輸入P3.0/UCB0STE/UCA0CLK28通用數(shù)字I/O/USCI B0從模式傳輸允許/USCI A0時(shí)鐘P3.1/UCB0SIMO/UCB0SDA29通用數(shù)字I/O/USCI B0從模式輸入/主模式輸出SDAP3.2/UCB0SOMI/UCB0SCL30通用數(shù)字I/O/ USCI B0從模式輸出/主模式輸入SPIP3.3/UCB0CLK/UCA0STE31通用數(shù)字I/O/USCI B0 時(shí)鐘/USCI A0從模式傳輸允許P3.4UCA0TXD/UCA0SIMO32通用數(shù)字I/O/UART模式USCI A0 數(shù)據(jù)輸出/SPI模式SIM
9、OP3.5/UCA0RXD/UCA0SOMI33通用數(shù)字I/O/P3.6/UCA1TXD/UCA1SIMO34通用數(shù)字I/O/ UART模式USCI A1 數(shù)據(jù)輸出/SPI模式SIMOP3.7/UCA1RXD/UCA1SOMI35通用數(shù)字I/O/ UART模式USCI A1 數(shù)據(jù)輸入/SPI模式SOMIP4.0/TB036通用數(shù)字I/O/定時(shí)器_B比較out0輸出或捕獲CCI0A/B輸入P4.1/TB137通用數(shù)字I/O/定時(shí)器_B比較out1輸出或捕獲CCI1A/B輸入P4.2/TB238通用數(shù)字I/O/定時(shí)器_B比較out2輸出或捕獲CCI2A/B輸入P4.3/TB339通用數(shù)字I/O/定
10、時(shí)器_B比較out3輸出或捕獲CCI3A/B輸入P4.4/TB440通用數(shù)字I/O/定時(shí)器_B比較out4輸出或捕獲CCI4A/B輸入P4.5/TB541通用數(shù)字I/O/定時(shí)器_B比較out5輸出或捕獲CCI5A/B輸入P4.6/TB642通用數(shù)字I/O/定時(shí)器_B比較out6輸出或捕獲CCI6A/B輸入P4.7/TBCLK43通用數(shù)字I/O/定時(shí)器B時(shí)鐘輸入P5.0/UCB1STE/UCA1CLK44通用數(shù)字I/O/USCI B1從模式傳輸允許/USCI A1時(shí)鐘P5.1/UCB1SIMO/UCB1SDA45通用數(shù)字I/O/USCI B1 SPI模式SIMO/I2C模式SDAP5.2/UCB
11、1SOMI/UCA1SCL46通用數(shù)字I/O/ USCI B1 SPI模式SOMI/I2C模式SCLP5.3/UCB1CLK/UCA1STE47通用數(shù)字I/O/USCI B1時(shí)鐘/USCI A1從模式傳輸允許P5.4/MCLK48通用數(shù)字I/O/MCLK輸出P5.5/SMCLK49通用數(shù)字I/O/SMCLK輸出P5.6/ACLK50通用數(shù)字I/O/ACLK輸出P5.7/TBOUTH/SVSOUT51通用數(shù)字I/O/定時(shí)器TB0TB6PWM輸出高阻態(tài)選擇位/SVS比較器輸出P6.0/A059通用數(shù)字I/O/模擬量輸入A0P6.1/A160通用數(shù)字I/O/模擬量輸入A1P6.2/A261通用數(shù)字I
12、/O/模擬量輸入A2P6.3/A32通用數(shù)字I/O/模擬量輸入A3P6.4/A43通用數(shù)字I/O/模擬量輸入A4P6.5/A54通用數(shù)字I/O/模擬量輸入A5P6.6/A65通用數(shù)字I/O/模擬量輸入A6P6.7/A7/SVSIN6通用數(shù)字I/O/模擬量輸入A7/SVS輸入XT2OUT52晶振XT2XT2IN53晶振XT2RST/NMI58復(fù)位輸入/非屏蔽中斷輸入TCK57JTAG口測(cè)試時(shí)鐘TDI/TCLK55JTAG口測(cè)試數(shù)據(jù)輸入/測(cè)試時(shí)鐘輸入TDO/TDI54JTAG口測(cè)試數(shù)據(jù)輸出TMS56JTAG口測(cè)試模式選擇VEREF+10外部參考電壓輸入VREF+7ADC12參考電壓正端輸出VREF
13、-/VEREF-11參考電源負(fù)端XIN8晶振XT1XOUT9晶振XT12)堆棧指針SP為CPU專用寄存器R1,SP指針為16為寄存器,也總是偶數(shù)的。堆棧是在片內(nèi)RAM中實(shí)現(xiàn)的,通常將堆棧指針設(shè)置為片內(nèi)RAM的最高地址加一。使用C語(yǔ)言編程時(shí),集成編譯軟件IAR會(huì)自動(dòng)設(shè)置堆棧指針初始值。對(duì)程序員來(lái)說(shuō)無(wú)需關(guān)心細(xì)節(jié),編譯結(jié)束后在信息窗提示的編譯結(jié)果會(huì)給出 RAM 使用量的大小,只要不超過(guò) RAM 區(qū)實(shí)際容量并稍留余量給堆棧用即可。使用匯編語(yǔ)言編程時(shí)必須注意堆棧指針的正確設(shè)置,否則堆棧可能會(huì)覆蓋你的變量區(qū),導(dǎo)致程序出錯(cuò)。3)狀態(tài)寄存器SR和常數(shù)發(fā)生器CG1、CG2(見(jiàn)數(shù)據(jù)手冊(cè))狀態(tài)寄存器SR159876
14、543210保留VSCG1SCG0OSCOFFCPUOFFGIENZCV溢出標(biāo)志,當(dāng)算術(shù)運(yùn)算結(jié)果超出有符號(hào)數(shù)范圍時(shí)置位。SCG1系統(tǒng)時(shí)鐘控制位1,該位置位時(shí)關(guān)閉SMCLKSCG0系統(tǒng)時(shí)鐘控制位0,如果DCO未用作MCLK或SMCLK時(shí),該位置位關(guān)閉DCO。OSCOFF晶振控制位,如果LFXT1未用作MCLK或SMCLK時(shí),該位置位關(guān)閉LFXT1。CPUOFFCPU控制位,該位置位時(shí)關(guān)閉CPU。GIE總中斷允許位,該位置位時(shí)允許可屏蔽中斷;復(fù)位時(shí)禁止所有的可屏蔽中斷。N負(fù)數(shù)標(biāo)志位,當(dāng)運(yùn)算結(jié)果為負(fù)時(shí)置位;否則復(fù)位。Z零標(biāo)志位,當(dāng)運(yùn)算結(jié)果為零時(shí)置位;否則復(fù)位。C進(jìn)位標(biāo)志位,當(dāng)運(yùn)算結(jié)果產(chǎn)生進(jìn)位時(shí)置位;
15、否則復(fù)位。(2)片內(nèi)存儲(chǔ)器MSP430單片機(jī)采用馮·諾依曼結(jié)構(gòu),程序存儲(chǔ)器flash、數(shù)據(jù)存儲(chǔ)器RAM、特殊功能寄存器以及中斷向量全部映射到64kB內(nèi)部地址空間。MSP430不同型號(hào)單片機(jī)地址空間略有不同,MSP430F249的存儲(chǔ)器結(jié)構(gòu)如表2-2所示。表2-2 MSP430F249存儲(chǔ)器結(jié)構(gòu)名稱地址范圍大小中斷向量0xFFFF0xFFC064B程序存儲(chǔ)區(qū)flash0xFFC00x1100約60kB信息存儲(chǔ)區(qū)0x10FF0x1000256B引導(dǎo)區(qū)0x0FFF0x0C001kB數(shù)據(jù)存儲(chǔ)區(qū)RAM0x09FF0x02002kB16位外圍模塊0x01FF0x0100256B8位外圍模塊0x0
16、0FF0x0010240B特殊寄存器0x000F0x000016B1)數(shù)據(jù)存儲(chǔ)區(qū)MSP430F249的數(shù)據(jù)存儲(chǔ)區(qū)RAM有2kB大小,地址范圍0x02000x09FF。RAM為堆棧、全局變量和局部變量提供空間。使用C語(yǔ)言來(lái)開(kāi)發(fā)項(xiàng)目,注意觀察編譯結(jié)束后在信息窗口中提示的RAM使用量的大小,只有不超過(guò)RAM區(qū)的實(shí)際容量并稍留余量即可。2)引導(dǎo)區(qū)引導(dǎo)區(qū)使得用戶可以通過(guò)UART串口對(duì)MSP430單片機(jī)的程序存儲(chǔ)器flash或RAM區(qū)實(shí)現(xiàn)程序代碼的寫(xiě)操作。詳細(xì)內(nèi)容參見(jiàn)TI公司的相關(guān)技術(shù)文檔Features of the MSP430 Bootstrap Loader。3)信息存儲(chǔ)區(qū)MSP430F249單片
17、機(jī)有256B的信息存儲(chǔ)區(qū),它分為兩段,每段128B。信息存儲(chǔ)區(qū)用來(lái)存放那些掉電后需要保存的變量,一般用來(lái)保存項(xiàng)目的設(shè)定值或量程轉(zhuǎn)換參數(shù)。Flash信息存儲(chǔ)區(qū)只允許塊擦除或?qū)懭氩僮?,且有擦除次?shù)的限制。需要頻繁(幾秒鐘一次)擦除寫(xiě)入的變量不能存放在信息存儲(chǔ)區(qū),這時(shí)可以外接鐵電存儲(chǔ)器EEPROM器件來(lái)保存這些變量。4)程序存儲(chǔ)區(qū)MSP430F249單片機(jī)的程序存儲(chǔ)區(qū)位于0x11000xFFC0,約60kB,程序存儲(chǔ)區(qū)用于存放用戶程序、常數(shù)以及表格等。程序存儲(chǔ)區(qū)可以通過(guò)JTAG、BSL和ISP方式下載得到用戶程序。關(guān)于Flash存儲(chǔ)器,我們介紹幾個(gè)基本概念。Flash 的結(jié)構(gòu)決定了寫(xiě)操作只能將存儲(chǔ)單
18、元中的各比特位從1改寫(xiě)成0,而不能將0改寫(xiě)成1。所以Flash中每個(gè)單元可以一次性寫(xiě)入數(shù)據(jù),數(shù)據(jù)一旦寫(xiě)入,在擦除前不能被再次改寫(xiě)。Flash可以被擦除,擦除后所有單元的比特位都恢復(fù)為 1,但擦除操作只能針對(duì)整個(gè)段進(jìn)行。所以在改寫(xiě)某單元之前,必須先擦除整個(gè)段。Flash存儲(chǔ)器較適合做大批量連續(xù)數(shù)據(jù)存儲(chǔ),而且一般控制器都會(huì)提供連續(xù)寫(xiě)功能以提高速度。在 Flash 中,將每次能擦除的最小區(qū)塊單位成為“段”(Segment),將每次能連續(xù)寫(xiě)入的最大區(qū)塊單位稱為“塊”(Block)。MSP430單片機(jī)有5種低功耗模式,1種活動(dòng)模式,如表2-3所示。任何一種低功耗模式只能與活動(dòng)模式進(jìn)行切換。表2-3工作模
19、式表模式說(shuō)明活動(dòng)模式CPU、所有時(shí)鐘與外設(shè)都為激活狀態(tài)LPM0CPU關(guān)閉、ACLK和SMCLK外設(shè)時(shí)鐘可用LPM1CPU關(guān)閉、ACLK和SMCLK外設(shè)時(shí)鐘可用,若活動(dòng)模式中DCOCLK未使用,則DCO發(fā)生器也禁止LPM2CPU關(guān)閉、MCLK和SMCLK禁止,DCO發(fā)生器使能,ACLK可用LPM3CPU關(guān)閉、MCLK和SMCLK禁止,DCO發(fā)生器禁止,ACLK可用LPM4CPU關(guān)閉且禁用所有時(shí)鐘(3)單片機(jī)工作原理單片機(jī)自動(dòng)完成賦予它的任務(wù)的過(guò)程,也就是單片機(jī)執(zhí)行程序的過(guò)程,即一條條指令的執(zhí)行過(guò)程。所謂指令就是把要求單片機(jī)執(zhí)行的各種操作,用命令的形式寫(xiě)下來(lái),一條指令對(duì)應(yīng)著一種基本操作。單片機(jī)所能
20、執(zhí)行的全部指令,就是該單片機(jī)的指令系統(tǒng),不同種類(lèi)的單片機(jī),其指令系統(tǒng)亦不同。為使單片機(jī)能自動(dòng)完成某一特定任務(wù),必須把要解決的問(wèn)題編成一系列指令(這些指令必須是選定單片機(jī)能識(shí)別和執(zhí)行的指令),這一系列指令的集合就成為程序。程序需要預(yù)先存放在具有存儲(chǔ)功能的部件存儲(chǔ)器中。存儲(chǔ)器由許多存儲(chǔ)單元(最小的存儲(chǔ)單位)組成,指令就存放在這些單元里。每一個(gè)存儲(chǔ)單元有唯一的地址號(hào),該地址號(hào)稱為存儲(chǔ)單元的地址,這樣只要知道了存儲(chǔ)單元的地址,就可以找到這個(gè)存儲(chǔ)單元,其中存儲(chǔ)的指令就可以被取出,然后再被執(zhí)行。 程序的執(zhí)行通常是順序的,所以程序中的指令也是一條條順序存放的。單片機(jī)在執(zhí)行程序時(shí)要能把這些指令一條條取出并加以
21、執(zhí)行,必須有一個(gè)部件能追蹤指令所在的地址,這一部件就是程序計(jì)數(shù)器PC(包含在CPU中)。在開(kāi)始執(zhí)行程序時(shí),給PC賦以程序中第一條指令所在的地址,然后取得每一條要執(zhí)行的命令,PC之中的內(nèi)容就會(huì)自動(dòng)增加,增加量由本條指令長(zhǎng)度決定,以指向下一條指令的起始地址,保證指令順序執(zhí)行。在程序順序執(zhí)行時(shí),PC指針的內(nèi)容自動(dòng)增加,指向正在執(zhí)行的指令的下一條指令;當(dāng)發(fā)生中斷或調(diào)用子程序時(shí),當(dāng)前的PC值被保存到堆棧,然后PC指針置入新的值(中斷向量地址或子程序入口地址),程序的流動(dòng)發(fā)生變化,執(zhí)行完這些程序后,PC指針的值要恢復(fù)為堆棧中保存的舊的PC值,程序從斷點(diǎn)處繼續(xù)順序執(zhí)行。2.2 MSP430單片機(jī)的C語(yǔ)言基礎(chǔ)
22、C語(yǔ)言是一種結(jié)構(gòu)化的高級(jí)語(yǔ)言,其優(yōu)點(diǎn)是語(yǔ)言簡(jiǎn)潔、表達(dá)能力強(qiáng)、使用方便靈活、可讀性好、可移植性強(qiáng)。C語(yǔ)言程序本身不依賴單片機(jī)硬件,如果更改工程項(xiàng)目中的單片機(jī)型號(hào),對(duì)C語(yǔ)言程序稍加修改就可以進(jìn)行程序移植,而且移植程序時(shí)不一定要求程序開(kāi)發(fā)人員詳細(xì)掌握新型號(hào)單片機(jī)的指令系統(tǒng)。C語(yǔ)言程序的書(shū)寫(xiě)格式十分自由。一條語(yǔ)句可以寫(xiě)成一行,也可以寫(xiě)成幾行;還可以在一行內(nèi)寫(xiě)多條語(yǔ)句;但是需要注意的是,每條語(yǔ)句都必須以分號(hào)“;”作為結(jié)束符。為了C語(yǔ)言程序能夠書(shū)寫(xiě)清晰,便于閱讀、理解和維護(hù),在書(shū)寫(xiě)C語(yǔ)言程序時(shí)最好遵循以下規(guī)則。a)一個(gè)聲明或一條語(yǔ)句占一行;b)不同結(jié)構(gòu)層次的語(yǔ)句,從不同的起始位置開(kāi)始,機(jī)縮進(jìn)相同的字?jǐn)?shù);c
23、)用括起來(lái)的部分表示程序的某一層次結(jié)構(gòu)。目前有幾種C編譯器可以進(jìn)行Msp430單片機(jī)程序開(kāi)發(fā),這些C編譯器基本功能大致相同,但在某些細(xì)節(jié)上還是有所區(qū)別的,因此當(dāng)選擇了某個(gè)C編譯器后應(yīng)該學(xué)習(xí)掌握相應(yīng)的C編譯器語(yǔ)言用法。本章將以IAR for MSP430 編譯器為例講解C430程序設(shè)計(jì)的C語(yǔ)言基礎(chǔ)。2.2.1 C語(yǔ)言的標(biāo)識(shí)符和關(guān)鍵字表2-4 C語(yǔ)言的關(guān)健字關(guān)鍵字 用途 說(shuō)明 char 聲明字符型變量或函數(shù) 數(shù)據(jù)類(lèi)型double 聲明雙精度變量或函數(shù) void 聲明函數(shù)無(wú)返回值或無(wú)參數(shù),聲明無(wú)類(lèi)型指針 unsigned 聲明無(wú)符號(hào)類(lèi)型變量或函數(shù) signed 聲明有符號(hào)類(lèi)型變量或函數(shù) short
24、聲明短整型變量或函數(shù) long 聲明長(zhǎng)整型變量或函數(shù) int 聲明整型變量或函數(shù) float 聲明浮點(diǎn)型變量或函數(shù) sizeof 計(jì)算數(shù)據(jù)類(lèi)型長(zhǎng)度 volatile 說(shuō)明變量在程序執(zhí)行中可被隱含地改變 typedef 重新進(jìn)行數(shù)據(jù)類(lèi)型定義 const 聲明常量 Static 聲明靜態(tài)變量 存儲(chǔ)種類(lèi)的說(shuō)明register 聲明寄存器變量 extern 聲明外部變量 return 函數(shù)返回語(yǔ)句 返回一個(gè)值 程序語(yǔ)句case 開(kāi)關(guān)語(yǔ)句分支 default Switch語(yǔ)句的失敗選擇項(xiàng) switch 開(kāi)關(guān)語(yǔ)句 goto 無(wú)條件跳轉(zhuǎn)語(yǔ)句 else 構(gòu)成if-else選擇語(yǔ)句 if if條件語(yǔ)句 cont
25、inue 結(jié)束當(dāng)前循環(huán),開(kāi)始下一輪循環(huán) break 跳出當(dāng)前循環(huán)體 while 構(gòu)成while和do-while循環(huán)語(yǔ)句 do 循環(huán)語(yǔ)句的循環(huán)體 for for循環(huán)語(yǔ)句 1)C語(yǔ)言的標(biāo)識(shí)符是用來(lái)標(biāo)識(shí)源程序中某個(gè)對(duì)象名字的。這些對(duì)象可以是函數(shù)、變量、常量、數(shù)組、數(shù)據(jù)類(lèi)型、存儲(chǔ)方式、語(yǔ)句等。一個(gè)標(biāo)識(shí)符由字符串、數(shù)字和下劃線等組成,第一個(gè)字符必須是字母或下劃線,通常以下劃線開(kāi)頭的標(biāo)識(shí)符是編譯系統(tǒng)專用的,因此在編寫(xiě)C語(yǔ)言源程序時(shí)一般不要使用以下劃線開(kāi)頭的標(biāo)識(shí)符,而將下劃線用作分段符。標(biāo)識(shí)符的長(zhǎng)度由系統(tǒng)決定,標(biāo)識(shí)符最長(zhǎng)可達(dá)255個(gè)字符,編寫(xiě)源程序時(shí)標(biāo)識(shí)符的長(zhǎng)度不要超過(guò) 32個(gè)字符。2)關(guān)鍵字是一類(lèi)具有固
26、定名稱和特定含義的特殊標(biāo)識(shí)符,又稱為保留字。在編寫(xiě)C語(yǔ)言源程序時(shí)一般不允許將關(guān)鍵字另作別用,換句話說(shuō)就是對(duì)于標(biāo)識(shí)符的命名不要與關(guān)鍵字相同。上面表2.4所列的C語(yǔ)言關(guān)鍵字由系統(tǒng)保留不能用作用戶標(biāo)識(shí)符。 3)程序中對(duì)于標(biāo)識(shí)符的命名應(yīng)當(dāng)簡(jiǎn)潔明了,含義清晰,便于閱讀理解,如用標(biāo)識(shí)符“max”表示最大值,用“TIMER0”表示定時(shí)器0等。盡量不要取名“aa”、 “bb”等等沒(méi)有特定意義的標(biāo)識(shí)符,這樣雖然沒(méi)有違反C語(yǔ)言的規(guī)則,但是在程序里就很不容易理解。 4)C語(yǔ)言區(qū)分大小寫(xiě)字母,C語(yǔ)言編譯器在對(duì)程序進(jìn)行編譯時(shí),對(duì)于程序中同一個(gè)字母的大小寫(xiě)作為不同的變量來(lái)處理。例如定義一個(gè)延時(shí)函數(shù)的形式參數(shù)time,但是
27、如果程序當(dāng)中再出現(xiàn)一個(gè)由大寫(xiě)字母定義的標(biāo)識(shí)符TIME,那么它們?cè)诔绦虍?dāng)中是兩個(gè)不同的標(biāo)識(shí)符,是沒(méi)有沖突的。 5)C語(yǔ)言程序中有且只有一個(gè)main函數(shù),一個(gè)C語(yǔ)言程序,無(wú)論main函數(shù)的物理位置在那里,總是從main函數(shù)開(kāi)始執(zhí)行。 6)每句程序語(yǔ)句后面一定要加分號(hào),分號(hào)是C語(yǔ)言結(jié)構(gòu)的一部分,如果缺少了就會(huì)語(yǔ)法出錯(cuò)。7)注釋,在程序中添加注釋是為了能更加容易讀懂和理解程序,IAR有兩種風(fēng)格的注釋方法“/”和“/*-*/”。 “/”的意思是在其后面的全部引導(dǎo)為注釋,而“/*-*/”的意思是在“/*”開(kāi)始,一直到遇到“*/”為止,在其里面的內(nèi)容都被認(rèn)為是注釋。 不同的C語(yǔ)言編譯器中變量類(lèi)型略有差別,表
28、2-5列出IAR for MSP430支持的變量類(lèi)型。表2-5 C430中變量類(lèi)型數(shù)據(jù)類(lèi)型 值域 字節(jié)數(shù) 備注char-1281271可設(shè)置unsigned char0255 128-1int-32768327672unsigned int065535 2216-1long-214748364821474836474unsigned long 04294967295 4232-1long long-922337203685477580892233720368547758078unsigned long long0184467440737095516158264-1float-3.4x10-38
29、3.4x10-3841位符號(hào)位, 8位指數(shù)位, 23位尾數(shù)位double-1.79x10-3081.79x10-3088可設(shè)置,1位符號(hào)位,11位指數(shù)位,52位尾數(shù)位Float和double的指數(shù)位是按補(bǔ)碼的形式來(lái)表示的,所以float的指數(shù)范圍為-128+127,而double的指數(shù)范圍為-1024+1023。float的范圍為-2128 +2128,也即-3.40E+38 +3.40E+38;double的范圍為-21024 +21024,也即-1.79E+308 +1.79E+308。float和double的精度是由尾數(shù)的位數(shù)來(lái)決定的。float:223 = 8388608,一共七位,
30、這意味著最多能有7位有效數(shù)字,float的精度為7位; double:252 = 4503599627370496,一共16位,double的精度為16位。IAR for msp430允許改變某些變量的特性。在打開(kāi)工程后,選擇菜單項(xiàng)ProjectOptions,在 General OptionTarget項(xiàng)中可以設(shè)置浮點(diǎn)數(shù)長(zhǎng)度,F(xiàn)loating Point決定了double變量的字節(jié)數(shù),默認(rèn)是 32bit,可以設(shè)置為64bit。在C/C+ CompileLanguage項(xiàng)中Plain char可以設(shè)置char是否等效為unsigned char。在變量定義中增加某些關(guān)鍵字
31、可以給變量賦予某些特殊性質(zhì):const:定義常量。在 C430 語(yǔ)言中,const關(guān)鍵字定義的常量實(shí)際上被放在了 程序存儲(chǔ)器flash中,經(jīng)常用const關(guān)鍵字定義顯示表之類(lèi)的常數(shù)數(shù)組。extern:聲明外部變量,外部變量是指在函數(shù)或文件外部定義的全局變量。使用時(shí),extern置于變量或函數(shù)前,表示變量或函數(shù)的定義在別的文件中,提示編譯器在遇到此變量和函數(shù)時(shí)在其他模塊中尋找它的定義,static:定義靜態(tài)局部變量或靜態(tài)函數(shù),靜態(tài)局部變量或靜態(tài)函數(shù)只有本文件內(nèi)的代碼才能訪問(wèn)它,它的名字在其它文件中不可見(jiàn)。有時(shí)候希望函數(shù)中的局部變量的值在函數(shù)調(diào)用結(jié)束后不消失而保留原值,即其占用的存儲(chǔ)單元不釋放,在
32、下次該函數(shù)調(diào)用時(shí),該變量保留上一次函數(shù)調(diào)用結(jié)束時(shí)的值。這時(shí)就應(yīng)該指定局部變量為靜態(tài)局部變量。volatile:定義“揮發(fā)性”變量。編譯器將認(rèn)為該變量的值會(huì)隨時(shí)改變,對(duì)該變量的任何操作都不會(huì)被優(yōu)化過(guò)程刪除。volatile用在如下的幾個(gè)地方:中斷服務(wù)程序中修改的供其它程序檢測(cè)的變量需要加volatile;多任務(wù)環(huán)境下任務(wù)間共享的標(biāo)志應(yīng)該加volatile;存儲(chǔ)器映射的硬件寄存器通常也要加volatile說(shuō)明,因?yàn)槊看螌?duì)它的讀寫(xiě)都可能由不同意義。volatile提醒編譯器它后面所定義的變量隨時(shí)都有可能改變,因此編譯后的程序每次需要存儲(chǔ)或讀取這個(gè)變量的時(shí)候,都會(huì)直接從變量地址中讀取數(shù)據(jù)。如果沒(méi)有vo
33、latile關(guān)鍵字,則編譯器可能優(yōu)化讀取和存儲(chǔ),可能暫時(shí)使用寄存器中的值,如果這個(gè)變量由別的程序更新了的話,將出現(xiàn)不一致的現(xiàn)象。全局變量:只要定義在函數(shù)體(包括主函數(shù))外,就是全局變量了,編譯器為全局變量安排特定的數(shù)據(jù)區(qū),這些數(shù)據(jù)區(qū)為全局變量專用。全局變量一般定義在C程序的開(kāi)頭部分、主函數(shù)之前,在與該程序有關(guān)的所有文件都可以使用該變量。程序開(kāi)始時(shí)分配空間,程序結(jié)束時(shí)釋放空間,默認(rèn)初始化為0。對(duì)于多文件C語(yǔ)言程序,如果全局變量定義在其它文件中,那么別的程序文件里面的函數(shù)要訪問(wèn)另一個(gè)文件里面的全局變量,須在對(duì)全局變量進(jìn)行外部變量聲明,關(guān)鍵詞extern。局部變量是在一個(gè)函數(shù)內(nèi)部定義的變量,它只在定
34、義它的那個(gè)函數(shù)范圍以內(nèi)有效,在此函數(shù)之外局部變量即失去意義,因而也就不能使用這些變量了。不同的函數(shù)可以使用相同的局部變量名,由于它們的作用范圍不同,不會(huì)相互干擾。函數(shù)的形式參數(shù)也屬于局部變量。局部變量在每次函數(shù)調(diào)用時(shí)分配存儲(chǔ)空間,在每次函數(shù)返回時(shí)釋放存儲(chǔ)空間。靜態(tài)局部變量:靜態(tài)局部變量在函數(shù)內(nèi)進(jìn)行定義,但不像其它局部變量,當(dāng)調(diào)用時(shí)就存在,退出函數(shù)時(shí)就消失,靜態(tài)局部變量始終存在著。靜態(tài)局部變量的生存期為整個(gè)源程序執(zhí)行期間,但是其作用域仍與局部變量相同,即只能在定義該變量的函數(shù)內(nèi)使用。退出該函數(shù)后,盡管靜態(tài)局部變量還繼續(xù)存在,但不能使用它。靜態(tài)局部變量有全局變量的優(yōu)點(diǎn),也有局部變量的優(yōu)勢(shì)。全局變量
35、和靜態(tài)局部變量會(huì)在程序剛開(kāi)始運(yùn)行時(shí)進(jìn)行初始化,也是唯一的一次初始化,默認(rèn)初始化值為0。不過(guò)和全局變量比起來(lái),static可以控制變量的可見(jiàn)范圍,。當(dāng)我們同時(shí)編譯多個(gè)文件時(shí),所有未加static前綴的全局變量和函數(shù)都具有全局可見(jiàn)性。例如,我們要同時(shí)編譯兩個(gè)源文件,一個(gè)是a.c,另一個(gè)是main.c。a.c函數(shù)的內(nèi)容char a = 'A' void msg() printf("Hellon"); 下面是main.c的內(nèi)容int &
36、#160;main( void ) extern char a; / 聲明外部變量 printf( "%c", a); msg(); while(1); /循環(huán)等待 程序的運(yùn)行結(jié)果是:A Hello為什么在a.c中定義的全局變量a和函數(shù)msg能
37、在main.c中使用?前面說(shuō)過(guò),所有未加static前綴的全局變量和函數(shù)都具有全局可見(jiàn)性,其它的源文件也能訪問(wèn)。此例中,a是全局變量,msg是函數(shù),并且都沒(méi)有加static前綴,因此對(duì)于另外的源文件main.c是可見(jiàn)的。如果加了static,就會(huì)對(duì)其它源文件隱藏。例如在a和msg的定義前加上static,main.c就看不到它們了。利用這一特性可以在不同的文件中定義同名函數(shù)和同名變量,而不必?fù)?dān)心命名沖突。2.2.2 C語(yǔ)言的運(yùn)算符表2-6 C語(yǔ)言的運(yùn)算符名稱符號(hào)算術(shù)運(yùn)算符+ - * / % + -關(guān)系運(yùn)算符> < = >= <= !=邏輯運(yùn)算符&& |
38、!位操作運(yùn)算符& | << >>賦值運(yùn)算符= += -= *= /= %= &= |= = = >>= <<=自增、自減運(yùn)算符說(shuō)明:+i 意思是:i自增1后再參與運(yùn)算。 -i 意思是:i自減1后再參與運(yùn)算。 i+ 意思是:i參與運(yùn)算后,i的值再自增1。 i- 意思是:i參與運(yùn)算后,i的值再自減1。 復(fù)合賦值運(yùn)算符說(shuō)明:在賦值運(yùn)算符“”的前面加上其它運(yùn)算符,就構(gòu)成了所謂復(fù)合賦值運(yùn)算符。+ 加法賦值,>> 右移位賦值,-減法賦值, 邏輯與賦值,* 乘法賦值,邏輯或賦值,除法賦值, 邏輯異或賦值,取模賦值, 邏輯非賦值,&l
39、t;< 左移位賦值。采用這種復(fù)合賦值運(yùn)算符,可以使程序簡(jiǎn)化,同時(shí)還可以提高程序的編譯效率。例如a+=b 表示a=a+b;a-=b 表示a=a-b;a*=b表示a=a*b;a/=b表示a=a/b;a%=b 表示a=a%b運(yùn)算符的優(yōu)先級(jí)與結(jié)合性 表2-7 運(yùn)算符的優(yōu)先級(jí)優(yōu)先級(jí) 操作符 功能 結(jié)合性 1(最高) () 改變優(yōu)先級(jí) 從左至右 數(shù)組下標(biāo) > 指向結(jié)構(gòu)成員 . 結(jié)構(gòu)體成員 2 + -自增1 自減1 從右至左 & 取地址 * 取內(nèi)容 ! 邏輯取反 按位取反 + - 正數(shù) 負(fù)數(shù) () 強(qiáng)制類(lèi)型轉(zhuǎn)換 sizeof 計(jì)算內(nèi)存字節(jié)數(shù) 3 * / % 乘法 除法 求余 從左至右 4
40、 + - 加法 減法 5 << >> 左移位 右移位 6 < <= > >= 小于 小于等于 大于 大于等于 7 = != 等于 不等于 8 & 按位與 9 按位異或 10 | 按位或 11 && 邏輯與 12 | 邏輯或 13 ?: 條件運(yùn)算符 從右至左 14 = += -= *= /= %= &= = |= <<= >>=復(fù)合賦值運(yùn)算符 從右至左 15(最低) , 逗號(hào)運(yùn)算符 從左至右 從表2-7可知,語(yǔ)言中的運(yùn)算符的運(yùn)算優(yōu)先級(jí)共分為15級(jí)。1級(jí)最高,15級(jí)最低。在表達(dá)式中,優(yōu)先級(jí)較高的
41、要比優(yōu)先級(jí)較低的先進(jìn)行運(yùn)算。 而在一個(gè)運(yùn)算量?jī)蓚?cè)的運(yùn)算符優(yōu)先級(jí)相同時(shí), 則按運(yùn)算符的結(jié)合性所規(guī)定的結(jié)合方向處理。 語(yǔ)言中各運(yùn)算符的結(jié)合性分為兩種,即左結(jié)合性(自左至右)和右結(jié)合性(自右至左)。需要時(shí)可在算術(shù)表達(dá)式中采用圓括號(hào)來(lái)改變運(yùn)算符的優(yōu)先級(jí)。 C語(yǔ)言中提供了一種用于求取數(shù)據(jù)類(lèi)型、變量以及表達(dá)式的字節(jié)數(shù)的運(yùn)算符: sizeof,該運(yùn)算符的一般使用形式為: sizeof(表達(dá)式)或sizeof(數(shù)據(jù)類(lèi)型) 應(yīng)該注意的是,sizeof是一種特殊的運(yùn)算符,不要錯(cuò)誤地認(rèn)為它是一個(gè)函數(shù)。實(shí)際上,字節(jié)數(shù)的計(jì)算在程序編譯時(shí)就完成了,而不是在程序執(zhí)行的過(guò)程中才計(jì)算出來(lái)的。例如:int a = sizeof(
42、float); 執(zhí)行這條命令的結(jié)果是把4賦給了整型變量a,這意味著一個(gè)單精度數(shù)存儲(chǔ)時(shí)占有4個(gè)字節(jié)內(nèi)存。1)盡可能避免浮點(diǎn)運(yùn)算。對(duì)于單片機(jī)來(lái)說(shuō),浮點(diǎn)數(shù)的運(yùn)算速度很慢, RAM開(kāi)銷(xiāo)也大,且有效位數(shù)有限;在低功耗應(yīng)用中CPU運(yùn)算時(shí)間直接關(guān)系到平均功耗。因此在編程初期就要養(yǎng)成盡量避免使用浮點(diǎn)數(shù)的習(xí)慣。2)防止定點(diǎn)數(shù)溢出。定點(diǎn)數(shù)運(yùn)算首先要防止數(shù)據(jù)溢出。例如:long x;int a;x=a*1000;雖然x是long變量,但a和常數(shù)1000都是int型,相乘結(jié)果仍然是int型。在 a>65的情況下,結(jié)果就會(huì)溢出。程序應(yīng)該修改為:x=a*(long)1000; 或 x=(long)a*1000;若遇
43、到多個(gè)變量相乘,更需要細(xì)心檢查。所以,在測(cè)試每一段軟件的時(shí)候,一定要取邊界條件做極限測(cè)試。3)小數(shù)的處理。遇到需要保留小數(shù)的運(yùn)算,可以采用浮點(diǎn)數(shù),但是軟件開(kāi)銷(xiāo)較大。用定點(diǎn)數(shù)也可以處理小數(shù)。原理就是先擴(kuò)大,再運(yùn)算。例如,我們需要計(jì)算溫度并保留1位小數(shù),假設(shè)溫度計(jì)算公式是:Deg_C=ADC*1.32/1.25-273為了讓小數(shù) 1.32 能被定點(diǎn)運(yùn)算,先擴(kuò)大 100 倍變成 132,當(dāng)然,除數(shù) 1.25 也要隨之?dāng)U大 100 倍,公式變?yōu)椋篋eg_C=(long)ADC*132/125-273。這樣運(yùn)算結(jié)果只能保留到整數(shù),為了讓結(jié)果保留1位小數(shù),需要人為將所有數(shù)值都擴(kuò)大 10 倍,得到最終計(jì)算公
44、式 Deg_C=(long)ADC*1320/125-2730。假設(shè)溫度應(yīng)該是 23.4 度,上述公式的運(yùn)算結(jié)果將是 234。在顯示的時(shí)候,將小數(shù)點(diǎn)添加在倒數(shù)第 2 位上,即可顯示 23.4。用定點(diǎn)數(shù)處理小數(shù),如需要保留 N 位小數(shù),就要將數(shù)值擴(kuò)大10N倍。注意防止溢出,且要記住每個(gè)數(shù)值所擴(kuò)大的倍數(shù),在程序中應(yīng)添加注釋。4)盡量減少乘除法。430 單片機(jī)沒(méi)有乘法/除法指令,乘除操作會(huì)被編譯器轉(zhuǎn)換成移位和加法來(lái)實(shí)現(xiàn)。如果乘除的數(shù)值剛好是 2 的冪,那么可以用移位直接替代乘除法,運(yùn)算速度會(huì)提高很多。例如對(duì) 16 次采樣數(shù)據(jù)求平均:for(i=0;i<16;i+) Sum+=ADC_Value
45、i; /求和Aver=Sum/16; /這一句的運(yùn)算較慢對(duì)于除 16 寫(xiě)成如下形式,運(yùn)行速度會(huì)提高很多:Aver=Sum>>4; /除以 16若將編譯器優(yōu)化級(jí)別設(shè)置得比較高,在遇到乘除 2 的冪表達(dá)式時(shí),編譯器會(huì)自動(dòng)用移位替代除法(編譯器很聰明),從而加快執(zhí)行速度。位操作指令大部分存在于早期速度不高的 CISC 處理器上(以 8051 為代表),以提高執(zhí)行效率,彌補(bǔ) CPU 運(yùn)算速度的不足。目前幾乎所有的 RISC 型處理器都取消了位操作指令,430 單片機(jī)也不例外。在 430 的 C 語(yǔ)言中,也不支持位變量,因?yàn)槲徊僮魍耆梢杂勺兞颗c掩模位(mask bits)之間的邏輯操作來(lái)實(shí)
46、現(xiàn)。例如將 P1.0 置高、將 P1.1 置低,將 P1.2 取反,我們可以寫(xiě)成:P1OUT |= 0x01; /P2.0 置高P1OUT &= 0x02; /P2.1 置低P1OUT = 0x04; /P2.2 取反在寄存器頭文件中,已經(jīng)將 BIT0BIT7 定義成 0x010x80,上述程序也可以寫(xiě)成:P1OUT |= BIT0; /P2.0 置高P1OUT &= BIT1; /P2.1 置低P1OUT = BIT2; /P2.2 取反對(duì)于多位可以同時(shí)操作,例如將 P1.1、P1.2、P1.3、P1.4 全部置高/低可以寫(xiě)成:P1OUT |= BIT1+BIT2+BIT3+
47、BIT4; /P1.1/2/3/4 全置高P1OUT &=(BIT1+BIT2+BIT3+BIT4); /P1.1/2/3/4 全置低注意括號(hào)!實(shí)際上,這條語(yǔ)句相當(dāng)于P1OUT |= 0x1e; /P1.1/2/3/4 全置高對(duì)于讀操作,也可以通過(guò)寄存器與掩模位(mask bits)之間的“與”操作來(lái)實(shí)現(xiàn)。例如有通過(guò) P1.5、P1.6 口控制位于 P2.0 口的 LED。下面代碼示范讀取 P1.5 和 1.6 的值:char Key;if(P1IN & BIT5)=0)P2OUT|=BIT0;/若P1.5為低,則P2.0口的LED 亮if( P1IN & BIT5)P
48、2OUT|=BIT1;/若P1.5為高,則P2.1口的 LED 亮if( P1IN & (BIT5+BIT6)P2OUT|=BIT0;/若 P1.5 和 P1.6 任一為高,則點(diǎn)亮LEDif(P1IN & (BIT5+BIT6) != (BIT5+BIT6)P2OUT|=BIT0;/若 P1.5 和 P1.6 任一為低,則點(diǎn)亮 LEDif(P1IN & BIT5)Key=1;ElseKey=0; /讀取 P1.5 狀態(tài)賦給變量 Key。另外還有一種流行的位操作寫(xiě)法,用(1<<x)來(lái)替代 BITx 宏定義:P2OUT |= (1<<0); /P2.
49、0 置高P2OUT &= (1<<1); /P2.1 置低P2OUT = (1<<2); /P2.2 取反if(P1IN & (1<<5)=0) P2OUT|=(1<<0); /若 P1.5 為低,則 P2.0 口的LED 亮。這種寫(xiě)法的好處是使用純粹的 C 語(yǔ)言表達(dá)式實(shí)現(xiàn),不依賴于 msp430 的頭文件中 BITx的宏定義,無(wú)需改動(dòng)即可移植到任何其他單片機(jī)上,但可讀性較差。2.2.3 函數(shù)C語(yǔ)言程序是由若干個(gè)函數(shù)單元組成的,每個(gè)函數(shù)都是完成某個(gè)特殊任務(wù)的子程序段。組成一個(gè)程序的若干個(gè)函數(shù)可以保存在一個(gè)源程序文件中,也可以保存在
50、不同源程序文件中。文件名由程序設(shè)計(jì)人員根據(jù)某種規(guī)則自己確定,其擴(kuò)展名統(tǒng)一為“.C”。一個(gè)完整的C語(yǔ)言程序應(yīng)包含一個(gè)主函數(shù)main()和若干個(gè)其它功能的函數(shù)。函數(shù)之間可以相互調(diào)用,但main()函數(shù)只能調(diào)用其它的功能函數(shù),而不能被其它函數(shù)所調(diào)用。功能函數(shù)可以是C語(yǔ)言編譯器提供的庫(kù)函數(shù),也可以由用戶按實(shí)際需要自行編寫(xiě)的函數(shù)。不管main()函數(shù)處于程序中的什么位置,程序總是從main()函數(shù)開(kāi)始執(zhí)行。一個(gè)函數(shù)必須預(yù)先定義或聲明后才能調(diào)用。函數(shù)定義或聲明位于源程序的預(yù)處理命令之后的開(kāi)始位置。函數(shù)定義部分包括有函數(shù)的存儲(chǔ)類(lèi)型、返回值數(shù)據(jù)類(lèi)型、函數(shù)名、形式參數(shù)說(shuō)明等,函數(shù)名后面必須跟一個(gè)圓括弧(),形式
51、參數(shù)說(shuō)明在圓括?。ǎ﹥?nèi)進(jìn)行。函數(shù)也可以沒(méi)有形式參數(shù)。函數(shù)的位置比較自由。函數(shù)由函數(shù)名和一對(duì)花括弧“”組成,在“”里面的內(nèi)容就是函數(shù)體,如果一個(gè)函數(shù)有多個(gè)“”,則最外面的一對(duì)“”為函數(shù)體的范圍。函數(shù)是C語(yǔ)言中的一種基本模塊。在進(jìn)行程序設(shè)計(jì)的過(guò)程中,如果所設(shè)計(jì)的程序較大,一般應(yīng)將其分成若干個(gè)子程序模塊,每個(gè)子程序模塊完成一種特定的功能。在C語(yǔ)言中,子程序是用函數(shù)來(lái)實(shí)現(xiàn)的。對(duì)于一些需要經(jīng)常使用的子程序可以按函數(shù)來(lái)設(shè)計(jì),以供反復(fù)調(diào)用。此外,EW430編譯器還提供了豐富的運(yùn)行庫(kù)函數(shù),用戶可以根據(jù)需要隨時(shí)調(diào)用。這種模塊化的程序設(shè)計(jì)方法,可以大大提高編程效率。標(biāo)準(zhǔn)庫(kù)函數(shù)見(jiàn)IAR for msp430安裝目錄
52、文件clib.pdf,路徑D:Program FilesIAR SystemsEmbedded Workbench 6.0 Evaluation430docclib.pdf。從用戶的角度來(lái)看,有兩種函數(shù):標(biāo)準(zhǔn)庫(kù)函數(shù)和用戶自定義函數(shù)。標(biāo)準(zhǔn)庫(kù)函數(shù)是IAR EW430編譯器提供的,不需要用戶進(jìn)行定義,可以直接調(diào)用。用戶自定義函數(shù)是用戶根據(jù)自己的需要編寫(xiě)的能實(shí)現(xiàn)特定功能的函數(shù),它必須先進(jìn)行定義之后才能調(diào)用。函數(shù)的定義無(wú)參數(shù)函數(shù)定義的語(yǔ)法格式: Void 函數(shù)名() 聲明部分 程序語(yǔ)句 void delay(void) /函數(shù)頭 unsigned int i,j; /聲明部分 for(i=100;i&g
53、t;0;i-) /程序語(yǔ)句 for(j=112;j>0;j-) ; 有參數(shù)函數(shù)定義的語(yǔ)法格式:函數(shù)類(lèi)型 函數(shù)名(形式參數(shù)表) 形式參數(shù)說(shuō)明; 局部變量定義; 函數(shù)體語(yǔ)句; 其中,“函數(shù)類(lèi)型”說(shuō)明了自定義函數(shù)返回值的類(lèi)型。 int compare(int a,int b)/函數(shù)頭,括號(hào)里為形式參數(shù) if(a>b) /以下是程序語(yǔ)句 return a; else return b; 對(duì)于實(shí)參與形參的特點(diǎn)有以下的幾點(diǎn)補(bǔ)充: 1)實(shí)參與形參在類(lèi)型數(shù)量順序應(yīng)保持一致,否則會(huì)在編繹的時(shí)候出現(xiàn)警告或者程序運(yùn)行的結(jié)果錯(cuò)誤。 2)被調(diào)用函數(shù)的形參只有被調(diào)用的時(shí)候才會(huì)被分配內(nèi)存空間,退出了函數(shù)之后,所
54、分配的內(nèi)存單元立即被釋放,所以退出了函數(shù)之后形參就不能再使用。 3)實(shí)參在調(diào)用前一定要有確定的值,因此在函數(shù)調(diào)用前必須先賦予實(shí)參一個(gè)確定的值。 如果定義函數(shù)時(shí)只給出一對(duì)花括號(hào)而不給出其局部變量和函數(shù)體語(yǔ)句,則該函數(shù)為所謂“空函數(shù)”,這種空函數(shù)也是合法的。在進(jìn)行C語(yǔ)言模塊化程序設(shè)計(jì)時(shí),各模塊的功能可通過(guò)函數(shù)來(lái)實(shí)現(xiàn)。開(kāi)始時(shí)只設(shè)計(jì)最基本的模塊,其它作為擴(kuò)充功能在以后需要時(shí)再加上。編寫(xiě)程序時(shí)可在將來(lái)準(zhǔn)備擴(kuò)充的地方寫(xiě)上一個(gè)空函數(shù),這樣可使程序的結(jié)構(gòu)清晰,可讀性好,而且易于擴(kuò)充。C語(yǔ)言程序中函數(shù)是可以互相調(diào)用的。所謂函數(shù)調(diào)用就是在一個(gè)函數(shù)體中引用另外一個(gè)已經(jīng)定義了的函數(shù),前者稱為主調(diào)用函數(shù),后者稱為被調(diào)用
55、函數(shù)。主調(diào)用函數(shù)調(diào)用被調(diào)用函數(shù)的一般形式為: 函數(shù)名(實(shí)際參數(shù)表); 其中,“函數(shù)名”指出被調(diào)用的函數(shù)。 “實(shí)際參數(shù)表”中可以包含多個(gè)實(shí)際參數(shù),各個(gè)參數(shù)之間用逗號(hào)隔開(kāi)。實(shí)際參數(shù)的作用是將它的值傳遞給被調(diào)用函數(shù)中的形式參數(shù)。在C語(yǔ)言中可以采用三種方式完成函數(shù)的調(diào)用: 1)函數(shù)語(yǔ)句。在主調(diào)函數(shù)中將函數(shù)調(diào)用作為一條語(yǔ)句。 2)函數(shù)表達(dá)式。在主調(diào)函數(shù)中將函數(shù)調(diào)用作為一個(gè)運(yùn)算對(duì)象直接出現(xiàn)在表達(dá)式中。 3)函數(shù)參數(shù)。在主調(diào)函數(shù)中將函數(shù)調(diào)用作為另一個(gè)函數(shù)用的實(shí)際參數(shù)。在進(jìn)行函數(shù)調(diào)用時(shí),必須用主調(diào)函數(shù)中的實(shí)際參數(shù)來(lái)替換被調(diào)函數(shù)中的形式參數(shù),這就是所謂的參數(shù)傳遞。在C語(yǔ)言中,對(duì)于不同類(lèi)型的實(shí)際參數(shù),有三種不同的參數(shù)傳遞方式: 1)基本類(lèi)型的實(shí)際參數(shù)傳遞 當(dāng)函數(shù)的參數(shù)是基本類(lèi)型的變量時(shí),主調(diào)函數(shù)將實(shí)際參數(shù)的值傳遞給被調(diào)函數(shù)中的形式參數(shù),這種方式稱為值傳遞。前面講過(guò),函數(shù)中的形式參數(shù)在未發(fā)生數(shù)調(diào)用之前是不占用內(nèi)存單元的,只有在進(jìn)行函數(shù)調(diào)用時(shí)才為其分配臨時(shí)存儲(chǔ)單元。而函數(shù)的實(shí)際參數(shù)是要占用確定的存儲(chǔ)單元的。 值傳遞方式是將實(shí)際參數(shù)的值傳遞到為被調(diào)函數(shù)中形式參數(shù)分
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度創(chuàng)意園區(qū)個(gè)人租賃合同書(shū)3篇
- 2025年度農(nóng)產(chǎn)品自產(chǎn)自銷(xiāo)農(nóng)村電商扶貧合作合同3篇
- 2025年度汽車(chē)維修企業(yè)員工績(jī)效考核與激勵(lì)合同范本3篇
- 二零二五年度網(wǎng)絡(luò)紅人經(jīng)紀(jì)合作合同范本3篇
- 二零二五年度風(fēng)力發(fā)電工程質(zhì)保金合同規(guī)定2篇
- 2025年度公租房合同(含租戶信息保密條款)2篇
- 二零二五年度農(nóng)村墓地墓區(qū)照明系統(tǒng)設(shè)計(jì)與安裝協(xié)議
- 2025年度文化產(chǎn)業(yè)股權(quán)置換及合作協(xié)議書(shū)3篇
- 二零二五年度企業(yè)股份分割與股權(quán)激勵(lì)實(shí)施協(xié)議書(shū)2篇
- 二零二五年度消費(fèi)股東合作協(xié)議及創(chuàng)新業(yè)務(wù)拓展2篇
- 【MOOC】診斷學(xué)-山東大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 人體寄生蟲(chóng)表格總結(jié)超全(原蟲(chóng)部分)
- 合作投資酒店意向合同范例
- 2024年度新能源汽車(chē)充電物流合同
- 2024年學(xué)校意識(shí)形態(tài)工作總結(jié)模版(3篇)
- 機(jī)械設(shè)備招投標(biāo)授權(quán)委托書(shū)模板
- 科研年終總結(jié)匯報(bào)
- 汽車(chē)維修安全應(yīng)急預(yù)案范文(5篇)
- 安全教育教案大班40篇
- 2024-2030年中國(guó)清潔供熱行業(yè)發(fā)展趨勢(shì)與投資前景預(yù)測(cè)報(bào)告版
- 2025屆上海市交大附中嘉定分校物理高二上期末達(dá)標(biāo)檢測(cè)試題含解析
評(píng)論
0/150
提交評(píng)論