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;
程序代碼執行結束,分析完畢。