51單片機 | I/O口直接輸入輸出實例


51單片機P0/P1/P2/P3口的區別:

P0口要作為低8位地址總線和8位數據總線用,這種情況下P0口不能用作I/O,要先作為地址總線對外傳送低8位的地址,然后作為數據總線對外交換數據;

P1口只能作為I/O口(P1.0、P1.1以外);

P2口除了作為普通I/O口之外,在擴展外圍設備時,要用作高8位地址線;

P3口除了作為普通I/O口之外,其每個引腳都有第二功能。

I/O端口具有以下特性:

端口自動識別:無論是P0 P2口的總線復用還是P3口的功能復用,內部資源會自動選擇,不需要通過指令的狀態選擇。

准雙向口功能:准雙向口作為輸入口時,應先使鎖存器置"1",然后再讀引腳。

P0作為普通I/O口使用:不使用並行擴展總線時,必須外加上拉電阻。

I/O口驅動特性:P0口作為I/O口時可輸出驅動8個LSTTL輸入端,P1-P3口則可以輸出驅動4個LSTTL輸入端

————————————————————————————————————————————

I/O接口直接輸入輸出實例

//51單片機原理及應用(第二版)——基於Keil C與Proteus》第四章例4.3

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

程序分析:

電路中的P2口既用作輸入也用作輸出,P2.0-P2.3作為輸入,P2.4-P2.7作為輸出;

首先將 P2 = 0xff; P2口全部賦高電平 1111 1111,因為I/O作為輸入時應先設置各個鎖存器為"1",才能確保輸入結果正確;

P2.0-P2.3讀入開關狀態 if ((P2 & 0x0f) != 0x0f)時,通過對其移位 P2 = P2<< 4;,將P2.0-P2.3的值對應移到了P2.4-P2.7

代碼分析:

    

代碼具體執行情況以及P2調試情況見下 ↓

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

調試及P2情況

Keil與Proteus聯調,打開P2狀態圖;

開始調試並且未操作時,P2 = 0xff;,P2狀態為 1111 1111,

閉合開關2,單擊RUN執行,在這個執行過程中P2情況:

① 初始狀態 1111 1111

② 閉合開關 1111 1101

④ "與運算" 0000 1101

//通過 (1111 1101 & 0000 1111) 運算得到 (0000 1101) 屏蔽掉高四位的情況,進行!= 0x0f 判斷。

// 如果四開關同時斷開,(1111 1111 & 0000 1111) == (0000 1111)

// 如果有任何一個開關閉合,則將執行左移操作

③ 左移四位 1101 0000

LED2 左端獲得低電平,右端高電平,LED亮

所有開關斷開,重新進入循環,P2 = 0xff;

程序代碼執行結束,分析完畢。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM