MSP430單片機(jī)原理課件_第1頁
MSP430單片機(jī)原理課件_第2頁
MSP430單片機(jī)原理課件_第3頁
MSP430單片機(jī)原理課件_第4頁
MSP430單片機(jī)原理課件_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第2章MSP430單片機(jī)原理2.1MSP430F249單片機(jī)基本結(jié)構(gòu)與原理MSP430F249的主要結(jié)構(gòu)特點(diǎn)供電電壓范圍1.8V~3.6V。超低功耗:活動狀態(tài)270uA(1MHz,2.2V);待機(jī)模式0.3uA;關(guān)機(jī)模式0.1uA。16位RISC精簡指令集處理器。時鐘系統(tǒng):多種時鐘源,可靈活使用。時鐘頻率達(dá)到16MHz;具有內(nèi)部振蕩器;可外接32kHz低頻晶振;外接時鐘輸入。第2章MSP430單片機(jī)原理2.1MSP430F249單112位A/D轉(zhuǎn)換器,內(nèi)部參考電壓,采用保持電路。16位定時器A,3個捕獲/比較寄存器。16位定時器B,7個捕獲/比較寄存器。4個通用串口:USCI_A0和USCI_A1、USCI_B0和USCI_B1(I2C、SPI)。60kB+256B的flash程序存儲器,2kB的RAM數(shù)據(jù)存儲器。64引腳QFP封裝。MSP430F249的主要結(jié)構(gòu)特點(diǎn)12位A/D轉(zhuǎn)換器,內(nèi)部參考電壓,采用保持電路。MSP4302MSP430F24x系列單片機(jī)功能結(jié)構(gòu)示意圖MSP430F24x系列單片機(jī)功能結(jié)構(gòu)示意圖3MSP430F249單片機(jī)引腳圖MSP430F249單片機(jī)引腳圖4(1)CPU簡介

MSP430單片機(jī)的CPU為16位RISC精簡指令集的處理器,只有27條正交匯編指令和7種尋址方式。RISC處理器基本上是為高級語言所設(shè)計的,編譯程序?qū)φ恢噶钕到y(tǒng)很容易做到最優(yōu)化,利于產(chǎn)生高效緊湊的代碼。MSP430CPU中集成了16個16位通用寄存器R0~R15,其中R0~R3分別復(fù)用為程序指針PC、堆棧指針SP、狀態(tài)寄存器SR和常數(shù)發(fā)生器CG1/CG2。這些寄存器之間的操作只需要一個CPU周期。(1)CPU簡介

MSP430單片機(jī)的CPU為16位RISC51)程序計數(shù)器(PC指針)也就是CPU專用寄存器R0,PC指針是一個16位寄存器,可以尋址64kB的空間。MSP430單片機(jī)的指令長度以字(16位)為最小單位,而程序存儲器單元以字節(jié)(8位)為單位,所以PC的值總是偶數(shù)。2)堆棧指針SP為CPU專用寄存器R1,SP指針為16為寄存器,也總是偶數(shù)的。堆棧是在片內(nèi)RAM中實(shí)現(xiàn)的,通常將堆棧指針設(shè)置為片內(nèi)RAM的最高地址加一。使用C語言編程時,集成編譯軟件IAR會自動設(shè)置堆棧指針初始值。對程序員來說無需關(guān)心細(xì)節(jié),編譯結(jié)束后在信息窗提示的編譯結(jié)果會給出RAM使用量的大小,只要不超過RAM區(qū)實(shí)際容量并稍留余量給堆棧用即可。使用匯編語言編程時必須注意堆棧指針的正確設(shè)置,否則堆??赡軙采w你的變量區(qū),導(dǎo)致程序出錯。1)程序計數(shù)器(PC指針)也就是CPU專用寄存器R0,PC指6(2)片內(nèi)存儲器MSP430單片機(jī)采用馮·諾依曼結(jié)構(gòu),程序存儲器flash、數(shù)據(jù)存儲器RAM、特殊功能寄存器以及中斷向量全部映射到64kB內(nèi)部地址空間。MSP430不同型號單片機(jī)地址空間略有不同,MSP430F249的存儲器結(jié)構(gòu)如表2-2所示。名稱地址范圍大小中斷向量0xFFFF~0xFFC064B程序存儲區(qū)flash0xFFC0~0x1100約60kB信息存儲區(qū)0x10FF~0x1000256B引導(dǎo)區(qū)0x0FFF~0x0C001kB數(shù)據(jù)存儲區(qū)RAM0x09FF~0x02002kB16位外圍模塊0x01FF~0x0100256B8位外圍模塊0x00FF~0x0010240B特殊寄存器0x000F~0x000016B(2)片內(nèi)存儲器名稱地址范圍大小中斷向量0xFFFF~0xF7模式說明活動模式CPU、所有時鐘與外設(shè)都為激活狀態(tài)LPM0CPU關(guān)閉、ACLK和SMCLK外設(shè)時鐘可用LPM1CPU關(guān)閉、ACLK和SMCLK外設(shè)時鐘可用,若活動模式中DCOCLK未使用,則DCO發(fā)生器也禁止LPM2CPU關(guān)閉、MCLK和SMCLK禁止,DCO發(fā)生器使能,ACLK可用LPM3CPU關(guān)閉、MCLK和SMCLK禁止,DCO發(fā)生器禁止,ACLK可用LPM4CPU關(guān)閉且禁用所有時鐘表2-3工作模式表模式說明活動模式CPU、所有時鐘與外設(shè)都為激活狀態(tài)LPM0C82.2MSP430單片機(jī)的C語言基礎(chǔ)C語言是一種結(jié)構(gòu)化的高級語言,其優(yōu)點(diǎn)是語言簡潔、表達(dá)能力強(qiáng)、使用方便靈活、可讀性好、可移植性強(qiáng)。C語言程序本身不依賴單片機(jī)硬件,如果更改工程項目中的單片機(jī)型號,對C語言程序稍加修改就可以進(jìn)行程序移植,而且移植程序時不一定要求程序開發(fā)人員詳細(xì)掌握新型號單片機(jī)的指令系統(tǒng)。C語言程序的書寫格式十分自由。一條語句可以寫成一行,也可以寫成幾行;還可以在一行內(nèi)寫多條語句;但是需要注意的是,每條語句都必須以分號“;”作為結(jié)束符。2.2MSP430單片機(jī)的C語言基礎(chǔ)C語言是一種結(jié)構(gòu)化的高9為了C語言程序能夠書寫清晰,便于閱讀、理解和維護(hù),在書寫C語言程序時最好遵循以下規(guī)則。a)一個聲明或一條語句占一行;b)不同結(jié)構(gòu)層次的語句,從不同的起始位置開始,機(jī)縮進(jìn)相同的字?jǐn)?shù);c)用{}括起來的部分表示程序的某一層次結(jié)構(gòu)。為了C語言程序能夠書寫清晰,便于閱讀、理解和維護(hù),在書寫C語101)C語言的標(biāo)識符是用來標(biāo)識源程序中某個對象名字的。這些對象可以是函數(shù)、變量、常量、數(shù)組、數(shù)據(jù)類型、存儲方式、語句等。一個標(biāo)識符由字符串、數(shù)字和下劃線等組成,第一個字符必須是字母或下劃線,通常以下劃線開頭的標(biāo)識符是編譯系統(tǒng)專用的,因此在編寫C語言源程序時一般不要使用以下劃線開頭的標(biāo)識符,而將下劃線用作分段符。標(biāo)識符的長度由系統(tǒng)決定,標(biāo)識符最長可達(dá)255個字符,編寫源程序時標(biāo)識符的長度不要超過32個字符。1)C語言的標(biāo)識符是用來標(biāo)識源程序中某個對象名字的。這些對象112)關(guān)鍵字是一類具有固定名稱和特定含義的特殊標(biāo)識符,又稱為保留字。在編寫C語言源程序時一般不允許將關(guān)鍵字另作別用,換句話說就是對于標(biāo)識符的命名不要與關(guān)鍵字相同。上面表2.4所列的C語言關(guān)鍵字由系統(tǒng)保留不能用作用戶標(biāo)識符。3)程序中對于標(biāo)識符的命名應(yīng)當(dāng)簡潔明了,含義清晰,便于閱讀理解,如用標(biāo)識符“max”表示最大值,用“TIMER0”表示定時器0等。盡量不要取名“aa”、“bb”等等沒有特定意義的標(biāo)識符,這樣雖然沒有違反C語言的規(guī)則,但是在程序里就很不容易理解。2)關(guān)鍵字是一類具有固定名稱和特定含義的特殊標(biāo)識符,又稱為保124)C語言區(qū)分大小寫字母,C語言編譯器在對程序進(jìn)行編譯時,對于程序中同一個字母的大小寫作為不同的變量來處理。例如定義一個延時函數(shù)的形式參數(shù)time,但是如果程序當(dāng)中再出現(xiàn)一個由大寫字母定義的標(biāo)識符TIME,那么它們在程序當(dāng)中是兩個不同的標(biāo)識符,是沒有沖突的。5)C語言程序中有且只有一個main函數(shù),一個C語言程序,無論main函數(shù)的物理位置在那里,總是從main函數(shù)開始執(zhí)行。4)C語言區(qū)分大小寫字母,C語言編譯器在對程序進(jìn)行編譯時,對136)每句程序語句后面一定要加分號,分號是C語言結(jié)構(gòu)的一部分,如果缺少了就會語法出錯。7)注釋,在程序中添加注釋是為了能更加容易讀懂和理解程序,IAR有兩種風(fēng)格的注釋方法“//”和“/*----------*/”?!?/”的意思是在其后面的全部引導(dǎo)為注釋,而“/*----------*/”的意思是在“/*”開始,一直到遇到“*/”為止,在其里面的內(nèi)容都被認(rèn)為是注釋。6)每句程序語句后面一定要加分號,分號是C語言結(jié)構(gòu)的一部分,14Float和double的指數(shù)位是按補(bǔ)碼的形式來表示的,所以float的指數(shù)范圍為-128~+127,而double的指數(shù)范圍為-1024~+1023。float的范圍為-2^128~+2^128,也即-3.40E+38~+3.40E+38;double的范圍為-2^1024~+2^1024,也即-1.79E+308~+1.79E+308。float和double的精度是由尾數(shù)的位數(shù)來決定的。float:2^23=8388608,一共七位,這意味著最多能有7位有效數(shù)字,float的精度為7位;

double:2^52=4503599627370496,一共16位,double的精度為16位。Float和double的指數(shù)位是按補(bǔ)碼的形式來表示的,所以15const:定義常量。在C430語言中,const關(guān)鍵字定義的常量實(shí)際上被放在了程序存儲器flash中,經(jīng)常用const關(guān)鍵字定義顯示表之類的常數(shù)數(shù)組。extern:聲明外部變量,外部變量是指在函數(shù)或文件外部定義的全局變量。使用時,extern置于變量或函數(shù)前,表示變量或函數(shù)的定義在別的文件中,提示編譯器在遇到此變量和函數(shù)時在其他模塊中尋找它的定義,static :定義靜態(tài)局部變量或靜態(tài)函數(shù),靜態(tài)局部變量或靜態(tài)函數(shù)只有本文件內(nèi)的代碼才能訪問它,它的名字在其它文件中不可見。有時候希望函數(shù)中的局部變量的值在函數(shù)調(diào)用結(jié)束后不消失而保留原值,即其占用的存儲單元不釋放,在下次該函數(shù)調(diào)用時,該變量保留上一次函數(shù)調(diào)用結(jié)束時的值。這時就應(yīng)該指定局部變量為靜態(tài)局部變量。const:定義常量。在C430語言中,const關(guān)鍵字16全局變量:只要定義在函數(shù)體(包括主函數(shù))外,就是全局變量了,編譯器為全局變量安排特定的數(shù)據(jù)區(qū),這些數(shù)據(jù)區(qū)為全局變量專用。全局變量一般定義在C程序的開頭部分、主函數(shù)之前,在與該程序有關(guān)的所有文件都可以使用該變量。程序開始時分配空間,程序結(jié)束時釋放空間,默認(rèn)初始化為0。對于多文件C語言程序,如果全局變量定義在其它文件中,那么別的程序文件里面的函數(shù)要訪問另一個文件里面的全局變量,須在對全局變量進(jìn)行外部變量聲明,關(guān)鍵詞extern。局部變量是在一個函數(shù)內(nèi)部定義的變量,它只在定義它的那個函數(shù)范圍以內(nèi)有效,在此函數(shù)之外局部變量即失去意義,因而也就不能使用這些變量了。不同的函數(shù)可以使用相同的局部變量名,由于它們的作用范圍不同,不會相互干擾。函數(shù)的形式參數(shù)也屬于局部變量。局部變量在每次函數(shù)調(diào)用時分配存儲空間,在每次函數(shù)返回時釋放存儲空間。全局變量:只要定義在函數(shù)體(包括主函數(shù))外,就是全局變量了,17自增、自減運(yùn)算符說明:++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)算符說明:在賦值運(yùn)算符“=”的前面加上其它運(yùn)算符,就構(gòu)成了所謂復(fù)合賦值運(yùn)算符。+=加法賦值,>>=右移位賦值,-=減法賦值,&=邏輯與賦值,*=乘法賦值,|=邏輯或賦值,/=除法賦值,^=邏輯異或賦值,%=取模賦值,~=邏輯非賦值,<<=左移位賦值。自增、自減運(yùn)算符說明:181)盡可能避免浮點(diǎn)運(yùn)算。對于單片機(jī)來說,浮點(diǎn)數(shù)的運(yùn)算速度很慢,RAM開銷也大,且有效位數(shù)有限;在低功耗應(yīng)用中CPU運(yùn)算時間直接關(guān)系到平均功耗。因此在編程初期就要養(yǎng)成盡量避免使用浮點(diǎn)數(shù)的習(xí)慣。2)防止定點(diǎn)數(shù)溢出。定點(diǎn)數(shù)運(yùn)算首先要防止數(shù)據(jù)溢出。3)小數(shù)的處理。遇到需要保留小數(shù)的運(yùn)算,可以采用浮點(diǎn)數(shù),但是軟件開銷較大。用定點(diǎn)數(shù)也可以處理小數(shù)。原理就是先擴(kuò)大,再運(yùn)算。4)盡量減少乘除法。430單片機(jī)沒有乘法/除法指令,乘除操作會被編譯器轉(zhuǎn)換成移位和加法來實(shí)現(xiàn)。如果乘除的數(shù)值剛好是2的冪,那么可以用移位直接替代乘除法,運(yùn)算速度會提高很多。1)盡可能避免浮點(diǎn)運(yùn)算。對于單片機(jī)來說,浮點(diǎn)數(shù)的運(yùn)算速度很慢19例如將P1.0置高、將P1.1置低,將P1.2取反,我們可以寫成:P1OUT|=0x01;//P2.0置高P1OUT&=~0x02;//P2.1置低P1OUT^=0x04;//P2.2取反在寄存器頭文件中,已經(jīng)將BIT0~BIT7定義成0x01~0x80,上述程序也可以寫成:P1OUT|=BIT0;//P2.0置高P1OUT&=~BIT1;//P2.1置低P1OUT^=BIT2;//P2.2取反對于多位可以同時操作,例如將P1.1、P1.2、P1.3、P1.4全部置高/低可以寫成:P1OUT|=BIT1+BIT2+BIT3+BIT4;//P1.1/2/3/4全置高P1OUT&=~(BIT1+BIT2+BIT3+BIT4);//P1.1/2/3/4全置低,注意括號!實(shí)際上,這條語句相當(dāng)于P1OUT|=0x1e;//P1.1/2/3/4全置高例如將P1.0置高、將P1.1置低,將P1.2取20charKey;if((P1IN&BIT5)==0)P2OUT|=BIT0;//若P1.5為低,則P2.0口的LED亮if(P1IN&BIT5)P2OUT|=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。charKey;21函數(shù)是C語言中的一種基本模塊。在進(jìn)行程序設(shè)計的過程中,如果所設(shè)計的程序較大,一般應(yīng)將其分成若干個子程序模塊,每個子程序模塊完成一種特定的功能。在C語言中,子程序是用函數(shù)來實(shí)現(xiàn)的。對于一些需要經(jīng)常使用的子程序可以按函數(shù)來設(shè)計,以供反復(fù)調(diào)用。此外,EW430編譯器還提供了豐富的運(yùn)行庫函數(shù),用戶可以根據(jù)需要隨時調(diào)用。這種模塊化的程序設(shè)計方法,可以大大提高編程效率。從用戶的角度來看,有兩種函數(shù):標(biāo)準(zhǔn)庫函數(shù)和用戶自定義函數(shù)。標(biāo)準(zhǔn)庫函數(shù)是IAREW430編譯器提供的,不需要用戶進(jìn)行定義,可以直接調(diào)用。用戶自定義函數(shù)是用戶根據(jù)自己的需要編寫的能實(shí)現(xiàn)特定功能的函數(shù),它必須先進(jìn)行定義之后才能調(diào)用。函數(shù)是C語言中的一種基本模塊。在進(jìn)行程序設(shè)計的過程中,如果所22指針是C語言中一個十分重要的概念,也是C語言的一個難點(diǎn),曾經(jīng)有許多人這樣講過,要精通指針的程序員才算正真懂得C語言。只要掌握指針,才能使程序變得更加簡潔、緊湊、高效,在C語言當(dāng)中指針可以談得上是全部精華的所在。初學(xué)者在開始學(xué)習(xí)時可能會有一點(diǎn)不習(xí)慣﹑但是不要灰心,只要我們在平時多思考、多上機(jī),那么很快就可以掌握它了。所謂指針就是指內(nèi)存中的地址,它可能是變量的地址,也可能是函數(shù)的入口地址。如果指針變量存儲的地址是變量的地址,則稱為變量的指針,簡稱變量指針;如果指針變量存儲的地址是函數(shù)的入口地址,則稱為函數(shù)的指針,簡稱函數(shù)指針。變量的指針就是該變量的地址,可以定義一個指向某個變量的指針變量。為了表示指針變量和它所指向的變量地址之間的關(guān)系,C語言提供了兩個專門的運(yùn)算符:*取內(nèi)容,&取地址。指針是C語言中一個十分重要的概念,也是C語言的一個難點(diǎn),曾經(jīng)23C語言程序的開始部分通常是預(yù)處理命令,如程序中通常遇到的#include命令。這個預(yù)處理命令通知編譯器在對程序進(jìn)行編譯時,將所需要的頭文件讀入后再一起進(jìn)行編譯。一般在“頭文件”中包含有程序在編譯時的一些必要的信息,通常C語言編譯器都會提供若干個不同用途的頭文件。頭文件的讀入是在對程序進(jìn)行編譯時才完成的。預(yù)處理命令通常在程序編譯時進(jìn)行一些符號處理,其并不執(zhí)行具體的硬件操作。C語言中的預(yù)處理命令主要有宏定義指令、文件包含指令和條件編譯指令,還有其他一些調(diào)試時使用的指令。本章將詳細(xì)介紹各種預(yù)處理命令以及用戶配置文件,并結(jié)合一定的程序?qū)嵗约由罾斫?。預(yù)處理指令是以#號開頭的代碼行,#后是指令關(guān)鍵字,整行語句構(gòu)成了一條預(yù)處理指令。該指令將在編譯器進(jìn)行編譯之前對源代碼做某些轉(zhuǎn)換。C語言程序的開始部分通常是預(yù)處理命令,如程序中通常遇到的#i24MSP430單片機(jī)原理課件25第2章MSP430單片機(jī)原理2.1MSP430F249單片機(jī)基本結(jié)構(gòu)與原理MSP430F249的主要結(jié)構(gòu)特點(diǎn)供電電壓范圍1.8V~3.6V。超低功耗:活動狀態(tài)270uA(1MHz,2.2V);待機(jī)模式0.3uA;關(guān)機(jī)模式0.1uA。16位RISC精簡指令集處理器。時鐘系統(tǒng):多種時鐘源,可靈活使用。時鐘頻率達(dá)到16MHz;具有內(nèi)部振蕩器;可外接32kHz低頻晶振;外接時鐘輸入。第2章MSP430單片機(jī)原理2.1MSP430F249單2612位A/D轉(zhuǎn)換器,內(nèi)部參考電壓,采用保持電路。16位定時器A,3個捕獲/比較寄存器。16位定時器B,7個捕獲/比較寄存器。4個通用串口:USCI_A0和USCI_A1、USCI_B0和USCI_B1(I2C、SPI)。60kB+256B的flash程序存儲器,2kB的RAM數(shù)據(jù)存儲器。64引腳QFP封裝。MSP430F249的主要結(jié)構(gòu)特點(diǎn)12位A/D轉(zhuǎn)換器,內(nèi)部參考電壓,采用保持電路。MSP43027MSP430F24x系列單片機(jī)功能結(jié)構(gòu)示意圖MSP430F24x系列單片機(jī)功能結(jié)構(gòu)示意圖28MSP430F249單片機(jī)引腳圖MSP430F249單片機(jī)引腳圖29(1)CPU簡介

MSP430單片機(jī)的CPU為16位RISC精簡指令集的處理器,只有27條正交匯編指令和7種尋址方式。RISC處理器基本上是為高級語言所設(shè)計的,編譯程序?qū)φ恢噶钕到y(tǒng)很容易做到最優(yōu)化,利于產(chǎn)生高效緊湊的代碼。MSP430CPU中集成了16個16位通用寄存器R0~R15,其中R0~R3分別復(fù)用為程序指針PC、堆棧指針SP、狀態(tài)寄存器SR和常數(shù)發(fā)生器CG1/CG2。這些寄存器之間的操作只需要一個CPU周期。(1)CPU簡介

MSP430單片機(jī)的CPU為16位RISC301)程序計數(shù)器(PC指針)也就是CPU專用寄存器R0,PC指針是一個16位寄存器,可以尋址64kB的空間。MSP430單片機(jī)的指令長度以字(16位)為最小單位,而程序存儲器單元以字節(jié)(8位)為單位,所以PC的值總是偶數(shù)。2)堆棧指針SP為CPU專用寄存器R1,SP指針為16為寄存器,也總是偶數(shù)的。堆棧是在片內(nèi)RAM中實(shí)現(xiàn)的,通常將堆棧指針設(shè)置為片內(nèi)RAM的最高地址加一。使用C語言編程時,集成編譯軟件IAR會自動設(shè)置堆棧指針初始值。對程序員來說無需關(guān)心細(xì)節(jié),編譯結(jié)束后在信息窗提示的編譯結(jié)果會給出RAM使用量的大小,只要不超過RAM區(qū)實(shí)際容量并稍留余量給堆棧用即可。使用匯編語言編程時必須注意堆棧指針的正確設(shè)置,否則堆??赡軙采w你的變量區(qū),導(dǎo)致程序出錯。1)程序計數(shù)器(PC指針)也就是CPU專用寄存器R0,PC指31(2)片內(nèi)存儲器MSP430單片機(jī)采用馮·諾依曼結(jié)構(gòu),程序存儲器flash、數(shù)據(jù)存儲器RAM、特殊功能寄存器以及中斷向量全部映射到64kB內(nèi)部地址空間。MSP430不同型號單片機(jī)地址空間略有不同,MSP430F249的存儲器結(jié)構(gòu)如表2-2所示。名稱地址范圍大小中斷向量0xFFFF~0xFFC064B程序存儲區(qū)flash0xFFC0~0x1100約60kB信息存儲區(qū)0x10FF~0x1000256B引導(dǎo)區(qū)0x0FFF~0x0C001kB數(shù)據(jù)存儲區(qū)RAM0x09FF~0x02002kB16位外圍模塊0x01FF~0x0100256B8位外圍模塊0x00FF~0x0010240B特殊寄存器0x000F~0x000016B(2)片內(nèi)存儲器名稱地址范圍大小中斷向量0xFFFF~0xF32模式說明活動模式CPU、所有時鐘與外設(shè)都為激活狀態(tài)LPM0CPU關(guān)閉、ACLK和SMCLK外設(shè)時鐘可用LPM1CPU關(guān)閉、ACLK和SMCLK外設(shè)時鐘可用,若活動模式中DCOCLK未使用,則DCO發(fā)生器也禁止LPM2CPU關(guān)閉、MCLK和SMCLK禁止,DCO發(fā)生器使能,ACLK可用LPM3CPU關(guān)閉、MCLK和SMCLK禁止,DCO發(fā)生器禁止,ACLK可用LPM4CPU關(guān)閉且禁用所有時鐘表2-3工作模式表模式說明活動模式CPU、所有時鐘與外設(shè)都為激活狀態(tài)LPM0C332.2MSP430單片機(jī)的C語言基礎(chǔ)C語言是一種結(jié)構(gòu)化的高級語言,其優(yōu)點(diǎn)是語言簡潔、表達(dá)能力強(qiáng)、使用方便靈活、可讀性好、可移植性強(qiáng)。C語言程序本身不依賴單片機(jī)硬件,如果更改工程項目中的單片機(jī)型號,對C語言程序稍加修改就可以進(jìn)行程序移植,而且移植程序時不一定要求程序開發(fā)人員詳細(xì)掌握新型號單片機(jī)的指令系統(tǒng)。C語言程序的書寫格式十分自由。一條語句可以寫成一行,也可以寫成幾行;還可以在一行內(nèi)寫多條語句;但是需要注意的是,每條語句都必須以分號“;”作為結(jié)束符。2.2MSP430單片機(jī)的C語言基礎(chǔ)C語言是一種結(jié)構(gòu)化的高34為了C語言程序能夠書寫清晰,便于閱讀、理解和維護(hù),在書寫C語言程序時最好遵循以下規(guī)則。a)一個聲明或一條語句占一行;b)不同結(jié)構(gòu)層次的語句,從不同的起始位置開始,機(jī)縮進(jìn)相同的字?jǐn)?shù);c)用{}括起來的部分表示程序的某一層次結(jié)構(gòu)。為了C語言程序能夠書寫清晰,便于閱讀、理解和維護(hù),在書寫C語351)C語言的標(biāo)識符是用來標(biāo)識源程序中某個對象名字的。這些對象可以是函數(shù)、變量、常量、數(shù)組、數(shù)據(jù)類型、存儲方式、語句等。一個標(biāo)識符由字符串、數(shù)字和下劃線等組成,第一個字符必須是字母或下劃線,通常以下劃線開頭的標(biāo)識符是編譯系統(tǒng)專用的,因此在編寫C語言源程序時一般不要使用以下劃線開頭的標(biāo)識符,而將下劃線用作分段符。標(biāo)識符的長度由系統(tǒng)決定,標(biāo)識符最長可達(dá)255個字符,編寫源程序時標(biāo)識符的長度不要超過32個字符。1)C語言的標(biāo)識符是用來標(biāo)識源程序中某個對象名字的。這些對象362)關(guān)鍵字是一類具有固定名稱和特定含義的特殊標(biāo)識符,又稱為保留字。在編寫C語言源程序時一般不允許將關(guān)鍵字另作別用,換句話說就是對于標(biāo)識符的命名不要與關(guān)鍵字相同。上面表2.4所列的C語言關(guān)鍵字由系統(tǒng)保留不能用作用戶標(biāo)識符。3)程序中對于標(biāo)識符的命名應(yīng)當(dāng)簡潔明了,含義清晰,便于閱讀理解,如用標(biāo)識符“max”表示最大值,用“TIMER0”表示定時器0等。盡量不要取名“aa”、“bb”等等沒有特定意義的標(biāo)識符,這樣雖然沒有違反C語言的規(guī)則,但是在程序里就很不容易理解。2)關(guān)鍵字是一類具有固定名稱和特定含義的特殊標(biāo)識符,又稱為保374)C語言區(qū)分大小寫字母,C語言編譯器在對程序進(jìn)行編譯時,對于程序中同一個字母的大小寫作為不同的變量來處理。例如定義一個延時函數(shù)的形式參數(shù)time,但是如果程序當(dāng)中再出現(xiàn)一個由大寫字母定義的標(biāo)識符TIME,那么它們在程序當(dāng)中是兩個不同的標(biāo)識符,是沒有沖突的。5)C語言程序中有且只有一個main函數(shù),一個C語言程序,無論main函數(shù)的物理位置在那里,總是從main函數(shù)開始執(zhí)行。4)C語言區(qū)分大小寫字母,C語言編譯器在對程序進(jìn)行編譯時,對386)每句程序語句后面一定要加分號,分號是C語言結(jié)構(gòu)的一部分,如果缺少了就會語法出錯。7)注釋,在程序中添加注釋是為了能更加容易讀懂和理解程序,IAR有兩種風(fēng)格的注釋方法“//”和“/*----------*/”?!?/”的意思是在其后面的全部引導(dǎo)為注釋,而“/*----------*/”的意思是在“/*”開始,一直到遇到“*/”為止,在其里面的內(nèi)容都被認(rèn)為是注釋。6)每句程序語句后面一定要加分號,分號是C語言結(jié)構(gòu)的一部分,39Float和double的指數(shù)位是按補(bǔ)碼的形式來表示的,所以float的指數(shù)范圍為-128~+127,而double的指數(shù)范圍為-1024~+1023。float的范圍為-2^128~+2^128,也即-3.40E+38~+3.40E+38;double的范圍為-2^1024~+2^1024,也即-1.79E+308~+1.79E+308。float和double的精度是由尾數(shù)的位數(shù)來決定的。float:2^23=8388608,一共七位,這意味著最多能有7位有效數(shù)字,float的精度為7位;

double:2^52=4503599627370496,一共16位,double的精度為16位。Float和double的指數(shù)位是按補(bǔ)碼的形式來表示的,所以40const:定義常量。在C430語言中,const關(guān)鍵字定義的常量實(shí)際上被放在了程序存儲器flash中,經(jīng)常用const關(guān)鍵字定義顯示表之類的常數(shù)數(shù)組。extern:聲明外部變量,外部變量是指在函數(shù)或文件外部定義的全局變量。使用時,extern置于變量或函數(shù)前,表示變量或函數(shù)的定義在別的文件中,提示編譯器在遇到此變量和函數(shù)時在其他模塊中尋找它的定義,static :定義靜態(tài)局部變量或靜態(tài)函數(shù),靜態(tài)局部變量或靜態(tài)函數(shù)只有本文件內(nèi)的代碼才能訪問它,它的名字在其它文件中不可見。有時候希望函數(shù)中的局部變量的值在函數(shù)調(diào)用結(jié)束后不消失而保留原值,即其占用的存儲單元不釋放,在下次該函數(shù)調(diào)用時,該變量保留上一次函數(shù)調(diào)用結(jié)束時的值。這時就應(yīng)該指定局部變量為靜態(tài)局部變量。const:定義常量。在C430語言中,const關(guān)鍵字41全局變量:只要定義在函數(shù)體(包括主函數(shù))外,就是全局變量了,編譯器為全局變量安排特定的數(shù)據(jù)區(qū),這些數(shù)據(jù)區(qū)為全局變量專用。全局變量一般定義在C程序的開頭部分、主函數(shù)之前,在與該程序有關(guān)的所有文件都可以使用該變量。程序開始時分配空間,程序結(jié)束時釋放空間,默認(rèn)初始化為0。對于多文件C語言程序,如果全局變量定義在其它文件中,那么別的程序文件里面的函數(shù)要訪問另一個文件里面的全局變量,須在對全局變量進(jìn)行外部變量聲明,關(guān)鍵詞extern。局部變量是在一個函數(shù)內(nèi)部定義的變量,它只在定義它的那個函數(shù)范圍以內(nèi)有效,在此函數(shù)之外局部變量即失去意義,因而也就不能使用這些變量了。不同的函數(shù)可以使用相同的局部變量名,由于它們的作用范圍不同,不會相互干擾。函數(shù)的形式參數(shù)也屬于局部變量。局部變量在每次函數(shù)調(diào)用時分配存儲空間,在每次函數(shù)返回時釋放存儲空間。全局變量:只要定義在函數(shù)體(包括主函數(shù))外,就是全局變量了,42自增、自減運(yùn)算符說明:++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)算符說明:在賦值運(yùn)算符“=”的前面加上其它運(yùn)算符,就構(gòu)成了所謂復(fù)合賦值運(yùn)算符。+=加法賦值,>>=右移位賦值,-=減法賦值,&=邏輯與賦值,*=乘法賦值,|=邏輯或賦值,/=除法賦值,^=邏輯異或賦值,%=取模賦值,~=邏輯非賦值,<<=左移位賦值。自增、自減運(yùn)算符說明:431)盡可能避免浮點(diǎn)運(yùn)算。對于單片機(jī)來說,浮點(diǎn)數(shù)的運(yùn)算速度很慢,RAM開銷也大,且有效位數(shù)有限;在低功耗應(yīng)用中CPU運(yùn)算時間直接關(guān)系到平均功耗。因此在編程初期就要養(yǎng)成盡量避免使用浮點(diǎn)數(shù)的習(xí)慣。2)防止定點(diǎn)數(shù)溢出。定點(diǎn)數(shù)運(yùn)算首先要防止數(shù)據(jù)溢出。3)小數(shù)的處理。遇到需要保留小數(shù)的運(yùn)算,可以采用浮點(diǎn)數(shù),但是軟件開銷較大。用定點(diǎn)數(shù)也可以處理小數(shù)。原理就是先擴(kuò)大,再運(yùn)算。4)盡量減少乘除法。430單片機(jī)沒有乘法/除法指令,乘除操作會被編譯器轉(zhuǎn)換成移位和加法來實(shí)現(xiàn)。如果乘除的數(shù)值剛好是2的冪,那么可以用移位直接替代乘除法,運(yùn)算速度會提高很多。1)盡可能避免浮點(diǎn)運(yùn)算。對于單片機(jī)來說,浮點(diǎn)數(shù)的運(yùn)算速度很慢44例如將P1.0置高、將P1.1置低,將P1.2取反,我們可以寫成:P1OUT|=0x01;//P2.0置高P1OUT&=~0x02;//P2.1置低P1OUT^=0x04;//P2.2取反在寄存器頭文件中,已經(jīng)將BIT0~BIT7定義成0x01~0x80,上述程序也可以寫成:P1OUT|=BIT0;//P2.0置高P1OUT&=~BIT1;//P2.1置低P1OUT^=BIT2;//P2.2取反對于多位可以同時操作,例如將P1.1、P1.2、P1.3、P1.4全部置高/低可以寫成:P1OUT|=BIT1+BIT2+BIT3+BIT4;//P1.1/2/3/4全置高P1OUT&=~(BIT1+BIT2+BIT3+BIT4);//P1.1/2/3/4全置低,注意括號!實(shí)際上,這條語句相當(dāng)于P1OUT|=0x1e;//P1.1/2/3/4全置高例如將P1.0置高、將P1.1置低,將P1.2取45charKey;if((P1IN&BIT5)==0)P2OUT|=BIT0;//若P1.5為低,則P2.0口的LED亮if(P1IN&BIT5)P2OUT|

溫馨提示

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

評論

0/150

提交評論