本節書摘來自異步社群《51單片機應用開發範例大全(第3版)》一書中的第2章,第2.2節,作者 張傑,宋戈,黃鶴松,員玉良,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
用序列槽擴充i/o口非常實用,但是序列槽是按位讀取的,輸入的資料必須重組後才能使用,速度受到限制,同時還需要嚴格的時鐘配合。
在有些場合,利用序列槽擴充i/o口不是很理想,比如bcd碼的輸入及多組速率較高的并行資料的輸入。是以,用并行資料端口擴充i/o口也是很有必要的。
bcd碼由四位二進制數組成,有些裝置直接以bcd碼的形式收發資料。如果這類接口的裝置比較多,就需要擴充4位并行接口。本設計利用單片機4個i/o接口,擴充成4個4位的并行i/o端口,用于4位并行資料的輸入/輸出。
1.8243簡介
8243共有4個4位的并行i/o端口,即p4、p5、p6、p7口,這4個端口均可獨立地設定為輸入口或輸出口。由于各端口均為4位。是以,十分适宜用于bcd碼的輸入/輸出。圖2-7所示為8243引腳圖,具體引腳說明如下。

prog信号用于選擇p2口的功能。在進行輸入/輸出時,先通過p2口傳送選擇端口及端口操作方式的控制指令,該指令由prog的下跳沿所存至8243内部的指令寄存器和位址譯碼器,而進行的資料傳送,由prog的上跳沿将資料通過指定的端口輸入/輸出。p2傳送指令時,由p2.1和p2.0指定端口位址,由p2.3和p2.2規定端口的工作方式,各位具體的定義如表2-1所示。
表中的“或”、“與”方式是指分别把輸出的資料與被尋址端口的内容進行“邏輯或”以及“邏輯與”運算後再寫入該端口。
2.8243與單片機的接口設計
以下是單片機序列槽驅動8243的程式代碼:
可程式設計并行i/o接口晶片8255a是intel公司生産的标準外圍接口電路。它采用nmos工藝制造,用單一+5v電源供電,具有40條引腳,采用雙列直插式封裝。它有a、b、c共3個端口共24條i/o線,可以通過程式設計的方法來設定端口的各種i/o功能。由于它功能強,又能友善地與各種微機系統相連,而且在連接配接外部裝置時,通常不需要再附加外部電路,是以得到了廣泛的應用。
1.8255a的引腳介紹
8255a是一種有40個引腳的雙列直插式标準晶片,其引腳如圖2-9所示。除電源(+5v)和位址外,其他信号可以分為兩組。
與外設相連接配接的如下。
pa7~pa0:端口a資料線。
pb7~pb0:端口b資料線。
pc7~pc0:端口c資料線。
與cpu相連接配接的如下。
2.8255a的工作方式
8255a共有3種工作方式,即工作方式0、工作方式1和工作方式2,這些工作方式可以用軟體程式設計來指定。
(1)工作方式0。
工作方式0也叫基本輸入/輸出方式。這種工作方式不需任何選通信号,端口a、端口b及端口c的高4位和低4位都可以設定為輸入或輸出。作為輸出端口時,輸出的資料均被鎖存;作為輸入端口時,端口a的資料能鎖存,端口b與端口c的資料不能鎖存。
(2)工作方式1。
工作方式1也叫選通輸入/輸出方式。在這種工作方式下,端口a可由程式設計指定為輸入口或輸出口,端口c的高4位用來作為輸入/輸出操作的控制聯絡信号;端口b同樣可由程式設計指定為輸入口或輸出口,端口c的低4位用來作為輸入/輸出操作的控制聯絡信号。在方式1下,端口a和端口b的輸入資料或輸出資料均能被鎖存。
(3)工作方式2。
8255a的工作方式2僅适合于端口a,這種工作方式下,端口a可作為8位的雙向資料傳輸端口,即可發送資料,也可接收資料。端口c的pc7~pc3用來作為輸入/輸出的同步控制信号。此時,端口b和pc2~pc0隻能程式設計為方式0或方式1工作,而端口c剩下的3條線可作為輸入或輸出線使用或用作端口b方式1下的控制線。
3.8255a的控制字及初始化
8255a為可程式設計接口晶片,以控制字形式對其工作方式和端口c各位的狀态進行設定,它有兩種控制字:工作方式控制字和端口c置位/複位控制字。
工作方式控制字用于确定各端口的工作方式及資料傳送方向,其格式如表2-3所示。
對工作方式控制字作如下說明。
端口a有3種工作方式,而端口b隻有2種工作方式。
a組包括端口a與端口c的高4位,b組包括端口b與端口c的低4位。
在方式1或方式2下,對端口c的定義(輸入或輸出)不影響作為聯絡使用的端口c各位的功能。
最高位(d7)為标志位,d7為方式控制字。
利用端口c置位/複位控制字可以很友善地使端口c8位任一位清0或置1,控制字的格式如表2-4所示。d7位為控制字的标志位,d7 = 0為端口c置位/複位控制字。
在使用中,控制字每次隻能對端口c的一位進行置位或複位。
應注意的是,作為聯絡信号使用的端口c各位是不能采用置位/複位操作來使其置位或複位的。其數值應視現場的具體情況而定。
8255a初始化的内容就是向控制寄存器寫入工作方式控制字或端口c置位/複位控制字。
這兩個控制字可按同一位址寫入且不受先後順序限制,因為兩個控制字标志位的狀态不同,是以8255a能加以區分。
例如,對8255a各口作如下設定:端口a方式0輸入,端口b方式0輸出,端口c高位部分為輸出、低位部分為輸入。假設控制寄存器的位址為03ffh,則其工作方式控制字可設定如下。
d0 = 1:端口c低半部分輸入。
d1 = 0:端口b輸出。
d2 = 0:端口b方式0。
d3 = 0:端口c高半部分輸出。
d4 = 0:端口a輸入。
d6d5 = 00:端口a方式0。
d7 = 1:工作方式字标志。
是以工作方式控制字為10010001b,即91h。
4.8255a與單片機的接口電路
因為8255a所有的寄存器、i/o端口都對應有讀寫位址,是以可以對8255a的各i/o口和控制字寄存器進行編址。令a15~a8為01111111,a6~a2為11111時,8255a才會工作。
pa位址:7f7ch。
pb位址:7f7dh。
pc位址:7f7eh。
控制字位址:7f7fh。
5.8255a驅動程式設計
8255a的驅動程式主要是涉及對端口a、b、c以及控制字的設定,8255a具體的驅動程式主要包括以下代碼及函數。
(1)管腳定義及函數聲明。
管腳定義是指端口a、端口b、端口c和控制字的位址說明以及狀态标志位的定義;函數的聲明包括端口a、端口b、端口c的讀寫函數和控制字以及c口配置函數,具體代碼如下:
(2)端口a、b、c讀寫函數。
端口a、b、c讀寫函數完成8255a端口a、b、c的資料讀寫,程式代碼如下:
(3)端口c配置函數。
端口c配置函數可實作pc口具體某一位的輸入/輸出設定,程式代碼如下:
(4)寫控制字函數。
寫控制字函數完成對控制字的寫,進而實作對端口a、b、c口輸入/輸出的配置,程式
代碼如下:
8155是intel公司生産的可程式設計多功能接口晶片。它的内部有兩個可程式設計的8位并行i/o口、一個6位并行i/o口、一個14位定時/計數器以及256位元組的ram存儲器。8155可以直接和mcs-51系列單片機連接配接,而不需增加硬體電路,它是單片機應用系統中最常用的晶片之一。8155的結構及引腳如圖2-11所示。
8155有3個可程式設計并行i/o端口:端口a、端口b、端口c。其中,端口a和端口b是8位,端口c是6位;1個14位可程式設計定時/計數器和256b的靜态ram,能友善地進行i/o端口擴充和ram擴充。
8155共有40個引腳,按其功能特點分類說明如下。
1.8155的工作方式及基本操作
8155可作為通用i/o端口,也可作為片外256b ram及定時器使用,在各種不同類型下使用時的基本操作如下。
8155的i/o端口各種方式選擇是通過對8155内部指令寄存器指令字來實作的。指令寄存器由8位鎖存器組成,隻能寫入不能讀出。指令字各位定義如表2-6所示。
8155的工作狀态由狀态寄存器指出,與指令字寄存器用同一個位址,隻能讀出不能寫入。狀态字的格式如表2-7所示。
端口操作如下。
端口a寄存器和端口b寄存器有完全相同的功能,可工作于基本i/o方式或選通i/o方式。
端口c可工作于基本i/o方式,也可作為端口a、端口b選通方式工作時的狀态控制信号線。
當8155設定為方式1和方式2時,端口a、端口b、端口c均工作于基本輸入/輸出方式,由“movx”類指令進行輸入/輸出操作。
設定為方式3時,端口a定義為選通輸入/輸出,由端口c低3位作為端口a聯絡線,端口c其餘位作為i/o端口線。
設定為方式4,端口a、端口b均定義為選通輸入/輸出方式,由端口c作為端口a、端口b的聯絡線。
邏輯組态如表2-8所示。
intr為中斷請求輸出線,作為cpu的中斷源,高電平有效。當8155的端口a或端口b緩沖器接收到裝置輸入的資料或裝置從緩沖器中取走資料時,中斷請求線intr升高(僅當指令字寄存器相應中斷允許位為1),向cpu請求中斷,cpu對8155的相應i/o端口進行一次讀/寫操作後,intr自動變為低電平。
bf為i/o端口緩沖器标志輸出線,緩沖器存有資料時,bf為高電平,否則為低電平。為裝置選通信号輸入線,低電平有效。
在i/o端口設定為輸出口時,仍可用對應的端口位址執行讀操作,讀取輸出端口的内容;設定為輸入端口時,輸出鎖存器被清除,無法将資料寫入輸出鎖存器。是以每次通道由輸入方式轉為輸出方式時,輸出端總是低電平。8155複位時,清除所有輸出寄存器,3個端口都為輸入方式。
2.8155與單片機的接口電路
圖2-12所示為8155與單片機接口電路。
根據圖中連線圖,假設a14~a9均為高電平,8155才工作,是以會有下述資訊。
存儲器位址:0x7f00~0x7fff。
指令/狀态寄存器位址:0x7e00(共有32個位址對應,選期中一個有效位址)。
端口a位址:0x7e01(共有32個位址對應,選期中一個有效位址)。
端口b位址:0x7e02(共有32個位址對應,選期中一個有效位址)。
端口c位址:0x7e03(共有32個位址對應,選期中一個有效位址)。
定時器寄存器a位址:0x7e04(共有32個位址對應,選期中一個有效位址)。
定時器寄存器b位址:0x7e05(共有32個位址對應,選期中一個有效位址)。
3.8155驅動程式設計
8155驅動程式主要是涉及對端口pa、pb、pc、控制字以及定時器的設定,主要包括以下代碼及函數。
(1)相關函數聲明及管腳定義。
管腳定義主要是指端口pa、端口pb、端口pc、控制字以及定時器a、b和存儲器首地
址和相關标志位的定義;函數的聲明涉及存儲器及端口pa、端口pb、端口pc的讀寫函數、中斷的開關函數和定時器相關函數,具體代碼如下。
(2)讀寫外ram函數。
讀寫外ram函數對外部存儲器指定單中繼資料進行讀寫,程式代碼如下。
(3)端口pa、端口pb以及端口pc的讀寫設定函數。
端口pa、端口pb以及端口pc的讀寫設定函數主要完成對8155端口的輸入輸出設定及
資料讀寫,程式代碼如下。
(4)端口pa、端口pb以及端口pc的中斷設定函數。
① 端口pa、端口pb以及端口pc的中斷設定函數完成各個端口的中斷開啟和關斷,程式代碼如下。
② 端口pc上下半口配置函數可實作端口pc上半口配置為pa狀态輸出和pc下半口配置為pb狀态輸出。程式代碼如下。
③ 計數器設定函數完成計數器的起停和讀寫和輸出模式設定,具體程式代碼如下。