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