日韩欧美国产极速不卡一区,国产手机视频在线观看尤物,国产亚洲欧美日韩蜜芽一区,亚洲精品国产免费,亚洲二区三区无码中文,A大片亚洲AV无码一区二区三区,日韩国语国产无码123

您好,歡迎來到維庫電子市場網(wǎng) 登錄 | 免費(fèi)注冊

avr單片�(jī)
閱讀�9632時間�2010-11-03 09:58:03

  AVR單片�(jī)�1997年由ATMEL公司研發(fā)出的增強(qiáng)型內(nèi)置Flash的RISC(Reduced Instruction Set CPU)精簡指令集高�8位單片機(jī)。AVR的單片機(jī)可以廣泛�(yīng)用于計算�(jī)外部�(shè)�、工�(yè)�(shí)時控制�儀器儀�、通訊�(shè)�、家用電器等各個領(lǐng)�。AVR的主要特性高可靠性、功能強(qiáng)、高速度、低功耗和低價�,一直是衡量單片�(jī)性能的重要指�(biāo),也是單片機(jī)占領(lǐng)市場、賴以生存的必要條件�

�(yōu)�(diǎn)

  1:在相同的系�(tǒng)時鐘下AVR�(yùn)行速度最��

  2: 芯片�(nèi)部的Flsah、EEPROM、SRAM容量較大�

  3:所有型號的Flash、EEPROM都可以反�(fù)燒寫、全部支持在線編程燒�(ISP)�

  4:多種頻率的�(nèi)部RC振蕩�、上電自動復(fù)�、看門�、啟動延時等功能,零外圍電路也可以工��

  5:每個IO口都可以以推換驅(qū)動的方式輸出�、低電平,驅(qū)動能力強(qiáng)�

  6:內(nèi)部資源豐�,一般都集成AD、DA模數(shù)�;PWM;SPI、USART、TWI、I2C通信�;豐富的中斷源等�

  目前支持AVR單片�(jī)編譯器的語言主要有匯編語言、C語言、BASIC語言�。其中C編譯器主要有CodeVisionAVR、AVRGCC、IAR、ICCAVR等,C語言編譯器由于它具有功能�(qiáng)�� �(yùn)用靈活、代碼小、運(yùn)行速度快等先天性的�(yōu)�(diǎn),使得它在程序設(shè)計上具有不可代替的地��

  AVR單片�(jī)�1997年由ATMEL公司研發(fā)出的增強(qiáng)型內(nèi)置FLASH的RISC(Reduced Instruction Set CPU) 精簡指令集高�8位單片機(jī)。AVR的單片機(jī)可以廣泛�(yīng)用于計算�(jī)外部�(shè)�、工�(yè)�(shí)時控�、儀器儀表、通訊�(shè)�、家用電器等各個領(lǐng)��

  AVR的主要特�

  高可靠性、功能強(qiáng)、高速度、低功耗和低價� , 一直是衡量單片�(jī)性能的重要指�(biāo),也是單片機(jī)占領(lǐng)市場、賴以生存的必要條件�

  早期單片�(jī)主要由于工藝及設(shè)計水平不�、功耗高和抗干擾性能差等原因,所以采取穩(wěn)妥方案:即采用較高的分頻系數(shù)對時鐘分�,使得指令周期長,執(zhí)行速度�。以后的 CMOS單片�(jī)雖然采用提高時鐘頻率和縮小分頻系�(shù)等措施,但這種狀�(tài)并未被徹底改觀(51以及51兼容)。此間雖有某些精簡指令集單片�(jī)(RISC)問世,但依然沿襲對時鐘分頻的作法�

  AVR單片�(jī)的推�,徹底打破這種舊設(shè)計格局,廢除了�(jī)器周期,拋棄�(fù)雜指令計算機(jī)(CISC)追求指令完備的做�;采用精簡指令集,以字作為指令長度單�,將�(nèi)容豐富的操作�(shù)與操作碼安排在一字之�(指令集中占大多數(shù)的單周期指令都是如此),取指周期短,又可預(yù)取指令,�(shí)�(xiàn)流水作業(yè),故可高速執(zhí)行指�。當(dāng)然這種速度上的升躍,是以高可靠性為其后盾的�

  AVR單片�(jī)硬件�(jié)�(gòu)采取8位機(jī)�16位機(jī)的折中策�,即采用局部寄存器存堆(32個寄存器文件)和單體高速輸�/輸出的方�(即輸入捕獲寄存器、輸出比較匹配寄存器及相�(yīng)控制邏輯)。提高了指令�(zhí)行速度(1Mips/MHz),克服了瓶頸�(xiàn)�,增�(qiáng)了功�;同時又減少了對外設(shè)管理的開�,相對簡化了硬件�(jié)�(gòu),降低了成本。故AVR單片�(jī)在軟/硬件開銷、速度、性能和成本諸多方面取得了�(yōu)化平�,是高性價比的單片�(jī)�

  AVR單片�(jī)�(nèi)嵌高�(zhì)量的Flash程序存儲�,擦寫方�,支持ISP和IAP,便于產(chǎn)品的�(diào)�、開�(fā)、生�(chǎn)、更新。內(nèi)嵌長壽命的EEProm可長期保存關(guān)鍵數(shù)�(jù),避免斷電丟失。片�(nèi)大容量的RAM不僅能滿足一般場合的使用,同時也更有效的支持使用語言開發(fā)系統(tǒng)程序,并可像MCS-51單片�(jī)那樣�(kuò)展外� RAM�

  AVR單片�(jī)的I/O線全部帶可設(shè)置的上拉電阻、可單獨(dú)�(shè)定為輸入/輸出、可�(shè)定(初始)高阻輸�、驅(qū)動能力強(qiáng)(可省去功率�(qū)動器件)等特�,使的得I/O口資源靈�、功能強(qiáng)大、可充分利用�

  AVR單片�(jī)片內(nèi)具備多種�(dú)立的時鐘分頻器,分別供URAT、I2C、SPI使用。其中與8/16位定時器配合的具有多�(dá)10 位的�(yù)分頻�,可通過軟件�(shè)定分頻系�(shù)提供多種檔次的定時時�。AVR單片�(jī)�(dú)有的“以定時�/計數(shù)器(單)雙向計數(shù)形成三角�,再與輸出比較匹配寄存器配合,生成占空比可變、頻率可�、相位可變方波的�(shè)計方�(即脈寬調(diào)制輸出PWM)”更是令人耳目一��

  增強(qiáng)性的高速同/異步串口,具有硬件產(chǎn)生校�(yàn)�、硬件檢測和校驗(yàn)偵錯、兩級接收緩�、波特率自動�(diào)整定位(接收時)、屏蔽數(shù)�(jù)幀等功能,提高了通信的可靠�,方便程序編�,更便于組成分布式網(wǎng)�(luò)和實(shí)�(xiàn)多機(jī)通信系統(tǒng)的復(fù)雜應(yīng)�,串口功能大大超過MCS-51/96單片�(jī)的串口,加之AVR單片�(jī)高�,中斷服�(wù)時間短,故可�(shí)�(xiàn)高波特率通訊�

  面向字節(jié)的高速硬件串行接口TWI、SPI。TWI與I2C接口兼容,具備ACK信號硬件�(fā)送與識別、地址識別、總線仲裁等功能,能�(shí)�(xiàn)�/從機(jī)的收/�(fā)全部4種組合的多機(jī)通信。SPI支持�/從機(jī)�4種組合的多機(jī)通信�

  AVR單片�(jī)有自動上電復(fù)位電�、獨(dú)立的看門狗電�、低電壓檢測電路BOD,多個復(fù)位源(自動上下電復(fù)�、外部復(fù)�、看門狗復(fù)位、BOD�(fù)�),可�(shè)置的啟動后延時運(yùn)行程�,增�(qiáng)了嵌入式系統(tǒng)的可靠��

  AVR單片�(jī)具有多種省電休眠模式,且可寬電壓�(yùn)行(5-2.7V�,抗干擾能力�(qiáng),可降低一�8位機(jī)中的軟件抗干擾設(shè)計工作量和硬件的使用�� AVR單片�(jī)技�(shù)體現(xiàn)了單片機(jī)集多種器�(包括FLASH程序存儲器、看門狗、EEPROM、同/異步串行�、TWI、SPI、A/D模數(shù)�(zhuǎn)換器、定時器/計數(shù)器等)和多種功�(增強(qiáng)可靠性的�(fù)位系�(tǒng)、降低功耗抗干擾的休眠模式、品種多門類全的中斷系�(tǒng)、具輸入捕獲和比較匹配輸出等多樣化功能的定時�/計數(shù)�、具替換功能的I/O端口…� )于一�,充分體�(xiàn)了單片機(jī)技�(shù)的從“片自為�(zhàn)”向“片上系�(tǒng)SoC”過渡的�(fā)展方向�

  綜上所�,AVR單片�(jī)博采眾長,又具獨(dú)特技�(shù),不愧為8位機(jī)中的佼佼者�

  AVR系列單片�(jī)的選�

  AVR單片�(jī)系列齊全,可適用于各種不同場合的要�。AVR單片�(jī)�3個檔�:

  低檔Tiny系列AVR單片�(jī): 主要有Tiny11/12/13/15/26/28等;

  中檔AT90S系列AVR 單片�(jī): 主要有AT90S1200/2313/8515/8535�� (正在淘汰或轉(zhuǎn)型到Mega�)

  ATmega系列AVR單片�(jī): 主要有ATmega8/16/32/64/128� 存儲容量�8/16/32/64/128 KB)以及ATmega8515/8535等�

RTOS-AVRX�(yīng)�

  隨著技�(shù)的發(fā)�,嵌入式系統(tǒng)的設(shè)計及�(yīng)用對人們的生活�(chǎn)生了很大的影�,并將逐漸改變?nèi)藗兾磥淼纳罘绞?,在特定的操作系�(tǒng)上開�(fā)�(yīng)用程�,可以使開發(fā)人員忽略掉很多底層硬件細(xì)節(jié),使得應(yīng)用程序調(diào)試更方便、易于維�(hù)、開�(fā)周期縮短并且降低開發(fā)成本,因而嵌入式操作系統(tǒng)深得開發(fā)人員的青��

  AVR微處理器是Atmel公司開發(fā)�8位嵌入式RISC處理�,它具有高性能、高保密�、低功�、非易失性等�(yōu)�(diǎn),而且程序存儲器和�(shù)�(jù)存儲器可�(dú)立編址,并具有�(dú)立訪問的哈佛�(jié)�(gòu)。AVR單片�(jī)�(nèi)核有豐富的指令集,通過32個通用寄存器直接與邏輯�(yùn)算單元相連接,允許在一個周期內(nèi)一條單一指令訪問兩個獨(dú)立的寄存�,這樣的結(jié)�(gòu)使代碼的�(zhí)行效率比傳統(tǒng)的復(fù)雜指令集微處理器快了將近10倍�

  AVRX是由1barello編寫的源碼公開的嵌入式操作系�(tǒng),它專門針對AVR系列單片�(jī)的RTOS,具有免�(fèi)和可以修改的特點(diǎn),它的缺�(diǎn)是由于做為一種專用的操作系統(tǒng)很難移植到其他平臺上�

  1 AVRX 系統(tǒng)的特�(diǎn)

  AVRX做為AVR專用RTOS有如下的特點(diǎn)�

  � 完全支持占先�、優(yōu)先級�(qū)動的任務(wù)�(diào)度算��

  � 16個優(yōu)先級,相同的�(yōu)先級的任�(wù)采用Round robin�(diào)度算法輪流執(zhí)��

  � 信號量可以用于信號傳�、同步和互斥信號量,支持阻塞和非阻塞語法�

  � 任務(wù)之間可以用消息隊列相互傳遞信息,接收和確�(rèn)消息可以用阻塞和非阻塞調(diào)��

  � 在中斷子程序中,大部分非阻塞的中斷服�(wù)程序可以使用�

  � 支持單個定時器的時間隊列管�,任何�(jìn)程都可以�(shè)置一個定時器,并且任何一個任�(wù)都可以等待定時器時間��

  � 支持單步�(diào)式運(yùn)行著的�(jìn)��

  � 程序空間�,包含所有功能的版本占用1000字節(jié)�

  � 與定時器/計算器有�(guān)的一些事�(wù)可以用AVRX寫成任務(wù)級代��

  1.1 任務(wù)

  AVRX2.6為了支持C語言,保存了所有的32個寄存器,最小的上下文是32個寄存器、SREG和PC,總�35個字節(jié)。AvrXInitTask()函數(shù)給所有的寄存器初始化�0x00;只有�(jìn)程上下文保存在任�(wù)堆棧中,所有其他的使用(包括內(nèi)核和中斷)保存在�(nèi)核堆�。這樣降低了個中斷的上下文切換和�(jìn)入內(nèi)核API的SRAM消�。隨后的中斷(如果允許中斷嵌套)嵌入�(nèi)核堆棧,API不�(jìn)行上下文切換�

  1.2 信號�

  信號量是SRAM指針,它們有三中狀�(tài):PEND、WAITING和DONE。當(dāng)一個�(jìn)程被一個信號量阻塞時,它處于WAITING狀�(tài),多個任�(wù)可以排隊等候一個信號量。在后一種情況下,信號量可以看作互斥信號�。提供的API函數(shù)如下:AvrXSetSemaphore、AvrXIntSetSemaphore、AvrXWaitSemaphore、AvrXtestSemaphore、AvrXIntTestSemaphore和AvrXResetSemaphore�

  1.3 定時�

  定時器控制塊(TCB)長度為4(或6)個字節(jié)。它們管理一�16位計�(shù)值。定時器隊列管理器管理一個分類的定時器隊�,每個都�(diào)整為所有計�(shù)器的和到其延時需要的�。提供的API函數(shù)如下:AvrXStartTimer、AvrXTimerHandler、AvrXCancelTimer、AvrXWaitTimer、AvrXTestTimer和AvrXDelay�

  1.4 消息隊列

  消息隊列用消息控制塊(MCB)做為隊列首地址。任何�(jìn)程、中斷處理函�(shù)和多個�(jìn)程都可以等待消息。MCB的長度是2�4個字節(jié)。消息可以認(rèn)為是靈活性更大的信號量。提供的API函數(shù)如下:AvrXSendMessage、AvrXIntSendMessage、AvrXRecvMessage、AvrXWaitMessage、AvrXAckMessage、AvrXTestMessage和AvrXWaitMessageAck�

  1.5 單步�(yùn)行支�

  通過重新匯編�(nèi)核AVRX,可以允許和禁止單步�(yùn)行的支持。單步運(yùn)行可以通過編譯�(nèi)核庫時定義下面的變量�#define SIGNALSTEPSUPPORT�

  在能夠單步運(yùn)行以前,�(jìn)程必須先暫停。有兩種方法�(shí)�(xiàn):一是僅僅初始化�(jìn)程但不使能;二是用目�(biāo)�(jìn)程的ID�(diào)用AvrXSuspend,一旦目�(biāo)�(jìn)程掛�,調(diào)試SPI就能使用�,提供的API函數(shù)有:AvrXStepNext和AvrXSingleStepNext�

  1.6 系統(tǒng)對象

  AVRX是圍繞系�(tǒng)對象的概念而構(gòu)建的,系�(tǒng)對象包括一個鏈接和其后面的0個或者若干個字節(jié)的數(shù)�(jù)信號�。�(jìn)程對象可以根�(jù)�(yùn)行隊列和信號量排�。計�(shù)器控制塊只能根據(jù)計數(shù)器隊列排�。消息控制塊只能在消息隊列排隊。�(jìn)程根�(jù)嵌入對象的信號量等待這些對象�

  �(jìn)程堆棧中可用的SRAM是限制系�(tǒng)�(guī)模的主要因素,每個�(jìn)程都需要至�10�35字節(jié)的空間來存儲�(jìn)程上下文。提供的API函數(shù)如下:AvrXSetObjectSamaphore、AvrXIntObjectSamaphore、AvrXResetObjectSamaphore、AvrXWaitObjectSamaphore、AvrXTestObjectSamaphore和AvrXIntTestObjectSamaphore�

  1.7 系統(tǒng)堆棧

  AVRX需要足夠大的堆棧來處理所有可能的中斷嵌套,每次�(jìn)入內(nèi)核將會把10�35字節(jié)壓�(jìn)堆棧(標(biāo)�(zhǔn)上下文和返回地址�,中斷處理可能壓�(jìn)去更�。AVRX的API會臨時壓�2個以上的字節(jié)。GCC或者匯編代碼定義于SRAM的頂�,保證AVRX的堆棧在有效SRAM空間之內(nèi)是設(shè)計者的工作�

  2 AVRX系統(tǒng)的應(yīng)�

  2.1 AVRX在不同型號AVR單片�(jī)上的移植

  下面以ATmega16為例,介紹移植工��

 ?�?)編譯器的選�

  由于AVRX的編者是在GNU推出的AVR-GCC編譯器下編寫�,所以選用AVR-GCC編譯器可以大大提高AVRX在不同AVR單片�(jī)上的移植特��

  �2)重新編譯AVRX�(nèi)�

  為了將應(yīng)用程序成功編�,需要重新編譯AVRX�(nèi)�,重新編譯包括下述步��

  ①重新修改AVRX源碼的Makefile文件,需要修改的幾處如下�

  ABSPATH=�/avrx /*更改AVRX原路徑到�(shí)際路徑下�/

  修改   MCU�8535

  AAVRMCU�

  GCCMCU=at90s$(MCU�

  AVRXMCU=_AT90S$(MCU)_

  為    ICCMCU=m16

  AAVRMCU�

  GCCMCU=atmega16

  AVRXMCU=_AT90Mega16�

 ?、谥匦滦薷腁VRX源碼的serialio.s文件,即根據(jù)不同的單片機(jī)修改串口部分的寄存器定義。需要增添如下代碼:

 ?。f defined(UBRRL�

 ?。efine UBRR UBRRL

 ?。ndif

 ?。f defined(UBRRH�

  sts UBRRH,p1h

 ?。ndif

  ③重新編譯內(nèi)�。具體做法是�(fù)制一個“令名提示符”到AVRX目錄�,運(yùn)行“命令提示符�,鍵入“makegcc”命令后�(yùn)行就完成了AVRX�(nèi)核的重新編譯,會生成很多�.o文件和avrx.a文件。這些文件在以后的�(yīng)用程序中會使��

  至此就完成了AVRX在ATmega16單片�(jī)上的�(nèi)核移植,接著就可以編寫應(yīng)用程序了�

  2.2 在AVRX上編寫應(yīng)用程�

  這時候要用一個新的makefile文件,同時自己的程序可以不和AVRX的內(nèi)核在一個目�,但是要指出依賴文件的明確路徑。makefile的框架可以采用Winavr的sample文件夾下的makefile文件框架,這里的難�(diǎn)其實(shí)還是makefile文件的語法問�。下面介紹應(yīng)用程序的makefile文件在實(shí)例中需要修改或增加的代碼:

  MCU=atmega16 /*微處理器的名字�/

  TARGET=test /*�(yīng)用程序文件名�/

  GCCLIB�$(AVRX�/avrx/avrx.a

  GCCINC=-L-I$(AVRX�/avrx-I$(AVR�/avr/inc /*加上相�(guān)的庫�/

  SCANF[_]LIB[_]MIN=-W1,-u,vfscanf�1scanf[_]min

  SCANF[_]LIB[_]FLOAT=-W1,-u,vfscanf�1scanf[_]flt

  SCANF[_]LIB /*設(shè)置sacnf函數(shù)庫的類型,在不使用時可以注釋�,這樣可以減小編譯后的文件�?�?

  LDFLAGS+=$(PRINTF[_]LIB�$(SCANF[_]LIB�$(MATH[_]LIB� /*新增的連接器參�(shù)�(shè)定*/

  3 系統(tǒng)測試

  3.1 系統(tǒng)�(shí)時性測�

  在實(shí)時系�(tǒng)�,實(shí)時系�(tǒng)的實(shí)時性表�(xiàn)在系�(tǒng)對外部事件的響應(yīng)能力�,系�(tǒng)通過中斷來響�(yīng)外部事件的發(fā)�,并且在用戶中斷程序中做的事要盡量少,把大部分工作留給任�(wù)去做,只是通過信號量或者信息機(jī)制來通知任務(wù)�(yùn)行。Mega16的定時器2�(shè)為比較匹配輸出模�,在匹配時間到了之后�(chǎn)生一定周期脈沖輸�,并�(chǎn)生中斷。設(shè)置定時器1為計�(shù)模式來計�(shù)�(chǎn)生的脈沖輸出。通過定時�2的比較匹配中斷服�(wù)子程序來�(fā)信號量通知任務(wù)�(yùn)�,并在中斷子程序中不開中�,而在任務(wù)得到信號后開中斷,以�(shí)�(xiàn)中斷處理與任�(wù)�(yùn)行的同步,任�(wù)中對一個全局變量計數(shù),以記錄任務(wù)�(zhí)行的次數(shù)。運(yùn)行一段時間后,在�(shè)置的匹配時間里,任務(wù)的運(yùn)行次�(shù)和定時器1的計�(shù)一�,則系統(tǒng)在這段時間里是能完全響�(yīng)外部事件的,�(dāng)定時�2的比較匹配時間設(shè)為大�23μs��2個計�(shù)是相等的;當(dāng)小于23μs�,定時器1計數(shù)值大于任�(wù)計數(shù)�,說明任�(wù)沒有完全得到響應(yīng)。這說明中斷的�(jìn)入和返回即系�(tǒng)對外部時間的響應(yīng)和處理時間為23μs,遠(yuǎn)�(yuǎn)大于其他操作系統(tǒng)在AVR單片�(jī)上移植后的響�(yīng)時間�

  3.2 使用例程測試

  這里只對源文件中的幾個例程先�(jìn)行簡單的編譯,然后去掉不必要的代�,加入自己想測試的一些代�,�(jìn)行了定時器控制模�,信號量和消息隊列以其簡單組合的測試,均在ATmega16上達(dá)到了�(yù)期的效果�

  4 心得體會

  ①AVRX的源碼都是用匯編語言編寫�,相對來講代碼效率很高,但是由于沒有詳細(xì)的API介紹文檔,所以的入門方法就是先讀懂RTOS的源碼和例程,然后�(jìn)行修改,再加上自己的代碼逐漸熟練�(yīng)��

  ②AVRX需要分配的堆棧�35個字節(jié)加上任務(wù)代碼需要的額外堆棧,具體的大小取決于每個�(jìn)程用的本地變量個數(shù)。比較好的確定分配給任務(wù)堆棧大小的方法是:分配很大的堆棧(如70字節(jié))運(yùn)行一段應(yīng)用程序后看堆棧到多深(因?yàn)镚CC啟動時把所有內(nèi)存都�0�,這樣很容易看到)。不�,為了安全起�,用編譯器或仿真器在估計堆棧的頂端寫入幾個字節(jié)�0xFFFFF去驗(yàn)證到底達(dá)到了多少字節(jié),然后分配給比測試結(jié)果多兩個以上的字節(jié)給這個任�(wù)�

 ?、蹎拥囊粋€指令必須跳�(zhuǎn)到Epilog()�

  5 �(jié)�

  AVRX是一個不錯的RTOS,最顯著的特�(diǎn)就是�(nèi)核小,速度�,編譯后大概只需500�700字節(jié),且基本的調(diào)度功能一個也不少。由于其代碼公開,結(jié)合不同型號AVR單片�(jī)的特性,可以在此基礎(chǔ)上�(jìn)行系�(tǒng)的裁減和�(kuò)�,使之能�(dá)到更好的效果,本文為AVR嵌入式系�(tǒng)的應(yīng)用提供了借鑒�

�(yīng)用區(qū)�

  目前,AVR已被廣泛用于�

  · 空調(diào)控制�

  · 打印�(jī)控制�

  · 智能電表

  · 智能手電�

  · LED控制�

  · �(yī)療設(shè)�

  · GPS

入門系列--MEGA端口操作

  AVR端口是真正的雙向端口,不�51偽雙向。這也是AVR的一�(xiàng)�(yōu)�,只是操作時大家注意DDRn就可以了。真正雙向端口在模擬時序方面不如偽雙向的方便�

  DDRn PORTn PINn 解釋:n為端口號:ABCDE

  DDRn:控制端口是輸入還是輸出�0為輸��1為輸�。個人記憶方法:一比零大所以往外擠,即1為輸��0為輸入�

  PORTn:從引腳輸出信號,當(dāng)DDRn�1時,可以通過PORTn=x等端口操作語句給引腳輸出賦��

  PINn:從引腳讀輸入信號,無論DDRn為何�,都可以通過x=PINn獲得端口n的外部電平�

  �(dāng)引腳配置為輸入時,若PORTxn �"1�,上拉電阻將使能。內(nèi)部上拉電阻的使用在鍵盤掃描的時候還要說��

  端口更詳�(xì)功能及介紹以及端口第二功能請參考數(shù)�(jù)手冊�

  端口引腳配置

  DDxn PORTxn PUD (in SFIOR) I/O 上拉電阻說明

  0 0 X 輸入 No 高阻�(tài) (Hi-Z)

  0 1 0 輸入 Yes被外部電路拉低時將輸出電�

  0 1 1 輸入 No高阻�(tài)(Hi-Z)

  1 0 X 輸出 No輸出低電� ( 漏電�)

  1 1 X 輸出 No輸出高電� ( 源電�)

  如果有引腳未被使�,建議給這些引腳賦予一個確定電平。最簡單的保證未用引腳具有確定電平的方法是使能內(nèi)部上拉電�。但要注意的是復(fù)位時上拉電阻將被禁用。如果復(fù)位時的功耗也有嚴(yán)格要求則建議使用外部上拉或下拉電�。不推薦直接將未用引腳與VCC 或GND 連接,因?yàn)檫@樣可能會在引腳偶然作為輸出時出現(xiàn)沖擊電流�

  下面我們來看例子:

  void port[_]init(void)

  {

  PORTA = 0x03;

  DDRA = 0x03;

  PORTB = 0x00;

  DDRB = 0x01;

  PORTC = 0x00;

  DDRC = 0x00;

  PORTD = 0x00;

  DDRD = 0x00;// 建議賦值為�

  }

  PORTA = 0x03;DDRA = 0x03;這兩句使PA口的PA1和PA0處于輸出狀�(tài),PA7—PA2處于輸入狀�(tài)。這里�0x03即二�(jìn)制的00000011,從左到右對�(yīng)于Pn7--Pn0八個IO��

  通過跑馬燈程序來深入理解IO口的操作�

  CODE:

  //ICC-AVR application builder : 2006-11-21 9:20:57

  // Target : M32

  // Crystal: 7.3728Mhz

  #include <iom32v.h>

  #include <macros.h>

  void [_]delay(unsigned char n) //延時函數(shù)定義

  {

  unsigned char i,j;

  for(;n!=0;n--) //n*10ms

  {

  for(j=100;j!=0;j--) //100us*100=10ms

  {

  for(i=147;i!=0;i--) //delay 100us

  ;

  }

  }

  }

  int main(void)

  {

  unsigned char i,j,k; //

  PORTA=0xFF; //PA口設(shè)為輸出高電平,燈�

  DDRA=0xFF; //PA口設(shè)置為輸出

  while(1)

  {

  i=1;

  for (j=0;j<8;j++) //循環(huán)8�,即PA0~~PA7輪流閃亮

  {

  PORTA=~i; //反相輸出,低電平有�,對應(yīng)的燈�

  for (k=0;k<10;k++) [_]delay(100); //延時 100*10=1秒,可自行調(diào)節(jié) i=i<<1; //左移一�,I的值將向下面的列表那樣變化

  // 0b00000001 PA0

  // 0b00000010 PA1

  // 0b00000100 PA2

  // 0b00001000 PA3

  // 0b00010000 PA4

  // 0b00100000 PA5

  // 0b01000000 PA6

  // 0b10000000 PA7

  }

  }

  }[Copy to clipboard]

  其他IO口操作指令:

  void main(void)

  {

  PORTA=0xff;

  DDRA=0xff; //輸出 模式 ,IO口上拉電阻有��1為輸出,0為輸��

  PORTA=0xf0; //�

  以下三條指令只對操作符號右邊的數(shù)字位是一的位操作�

  PORTA&=~0x70; //清零 0x70� 01110000 ,即�*三位清零,其余數(shù)位不��

  PORTA|=0x77; //置一 0x77� 01110111 ,即�*210六位清零,其余數(shù)位不��

  PORTA^=0x70; //翻轉(zhuǎn) 0x70� 01110000,即*三位,如果是零變�1,是一變成0�

  (P & 0x80)==0x80; //按位� 判斷p的第七位是否是一,是則成立

  }

  �(guān)�1<<x的說�,網(wǎng)上的程序中經(jīng)常會看到1<<ADIF類似的語�,新手很難看明白是什么意�,我這里簡單說明一下:

  ADIF是一個寄存器變量,可以堪稱數(shù)�4� 跟手冊中的定�,包含芯片頭文件的定義是一樣的�

  (1<<ADIF) =(1<<4)=0b00010000

  ADCSR=(1<<ADIF); //只是ADIF� =1,其他=0

  ADCSR|=(1<<ADIF); //只是ADIF� =1,其他不變

  ADCSR&=~(1<<ADIF); //只是ADIF� =0,其他不變

  while(ADCSR&(1<<ADIF)) ; //等待ADIF位為0,才退出循�(huán),執(zhí)行下一�

  while(1)

  {

  while(ADCSR&(1<<ADIF)) ; //等待ADIF位為0,才退出循�(huán),執(zhí)行下一�

  {

  程序......

  }

  }

  �(shí)踐出真知:只看這樣的說明是很枯燥的,從�(shí)踐中去學(xué)�(xí)會是更好的途徑,把這些代碼都寫到單片機(jī)里,一步一步調(diào)試運(yùn)�,看看各個端口以及寄存器的效�,也鍛練程序�(diào)試能�,和樂而不為呢�

維庫電子�,電子知識,一查百��

已收錄詞�160850