第6章 通用IO接口的基本結(jié)構(gòu)與輸出應(yīng)用_第1頁
第6章 通用IO接口的基本結(jié)構(gòu)與輸出應(yīng)用_第2頁
第6章 通用IO接口的基本結(jié)構(gòu)與輸出應(yīng)用_第3頁
第6章 通用IO接口的基本結(jié)構(gòu)與輸出應(yīng)用_第4頁
第6章 通用IO接口的基本結(jié)構(gòu)與輸出應(yīng)用_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1第6章通用I/O接口基本結(jié)構(gòu)與輸出應(yīng)用2ATmega16芯片有PORTA、PORTB、PORTC、PORTD(簡稱PA、PB、PC、PD)4組8位,共32路通用I/O接口,分別對應(yīng)于芯片上32根I/O引腳。所有這些I/O口都是雙(有的為3)功能復(fù)用的。

其中第一功能均作為數(shù)字通用I/O接口使用,復(fù)用功能則分別用于中斷、時鐘/計數(shù)器、USRAT、I2C和SPI串行通信、模擬比較、捕捉等應(yīng)用。引言

3I/O口的基本結(jié)構(gòu)

每組I/O口配備三個8位寄存器,它們分別是方向控制寄存器DDRx,數(shù)據(jù)寄存器PORTx,和輸入引腳寄存器PINx(x=A\B\C\D)。I/O口的工作方式和表現(xiàn)特征由這3個I/O口寄存器控制。4方向控制寄存器DDRx用于控制I/O口的輸入輸出方向,即控制I/O口的工作方式為輸出方式還是輸入方式。當(dāng)DDRx=1時,I/O口處于輸出工作方式。

當(dāng)PORTx=1時,I/O引腳呈現(xiàn)高電平,同時可提供輸出20mA的電流;而當(dāng)PORTx=0時,I/O引腳呈現(xiàn)低電平,同時可吸納20mA電流。5當(dāng)DDRx=0時,I/O處于輸入工作方式

此時引腳寄存器PINx中的數(shù)據(jù)就是外部引腳的實際電平,通過讀I/O指令可將物理引腳的真實數(shù)據(jù)讀入MCU。此外,當(dāng)I/O口定義為輸入時(DDRx=0),通過PORTx的控制,可使用或不使用內(nèi)部的上拉電阻。6表6.1是AVR通用I/O端口的引腳配置情況

表中的PUD為寄存器SFIOR中的一位,它的作用相當(dāng)AVR全部I/O口內(nèi)部上拉電阻的總開關(guān)。當(dāng)PUD=1時,AVR所有I/O內(nèi)部上拉電阻都不起作用(全局內(nèi)部上拉無效);而PUD=0時,各個I/O口內(nèi)部上拉電阻取決于DDRXn的設(shè)置。7(1).使用AVR的I/O口,首先要正確設(shè)置其工作方式,確定其工作在輸出方式還是輸入方式。

(2)當(dāng)I/O工作在輸入方式,要讀取外部引腳上的電平時,應(yīng)讀取PINxn的值,而不是PORTxn的值。

(3)當(dāng)I/O工作在輸入方式,要根據(jù)實際情況使用或不使用內(nèi)部的上拉電阻。

(4)一旦將I/O口的工作方式由輸出設(shè)置成輸入方式后,必須等待一個時鐘周期后才能正確的讀到外部引腳PINxn的值。8I/O端口寄存器PA口寄存器—PORTA、DDRA、PINA各個位的具體定義9

正確使用AVR的I/O口要注意:(1)先正確設(shè)置DDRx方向寄存器,再進(jìn)行I/O口的讀寫操作。(2)AVR的I/O口復(fù)位后的初始狀態(tài)全部為輸入工作方式,內(nèi)部上拉電阻無效。所以,外部引腳呈現(xiàn)三態(tài)高阻輸入狀態(tài)。(3)用戶程序需要首先對要使用的I/O口進(jìn)行初始化設(shè)置,根據(jù)實際需要設(shè)定使用I/O口的工作方式(輸出還是輸入),當(dāng)設(shè)定為輸入方式時,還要考慮是否使用內(nèi)部的上拉電阻。(4)在硬件電路設(shè)計時,如能利用AVR內(nèi)部I/O口的上拉電阻,可以節(jié)省外部的上拉電阻。AVR通用I/O端口的主要特點雙向可獨立位控的I/O口ATmega16的PA、PB、PC、PD四個端口都是8位雙向I/O口,每一位引腳都可以單獨的進(jìn)行定義,相互不受影響。如用戶可以在定義PA口第0、2、3、4、5、6位用于輸入的同時定義第1、7位用于輸出,互不影響10AVR通用I/O端口的主要特點Push-Pull大電流驅(qū)動每個I/O口輸出方式均采用推挽式緩沖器輸出,提供大電流的驅(qū)動,可以輸出(吸入)20mA的電流,因而能直接驅(qū)動LED顯示器??煽刂频囊_內(nèi)部上拉電阻每一位引腳內(nèi)部都有獨立的,可通過編程設(shè)置的,設(shè)定為上拉有效或無效的內(nèi)部上拉電阻。當(dāng)I/O口被用于輸入狀態(tài),且內(nèi)部上拉電阻被激活(有效)時,如果外部引腳被拉低,則構(gòu)成電流源輸出電流(uA量級)。11AVR通用I/O端口的主要特點DDRx可控的方向寄存器。AVR的I/O端口結(jié)構(gòu)同其它類型單片機(jī)的明顯區(qū)別是,AVR采用3個寄存器來控制I/O端口。一般單片機(jī)的I/O僅有數(shù)據(jù)寄存器和控制寄存器,而AVR還多了一個方向控制器,用于控制I/O的輸入輸出方向。由于輸入寄存器PINx實際不是一個寄存器,而是一個可選通的三態(tài)緩沖器,外部引腳通過該三態(tài)緩沖器與MCU的內(nèi)部總線連接,因此,讀PINx時是讀取外部引腳上的真實和實際邏輯值,實現(xiàn)了外部信號的同步輸入。這種結(jié)構(gòu)的I/O端口,具備了真正的讀-修改-寫(Read-Modify-Write)特性。1213C語言中的位操作

a|b–-按位或

這個表達(dá)式指示中a被表達(dá)式中的b按位進(jìn)行或運算這慣用于打開某些位尤其常用|=的形式例如

PORTA|=0x80;//打開位7(最高位)

a&b–-按位與

這個運算在檢查某些位是否置1時有用例如

If((PORTA&0x81)==0)//檢查位7和位0注意圓括號需要括在&運算符的周圍因為它和==相比運算優(yōu)先級較低這是C程序中很多錯誤的原因之一

a^b–-按位異或

這個運算對一個位取反有用例如在下面的例子中位7是被翻轉(zhuǎn)的

PORTA^=0x80;//翻轉(zhuǎn)位7

~a–-按位取反

在表達(dá)式中這個運算執(zhí)行一個取反當(dāng)用按位與運算關(guān)閉某些位時與這個運算組合使用尤其有用如

PORTA&=~0x80;//關(guān)閉位7

14PORTC

|=(1<<BIT0)|(1<<BIT3);

1<<(BIT0)表示邏輯1左移到PORTC

的D0位,結(jié)果為0b00000001;1<<(BIT3)表示邏輯1左移PORTC

的D3位,結(jié)果為0b00001000。0b00000001在同0b00001000相或,結(jié)果為0b00001001。

PORTD^=BIT(PD7)PORTD口的第7位取反/,取反PD0引腳,TCCR0|=(1<<CS01)|(1<<CS00);TCCR0功能寄存器的CS01、CS00位置1。15通用數(shù)字I/O口的設(shè)置與編程1.通用I/O輸出設(shè)計要點

應(yīng)用I/O口輸出時,在系統(tǒng)的軟硬件設(shè)計上應(yīng)注意的問題有:

輸出電平的轉(zhuǎn)換和匹配。

輸出電流的驅(qū)動能力。

I/O口輸出為“1”時,可以提供20mA左右的驅(qū)動電流。輸出為“0”時,可以吸收20mA左右的灌電流(最大為40mA)。輸出電平轉(zhuǎn)換的延時。應(yīng)用舉例:LED發(fā)光二極管的控制設(shè)計一個帶有一排8個發(fā)光二極管的簡易彩燈控制系統(tǒng)16硬件電路設(shè)計

當(dāng)電壓U1大于U2約1V以上時,二極管導(dǎo)通發(fā)光。當(dāng)導(dǎo)通電流大于5mA時,人的眼睛就可以明顯地觀察到二極管的發(fā)光,導(dǎo)通電流越大,亮度越高。

AVR的I/O口輸出“0”時,可以吸收最大40mA的電流,因此采用控制發(fā)光二極管負(fù)極的設(shè)計比較好。17#include<mega16.h>#include<delay.h>voidmain(void){unsignedcharposition=0; //position為控制位的位置PORTA=0xFF; //PA口輸出全1,LED全滅DDRA=0xFF; //PA口工作為輸出方式while(1){ PORTA=~(1<<position); if(++position>=8)position=0; delay_ms(1000);}}18應(yīng)用舉例:繼電器控制控制恒溫箱的加熱的硬件電路設(shè)計

恒溫箱的加熱源采用500W電爐,電爐的工作電壓220v,電流2.3A。選用HG4200繼電器,開關(guān)負(fù)載能力為5A/AC220V,繼電器吸合線圈的工作電壓5v,功耗0.36W,計算得吸合電流為0.36/5=72mA。因此,要能使繼電器穩(wěn)定的吸合,驅(qū)動電流應(yīng)該大于80mA。該電流已經(jīng)超出AVR本身I/O口的驅(qū)動能力,因此外部需要使用功率驅(qū)動元件。I/O引腳輸出“1”時,三極管導(dǎo)通,繼電器吸合,電爐開始加熱。I/O引腳輸出“0”時,三極管截止,繼電器釋放,加熱停止。19PORTC

|=(1<<

PORTC0)//PORTC位置1。繼電器吸合,電爐開始加熱。PORTC&

=~(1<<

PORTC0)PORTC&

=

~0x80//PORTC位置0。繼電器釋放,加熱停止。

20應(yīng)用舉例:步進(jìn)電機(jī)控制21硬件電路22程序#include<mega16.h>#include<delay.h>Flashunsignedcharstep[6]={0x04,0x06,0x02,0x03,0x01,0x05};voidmain(void){chari=0; intdelay=500;PORTA=0x00;DDRA=0x07; //PA口工作為輸出方式

while(1){ PORTA=step[i]; // if(++i>=6)i=0; delay_ms(delay);};}23AVRI/O端口應(yīng)用實例-7段LED顯示器

在單片機(jī)系統(tǒng)中,常用的顯示器有:○發(fā)光二極管顯示器,簡稱LED(LightEmittingDiode);○液晶顯示器,簡稱LCD(LiquidCrystalDisplay);○熒光管顯示器,簡稱CRT。近年來也開始使用簡易的CRT接口,顯示一些漢字及圖形。24LED顯示器

◎前二種顯示器都有兩種顯示結(jié)構(gòu):段顯示(7段,“米”字型等)和點陣顯示(5×7,5×8,8×8點陣等)。而發(fā)光二極管顯示又分為固定段顯示和可以拼裝的大型字段顯示,此外還有共陽極和陰極之分等?!蛉N顯示器中,以熒光管顯示器亮度最高,發(fā)光二極管次之,而液晶顯示器最弱,為被動顯示器,必須有外光源。◎限于篇幅,我們介紹7段LED顯示器。25一、LED段顯示器結(jié)構(gòu)與原理

LED顯示器是單片機(jī)應(yīng)用系統(tǒng)中常用的價廉輸出設(shè)備。它是由若干個發(fā)光二極管組成的,當(dāng)發(fā)光二極管導(dǎo)通時,相應(yīng)的一個點或一個筆畫發(fā)亮??刂撇煌M合的二極管導(dǎo)通,就能顯示出各種字符。發(fā)光二極管的陽極連在一起的稱為共陽極顯示器,陰極連在一起的稱為共陰極顯示器。26一、LED段顯示器結(jié)構(gòu)與原理

○對于共陰極LED,欲點亮的段在字節(jié)中所處的位為“1”,○對于共陽極LED,欲點亮的段在字節(jié)中所處的位為“0”,○例如:顯示字符5,共陰極字型碼為01101101B(6DH),共陽極字型碼為10010010B(92H)。

27LED共陰/共陽段選編碼表

顯示字符共陰極字型碼共陽極字型碼顯示字符共陰極字型碼共陽極字型碼0

3FH

C0H

c

39HC6H

1

06H

F9HD

5EHA1H

2

5BH

A4HE

79H86H

3

4FH

B0H

F

71H8EH

4

66H

99H

P

73H8CH

5

6DH

92HU

3EHC1H

6

7DH

82H

I

31HCEH

7

07H

F8H

Y

6EH91H

87FH

80HH

76H89H9

6FH

90H

L

38HC7H

A

77H

88H

“滅”

00HFFH

b

7CH

83H

28二、

LED顯示器顯示方式

LED顯示器有靜態(tài)顯示和動態(tài)顯示兩種顯示方式,分述如下:1.LED靜態(tài)顯示方式所謂靜態(tài)顯示,就是當(dāng)顯示器顯示某一個字符時,相應(yīng)的發(fā)光二極管恒定地導(dǎo)通或截止,例如七段顯示器的a,b,c,d,e,f導(dǎo)通,g截止,顯示0。這種顯示方式每一位都需要有一個8位輸出口控制。29

多位顯示器的接口邏輯。如圖所示

◎優(yōu)點:編程容易,管理簡單,亮度較高,◎缺點:占用口線資源較多。

1、LED靜態(tài)顯示方式302.LED動態(tài)顯示方式

※動態(tài)顯示—就是一位一位地輪流點亮顯示器各個位(掃描),對于顯示器的每一位來說,每隔一段時間點亮一次?!痫@示器的亮度既與導(dǎo)通電流有關(guān),也與點亮?xí)r間和間隔時間的比例有關(guān)。調(diào)整電流和時間參數(shù),可實現(xiàn)亮度較高較穩(wěn)定的顯示。

31

※多位7段LED動態(tài)顯示器電路在多位LED顯示時,為了簡化硬件電路,通常將所在位段選線相應(yīng)地并聯(lián)在一起,由一個(7段LED)8位I/O口控制,形成段線的多路復(fù)用。而各位的共陽極或共陰極分別由相應(yīng)的I/O口線控制,實現(xiàn)各位的分時選通。

2.LED動態(tài)顯示方式32

2.LED動態(tài)顯示方式

掃描顯示方式,即在某一時刻,只讓某一位的位選線處于選通狀態(tài),而其它各位的位選線處于關(guān)閉狀態(tài),同時,段選線上輸出相應(yīng)位要顯示字符的字型碼,這樣同一時刻,6位LED中只有選通的那一位顯示出字符,而其它三位則是熄滅的。由于人眼有視覺暫留現(xiàn)象,只要每位顯示間隔足夠短,則可造成多位同時亮的假象,達(dá)到顯示的目的。33LED顯示器接口技術(shù)

※要使LED顯示器顯示出字符,必須提供段選碼和位選碼。◎段選碼(即字碼)可以用硬件譯碼的方法獲得,也可以用軟件的方法獲得?!蛭贿x碼靜態(tài)顯示和動態(tài)顯示。下面介紹軟件譯碼顯示器接口方法。34一、靜態(tài)顯示接口35一、靜態(tài)顯示接口

1.靜態(tài)顯示器硬件電路是一個采用串行傳送數(shù)據(jù)的8位數(shù)碼管靜態(tài)顯示接口。設(shè)計中將8片八位串行輸入/并行輸出移位寄存器74HC164串接,數(shù)碼管為共陽極型。

MCU將8個要顯示字符的段碼字準(zhǔn)備好,通過DataOut引腳,在ClkOut引腳產(chǎn)生的cp移位脈沖的作用下,一位一位地移入74HC164的QA-QH端(串行輸入)。QA-QH的輸出(并行輸出)直接作為數(shù)碼管的段位控制。由于左邊74HC164芯片的QH(最低位)和右邊74HC164芯片的數(shù)據(jù)串入端連接,經(jīng)過ClkOut時鐘線64個cp脈沖后,要顯示的8個字符將會在8個數(shù)碼管上顯示,最先發(fā)送的顯示字符段碼將顯示在最右邊。

36二、動態(tài)顯示接口37二、動態(tài)顯示接口在任何一個時刻,PC0-PC5中只能有一個I/O口輸出低電平,即只有一位數(shù)碼管亮。MCU必須循環(huán)輪流控制PC0-PC5中的一位輸出“0”,同時PA口要輸出該位相應(yīng)的段碼值。即使顯示的內(nèi)容沒有變化,MCU也要進(jìn)行不停的循環(huán)掃描處理。38二、動態(tài)顯示接口軟件的設(shè)計應(yīng)保證從在外表看數(shù)碼管顯示的效果要連續(xù)(即在人眼里各個數(shù)碼管全部亮),亮度均勻,同時沒有拖尾現(xiàn)象。為了保證各個數(shù)碼管的顯示的效果不產(chǎn)生閃爍情況,表象上全部點亮的話,則首先必須在1秒中內(nèi)循環(huán)掃描6個數(shù)碼管的次數(shù)應(yīng)大于25次,這里是利用了人眼的影像滯留效應(yīng)。本例中我們選擇40次,既每隔1000/40=25ms將6個數(shù)碼管循環(huán)掃描一遍。第二要考慮的是,在25ms時間間隔中,要逐一輪流點亮6個數(shù)碼管,那么每個數(shù)碼管點亮的持續(xù)時間要相同,這樣亮度才能均勻。第三個要考慮的要點為每個數(shù)碼管點亮的持續(xù)時間,這個時間長一些的話,數(shù)碼管的亮度高一些,反之則暗一些。通常,每個數(shù)碼管點亮的持續(xù)時間為1-2ms。我們將每個數(shù)碼管的點亮持續(xù)時間定為2ms,那么6個數(shù)碼管掃描一遍的時間為12ms,因此MCU還有13ms的時間處理其它事件39二、動態(tài)顯示接口#include<mega16.h>#include<delay.h>charled_7[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};charposition[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//任何時刻只有一個管亮,即只有一個I/O口輸出為低voiddisplay(void)//掃描顯示函數(shù),執(zhí)行時間12ms{chari;for(i=0;i<=5;i++){PORTA=led_7[dis_buff[i]];PORTC=position[i];delay_ms(2);//(2)PORTC=0xff;//(3)}}40voidtime_to_disbuffer(void)//時間值送顯示緩沖區(qū)函數(shù){unsignedchari,j=0;for(i=0;i<=2;i++) { dis_buff[j++]=time[i]%10; dis_buff[j++]=time[i]/10; }}voidmain(void){PORTA=0x00; //PORTA初始化

DDRA=0xFF;PORTC=0x3F; //PORTC初始化

DDRC=0x3F;time[2]=23;time[1]=58;time[0]=55; //時間初值23:58:55time_to_disbuffer();41while(1){ display(); //顯示掃描,執(zhí)行時間12ms if(++time_counter>=40) { time_counter=0; //(4)

point_on=~point_on; //(5)

if(++time[0]>=60) { time[0]=0; if(++time[1]>=60) { time[1]=0; if(++time[2]>=24)time[2]=0; } } time_to_disbuffer(); }delay_ms(13); //延時13ms,可進(jìn)行其它處理(6)

}}42點陣LED顯示器點陣LED在許多產(chǎn)品中也是經(jīng)常使用的一種外圍設(shè)備,如電梯中的運行指示,公交汽車?yán)锏恼久麖V告顯示,以及大型的電子廣告牌等。這種LED的優(yōu)點是可以通過點陣的形式顯示漢字、圖形等。實際上,PC的顯示屏、手機(jī)顯示屏等,在上面顯示漢字、圖形的原理都是點陣顯示的方法。43點陣LED顯示器8*8點陣LED一般是一個方型的器件,由8行*8列共64個LED發(fā)光二極管組成。44點陣LED顯示器8*8點陣LED的顯示控制方式與LED數(shù)碼管的顯示方式類似,也是使用動態(tài)掃描的工作方式。上箭頭“↑”的碼表45點陣LED顯示器Col+PA口輸出值1(PA7)2(PA6)3(PA5)4(PA4)5(PA3)6(PA2)7(PA1)8(PA0)Row(-)1(PC0)●0x102(PC1)●●●0x383(PC2)●●●●●0x7C4(PC3)●●●●●●●0xFE5(PC4)●●●0x386(PC5)●●●0x387(PC6)●●●0x388(PC7)●●●0x3846點陣LED顯示器flashcharchar_7[8]={0x10,0x38,0x7C,0xFE,0x38,0x38,0x38,0x38};voiddisplay(charrow){chari;for(i=0;i<=7;i++){if(row<=7)PORTA=char_7[row];elsePORTA=0;PORTC=~(

溫馨提示

  • 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

提交評論