第4章并行IO口編程_第1頁
第4章并行IO口編程_第2頁
第4章并行IO口編程_第3頁
第4章并行IO口編程_第4頁
第4章并行IO口編程_第5頁
已閱讀5頁,還剩56頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第4章并行I/O端口的C51編程C51的并行I/O口結構4.1C51的并行I/O口編程4.2LED數(shù)碼管原理與編程4.3數(shù)碼管動態(tài)顯示原理與編程4.4行列式鍵盤原理與編程4.54.6AT89S51共有4個雙向的8位并行I/O端口:P0、P1、P2和P3,它們的輸出鎖存器屬于特殊功能寄存器。4個端口除了按字節(jié)輸入/輸出外,還可位尋址,便于實現(xiàn)位控功能。(1)P0口用作地址/數(shù)據(jù)總線當AT89S51外擴存儲器或I/O時,P0口作為單片機系統(tǒng)復用的地址/數(shù)據(jù)總線使用。真正的雙向口,應該是具有高電平、低電平和高阻抗輸入3種狀態(tài)的端口。因此,P0口作為地址/數(shù)據(jù)總線使用時是一個真正的雙向端口,簡稱雙向口。4.1AT89S51的并行I/O端口的結構及工作原理當P0口不作為系統(tǒng)的地址/數(shù)據(jù)總線使用時,也可作為通用I/O使用。須外接上拉電阻才能有高電平輸出;(2)P0口用作通用I/O口(3)P0口的特點P0口有如下特點:P0口為雙功能口——地址/數(shù)據(jù)復用口和通用I/O口。當P0口用作地址/數(shù)據(jù)復用口時,是一個真正的雙向口,用作與外部存儲器的連接,輸出低8位地址和輸出/輸入8位數(shù)據(jù)。當P0口用作通用I/O口時,由于需在片外接上拉電阻,端口不存在高阻抗(懸浮)狀態(tài),因此是一個準雙向口。P1口只能作為通用的I/O口使用。P1口由于有內部上拉電阻,沒有高阻抗輸入狀態(tài),故為準雙向口。作為輸出口時,不需要在片外接上拉電阻。P2口是一個雙功能口,作為地址輸出線使用時,P2口可以輸出外部存儲器的高8位地址,與P0口輸出的低8位地址一起構成16位地址,可以尋址64KB的地址空間。當P2口作為高8位地址輸出口時,輸出鎖存器的內容保持不變。P2口作為通用I/O口使用時,P2口為一個準雙向口。功能與P1口一樣。由于AT89S51的引腳數(shù)目有限,因此在P3口電路中增加了引腳的第二功能P3口內部有上拉電阻,不存在高阻抗輸入狀態(tài),為準雙向口。P1~P3口驅動LED發(fā)光二極管的問題在實際應用中,常用P1~P3端口驅動LED發(fā)光二極管,下面來討論P1~P3端口與LED發(fā)光二極管的驅動連接問題。P0口與P1、P2、P3口相比,P0口的驅動能力較大,每位可驅動8個LSTTL輸入,而P1、P2、P3口的每一位的驅動能力,只有P0口的一半。當P0口的某位為高電平時,可提供400A的電流;當P0口的某位為低電平(0.45V)時,可提供3.2mA的灌電流,如低電平允許提高,灌電流可相應加所以,任一個口要想獲得較大的驅動能力,只能用低電平輸出。例如,使用單片機的并行端口P1~P3直接驅動發(fā)光二極管,電路如圖所示。

5(a)不恰當?shù)倪B接:高電平驅動(b)恰當?shù)倪B接:低電平驅動發(fā)光二極管與AT89S51并行口的直接連接由于P1~P3口內部有30kΩ左右的上拉電阻,如果高電平輸出,則強行從P1、P2和P3口輸出的電流Id會造成單片機端口的損壞,如圖(a)所示。如果端口引腳為低電平,能使電流Id從單片機的外部流入內部,則將大大增加流過的電流值,如圖(b)所示。所以,當P1~P3端口驅動LED發(fā)光二極管時,應該采用低電平驅動。7輸出單元:

發(fā)光二極管(LightEmittingDiode)——基本輸出元件低電平驅動限流電阻R=100Ω~1kΩ高電平驅動灌電流拉電流基本輸入輸出單元輸入單元:

按鈕(Button)或開關(Switch)——基本輸入元件

P0口為漏極開路結構——需要外接上拉電阻當按鍵未按下壓時,Px.n端口為高電平;按壓按鍵后為低電平。4.2.1從左到右的流水燈的制作片內I/O端口作為輸出使用時,最常用的應用是控制相應的I/O引腳上的LED點亮與熄滅?!纠?-1】

如圖所示,8個發(fā)光二極管LED0~LED7經限流電阻分別接至P1口的P2.0~P2.7引腳上,陽極共同接高電平。編程來實現(xiàn)發(fā)光二極管的從左到右的流水點亮,即按照LED0→LED1→┉→LED7的順序,每次點亮一個發(fā)光二極管,延時一段時間后熄滅這個發(fā)光二極管,然后點亮下一個發(fā)光二極管,重復循環(huán)。參考程序如下:

104.2并行I/O端口的C51編程舉例8個發(fā)光二極管與并行口P2的連接#include<reg51.h>#include<intrins.h> /*包含移位函數(shù)的頭文件*/#defineucharunsignedchar #defineuintunsignedint

voiddelay(uinti) /*延時函數(shù)*/{ uintt; while(i--); { for(t=50000;t>0;t--);//循環(huán)延時

}}voidmain() /*主程序*/{ P2=0xfe; while(1) { P2=_crol_(P2,1);/*C51函數(shù)庫中的左移函數(shù),P2中的數(shù)據(jù)循環(huán)左移1位*/ delay(2000);/*500為延時參數(shù),可根據(jù)實際需要調整*/ }}8個發(fā)光二極管與并行口P2的連接實例2獨立按鍵識別【要求】采用獨立按鍵方式實現(xiàn)下述功能:開機時LED全熄,然后根據(jù)按鍵動作使相應燈亮,并將亮燈狀態(tài)保持到按壓其它鍵時為止。獨立按鍵——每個按鍵都彼此獨立地各占有一位I/O口線。特點是電路簡單,但占用I/O口線較多。①按鍵的閉合電平為0,但LED的驅動電平為1,故不能直接將P0口的狀態(tài)送到P1口,而應使其先取反再送出;②為使按鍵抬起后LED能保持先前的點亮狀態(tài),需要在按鍵未壓下期間禁止向P2輸出P0狀態(tài)值?!痉治觥繀⒖汲绦蛉缦拢?/p>

“取反”操作的優(yōu)先級高于“與”操作voidmain(){charkey=0; //定義按鍵變量P2=0; //初始狀態(tài)為燈全滅while(1){key=~P0&0x0f; //讀取按鍵狀態(tài),高4位清零if(key!=0)P2=key;//有按鍵動作時,P0狀態(tài)值送P2}}編程界面和運行界面分別如下圖實例1X運行效果實例2鍵控流水燈

【要求】K1為“啟動鍵”,首次按壓K1可產生“自下向上”的流水燈運動;K2為“停止鍵”,按壓K2可終止流水燈的運動;

K3和K4為“方向鍵”,分別產生“自上向下”和“自下向上”運動。K1K2K3K4思路分析:根據(jù)鍵值修改標志位,根據(jù)標志位控制燈狀態(tài)總體關系流程圖鍵值:按壓K1——xxxx1110B按壓K2——xxxx1101B按壓K3——xxxx1011B按壓K4——xxxx0111B無按鍵——xxxx1111B按鍵動作判斷——(P0&0x0f)是否等于0x0f?若是,說明無按鍵動作,反之則有按鍵動作。→0x0e→0x0d→0x0b→0x07→0x0f獲取按鍵狀態(tài)修改方向和啟停標志值亮燈P2輸出碼:xxxx0001xxxx0010xxxx0100xxxx1000D1~D4循環(huán)方向控制charled[]={0x01,0x02,0x04,0x08};for(i=0;i<=3;i++){P2=led[i];}//↓移動for(i=3;i>=0;i--){P2=led[i];}//↑移動實例2原理圖與程序界面圖程序運行效果4.3LED數(shù)碼管原理與編程

LED顯示元件——人機交互輸出設備,其作用是指示中間運行結果與運行狀態(tài)。點式字段式LED光柱式LED的類型com為公共端共陽極LED共陰極LED引腳配置七段式LED顯示器(7-SegmentDisplay)不同顯示字符采需用不同LED組合關系實現(xiàn)(顯示碼,字模)以共陰極為例,部分字符的顯示碼(字模)為:七段LED數(shù)碼管的標準顯示字符為0~9,A~F顯示字符顯示碼(共陰)其它字符:——00111000B=0x38“L”字符的顯示碼“H”字符的顯示碼——01110110B=0x76實例4LED數(shù)碼管顯示在P0口連接一個共陰極數(shù)碼管,使之循環(huán)顯示0~9數(shù)字。分析:將顯示碼循環(huán)輸出到P0口即可實現(xiàn)循環(huán)顯示。但由于數(shù)字0~9的顯示段碼沒有規(guī)律可循,需要采取查表方式進行操作:循環(huán)10次?N

延時循環(huán)指針i賦值(10)P0←數(shù)組[i]Y①將顯示碼按序存放在一個數(shù)組中,順序號與代表的顯示字符相對應。(如,charled_mod[]={x1,x2,….,xn)②通過循環(huán)變量指定待送出的數(shù)組元素參考程序運行結果實例5計數(shù)顯示器統(tǒng)計按鍵次數(shù)并以十進制形式顯示,按鍵次數(shù)大于99后重新由0開始計數(shù)。個位LED接P2口,十位LED接P0口(共陰型)按鈕接P3.7口線,按壓時為0電平編程分析:問題:按鍵壓下時可能被連續(xù)計數(shù)如何避免連續(xù)計數(shù)?初始化:P2=P0=table[0];解決辦法:取模運算(%10)→個位整除10運算(/10)→十位P2=table[count%10];P

0=table[count/10];顯示輸出:如何將計數(shù)值拆成兩個獨立的數(shù)?參考程序程序運行效果

4.4數(shù)碼管動態(tài)顯示原理與編程

兩種顯示接口:靜態(tài)顯示接口和動態(tài)顯示接口靜態(tài)顯示接口:一個數(shù)碼管的引腳獨立占據(jù)一根I/O口線。優(yōu)點:被顯示數(shù)據(jù)只要送入并行口后就不再需要CPU干預,因而顯示效果穩(wěn)定。缺點:占用資源較多動態(tài)顯示接口:所有數(shù)碼管的段碼線對應并聯(lián)接在一個并行口上,而每位數(shù)碼管的公共端分別由一位I/O線控制;由并口輸出的顯示碼可被所有數(shù)碼管收到,但只有滿足導通條件的數(shù)碼管可以被驅動。工作原理:采用快速切換方式(如10ms),每一時刻只有一只數(shù)碼管導通工作。利用視力暫留特性,可獲得連續(xù)顯示效果。優(yōu)點:占用資源較少缺點:占用機時較多(需要CPU隨時刷新顯示值)實例6數(shù)碼管動態(tài)顯示采用共陰極動態(tài)LED顯示原理,實現(xiàn)如下功能:SW1向下?lián)軙r顯示字符“L2”,向上撥時顯示字符“H3”。分析:Proteus中的雙聯(lián)LED數(shù)碼管相當于兩個并聯(lián)的數(shù)碼管。7SEG-MPX2-CC-BLUEBlue,2Digit,7-segmentCathodeDisplayA-G→“0x38”,1#→“0”,2#→“1”A-G→“0x5b”,1#→“1”,2#→“0”P2←led_mode[0],P3←xxxxxx10B=2P2←led_mode[1],P3←xxxxxx01B=1led_mode[]={0x38,0x5b}led_point=0P2=led_mode[led_point]led_point=1-led_pointP3=2-led_point如果不考慮開關switch,動態(tài)顯示“L2”的程序可以如下:;//LED“指針”//顯示字模led_point=0P2=led_mode[led_point]led_point=1-led_pointP3=2-led_pointA-G→“0x76”,1#→“0”,2#→“1”A-G→“0x4f”,1#→“1”,2#→“0”字符數(shù)組led_mode[]={0x38,0x5b,0x76,0x4f}開關狀態(tài)變量

switch_sta復合指針變量led_point+switch_sta顯示字符L2H3switch_sta+led_point0123led_point

0101switch_sta0022P3=2-led_point2121led_point=0P2=led_mode[led_point+switch_sta]led_point=1-led_pointP3=2-led_pointswitch_sta=0,2完整的主函數(shù)#include<REG51.H>charled_mod[]={0x38,0x5B,0x76,0x4F}; voiddelay(unsigned

inttime);sbitP17=P1^7;voidmain(){charled_point=0,switch_sta=0;while(1){ if(P17==1)switch_sta=2;

elseswitch_sta=0;

P3=2-led_point;

P2=led_mod[switch_sta+led_point];

led_point=1-led_point;

delay(30); }}led_point=0P2=led_mode[led_point+switch_sta]led_point=1-led_pointP3=2-led_pointswitch_sta=0,2編程界面運行效果圖4.5行列式鍵盤原理與編程

獨立式鍵盤的電路簡單,易于編程,但占用的I/O口線較多,當需要較多按鍵時可能產生I/O資源緊張問題。獨立式鍵盤電路行列式鍵盤——將I/O口分為行線和列線,按鍵跨接在行線和列線上,列線通過上拉電阻接正電源。4×4行列式鍵盤7407——六高壓輸出緩沖器/驅動器行列式鍵盤的特點:占用I/O口線少,但軟件過程復雜。①鍵盤掃描

同時將各行電平置1,分別將各列電平置0。掃描碼:key_scan[]={0xef,0xdf,0xbf,0x7f};寫P3: P3=key_scan[i];鍵盤掃描原理(以P3口接4×4鍵盤為例)第一次11101111B第二次11011111B第三次10111111B第四次01111111B=0xef=0xdf=0xbf=0x7f(P3&0x0f)=0x0f

→無鍵壓下

(P3&0x0f)≠0x0f

→有鍵壓下

按鍵閉合狀態(tài)判斷0#:11101110B——0xee1#:

11011110B——0xdeF#:

01110111B——0x77按鍵閉合前后,所在行線端口電平反轉;讀P3后,若發(fā)現(xiàn)其低4位為f,說明無鍵壓下;反之則相反。鍵值——

溫馨提示

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

評論

0/150

提交評論