嵌入式系統 - I/O 程式設計



在 8051 中,I/O 操作是使用四個埠和 40 個引腳完成的。以下引腳圖顯示了 40 個引腳的詳細資訊。I/O 操作埠保留 32 個引腳,每個埠有 8 個引腳。其他 8 個引腳被指定為 Vcc、GND、XTAL1、XTAL2、RST、EA(反相)、ALE/PROG(反相)和 PSEN(反相)。

它是一個 40 引腳 PDIP(塑膠雙列直插封裝)

PIN diagram

注意 - 在 DIP 封裝中,您可以透過 IC 中間的切口識別第一個引腳和最後一個引腳。第一個引腳位於此切口標記的左側,最後一個引腳(在本例中為第 40 個引腳)位於切口標記的右側。

I/O 埠及其功能

四個埠 P0、P1、P2 和 P3,每個使用 8 個引腳,使它們成為 8 位埠。復位後,所有埠都配置為輸入,準備用作輸入埠。當第一個 0 寫入埠時,它將變為輸出。要將其重新配置為輸入,必須向埠傳送 1。

埠 0(引腳號 32 – 引腳號 39)

它有 8 個引腳(32 到 39)。它可以用於輸入或輸出。與 P1、P2 和 P3 埠不同,我們通常將 P0 連線到 10K 歐姆上拉電阻,以將其用作輸入或輸出埠,因為它是開漏的。

它也被指定為 AD0-AD7,允許它同時用作地址和資料。在 8031(即無 ROM 晶片)的情況下,當我們需要訪問外部 ROM 時,P0 將用於地址和資料匯流排。ALE(引腳 31)指示 P0 是否具有地址或資料。當 ALE = 0 時,它提供資料 D0-D7,但當 ALE = 1 時,它具有地址 A0-A7。如果沒有可用的外部儲存器連線,則必須將 P0 外部連線到 10K 歐姆上拉電阻。

Port 0 diagram
MOV A,#0FFH  ;(comments: A=FFH(Hexadecimal  i.e. A=1111 1111)  

MOV P0,A     ;(Port0 have 1's on every pin so that it works as Input)

埠 1(引腳 1 至 8)

它是一個 8 位埠(引腳 1 至 8),可以用作輸入或輸出。它不需要上拉電阻,因為它們已在內部連線。復位後,埠 1 配置為輸入埠。以下程式碼可用於向埠 1 傳送 55H 和 AAH 的交替值。

;Toggle all bits of continuously 
MOV     A,#55 
BACK:    

MOV     P2,A 
ACALL   DELAY 
CPL     A      ;complement(invert) reg. A 
SJMP    BACK

如果埠 1 配置為用作輸出埠,則要再次將其用作輸入埠,請透過向其所有位寫入 1 來對其進行程式設計,如下面的程式碼所示。

;Toggle all bits of continuously 

MOV     A ,#0FFH    ;A = FF hex 
MOV     P1,A        ;Make P1 an input port                     
MOV     A,P1        ;get data from P1 
MOV     R7,A        ;save it in Reg R7 
ACALL   DELAY       ;wait 

MOV     A,P1        ;get another data from P1 
MOV     R6,A        ;save it in R6 
ACALL   DELAY       ;wait 

MOV     A,P1        ;get another data from P1 
MOV     R5,A        ;save it in R5

埠 2(引腳 21 至 28)

埠 2 共佔用 8 個引腳(引腳 21 至 28),可用於輸入和輸出操作。與 P1(埠 1)一樣,P2 也不需要外部上拉電阻,因為它們已在內部連線。它必須與 P0 一起使用以提供外部儲存器的 16 位地址。因此它也被指定為 (A0–A7),如引腳圖所示。當 8051 連線到外部儲存器時,它為 16 位地址的高 8 位提供路徑,並且不能用作 I/O。復位後,埠 2 配置為輸入埠。以下程式碼可用於向埠 2 傳送 55H 和 AAH 的交替值。

;Toggle all bits of continuously 
MOV     A,#55 
BACK: 
MOV     P2,A 
ACALL   DELAY 
CPL     A         ; complement(invert) reg. A 
SJMP    BACK

如果埠 2 配置為用作輸出埠,則要再次將其用作輸入埠,請透過向其所有位寫入 1 來對其進行程式設計,如下面的程式碼所示。

;Get a byte from P2 and send it to P1 
MOV    A,#0FFH    ;A = FF hex 
MOV    P2,A       ;make P2 an input port 
BACK: 
MOV    A,P2       ;get data from P2 
MOV    P1,A       ;send it to Port 1
SJMP   BACK       ;keep doing that

埠 3(引腳 10 至 17)

它也是 8 位的,可以用作輸入/輸出。此埠提供一些極其重要的訊號。P3.0 和 P3.1 分別是 RxD(接收器)和 TxD(傳送器),它們共同用於序列通訊。P3.2 和 P3.3 引腳用於外部中斷。P3.4 和 P3.5 用於定時器 T0 和 T1。P3.6 和 P3.7 是寫(WR)和讀(RD)引腳。這些是低電平有效的引腳,這意味著當向它們提供 0 時它們將處於活動狀態,並且這些引腳用於在基於 8031 的系統中為外部 ROM 提供讀寫操作。

P3 位 功能 引腳
P3.0 RxD 10
P3.1 < TxD 11
P3.2 < INT0 的補碼 12
P3.3 < INT1 13
P3.4 < T0 14
P3.5 < T1 15
P3.6 < WR 16
P3.7 < RD 的補碼 17

埠 0 和埠 2 的雙重作用

  • 埠 0 的雙重作用 - 埠 0 也被指定為 AD0–AD7,因為它可以用於資料和地址處理。在將 8051 連線到外部儲存器時,埠 0 可以提供地址和資料。然後,8051 微控制器複用輸入作為地址或資料以節省引腳。

  • 埠 2 的雙重作用 - 除了用作 I/O 之外,埠 P2 還與埠 0 一起用於為外部儲存器提供 16 位地址匯流排。埠 P2 也被指定為 (A8– A15),而埠 0 透過 A0–A7 提供低 8 位。換句話說,我們可以說當 8051 連線到外部儲存器 (ROM) 時,最大可達 64KB,這是透過 16 位地址匯流排實現的,因為我們知道 216 = 64KB。埠 2 用於 16 位地址的高 8 位,它不能用作 I/O,這是外部 ROM 的任何程式程式碼的定址方式。

引腳的硬體連線

  • Vcc - 引腳 40 為晶片提供電源,為 +5 V。

  • Gnd - 引腳 20 為參考提供接地。

  • XTAL1、XTAL2(引腳 18 和引腳 19) - 8051 具有片上振盪器,但需要外部時鐘才能執行。石英晶體連線到晶片的 XTAL1 和 XTAL2 引腳之間。該晶體還需要兩個 30pF 的電容來產生所需頻率的訊號。每個電容的一端連線到地。8051 IC 可用於各種速度,這完全取決於此石英晶體,例如,20 MHz 微控制器需要頻率不超過 20 MHz 的晶體。

XTAL1, XTAL2 diagram
  • RST(引腳 9) - 它是一個輸入引腳,並且是高電平有效的引腳。在該引腳上施加高脈衝,即 1,微控制器將復位並終止所有活動。此過程稱為上電覆位。啟用上電覆位將導致暫存器中的所有值丟失。它將程式計數器設定為全 0。為了確保復位的有效輸入,高脈衝必須在允許其變低之前保持高電平至少兩個機器週期,這取決於電容值及其充電速率。(機器週期是執行單個指令所需的最小頻率量)。

  • EA 或外部訪問(引腳 31) - 它是一個輸入引腳。此引腳是低電平有效的引腳;施加低脈衝後,它將被啟用。對於具有片上 ROM 的微控制器 (8051/52),EA(反相)引腳連線到 Vcc。但在沒有片上 ROM 的 8031 微控制器中,程式碼儲存在外部 ROM 中,然後由微控制器獲取。在這種情況下,我們必須將 (引腳 31) EA 連線到 GND 以指示程式程式碼儲存在外部。

RST, EA diagram
  • PSEN 或程式儲存器使能(引腳 29) - 這也是一個低電平有效的引腳,即施加低脈衝後它將被啟用。它是一個輸出引腳,與基於 8031 的(即無 ROM)系統中的 EA 引腳一起使用,以允許將程式程式碼儲存在外部 ROM 中。

  • ALE 或(地址鎖存使能) - 這是一個輸出引腳,並且是高電平有效的。它尤其用於 8031 IC 以將其連線到外部儲存器。它可以在決定 P0 引腳將用作地址匯流排還是資料匯流排時使用。當 ALE = 1 時,P0 引腳用作資料匯流排,當 ALE = 0 時,P0 引腳用作地址匯流排。

I/O 埠和位定址

在為 8051 編寫程式碼時,它是 8051 最廣泛使用的功能之一。有時我們需要訪問埠的僅 1 或 2 位,而不是整個 8 位。8051 提供了訪問埠各個位的功能。

以單位元方式訪問埠時,我們使用語法“SETB X. Y”,其中 X 是埠號(0 到 3),Y 是資料位 D0-D7 的位號(0 到 7),其中 D0 是 LSB,D7 是 MSB。例如,“SETB P1.5”設定埠 1 的高位 5。

以下程式碼顯示了我們如何連續切換 P1.2 位。

AGAIN: 
SETB    P1.2
ACALL   DELAY    
CLR     P1.2      
ACALL   DELAY 
SJMP    AGAIN

單位元指令

指令 功能
SETB 位 設定位(位 = 1)
CLR 位 清除位(位 = 0)
CPL 位 取反位(位 = 非位)
JB 位,目標 如果位 = 1,則跳轉到目標(如果位,則跳轉)
JNB 位,目標 如果位 = 0,則跳轉到目標(如果沒有位,則跳轉)
JBC 位,目標 如果位 = 1,則跳轉到目標,清除位(如果位,則跳轉,然後清除)
廣告