如何使用并行 I/O 口?如何擴(kuò)展簡單并行 I/O 接口?
MCS-51單片機(jī)有4個(gè)并行I/O口P0、P1、P2和P3,共32個(gè)I/O口引腳,其中:P1口
功能單一,僅作為基本的輸入輸出接口使用;P0口和P2口除了作基本輸入輸出接口外,還在單片機(jī)擴(kuò)展外部數(shù)據(jù)存儲(chǔ)器、程序存儲(chǔ)器和I/O接口時(shí)用作地址和數(shù)據(jù)總線;P3口除了作基本輸入、輸出接口外,還具有第二功能。因此,通常情況下,留給用戶使用的只有P1口的8個(gè)引腳,但這往往是不夠的。
比如,在圖5-15中,單片機(jī)的P1口的P1.0~P1.3引腳作為輸入接口與4個(gè)LED燈相連,而P1.4~P1.7引腳作為輸入接口與4個(gè)開關(guān)相連;通過下面的程序,可以由LED燈的亮滅,來反映開關(guān)閉合的狀態(tài)。顯然,當(dāng)開關(guān)和LED燈的數(shù)目大于4時(shí),P1口的引腳個(gè)數(shù)無法滿足要求,此時(shí)就需要單片機(jī)擴(kuò)展外部的I/O接口。
圖5-15單片機(jī)并口應(yīng)用電路
簡單并行I/O接口的擴(kuò)展
在實(shí)際系統(tǒng)中,74系列的TTL或CMOS芯片是常用的I/O接口芯片。圖5-16是由74LS273和74LS244構(gòu)成的簡單I/O接口擴(kuò)展電路原理圖,其中:74LS273芯片(帶有鎖存功能的鎖存器)為輸出接口,74LS244芯片(帶有三態(tài)緩沖功能的緩沖器)為輸入接口。
在圖5-16中,單片機(jī)的P0口是并行雙向I/O口,若通過P0向輸出接口74LS273寫數(shù)據(jù),則可以控制LED燈LED0~LED7的亮滅;若通過P0口從輸入接口74LS244讀數(shù)據(jù),則可獲得開關(guān)S7~S0的開閉狀態(tài);若將從74LS244獲得的開關(guān)狀態(tài)送到74LS273的輸出端,則可利用LED燈的亮滅,反映開關(guān)的開閉狀態(tài)。
【例】簡單I/O擴(kuò)展電路程序設(shè)計(jì)。要求:針對圖5-16所示簡單I/O接口電路,編寫匯編語言程序,由LED燈(LED7~LED0)的亮滅狀態(tài)反映開關(guān)(S7~S0)的開閉狀態(tài),即若S0閉合,則LED0點(diǎn)亮,依此類推。
電路功能分析如下:
1)開關(guān)S7~S0被連接到74LS244的輸入引腳D7~D0。當(dāng)開關(guān)斷開時(shí),對應(yīng)的74LS244輸入引腳為高電平1;反之,為低電平0。
2)74LS244的輸出引腳Q7~Q0與單片機(jī)的數(shù)據(jù)總線P0口相連。單片機(jī)可以讀取開關(guān)狀態(tài)的前提是,必須將74LS244輸入引腳D7~D0的狀態(tài)傳送至其輸出引腳Q7~Q0。而74LS244是三態(tài)緩沖器,當(dāng)G為高電平時(shí),74LS244處于高阻態(tài),即其輸入引腳和輸出引腳在電氣上是隔離不通的;僅當(dāng)G為低電平時(shí),其輸入和輸出引腳才是電氣上連通的,即輸入引腳的狀態(tài)能反映在輸出引腳上。
圖5-16簡單I/O接口擴(kuò)展電路
3)74LS273的輸出引腳Q7~Q0與LED燈相連,當(dāng)74LS273的輸出引腳為低電平0時(shí),對應(yīng)的LED燈被點(diǎn)亮,反之亦然。
4)作為鎖存器,當(dāng)74LS273的CLK引腳出現(xiàn)上升沿信號(hào)時(shí),其輸入引腳的狀態(tài)將被鎖存到其輸出引腳,并保持不變,直到再次進(jìn)行新的鎖存為止。
5)若由單片機(jī)控制LED燈的亮滅,則必須使單片機(jī)P0口輸出到74LS273輸入引腳的電平出現(xiàn)在74LS273的輸出引腳上,并且保持不變,直至P0口產(chǎn)生新的輸出為止。實(shí)現(xiàn)這一目的的方法是,利用74LS273的鎖存功能,在P0口輸出LED狀態(tài)的同時(shí)給74LS273的CLK引腳提供一個(gè)上升沿信號(hào),用于觸發(fā)74LS273,將P0口的輸出鎖存,以控制LED燈的亮滅。
I/O接口操作指令分析如下:
1)MCS-51單片機(jī)通過MOVX指令訪問片外擴(kuò)展的I/O接口。輸入指令“MOVX A,@DPTR”和“MOVX A,@Ri”,從I/O端口讀數(shù)據(jù),并送入單片機(jī)內(nèi)部的累加器A?!癕OVX@DPTR,A”和“MOVX@Ri,A”是輸出指令,可將單片機(jī)內(nèi)部累加器A中的數(shù)據(jù)送至I/O端口。
2)分析圖5-12所示的MOVX指令讀總線周期可知,在讀操作時(shí),MOVX指令會(huì)令單片機(jī)的RD引腳上出現(xiàn)低電平。若此時(shí)P2.7引腳(此時(shí)P2是高8位地址線)為低電平,則RD的低電平將通過或門,并使74LS244引腳G為低電平,從而使開關(guān)S7~S0的狀態(tài)出現(xiàn)
在74LS244的Q7~Q0引腳上和單片機(jī)的P0口引腳上。另外,當(dāng)RD為低電平時(shí),在總線時(shí)序的S3階段,P0口為數(shù)據(jù)線,P0口上的數(shù)據(jù)(即開關(guān)S7~S0的狀態(tài))將在MOVX指令的作用下被送入單片機(jī)的累加器A。結(jié)合上述分析可知,使用MOVX指令讀取開關(guān)狀態(tài)時(shí),必須使P2.7引腳(即地址線A15)為低電平。
3)由圖5-13所示MOVX指令寫總線周期可知,在執(zhí)行MOVX寫指令時(shí),單片機(jī)WR引腳上的電平會(huì)從高電平變成低電平(即下降沿),再從低電平變回為高電平(即上升沿)。與讀操作類似,若此時(shí)P2.7引腳為低電平,則WR上的電平變化可以通過或門,并傳輸至74LS273的CLK引腳,而WR的上升沿信號(hào)可以觸發(fā)74LS273進(jìn)行鎖存操作。特別需要注意的是,當(dāng)WR出現(xiàn)上升沿時(shí),P0恰好為數(shù)據(jù)總線,并且P0上出現(xiàn)的是累加器A中的數(shù)據(jù),即MOVX指令要輸出的數(shù)據(jù)。因此,可以通過MOVX指令控制LED燈的亮滅。
4)由之前幾條分析可知,控制74LS244(輸入接口)和74LS273(輸出接口)分別完成讀取開關(guān)狀態(tài)和控制燈亮滅的前提是,執(zhí)行指令MOVX時(shí)必須使74LS244和74LS273的地址的最高位A15(P2.7)為低電平0。另外,74LS244和74LS273地址的其他位A14~A0對讀寫無影響,可以為任意值。但是正如之前在外部存儲(chǔ)器擴(kuò)展中所講的,對讀寫無影響的地址線通常被設(shè)置為高電平1。因此,在本例中,74LS244和74LS273的地址均被設(shè)置為7FFFH。特別需要注意的是,雖然74LS244和74LS273有相同的地址,但是讀、寫時(shí)序的差別使得它們的讀寫操作不會(huì)發(fā)生沖突。
解:匯編語言程序如下:
下面這段程序可實(shí)現(xiàn)與上面程序完全相同的功能,只是MOVX指令的操作數(shù)有差別:
另外,通過正確設(shè)置高位地址線還可以擴(kuò)展更多的輸入和輸出接口。例如:針對圖5-17所示電路,只要正確確定P2.7和P2.6的狀態(tài),就可以分別選擇訪問74LS244(1)、
74LS273(1)、74LS244(2)和74LS273(2),即:P2.7和P2.6是I/O端口的選擇線(或稱地址選擇線),訪問74LS244(1)和74LS273(1)時(shí),P2.7應(yīng)為低電平0,P2.6應(yīng)為高電平1;而訪問74LS244(2)和74LS273(2)時(shí),P2.7應(yīng)為高電平1,P2.6應(yīng)為低電平0。