片外程序存儲(chǔ)器的連接與訪問是如何實(shí)現(xiàn)的
隨著生產(chǎn)工藝的提高,大部分單片機(jī)片內(nèi)都集成了大容量的程序存儲(chǔ)器和數(shù)據(jù)存儲(chǔ)器。因此,存儲(chǔ)器擴(kuò)展的需求正在降低。但是,學(xué)習(xí)存儲(chǔ)器的擴(kuò)展方法,將對(duì)更好地掌握單片機(jī)的時(shí)序和單片機(jī)系統(tǒng)設(shè)計(jì)技巧有很大的幫助。接下來,本節(jié)將首先介紹程序存儲(chǔ)器的擴(kuò)展方法。
程序存儲(chǔ)器用于存放程序和一些程序執(zhí)行過程中的常數(shù)。當(dāng)單片機(jī)沒有片內(nèi)程序存儲(chǔ)器(如8031單片機(jī))或片內(nèi)程序存儲(chǔ)器容量不夠時(shí),則需要利用單片機(jī)的片外總線進(jìn)行片外程序存儲(chǔ)器的擴(kuò)展。
一個(gè)微處理器能夠聰明地執(zhí)行某種任務(wù),除了它們強(qiáng)大的硬件外,還需要它們運(yùn)行的軟件,其實(shí)微處理器并不聰明,它們只是完全按照人們預(yù)先編寫的程序而執(zhí)行之。那么設(shè)計(jì)人員編寫的程序就存放在微處理器的程序存儲(chǔ)器中,俗稱只讀程序存儲(chǔ)器(ROM)。程序相當(dāng)于給微處理器處理問題的一系列命令。其實(shí)程序和數(shù)據(jù)一樣,都是由機(jī)器碼組成的代碼串。只是程序代碼則存放于程序存儲(chǔ)器中。
MCS-51具有64kB程序存儲(chǔ)器尋址空間,它是用于存放用戶程序、數(shù)據(jù)和表格等信息。對(duì)于內(nèi)部無ROM的8031單片機(jī),它的程序存儲(chǔ)器必須外接,空間地址為64kB,此時(shí)單片機(jī)的端必須接地。強(qiáng)制CPU從外部程序存儲(chǔ)器讀取程序。對(duì)于內(nèi)部有ROM的8051等單片機(jī),正常運(yùn)行時(shí),則需接高電平,使CPU先從內(nèi)部的程序存儲(chǔ)中讀取程序,當(dāng)PC值超過內(nèi)部ROM的容量時(shí),才會(huì)轉(zhuǎn)向外部的程序存儲(chǔ)器讀取程序。
在圖5-2a所示的單片機(jī)系統(tǒng)中,擴(kuò)展了一片程序存儲(chǔ)器芯片2764EPROM(引腳如圖5-3所示,引腳功能見表5-1)。該圖主要用于說明單片機(jī)與存儲(chǔ)器間的連接方法,因此圖中沒有給出單片機(jī)的復(fù)位電路和時(shí)鐘電路等輔助電路,在本書的其他電路圖中也會(huì)進(jìn)行類似的簡化處理。
由圖5-2a可知:
1)8051單片機(jī)P2.4~P2.0引腳是地址總線的高5位,未經(jīng)過鎖存器直接到2764的地址引腳A12~A8上。
2)單片機(jī)P2.5~P2.7引腳未被使用,引腳上的電平狀態(tài)與2764的訪問無關(guān)。
3)單片機(jī)P0.7~P0.0引腳未經(jīng)過鎖存器74LS373,是數(shù)據(jù)總線,直接與2764的數(shù)據(jù)引腳D7~D0相連。
4)單片機(jī)P0.7~P0.0引腳經(jīng)過鎖存器74LS373后的Q7~Q0是低8位的地址總線,與2764的地址總線A7~A0相連。
5)單片機(jī)EA引腳接地,該單片機(jī)僅使用片外擴(kuò)展的程序存儲(chǔ)器。
6)ALE連接至74LS373的鎖存器觸發(fā)引腳G,當(dāng)ALE出現(xiàn)下降沿信號(hào)的時(shí)候?qū)⒂|發(fā)74LS373鎖存P0口上的地址信息。
圖5-2單片程序存儲(chǔ)器芯片2764的擴(kuò)展電路圖
a)實(shí)際連線圖b)總線式簡化連線圖
圖5-3常用程序存儲(chǔ)器芯片引腳圖
7)8051的PSEN與2764的選通信號(hào)引腳OE相連,當(dāng)PSEN出現(xiàn)低電平時(shí),允許2764輸出。
圖5-2b給出的是圖5-2a的幾種常用簡化繪制方法。簡化繪制方法以總線方式顯示單片機(jī)與片外擴(kuò)展存儲(chǔ)器(或I/O接口)的連接關(guān)系,常用于復(fù)雜電路的繪制。
通常,存儲(chǔ)器芯片的地址線根數(shù)M確定了存儲(chǔ)器芯片的存儲(chǔ)單元個(gè)數(shù)為2M,因?yàn)橐粋€(gè)地址對(duì)應(yīng)于一個(gè)存儲(chǔ)單元;而數(shù)據(jù)線的個(gè)數(shù)N決定了每個(gè)存儲(chǔ)單元能存放N位二進(jìn)制數(shù)。顯然,存儲(chǔ)器芯片的容量,即所能存放的二進(jìn)制數(shù)的位數(shù)為2M×N。根據(jù)這一思路,可以確定2764的存儲(chǔ)容量。2764 EPROM有13根地址線和8根數(shù)據(jù)線,可知:2764有213=8K=8192個(gè)存儲(chǔ)單元,每個(gè)存儲(chǔ)單元能存放8位二進(jìn)制數(shù),即2764的存儲(chǔ)容量為213×8位,即8K×8bit=64Kbit=8KB。
單片機(jī)訪問片外存儲(chǔ)器芯片時(shí),由單片機(jī)的地址總線A15~A0送出存儲(chǔ)單元的地址,通過地址選中存儲(chǔ)器芯片上被訪問的存儲(chǔ)單元。在圖5-2中,單片機(jī)地址總線中的低13位A12~A0與2764的片內(nèi)地址線A12~A0對(duì)應(yīng)相連,而單片機(jī)地址總線中的高3位A15~A13并未用到,由此可得2764的地址范圍(見表5-2)。這里需要特別注意的是,訪問2764時(shí)僅片內(nèi)地址線(A12~A0)起作用,未用到的地址總線高3位A15~A13與2764的訪問無關(guān),因此A15~A13的取值可以是000~111中的任意一個(gè)。這使得圖5-2中2764芯片的每個(gè)存儲(chǔ)單元都有23=8個(gè)不同的地址。
若要從圖5-2中2764芯片的地址為2000H的存儲(chǔ)單元讀取數(shù)據(jù),并送入單片機(jī)的累加器A,可以采用如下的程序段:
由表5-2可知,在上面的程序段中,地址2000H還可以替換為0000H、4000H、6000H、8000H、0A000H、0C000H和0E000H。