AVR單片機(jī)C語(yǔ)言編譯器.doc_第1頁(yè)
AVR單片機(jī)C語(yǔ)言編譯器.doc_第2頁(yè)
AVR單片機(jī)C語(yǔ)言編譯器.doc_第3頁(yè)
AVR單片機(jī)C語(yǔ)言編譯器.doc_第4頁(yè)
AVR單片機(jī)C語(yǔ)言編譯器.doc_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

AVR單片機(jī)C語(yǔ)言編譯器Win-AVR是流行的GNU編譯器在AVR平臺(tái)上的移植。安裝完畢后會(huì)在桌面上出現(xiàn)一下七個(gè)快捷方式,它們的作用如下:Programmers Notepad源文件的編輯軟件,可提供應(yīng)用程序接口AVR InsightGDB Debug的前端工具,用于仿真調(diào)試TKInfoGNU超文本格式的圖形瀏覽器,用于瀏覽各種說(shuō)明文檔Avr-libc ManualAVR-GCC編譯器的C語(yǔ)言函數(shù)庫(kù)GNU Manuals OnlineGNU在線幫助手冊(cè)MFileMakefile編輯軟件READMEWinAVR的readme文件 IDE (Integrated Development Environment)集成開(kāi)發(fā)環(huán)境 ICE (In Circuit Emulator) 在線仿真器 JTAG (Joint Test Action Group) 聯(lián)合測(cè)試行為組織 *.hex 文件用來(lái)向單片機(jī)下載的16進(jìn)制文件 *.cof文件用來(lái)利用AVRstudio進(jìn)行在線仿真和調(diào)試的文件l AVR COFF(AVR Studio 3.x)l AVR “Extended” COFF(AVR Studio 4.07+)*.hex和*.cof這兩個(gè)文件不能由AVR-GCC本身生成,需要其他輔助工具來(lái)完成這一步,這個(gè)工具叫avr-objcopy。Makefile文件就是一個(gè)描述性質(zhì)的文件,告知make各文件之間的依賴關(guān)系,不需要擴(kuò)展名。一般在MFile這個(gè)程序中生成對(duì)應(yīng)的makefile文件,然后將它復(fù)制到PN源文件的文件夾下,就可以進(jìn)行make all的命令來(lái)實(shí)現(xiàn)對(duì)源文件的編譯了。一般而言,makefile文件只需要修改一下幾個(gè)地方。Main file name (不要帶擴(kuò)展名)和MCU type 以及Default make target,然后點(diǎn)file-save as保存到要編譯的文件的文件夾下。C語(yǔ)言小總結(jié) C語(yǔ)言的標(biāo)識(shí)符是區(qū)分大小寫(xiě)的,標(biāo)識(shí)符必須以字母或者下劃線開(kāi)頭,下劃線開(kāi)頭的標(biāo)識(shí)符一般是編譯器定義的。 一般而言,如果不是需要使用負(fù)整數(shù),盡量使用無(wú)符號(hào)數(shù)整數(shù)來(lái)表示,這樣可以減少系統(tǒng)處理符號(hào)的工作,從而提高程序的執(zhí)行效率。 凡是耳目運(yùn)算符,都可以和賦值符一起組成復(fù)合賦值符,C語(yǔ)言中規(guī)定可使用的10中復(fù)合賦值運(yùn)算符:+=;-=;*=;/=;%=;=;&=;=;|= 逗號(hào)運(yùn)算符是C語(yǔ)言的一種特殊的運(yùn)算符,其作用是將兩個(gè)表達(dá)式連接起來(lái),C語(yǔ)言對(duì)兩個(gè)表達(dá)式分別計(jì)算,并將后一個(gè)表達(dá)式的值作為逗號(hào)表達(dá)式的值。運(yùn)算優(yōu)先級(jí)最低。例如:a=3*6,4*8;其結(jié)果為a=32; C語(yǔ)言規(guī)定了六種關(guān)系運(yùn)算符:;=;=;!=其中前四個(gè)的優(yōu)先級(jí)比較高,后兩個(gè)的優(yōu)先級(jí)比較低。 C語(yǔ)言規(guī)定的位運(yùn)算共有一下幾種: & 按位與 | 按位或 按位異或 (XOR) 10=1 11=0 取反 右移位翻轉(zhuǎn):令其和一個(gè)相應(yīng)位為1,其他位位0的常量做異或運(yùn)算。位置一:令其和一個(gè)相應(yīng)位為1,其他為為0的常量做或運(yùn)算。PORTA|=(17)位置零:令其和一個(gè)相應(yīng)位為0,其他位為1的常量做與運(yùn)算。PORTA&=(17) 一般的變量和數(shù)組均存儲(chǔ)在系統(tǒng)的RAM中,AVR-GCC還支持存儲(chǔ)在ROM的數(shù)組和字符串,該字符串使用PROGMEM關(guān)鍵字進(jìn)行聲明。如:Const char str PROGMEM =”hello” ; / 聲明了一個(gè)存儲(chǔ)在ROM中的字符串 字符串是不能在程序中用賦值符直接賦值的,但可以借助循環(huán)語(yǔ)句,一個(gè)變量一個(gè)變量的進(jìn)行拷貝,如下:char a5=”hello” ;char b5;b=a; /*這樣的操作是非法的*/for(i=0;isex=M;student31.sex=M;student32.score=95.5; 共同體:共同體的所有成員都占有相同的空間,共同體占用的空間的大小等于共同體內(nèi)占用空間最大的變量所占用的空間。共同體類型聲明形式如下:union 共同體名 數(shù)據(jù)類型 成員名1; 數(shù)據(jù)類型 成員名2; 數(shù)據(jù)類型 成員名n;共同體的變量聲明形式為:union 共同體名 共同體變量名共同體變量引用的形式為: 共同體變量.名成員;注意共同體的數(shù)據(jù)是存儲(chǔ)在一個(gè)存儲(chǔ)空間的,因此共同體變量所存儲(chǔ)的值等于最后一次對(duì)共同體變量所賦的值。不能對(duì)共同體變量名賦值,也不能在定義共同體變量時(shí)對(duì)其初始化,對(duì)共同體的操作必須指明其成員。不能把共同體變量作為函數(shù)的參數(shù)和返回值。例如:union length_union Unit16_t word; Unit8_t byte2;length; /定義了一個(gè)共同體,有兩個(gè)成員,一個(gè)是16位的無(wú)符號(hào)整數(shù),另外一個(gè)是一個(gè)包含兩個(gè)無(wú)符號(hào)8位整數(shù)的數(shù)組,二者共用存儲(chǔ)空間。在上例中,如果按照l(shuí)ength_union.word來(lái)操作時(shí),則作為一個(gè)16位無(wú)符號(hào)整數(shù),如果作為length_union.byte0和length_union.byte1操作,則訪問(wèn)的是該存儲(chǔ)空間的低位字節(jié)和高位字節(jié)。 枚舉類型如果變量只有幾個(gè)可能的取值,則可以用枚舉類型表示該變量。枚舉類型定義形式為:enum 枚舉類型標(biāo)識(shí)符 枚舉列表;枚舉變量的定義為:enum 枚舉類型 枚舉變量名;例如: enum color red,green,blue;C語(yǔ)言將枚舉類型中的枚舉元素定義為常量,因此枚舉元素是有值的,C語(yǔ)言自動(dòng)按照值的順序定義值為0,1,2,枚舉元素的值可以改變enum colorred=5,green,blue; /red代表5,后面的未定值依次加一例如:enum colorred,green,blue;enum color crt;crt=red;crt=2; /錯(cuò)誤crt=(enum color)2; /將枚舉元素中的值為2的元素賦值給crt變量,強(qiáng)制轉(zhuǎn)換。枚舉變量的賦值必須用枚舉元素,如果直接用整數(shù)賦值是不行的,必須采用強(qiáng)制轉(zhuǎn)換。 用戶自定義類型用戶可以對(duì)已存在的C語(yǔ)言類型名重新進(jìn)行定義,從而方便使用,用戶定義類型一般為: typedef 類型名 標(biāo)識(shí)符使用這些自定義類型是,必須包含inttypes.h頭文件。例如: #include typedef signed char int8_t /八位有符號(hào)數(shù) (無(wú)分號(hào))typedef unsigned char uint8_t /八位無(wú)符號(hào)數(shù) 預(yù)處理C語(yǔ)言的預(yù)處理功能主要有一下三方面:l 宏定義l 文件包含l 條件編譯 宏定義宏定義的作用是用指定的標(biāo)識(shí)符代表一個(gè)字符串,宏可以參數(shù),也可以不帶參數(shù),不帶參數(shù)的宏定義的一般形式為: #define 標(biāo)識(shí)符 字符串帶參數(shù)的宏定義聲明形式為: #define 宏名(參數(shù)表) 字符串例如:define S(a,b) a*b /定義了一個(gè)帶參數(shù)的宏int main(void)int i; i=S(5,6); /該語(yǔ)句與i=5*6完全一樣 return 0; 文件包含文件包含的作用是將一個(gè)文件的內(nèi)容包括到另一個(gè)文件之中,文件包含的形式為:#include “文件名” #include 第一種首先在當(dāng)前文件的所在目錄中尋找包含的文件,如果找不到再到系統(tǒng)指定的包含文件的目錄去尋找,第二種則直接在系統(tǒng)指定的包含目錄中去尋找,一般為了保險(xiǎn)起見(jiàn),盡量使用雙引號(hào)形式的include指令。 條件編譯條件編譯可以根據(jù)用戶定義的不同條件,選擇使用不同的語(yǔ)句,這在編寫(xiě)可移植的程序時(shí)特別有用。條件編譯有以下幾種形式:l 第一種#ifdef 標(biāo)識(shí)符 程序段 1#else 程序段 2#endif該語(yǔ)句的作用是,如果在此語(yǔ)句前用“#define標(biāo)識(shí)符”定義了標(biāo)識(shí)符,則只在程序中包含程序段1,否則只包含程序段2.l 第二種#ifndef 標(biāo)識(shí)符 程序段1#else 程序段2#endif該語(yǔ)句的作用是,如果在此語(yǔ)句前沒(méi)有用“#define 標(biāo)識(shí)符”定義了標(biāo)識(shí)符,則只在程序中包含程序段1,否則只包含程序段2l 第三種#if 表達(dá)式 程序段1#else 程序段2#endif該語(yǔ)句的作用是,如果表達(dá)式的值為真,則值在程序中包含程序段1,否則,若表達(dá)式的值為0,則只在程序中包含程序段2. AVR-LIBC的中斷處理函數(shù)對(duì)于不同的編譯器有不同的方法處理中斷,這是因?yàn)镃語(yǔ)言的目標(biāo)就是與處理器的細(xì)節(jié)無(wú)關(guān),因此每個(gè)編譯器的作者都不得不使用自己的方法為編譯器添加對(duì)中斷的支持。在AVR-LIBC的環(huán)境中,中斷向量表已經(jīng)預(yù)先固定指向具有特定名字的函數(shù),這些函數(shù)用來(lái)執(zhí)行中斷操作。使用這些特殊名字的函數(shù)可在相應(yīng)中斷發(fā)生時(shí)被調(diào)用。AVR-LIBC中,對(duì)中斷處理函數(shù)進(jìn)行了封裝,通過(guò)使用兩個(gè)參數(shù)的宏INTERRUPT()和SIGNAL(),程序可正確的處理不同的中斷操作。#include “avr/signal.h”INTERRUPT(SIG_ADC)/用戶代碼或者為#include “avr/signal.h”SIGNAL(SIG_ADC)/用戶代碼 全局中斷標(biāo)志操作函數(shù):#define sei() _asm_ _volatile_(“sei” :)使用中斷處理函數(shù),必須加入下面的包含語(yǔ)句:#include sei(); /設(shè)置全局中斷標(biāo)志位允許全局中斷#define cli() _asm_ _volatile_(“cli” :)使用中斷處理函數(shù),必須加入下面的包含語(yǔ)句:#include cli(); /清楚全局中斷標(biāo)志位來(lái)禁止全局中斷上面的兩個(gè)函數(shù)實(shí)際上只生成一條匯編指令,不會(huì)增加用戶程序的負(fù)擔(dān)。 使用算術(shù)運(yùn)算函數(shù)avr-libc提供了算術(shù)運(yùn)算函數(shù),使用數(shù)學(xué)的數(shù)學(xué)運(yùn)算函數(shù)請(qǐng)?jiān)诔绦虻念^部加入包含語(yǔ)句:#include “math.h”為了使用數(shù)學(xué)運(yùn)算函數(shù),需要鏈接庫(kù)libm.a,通常該庫(kù)是不鏈接到用戶的程序中的,為了鏈接庫(kù),請(qǐng)?jiān)谧约旱腉CC編譯選項(xiàng)的結(jié)尾加入-lm選項(xiàng)。即用PN打開(kāi)makefile文件的第130行,MATH_LIB= lm 特殊功能寄存器的操作方式:在單片機(jī)系統(tǒng)中,經(jīng)常要對(duì)寄存器或者外圍設(shè)備進(jìn)行操作,這些操作都是通過(guò)一組特殊功能寄存器的操作實(shí)現(xiàn)的。AVR單片機(jī)中,提供了兩種方法完成操作。一種是獨(dú)立的I/O地址空間,通過(guò)特殊的I/O操作指令,可以利用特殊的I/O指令操作部分或全部的I/O空間。另外一種是I/O地址也被映射到單片機(jī)的內(nèi)存空間中,因此也可以用通常的內(nèi)存操作指令完成I/O的控制,I/O地址加上0x20的偏移量就是I/O映射到內(nèi)存空間中的地址。AVR單片機(jī)支持這兩種操作,一般使用后者,而且這些操作已經(jīng)封裝好,不需要編程者干預(yù)。因此,編程者可以使用特殊函數(shù)如outb()操作I/O。#include outb(PORTA,0x33);或者直接向內(nèi)存中映射的地址寫(xiě)數(shù)據(jù) PORTA=0x33;編譯器會(huì)選擇合適的指令生成操作代碼訪問(wèn)I/O端口,與編程人員書(shū)寫(xiě)的代碼無(wú)

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論