單片機(jī)內(nèi)部存儲器和I/o口資源有限,多數(shù)情況下需要外部擴(kuò)展。
一、擴(kuò)展方法和內(nèi)容
二、總線介紹
單片機(jī)并行擴(kuò)展的典型結(jié)構(gòu)是總線結(jié)構(gòu)。
各擴(kuò)展部件通過總線與單片機(jī)連接起來,相當(dāng)于系統(tǒng)中各部件掛在總線上,分時(shí)利用總線與CPU通訊。
當(dāng)選中某部件時(shí),可對該部件進(jìn)行讀寫及控制,而其它部件與總線間處于“高阻態(tài)”,相當(dāng)于與總線斷開。
單片機(jī)系統(tǒng)的三總線構(gòu)造方法如下:
以P0口線作數(shù)據(jù)總線/低位地址總線4以P2口線作高位地址總線;
采用功能引腳形成控制總線。
以P0口線作數(shù)據(jù)總線/低位地址總線:先由P0口線作地址總線,把低8位地址送鎖存器,由鎖存器提供給系統(tǒng);然后再將P0口線作數(shù)據(jù)總線讀寫數(shù)據(jù),從而實(shí)現(xiàn)地址總線的低8位地址信號和數(shù)據(jù)總線共用P0口線而不產(chǎn)生沖突。
以P2口線作高位地址總線:P2口線最多可提供8位高位地址,加上P0口線提供的低8位地址,最多可提供16位地址,可使單片機(jī)系統(tǒng)的尋址范圍最大達(dá)到64KB。
采用功能引腳形成控制總線:由 RD(P3.6引腳)和 WR(P3.7引腳)作為讀寫選通信號線;由ALE作為地址鎖存信號線,以配合P0口實(shí)現(xiàn)分時(shí)復(fù)用;PSEN以作為片外程序存儲器讀選通信號線;以EA作為片內(nèi)和片外程序存儲器的選擇信號。
存儲器的基本操作控制,包括片選控制和讀寫操作控制。
線選法:地位地址線(A0~A10)實(shí)現(xiàn)片內(nèi)尋址,高位地址線線(A11~A13)實(shí)現(xiàn)片選。線選法連線簡單,但地址空間不連續(xù),適用于擴(kuò)展容量較小且芯片數(shù)目較少的情況。
譯碼法:通過譯碼器將高位地址線轉(zhuǎn)換為片選信號。譯碼法能有效利用存儲空間,且地址連續(xù),適用于多芯片下的擴(kuò)展。常用譯碼器芯片有74138等。
三、儲存擴(kuò)展
地址線:地址是由P0和P2口提供的。ROM的地址線(A0~A15)中,低8位A0~A7通過鎖存器74LS373與P0口連接,高8位A8~A11直接與P2口的P2.0~P2.7連接。
數(shù)據(jù)線:片外ROM的8位數(shù)據(jù)線直接與單片機(jī)的P0口相連。
控制線:CPU執(zhí)行ROM中存放的程序指令時(shí),取指階段就是對ROM進(jìn)行讀操作。讀操作控制線有以下幾條:
地址鎖存信號ALE、片選信號CS、讀選通信號OE、片外程序存儲器的選用控制信號EA
地址鎖存信號ALE:單片機(jī)的ALE管腳與鎖存器的鎖存使能端G相連,用于單片機(jī)從片外ROM在讀指令時(shí)給出低8位地址的鎖存信號。
片選信號CS:低電平有效。如果系統(tǒng)中只擴(kuò)展了一片程序存儲器芯片,可將該片選端直接接地,使該芯片一直有效。若同時(shí)擴(kuò)展多片,需通過線選法或譯碼法來完成片選工作。
讀選通信號OE:低電平有效。該引腳接8051的片外ROM讀選通信號端PSEN。在訪問片外程序存儲器時(shí),只要該端出現(xiàn)負(fù)脈沖,即可從ROM中讀出指令或數(shù)據(jù)。
片外程序存儲器的選用控制信號EA:當(dāng)EA引腳接高電平時(shí),CPU只訪問單片機(jī)內(nèi)部的程序存儲器并執(zhí)行內(nèi)部程序存儲器中的指令,但當(dāng)程序存儲量超過內(nèi)部程序存儲器的最大容量時(shí),將自動(dòng)轉(zhuǎn)去執(zhí)行單片機(jī)外部程序存儲器內(nèi)的程序。當(dāng)輸入信號引腳接低電平(接地)時(shí),CPU只訪問外部程序存儲器并執(zhí)行外部程序存儲器中的指令。
在執(zhí)行片外ROM讀指令時(shí),單片機(jī)自動(dòng)進(jìn)行的操作時(shí)序:
(1)首先由PO口和P2口給出16位地址,然后ALE出現(xiàn)下降沿通知鎖存器將P0口的低8位地址鎖存;
(2)PSEN出現(xiàn)低電平,使片外ROM有效;
(3)根據(jù)鎖存器和P2口提供的地址取出指令并送P0口,由P0口讀入單片機(jī)執(zhí)行。
在上述過程中,數(shù)據(jù)存儲器RAM讀寫信號端WR和RD一直處于高電平狀態(tài),使RAM與總線隔離。
四、控制程序
根據(jù)下圖電路編寫程序用數(shù)碼管顯示0-9共10個(gè)數(shù)字循環(huán)顯示。
?
#includeunsigned char led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//字型碼? int main(void) { unsigned char i; while(1) { for(i=0;i<10;i++)//循環(huán)顯示10個(gè)數(shù)字 { P1=led[i]; delay();//延時(shí)一段時(shí)間 } } } void delay()//延時(shí)函數(shù) { int i,j; for(i=0;i<3000;i++) for(j=0;j<5;j++); }
?
五、數(shù)據(jù)儲存擴(kuò)展
數(shù)據(jù)存儲器RAM的擴(kuò)展主要用到以下3個(gè)控制信號:
ALE:低8位地址鎖存控制信號,通常接地址鎖存器的LE引腳;
WR:外部RAM寫信號,低電平有效,接數(shù)據(jù)存儲器的WE引腳;
RD:外部RAM讀信號,低電平有效,接數(shù)據(jù)存儲器的OE引腳。
在執(zhí)行片外RAM讀寫指令時(shí),單片機(jī)自動(dòng)進(jìn)行的操作時(shí)序與讀ROM相似:
(1)首先由PO口和P2口給出16位地址,然后ALE出現(xiàn)下降沿將P0口的低8位地址鎖存;
(2)在讀數(shù)據(jù)時(shí),RD出現(xiàn)低電平,WR出現(xiàn)高電平,使讀片外RAM有效,并根據(jù)鎖存器和P2口提供的地址取出數(shù)據(jù)并送P0口,由P0口讀入單片機(jī)。
(3)在寫數(shù)據(jù)時(shí)首先將數(shù)據(jù)加載到P0口,然后RD引腳出現(xiàn)高電平,WR引腳出現(xiàn)低電平,使寫片外RAM有效,并根據(jù)鎖存器和P2口提供的地址將P0口上的數(shù)據(jù)寫入片外RAM。
六、程序舉例
根據(jù)圖8-4編寫程序?qū)?a target="_blank">數(shù)碼管顯示0-9共10個(gè)數(shù)字的字型碼存儲到6264中,然后從6264中循環(huán)讀出字型碼并送數(shù)碼管顯示。
#include#include unsigned char led[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//字型碼 int main(void) { unsigned char i; for(i=0;i<10;i++)//存儲10個(gè)數(shù)字字型碼 XBYTE[0x8000+i]=led[i]; while(1) { for(i=0;i<10;i++)//循環(huán)顯示10個(gè)數(shù)字 { P1=XBYTE[0x8000+i]; delay();//延時(shí)一段時(shí)間 } } } void delay()//延時(shí)函數(shù) { int i,j; for(i=0;i<30000;i++) for(j=0;j<5;j++); }
?
對輸入/輸出口功能的擴(kuò)展,可以利用簡單的TTL電路或MOS電路,也可以使用結(jié)構(gòu)較為復(fù)雜的可編程接口芯片。
MCS-51單片機(jī)將I/O口與片外RAM統(tǒng)一編址,兩者合在一起使用同一個(gè)64KB的外擴(kuò)展地址空間,因而,I/O口的輸入、輸出指令也就是片外數(shù)據(jù)存儲器的讀/寫指令。
簡單輸入擴(kuò)展主要采用三態(tài)數(shù)據(jù)緩沖器實(shí)現(xiàn),目的是使被選通的輸入設(shè)備能獨(dú)占數(shù)據(jù)總線向單片機(jī)輸入數(shù)據(jù),而未被選通的設(shè)備與數(shù)據(jù)總線隔離。常用的三態(tài)數(shù)據(jù)緩沖器芯片有74LS244等。
簡單輸出擴(kuò)展主要采用三態(tài)數(shù)據(jù)鎖存器實(shí)現(xiàn),目的是使單片機(jī)能通過數(shù)據(jù)總線向被選通的設(shè)備輸出數(shù)據(jù),而未被選通的設(shè)備與數(shù)據(jù)總線隔離。常用的三態(tài)數(shù)據(jù)鎖存器芯片有74LS273等。
8051單片機(jī)使用74LS373和74LS245展I/O口,分別連接發(fā)光二極管和撥碼開關(guān),要求編寫控制程序,通過開關(guān)的撥動(dòng)控制發(fā)光二極管的亮滅。
#include? ? ? 審核編輯:湯梓紅#include #define PORT XBYTE[0xFFFF] //地址寫什么都可以 int main(void) { unsigned char temp; while(1) { temp=PORT; //讀存儲單元操作,即通過74LS245獲取開關(guān)數(shù)據(jù) PORT=temp; //寫存儲單元操作,即通過74LS373用開關(guān)數(shù)據(jù)控制發(fā)光二極管 } }
評論
查看更多