AVR單片機(jī)位操作的C語(yǔ)言編程實(shí)現(xiàn)_第1頁(yè)
AVR單片機(jī)位操作的C語(yǔ)言編程實(shí)現(xiàn)_第2頁(yè)
AVR單片機(jī)位操作的C語(yǔ)言編程實(shí)現(xiàn)_第3頁(yè)
AVR單片機(jī)位操作的C語(yǔ)言編程實(shí)現(xiàn)_第4頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡(jiǎn)介

1、第第 頁(yè)共4頁(yè)電子報(bào)/2011年/I月/16日/第015版智能電子AVR單片機(jī)位操作的C語(yǔ)言編程實(shí)現(xiàn)湖北曾安君一、常規(guī)方法AVR單片機(jī)的各類教材或編程應(yīng)用參考資料,對(duì)介紹的端II位操作方法不外乎宏定義及整體和某個(gè)常吊湘或、相與來(lái)實(shí)現(xiàn)某一單個(gè)位狀態(tài)的改變。如:PORT&=(11):等價(jià)J:PORTB&=oxfd:作用是PB1清零而其余位不變。與之類似的還有:PORTB1=(14);PB4置位,其余位不變。PORTBA=(14);PB4翻轉(zhuǎn),其余位不變。上述方法,無(wú)論是常屋值參與還是移位操作,用起來(lái)總嫌麻煩,不夠直觀,且具體常崑值還需人工推算,易出錯(cuò)。移位操作生成的目標(biāo)代碼偏人,在人鼠運(yùn)用時(shí),占用

2、系統(tǒng)內(nèi)存或flash空間,執(zhí)行效率低。以筆者實(shí)際運(yùn)用效果來(lái)看,宏定義比較好。筆者也偏好運(yùn)用宏定義。C編譯器在編譯Z前會(huì)事先進(jìn)行宏替換,所以,如果宏定義講究一些技巧,則代碼執(zhí)行效率將得到較人提升,編程時(shí),操作也得心應(yīng)手。常規(guī)參考手冊(cè)或資料,建議用以I、宏定義:#definePAO0#definePAI1#definePA22#definePA33#definePA44#deffinePA55#definePA66#definePA77#defineCPL_BIT(x、y)(xA=(1y)#dcfineSET_BIT(x、y)(xl=(ly)#defineCLR_BIT(x、y)(x&=(lvy)

3、#defineGET_BIT(x、y)(x&=(ly)如此宏定義之后,可構(gòu)成一個(gè)頭文件,然后加入到新建工程文件中(編譯器用ICC的ICC6.31A),但Z前需包含和應(yīng)單片機(jī)的頭文件,如:MCU為AT-MEGA48,則最先包含iom48V.h之后,再包含此自制頭文件,即可在程序中運(yùn)用:CPLBIT(PORTA.PA2);/PB2取反GET_BIT(PORTA.PA6);讀取PA6的狀態(tài)CLR_BIT(PORTA.PA5);清零PA5SETBIT(PORTA.PAl);/PA1置1此法在運(yùn)用時(shí),依舊用了移位操作,只是為了方便程序操作,筆者只在小規(guī)模程序中運(yùn)用。I、而,筆者將充分利用C語(yǔ)言自身的強(qiáng)人

4、位運(yùn)算能力和指針相結(jié)合,構(gòu)建一個(gè)ICC6.31A平臺(tái)卜的位定義頭文件,希望能給大家一些啟示。首先明確幾個(gè)基本概念:位域、地址綁定,和Volatile限定關(guān)鍵字。在ICC631A的安裝目錄中有個(gè)in-elude文件夾,里而有大屋編譯器開發(fā)人員已為我們開發(fā)好的各類AVR單片機(jī)預(yù)定頭文件,卜面是iom48v.h頭文件。AVR的ATMEGA48MCU頭文件iom48v.h中關(guān)其端II地址定義部分:/*PortB*/#definePINB(*(volatileunsignedchar*)ox23)#defineDDRB(*(volatileunsignedchar*)oxx24)#definePORTB

5、(*(volatileunsignedchar*)ox25)/*PORTC*/#definePINC(*(volatileunsignedchar*)ox26)#defineDDRC(*(volatileunsignedchar*)ox27)#definePORTC(*(volatileunsignedchar*)ox28)/*PortD*/#definePIND(*(volatileunsignedchar*)ox29)#defineDDRD(*(volatileunsignedchar*)ox2A)#definePORTD(*(volatileunsignedchar*)ox2B)注:每個(gè)

6、端II均有PIN、DDR、PORT三個(gè)八位寄存器簡(jiǎn)要概括如下:Volatile一詞用來(lái)規(guī)定C編譯器不允許對(duì)其限定的變堂進(jìn)行優(yōu)化處理。如:#definePORTB(*(volatileunSignedchar*)ox25)這句宏定義要結(jié)合iom48v.h頭文件來(lái)看,在前而有該頭文件關(guān)丁各端II寄存器的定義。上述宏語(yǔ)句中,ox25被強(qiáng)制轉(zhuǎn)化為一個(gè)指針常彊,實(shí)際上,上述宏定義的意義為:PORTB被強(qiáng)制定義在地址ox25,即定義了一個(gè)無(wú)符號(hào)字符型變量PORTB,且被強(qiáng)制綁定在ox25地址上。其他語(yǔ)句依此類推。有了這個(gè)概念之后,再來(lái)了解一下C語(yǔ)言中位域的定義。標(biāo)準(zhǔn)C語(yǔ)言中,可以定義一個(gè)特殊的結(jié)構(gòu),位域,

7、允許對(duì)定義的結(jié)構(gòu)中的單個(gè)位進(jìn)行操作。基本構(gòu)成如卜:位域:stnict位域結(jié)構(gòu)名位域列表;)位域類型變量名;卜面是筆者給出的位域定義等的頭文件,在自定義位操作頭文件中定義了一個(gè)位域BYTE_BITo相關(guān)詳細(xì)架構(gòu)標(biāo)準(zhǔn)請(qǐng)參考C語(yǔ)言規(guī)范,在此不再多述,只是希望人家對(duì)此有人概了解。自定義avr_bit.h頭文件(節(jié)選,以ATMEGA48為例,定義其BII)定義位域tyoedefstnictByteBitunsignedBitO:1;unsignedBitl:l;unsignedBit2:l:unsignedBit3:l;unsignedBit4:1;unsignedBit5:l;unsignedBit6

8、:1;unsignedBit7:l;)BYTE.BIT:/BI1宏定義,此值參見相應(yīng)頭文件。#define_PINBox23#define_DDRBox24#definePORTBox25定義B端口每個(gè)位,進(jìn)行地址綁定。#definePINB_BITO(*(voIatileBYTE_BIT*)(_PINB).BTTOPINB.BITlBIT1#dcfincPORTB_BITO(*(volatiIcBYTE_BIT*)(_PORTB)BITOPORTB_BIT1BIT1#defineDDRBBITO(*(volatilcBYTE_BIT*)(_DDRB)BITODDRB_B1T1Bill對(duì)各端L

9、I依同一規(guī)律均進(jìn)行各位的定義即可。結(jié)合頭文件的和關(guān)定義,重新對(duì)其特定地址進(jìn)行另外的綁定,結(jié)合位域的概念,進(jìn)而一步步將各寄存器由一個(gè)字節(jié)分成了可操控的8個(gè)位。在上述文件中,筆者僅表述了B端II。另外,Atmega48的端門不完全,只有B、C、DII,沒有All,且Dll為8位,CII為6位,BII為7位,若外接晶體,則PB6和PB7不能另作端II運(yùn)用。所以,端II很不完整,但為了保持位域完整性和一致性,便丁理解,將B、C、D三門均作8bit對(duì)待。實(shí)際操作時(shí),千萬(wàn)注意不要去操作那些實(shí)際不存在的位。當(dāng)然,若感興趣,人家可改動(dòng)頭文件相關(guān)定義,來(lái)完善它。為驗(yàn)證這個(gè)頭文件,筆者很快編寫了一個(gè)測(cè)試程序Bee

10、p.c,具體如卜:Beep.c程序代碼#include#includeavr_bith”包含自定義頭文件#definetime40000Voidbeepcunsignedint);Voidporting):Voidmain():while(l)portint();beep(time);1)Voidbeepcunsignedintr)/蜂鳴器發(fā)聲函數(shù)unsignedinti;PORTB_BIT0=0;/PBO輸出低電平fori=rjoa.)PORTB_BITO=1;/PBO輸出高電平for(i=r;i0;i.)voidportint()端II初始化函數(shù)DDRB_BITO=1:/PBO為輸出狀態(tài)P

11、ORTB_BITO=0:/PBO輸出“0”1在電路拓?fù)渲?,在ATMEGA48的PB0腳,即(14)腳外接一只三極管(接b極)由三極管去控制只蜂鳴器。程序很簡(jiǎn)單。為了更直觀,在PORTBII其他不用的引腳上均接了發(fā)光二極管,此時(shí),在測(cè)試程序中,將端II初始化函數(shù)語(yǔ)句改為:DDRB=oxff:PORTB=oxOO;(或PORTB=oxff:視二極管接法而定),由二極管配合蜂鳴器來(lái)觀察PBO位是否能單獨(dú)動(dòng)作。當(dāng)然,運(yùn)用此位定義頭文件,可實(shí)現(xiàn)單片機(jī)任一口的任一位的位操作。二、擴(kuò)展運(yùn)用基上述原理,結(jié)合C語(yǔ)言取地址運(yùn)算符&,不難實(shí)現(xiàn)一個(gè)通用位定義頭文件,來(lái)適合所有AVR單片機(jī),只是代碼較為復(fù)雜。大家不妨自己試試。注意一點(diǎn):以上頭文件,筆者是參考ICC6.31A編譯器的include文件夾定義的,在使用前,請(qǐng)首先包含系統(tǒng)提供的MCU頭文件,并將自定義頭文件復(fù)制到所建工程中,然后,就可運(yùn)用自如To就目前使用情況來(lái)看,使用AT-MEGA48/16/128的MCU較多,所以即便是定義3個(gè)對(duì)應(yīng)的位操作頭文件,也是可以的。通用型文件往往體積較人,編制麻煩,可讀性差,不適合普通愛好者。在本文中,筆者對(duì)J-AVR單片機(jī)的位操作端II編程提

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論