《單片機(jī)系統(tǒng)設(shè)計(jì)及工程應(yīng)用》課件第6章_第1頁
《單片機(jī)系統(tǒng)設(shè)計(jì)及工程應(yīng)用》課件第6章_第2頁
《單片機(jī)系統(tǒng)設(shè)計(jì)及工程應(yīng)用》課件第6章_第3頁
《單片機(jī)系統(tǒng)設(shè)計(jì)及工程應(yīng)用》課件第6章_第4頁
《單片機(jī)系統(tǒng)設(shè)計(jì)及工程應(yīng)用》課件第6章_第5頁
已閱讀5頁,還剩246頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

6.1單片機(jī)系統(tǒng)總線的形成6.2外部數(shù)據(jù)存儲(chǔ)器的擴(kuò)展6.3外部程序存儲(chǔ)器的擴(kuò)展6.4并行I/O端口擴(kuò)展技術(shù)6.5單片機(jī)系統(tǒng)擴(kuò)展舉例習(xí)題6目前,51系列單片機(jī)的種類很多,單片機(jī)的性能和實(shí)用性得到了很大的提升。在有些應(yīng)用場(chǎng)合,一個(gè)單片機(jī)本身就是一個(gè)最小應(yīng)用系統(tǒng),許多實(shí)際的應(yīng)用系統(tǒng)就是由這種

低成本和小體積的單片機(jī)構(gòu)成的。

圖6.1是單片機(jī)最小系統(tǒng)的一般結(jié)構(gòu),單片機(jī)的四個(gè)并行口都可以與外部電路直接相連。圖6.2是單片機(jī)最小系統(tǒng)的一個(gè)簡(jiǎn)單例子,P1口的P1.0~P1.3作輸入,讀取開關(guān)S0~S3上的數(shù)據(jù),用P1.4~P1.7作輸出,控制發(fā)光二極管L0~L3。6.1單片機(jī)系統(tǒng)總線的形成在圖6.1和圖6.2中,由于AT89C51內(nèi)部含程序存儲(chǔ)器,故引腳(31腳)應(yīng)接+5V,加電后,在自動(dòng)復(fù)位電路的作用下,CPU從內(nèi)部程序存儲(chǔ)器的0000H處開始執(zhí)行程序,系統(tǒng)便可根據(jù)用戶程序的功能正常運(yùn)行。在實(shí)際應(yīng)用中,有時(shí)還需要設(shè)計(jì)手動(dòng)復(fù)位電路,關(guān)于復(fù)位電路和時(shí)鐘電路的細(xì)節(jié)請(qǐng)參閱第2章的有關(guān)內(nèi)容,在此不再贅述。

單片機(jī)本身的資源是有限的,如51系列單片機(jī)的片內(nèi)RAM容量一般為128~256B,片內(nèi)程序存儲(chǔ)器為4~8KB。對(duì)復(fù)雜系統(tǒng)而言,若單片機(jī)本身的資源滿足不了實(shí)際要求時(shí),就需要進(jìn)行系統(tǒng)擴(kuò)展。圖6.1AT89C51單片機(jī)最小系統(tǒng)圖6.2最小系統(tǒng)應(yīng)用實(shí)例系統(tǒng)擴(kuò)展的主要內(nèi)容有如下幾個(gè)方面:

(1)外部數(shù)據(jù)存儲(chǔ)器擴(kuò)展;

(2)外部程序存儲(chǔ)器擴(kuò)展;

(3)輸入/輸出接口擴(kuò)展;

(4)A/D和D/A擴(kuò)展;

(5)管理功能器件的擴(kuò)展(如擴(kuò)展定時(shí)器/計(jì)數(shù)器、鍵盤/顯示器等)。

為了使單片機(jī)能方便地與各種芯片連接,常用單片機(jī)的外部連線構(gòu)成3總線結(jié)構(gòu)形式——地址總線、數(shù)據(jù)總線和控制總線。對(duì)于51系列單片機(jī),3總線形成如圖6.3所示。圖6.3系統(tǒng)總線形成電路地址總線形成電路:對(duì)單片機(jī)進(jìn)行系統(tǒng)擴(kuò)展時(shí),P2口作為高8位地址總線。單片機(jī)訪問外部程序存儲(chǔ)器,或訪問外部數(shù)據(jù)存儲(chǔ)器和擴(kuò)展I/O端口(即執(zhí)行MOVXA,@DPTR

和MOVX@DPTR,A指令)時(shí),由P2口輸出高8位地址信號(hào)A15~A8,P2口具有輸出鎖存功能,在CPU訪問外部部件期間,P2口能保持地址信息不變。P0口為地址/數(shù)據(jù)分時(shí)

復(fù)用口,分時(shí)用作低8位地址總線和8位雙向數(shù)據(jù)總線。因此,構(gòu)成系統(tǒng)總線時(shí),應(yīng)加1個(gè)74LS373鎖存器,用于鎖存低8位地址信號(hào)A7~A0。

74LS373是一個(gè)8位鎖存器,三態(tài)輸出,其真值表見表6.1。在圖6.3所示的電路中,74LS373的8個(gè)輸入端8D~1D分別與P0.7~P0.0相連。G為373的使能端,用地址鎖存信號(hào)ALE控制,當(dāng)ALE為“1”時(shí),使能端G有效,P0口提供的低8位地址信號(hào)被373鎖存,其輸出8Q~1Q即為地址信號(hào)A7~A0;當(dāng)ALE為“0”時(shí),CPU用P0口傳送指令代碼或數(shù)據(jù),此時(shí),使能端G無效,地址信號(hào)A7~A0保持不變,從而保證了CPU訪問外部部件(外部程序存儲(chǔ)器或外部RAM,也可能是擴(kuò)展的I/O端口)期間地址信號(hào)不會(huì)發(fā)生變化。表6.174LS373真值表數(shù)據(jù)總線:P0口作為數(shù)據(jù)總線D7~D0。數(shù)據(jù)總線是雙向三態(tài)總線。

控制總線:系統(tǒng)擴(kuò)展時(shí)常用的控制信號(hào)有:

ALE——地址鎖存信號(hào)。當(dāng)CPU訪問外部部件時(shí),利用ALE信號(hào)的正脈沖鎖存出現(xiàn)在P0口的低8位地址,因此把ALE稱為地址鎖存信號(hào)。

——片外程序存儲(chǔ)器訪問允許信號(hào),低電平有效。當(dāng)CPU從外部程序存儲(chǔ)器讀取指令或讀取常數(shù)(即執(zhí)行MOVC指令)時(shí),該信號(hào)有效,CPU通過數(shù)據(jù)總線讀回指令或常數(shù)。擴(kuò)展外部程序存儲(chǔ)器時(shí),用該信號(hào)作為程序存儲(chǔ)器的讀出允許信號(hào)。當(dāng)CPU訪問外部數(shù)據(jù)存儲(chǔ)器期間,該信號(hào)無效。

——片外數(shù)據(jù)存儲(chǔ)器讀信號(hào),低電平有效。

——片外數(shù)據(jù)存儲(chǔ)器寫信號(hào),低電平有效。

當(dāng)CPU訪問外部數(shù)據(jù)存儲(chǔ)器或訪問外部擴(kuò)展的I/O端口時(shí)(執(zhí)行MOVX指令時(shí)),會(huì)產(chǎn)生相應(yīng)的讀/寫信號(hào)。擴(kuò)展外部數(shù)據(jù)存儲(chǔ)器和I/O端口時(shí),和用于外部數(shù)據(jù)存儲(chǔ)器芯片和I/O接口芯片的讀/寫控制。

51系列單片機(jī)內(nèi)部RAM的容量是有限的,一般只有128B或256B。當(dāng)單片機(jī)用于實(shí)時(shí)數(shù)據(jù)采集或處理大批量數(shù)據(jù)時(shí),僅靠片內(nèi)提供的RAM是遠(yuǎn)遠(yuǎn)不夠的。此時(shí),我們可以利用單片機(jī)的擴(kuò)展功能,擴(kuò)展外部數(shù)據(jù)存儲(chǔ)器。由圖6.3可知,單片機(jī)的地址總線為16條A15~A0,可以尋址外部數(shù)據(jù)存儲(chǔ)器的最大空間為64KB,用戶可根據(jù)系統(tǒng)的需要確定擴(kuò)展存儲(chǔ)器容量的大小。6.2外部數(shù)據(jù)存儲(chǔ)器的擴(kuò)展數(shù)據(jù)存儲(chǔ)器即隨機(jī)存取存儲(chǔ)器(RAM,RandomAccessMemory),用于存放可隨時(shí)修改的數(shù)據(jù)信息。常用的外部數(shù)據(jù)存儲(chǔ)器有靜態(tài)RAM(SRAM,StaticRandomAccess

Memory)和動(dòng)態(tài)RAM(DRAM,DynamicRandomAccessMemory)兩種。前者讀/寫速度高,一般都是8位寬度,使用方便,易于擴(kuò)展;缺點(diǎn)是集成度低,成本高,功耗大。

后者集成度高,成本低,功耗相對(duì)較低;缺點(diǎn)是需要增加動(dòng)態(tài)刷新電路,硬件電路復(fù)雜。因此,對(duì)單片機(jī)擴(kuò)展數(shù)據(jù)存儲(chǔ)器時(shí)一般都采用靜態(tài)RAM。

常用的靜態(tài)RAM芯片有6264(8k×8)、62256(32k×8)等芯片,其管腳配置均為28腳雙列直插式封裝,有利于印刷板電路設(shè)計(jì),使用方便。圖6.4給出了6264的引腳圖和真值表。圖6.46264的引腳圖和真值表存儲(chǔ)器擴(kuò)展的核心問題是存儲(chǔ)器的編址問題,就是給存儲(chǔ)單元分配地址。由于存儲(chǔ)器通常由多塊芯片組成,因此存儲(chǔ)器的編址分為兩個(gè)層次:存儲(chǔ)器芯片內(nèi)部存儲(chǔ)單元編址和存儲(chǔ)器芯片編址。前者,靠存儲(chǔ)器芯片內(nèi)部的譯碼器選擇芯片內(nèi)部的存儲(chǔ)單元。后者,必須利用譯碼電路實(shí)現(xiàn)對(duì)芯片的選擇。譯碼電路是將輸入的一組二進(jìn)制編碼變換為一個(gè)特定的輸出信號(hào),即將輸入的一組高位地址信號(hào)通過變換,產(chǎn)生一個(gè)有效的輸出信號(hào),用于選中某一個(gè)存儲(chǔ)器芯片,從而確定該存儲(chǔ)器芯片所占用的地址范圍。常用的有3種譯碼方法:全譯碼、部分譯碼和線選法。6.2.1全譯碼

全譯碼是用全部的高位地址信號(hào)作為譯碼電路的輸入信號(hào)進(jìn)行譯碼。其特點(diǎn)是:

地址與存儲(chǔ)單元一一對(duì)應(yīng),也就是說1個(gè)存儲(chǔ)單元只占用1個(gè)惟一的地址,地址空間的利用率高。對(duì)于要求存儲(chǔ)器容量大的系統(tǒng),一般使用這種譯碼方法。

例6.2.1

利用全譯碼為AT89C51擴(kuò)展16KB的外部數(shù)據(jù)存儲(chǔ)器,存儲(chǔ)器芯片選用SRAM6264,要求外部數(shù)據(jù)存儲(chǔ)器占用從0000H開始的連續(xù)地址空間。

解首先確定要使用的6264芯片的數(shù)目:

芯片數(shù)目=系統(tǒng)擴(kuò)展的存儲(chǔ)容量÷6264芯片的容量

=16KB÷8KB=2片

然后進(jìn)行地址分配,畫出地址譯碼關(guān)系圖。所謂地址譯碼關(guān)系圖,是一種用簡(jiǎn)單的符號(hào)來表示系統(tǒng)地址與芯片所占用的地址之間相互關(guān)系的示意圖,如下所示。最后,根據(jù)地址譯碼關(guān)系畫出原理電路圖,如圖6.5所示。圖中,系統(tǒng)的數(shù)據(jù)線與芯片的數(shù)據(jù)線一一對(duì)應(yīng)相連;片內(nèi)地址線與芯片的地址線一一對(duì)應(yīng)相連,高位地址信號(hào)作為譯碼電路的輸入信號(hào)進(jìn)行譯碼。當(dāng)CPU執(zhí)行MOVX指令時(shí),若指令給出的地址在0000H~1FFFH范圍內(nèi),則1號(hào)或門輸出為低電平,1#SRAM6264的片選信號(hào)有效,CPU訪問1#存儲(chǔ)器芯片;若指令給出的地址在2000H~3FFFH范圍內(nèi),則2號(hào)或門輸出為低電平,2#SRAM6264的片選信號(hào)有效,CPU訪問2#存儲(chǔ)器芯片。和用于外部數(shù)據(jù)存儲(chǔ)器芯片的讀/寫控制。圖6.5擴(kuò)展16KB的外部數(shù)據(jù)存儲(chǔ)器如把外部RAM的1000H單元的數(shù)據(jù)傳送到外部RAM的2000H單元的程序段為:

MOVDPTR,#1000H ;設(shè)置源數(shù)據(jù)指針

MOVXA,@DPTR ;產(chǎn)生信號(hào),讀1#存

;儲(chǔ)器芯片

MOVDPTR,#2000H

MOVX@DPTR,A ;產(chǎn)生信號(hào),寫2#存

;儲(chǔ)器芯片

該例中采用的是全譯碼,故1#和2#存儲(chǔ)器芯片的每一個(gè)存儲(chǔ)單元各占用1個(gè)惟一的地址,每個(gè)芯片為8KB存儲(chǔ)容量,擴(kuò)展的外部數(shù)據(jù)存儲(chǔ)器總?cè)萘繛?6KB,地址范圍

為0000H~3FFFH。

例6.2.2

利用全譯碼為AT89C51擴(kuò)展40KB的外部數(shù)據(jù)存儲(chǔ)器,存儲(chǔ)器芯片選用SRAM6264。要求外部數(shù)據(jù)存儲(chǔ)器占用從6000H開始的連續(xù)地址空間。

解首先確定要使用的6264芯片的數(shù)目:

芯片數(shù)目=系統(tǒng)擴(kuò)展的存儲(chǔ)容量÷6264芯片容量

=40KB÷8KB=5片對(duì)于要求存儲(chǔ)器容量大的系統(tǒng),一般使用全譯碼方法進(jìn)行譯碼。這時(shí)擴(kuò)展的芯片數(shù)目較多,譯碼電路使用專用譯碼器。3-8譯碼器74LS138是一種常用的地址譯碼器,其引腳圖和真值表如圖6.6所示。其中,、和G1為控制端,只有當(dāng)G1為“1”,且和均為“0”時(shí),譯碼器才能進(jìn)行譯碼輸出,否則譯碼器的8個(gè)輸出端全為高阻狀態(tài)。使用74LS138時(shí),、和G1可直接接固定電平,也可參與地址譯碼,但其譯碼關(guān)系必須為001。在本例中,通過進(jìn)行地址分配可以很方便地畫出存儲(chǔ)器系統(tǒng)的連接圖,如圖6.7所示。圖6.674LS138引腳圖和真值表圖6.7擴(kuò)展40KB的數(shù)據(jù)存儲(chǔ)器在圖6.7中,各芯片的地址范圍分別為:

1#芯片:6000H~7FFFH (A15A14A13=011)

2#芯片:8000H~9FFFH (A15A14A13=100)

3#芯片:A000H~BFFFH(A15A14A13=101)

4#芯片:C000H~DFFFH(A15A14A13=110)

5#芯片:E000H~FFFFH(A15A14A13=111)6.2.2部分譯碼

部分譯碼是用部分高位地址信號(hào)(而不是全部)作為譯碼電路的輸入信號(hào)進(jìn)行譯碼。

其特點(diǎn)是:地址與存儲(chǔ)單元不是一一對(duì)應(yīng)的,而是1個(gè)存儲(chǔ)單元占用多個(gè)地址。即在部分譯碼電路中,有若干根地址線不參與譯碼,會(huì)出現(xiàn)地址重疊現(xiàn)象。我們把不參與譯碼的地址線稱為無關(guān)項(xiàng),若1根地址線不參與譯碼,則一個(gè)單元占用2(21)個(gè)地址;若2根地址線不參與譯碼,則一個(gè)單元占用4(22)個(gè)地址;若n根地址線不參與譯碼,則一個(gè)單元占用2n個(gè)地址,n為無關(guān)項(xiàng)的個(gè)數(shù)。部分譯碼會(huì)造成地址空間的浪費(fèi),但譯碼器電路簡(jiǎn)單,對(duì)地址譯碼電路的設(shè)計(jì)帶來了很大的方便。一般在較小的系統(tǒng)中常采用部分譯碼方法進(jìn)行譯碼。

例6.2.3

分析圖6.8中的譯碼方法,寫出存儲(chǔ)器芯片SRAM6264占用的地址范圍。

解畫出地址譯碼關(guān)系如下:圖6.8數(shù)據(jù)存儲(chǔ)器擴(kuò)展通過地址譯碼關(guān)系圖可知圖6.8采用的是部分譯碼,地址線A13不參與譯碼,為無關(guān)項(xiàng)。當(dāng)A13=0時(shí),6264占用的地址空間為4000H~5FFFH,當(dāng)A13=1時(shí),6264占用的地址空間為6000H~7FFFH,出現(xiàn)地址重疊現(xiàn)象。由于存在無關(guān)項(xiàng),使得4000H和6000H這兩個(gè)地址指向同一個(gè)單元,4001H和6001H這兩個(gè)地址指向同一個(gè)單元,依此類推,5FFFH和7FFFH這兩個(gè)地址指向同一個(gè)單元。即存儲(chǔ)器芯片的每個(gè)單元都占用兩個(gè)地址,其地址空間示意圖如圖6.9所示,一個(gè)8KB的存儲(chǔ)器芯片占用了16KB的地址空間,其實(shí)際存儲(chǔ)容量只有8KB。我們把無關(guān)項(xiàng)為0時(shí)的地址稱為基本地址,無關(guān)項(xiàng)為1時(shí)的地址稱為重疊地址。編程時(shí)一般使用基本地址(4000H~5FFFH)訪問該芯片,而重疊地址空著不用。圖6.96264地址空間6.2.3線選法

所謂線選法,是利用系統(tǒng)的某一根地址線作為芯片的片選信號(hào)。線選法實(shí)際上是部分譯碼的一種極端應(yīng)用,其具有部分譯碼的所有特點(diǎn),譯碼電路最簡(jiǎn)單,甚至不使用譯

碼器。如直接以系統(tǒng)的某一條地址線作為存儲(chǔ)器芯片的片選信號(hào),只需把用到的地址線與存儲(chǔ)器芯片的片選端直接相連即可。當(dāng)一個(gè)應(yīng)用系統(tǒng)需要擴(kuò)展的芯片數(shù)目較少,需要的實(shí)際存儲(chǔ)空間較小時(shí),常使用線選法。

例6.2.4

分析圖6.10中的譯碼方法,寫出各存儲(chǔ)器芯片SRAM6264占用的地址范圍。

解圖6.10中,使用線選法選擇芯片,直接把地址線A15、A14和A13作為芯片的片選信號(hào),地址譯碼關(guān)系如下:圖6.10數(shù)據(jù)存儲(chǔ)器擴(kuò)展線選法的優(yōu)點(diǎn)是硬件簡(jiǎn)單,不需要譯碼器。缺點(diǎn)是各存儲(chǔ)器芯片的地址范圍不連續(xù),給程序設(shè)計(jì)帶來不便。但在單片機(jī)應(yīng)用系統(tǒng)中,一般要擴(kuò)展的芯片數(shù)目較少,廣泛使用線選法作為芯片的片選信號(hào),尤其在I/O端口擴(kuò)展中更是如此。

51系列單片機(jī)具有64KB的程序存儲(chǔ)器空間,其中87C51、AT89C51單片機(jī)含有4KB的片內(nèi)程序存儲(chǔ)器,而8031則無片內(nèi)程序存儲(chǔ)器。當(dāng)采用87C51、AT89C51單片機(jī)而程序超過4KB,或采用8031型單片機(jī)時(shí),就需要進(jìn)行程序存儲(chǔ)器的擴(kuò)展。這里要注意的是,51系列單片機(jī)有一個(gè)管腳跟程序存儲(chǔ)器的擴(kuò)展有關(guān)。如果接低電平,則不使用片內(nèi)程序存儲(chǔ)器,片外程序存儲(chǔ)器地址范圍為0000H~FFFFH(64KB)。如果接高電平,那么片內(nèi)存儲(chǔ)器和片外程序存儲(chǔ)器總?cè)萘繛?4KB。6.3外部程序存儲(chǔ)器的擴(kuò)展6.3.1EPROM擴(kuò)展

擴(kuò)展程序存儲(chǔ)器常用的器件是EPROM芯片,如2764(8K×8bit)、27128(16K×8bit)和27256(32K×8bit)等。它們均為28腳雙列直插式封裝,引腳如圖6.11所示。圖6.112764、27128和27256引腳圖我們以2764為例介紹其性能和擴(kuò)展方法,其他EPROM芯片的使用方法與其相似。

2764是8K×8bit的EPROM,單一+5V供電,工作電流為75mA,維持電流為35mA,讀出時(shí)間最大為250ns。其引腳有:

A12~A0:13條地址線。

D7~D0:8位數(shù)據(jù)線。

:片選信號(hào),低電平有效。

:輸出允許信號(hào),當(dāng)CE=0,且OE=0時(shí),被尋址單元的內(nèi)容才能被讀出。

VPP:編程電源,當(dāng)芯片編程時(shí),該端加編程電壓(+25V或+12V);正常使用時(shí),該端接+5V電源。(NC為不用的引腳。)在使用2764時(shí),只能將其所存儲(chǔ)的內(nèi)容讀出,讀出過程與SRAM的讀出十分相似。

即首先送出要讀出的單元地址,然后使和均有效(低電平),則在芯片的D0~D7數(shù)據(jù)線上就可以輸出要讀出的內(nèi)容,其讀出時(shí)序關(guān)系如圖6.12所示。圖6.122764讀出時(shí)序

例6.3.1

圖6.13所示的電路中,為AT89C51擴(kuò)展外部程序存儲(chǔ)器,用作為EPROM的讀出允許信號(hào)。分析該電路,寫出該系統(tǒng)的程序存儲(chǔ)器容量及地址范圍。

解圖6.13中,AT89C51內(nèi)部含4KB的程序存儲(chǔ)器,外部擴(kuò)展的程序存儲(chǔ)器為8KB,故該系統(tǒng)的程序存儲(chǔ)器總?cè)萘繛?2KB。外部擴(kuò)展的程序存儲(chǔ)器使用線選法選擇芯片,

當(dāng)?shù)刂肪€A13=1時(shí)選中外部擴(kuò)展的程序存儲(chǔ)器。系統(tǒng)的程序存儲(chǔ)器的地址空間示意圖如圖6.14所示。圖6.13程序存儲(chǔ)器擴(kuò)展圖6.14地址空間示意圖該系統(tǒng)中,既有片內(nèi)程序存儲(chǔ)器,又有片外程序存儲(chǔ)器。執(zhí)行程序時(shí),CPU是從片內(nèi)程序存儲(chǔ)器取指令,還是從片外程序存儲(chǔ)器取指令,是由單片機(jī)引腳電平的高低來決定的。在例6.3.1中,=1為高電平,加電后,CPU先執(zhí)行片內(nèi)程序存儲(chǔ)器的程序,當(dāng)PC的值超過0FFFH時(shí)將自動(dòng)轉(zhuǎn)向片外程序存儲(chǔ)器執(zhí)行指令。但應(yīng)當(dāng)注意,由于該系統(tǒng)中的程序存儲(chǔ)器的地址是不連續(xù)的,在編程時(shí)應(yīng)當(dāng)合理地進(jìn)行程序的轉(zhuǎn)移。

例6.3.2

利用全譯碼為AT89C51擴(kuò)展40KB的外部數(shù)據(jù)存儲(chǔ)器和40KB的外部程序存儲(chǔ)器,存儲(chǔ)器芯片選用SRAM6264和EPROM2764。要求6264和2764占用從6000H開始的連續(xù)地址空間。

解要擴(kuò)展40KB的外部數(shù)據(jù)存儲(chǔ)器和40KB的外部程序存儲(chǔ)器需要6264和2764各5片,使用專用譯碼器74LS138進(jìn)行譯碼,其存儲(chǔ)器系統(tǒng)的連接圖如圖6.15所示。其中,各芯片的地址范圍分別為:

芯片1、6:6000H~7FFFH

芯片2、7:8000H~9FFFH

芯片3、8:A000H~BFFFH

芯片4、9:C000H~DFFFH

芯片5、10:E000H~FFFFH圖6.15擴(kuò)展數(shù)據(jù)存儲(chǔ)器和程序存儲(chǔ)器6.3.2E2PROM擴(kuò)展舉例

E2PROM(EEPROM)是一種電擦除可編程只讀存儲(chǔ)器,其主要特點(diǎn)是能在計(jì)算機(jī)系統(tǒng)中進(jìn)行在線修改,它既有RAM可讀可改寫的特性,又具有非易失性存儲(chǔ)器ROM在掉電后仍能保持所存數(shù)據(jù)的優(yōu)點(diǎn)。因而,E2PROM在智能儀器儀表、控制裝置等領(lǐng)域得到了普遍應(yīng)用。

E2PROM在單片機(jī)存儲(chǔ)器擴(kuò)展中,可以用作程序存儲(chǔ)器,也可以用作數(shù)據(jù)存儲(chǔ)器,至于具體做什么使用,由硬件電路確定。E2PROM作為程序存儲(chǔ)器使用時(shí),CPU讀取E2PROM數(shù)據(jù)同讀取一般EPROM的操作相同;E2PROM作為數(shù)據(jù)存儲(chǔ)器使用時(shí),總線連接及讀取E2PROM數(shù)據(jù)同讀取RAM的操作相同,但E2PROM的寫入時(shí)間較長(zhǎng),必須用軟件或硬件來檢測(cè)寫入周期。常用的E2PROM芯片有Intel2816A、2817A和2864A等芯片,其引腳如圖6.16所示。圖6.16E2PROM引腳圖

1)E2PROM2816A

2816A的存儲(chǔ)容量為2K×8bit,單一+5V供電,不需要專門配置寫入電源。2816A能隨時(shí)寫入和讀出數(shù)據(jù),其讀取時(shí)間完全能滿足一般程序存儲(chǔ)器的要求,但寫入時(shí)間較長(zhǎng),需9~15ms,寫入時(shí)間完全由軟件延時(shí)控制。

2)E2PROM2817A

與2816A一樣,2817A也均屬于5V電擦除可編程只讀存儲(chǔ)器,其容量也是2K×8bit。不同之處在于:2816A的寫入時(shí)間為9~15ms,完全由軟件延時(shí)控制,與硬件電路無關(guān);2817A可利用硬件引腳RDY/BUSY來檢測(cè)寫操作是否完成。

3)E2PROM2864A

2864A是8K×8bitE2PROM,單一+5V供電,最大工作電流為160mA,最大維持電流為60mA,典型讀出時(shí)間為250ns。由于芯片內(nèi)部設(shè)有“頁緩沖器”,因此允許對(duì)其快

速寫入。2864A內(nèi)部可以提供編程所需的全部定時(shí)控制,編程結(jié)束可以給出查詢標(biāo)志。圖6.172817A的寫入時(shí)序在此,我們以2817A芯片為例介紹其性能和擴(kuò)展方法。2817A的封裝是DIP28,采用單一+5V供電,最大工作電流為150mA,維持電流為55mA,讀出時(shí)間最大為250ns。片內(nèi)設(shè)有編程所需的高壓脈沖產(chǎn)生電路,無需外加編程電源和編程脈沖即可工作。

2817A的讀操作與普通EPROM的讀出相同,其寫入時(shí)序如圖6.17所示。

2817A的寫入過程如下:CPU向2817A發(fā)出字節(jié)寫入命令后,即當(dāng)?shù)刂酚行?、?shù)據(jù)有效及控制信號(hào)=0、=1,且在端加上100ns的負(fù)脈沖,便啟動(dòng)一次寫操作。但應(yīng)注意的是,寫脈沖過后并沒有真正完成寫操作,還需要一段時(shí)間進(jìn)行芯片內(nèi)部的寫操作,在此期間,2817A的引腳RDY/為低電平,表示2817A正在進(jìn)行內(nèi)部的寫

操作,此時(shí)它的數(shù)據(jù)總線呈高阻狀態(tài),因而允許CPU在此期間執(zhí)行其他的任務(wù)。當(dāng)一次寫入操作完畢,2817A便將RDY/置高,由此來通知CPU。

例6.3.3

為AT89C51單片機(jī)擴(kuò)展2KB的E2PROM。

解單片機(jī)擴(kuò)展2817A的硬件電路圖如圖6.18所示。圖6.18擴(kuò)展E2PROM圖6.18中,P2.6反相后與2817A的片選端相連,2817A的地址范圍是4000H~47FFH(無關(guān)項(xiàng)取0,該地址范圍不是惟一的)。

2817A的讀/寫控制線連接采用了將外部數(shù)據(jù)存儲(chǔ)器空間和程序存儲(chǔ)器空間合并的方法,使得2817A既可以作為程序存儲(chǔ)器使用,又可以作為數(shù)據(jù)存儲(chǔ)器使用。如果只是把2817A作為程序存儲(chǔ)器使用,使用方法與EPROM相同。E2PROM也可以通過編程器將程序固化進(jìn)去。如果將2817A作為數(shù)據(jù)存儲(chǔ)器,讀操作同使用靜態(tài)RAM一樣,用“MOVX

A,@DPTR”指令直接從給定的地址單元中讀取數(shù)據(jù)即可。向2817A中寫數(shù)據(jù)采用“MOVX@DPTR,A”指令。

2817A的RDY/引腳是一個(gè)漏極開路的輸出端,故外接上拉電阻后,將其與AT89C51的P1.0相連。采用查詢方式對(duì)2817A的寫操作進(jìn)行管理。在寫操作期間,RDY/腳為低電平,當(dāng)寫操作完畢時(shí),RDY/變?yōu)楦唠娖?。其?shí),檢測(cè)2817A寫操作是否完成也可以用中斷方式實(shí)現(xiàn),方法是將2817A的RDY/反相后與AT89C51的外部中斷輸入腳相連(圖6.18中的虛線所示),當(dāng)2817A每寫完一個(gè)字節(jié),便向單片機(jī)提出中斷請(qǐng)求。6.4.1簡(jiǎn)單I/O端口的擴(kuò)展

對(duì)一些簡(jiǎn)單外設(shè)的接口,只要按照“輸入三態(tài),輸出鎖存”與總線相連的原則,選擇74LS系列的TTL或MOS器件即能組成擴(kuò)展接口電路。例如,可采用8位三態(tài)緩沖器74LS244組成輸入口,采用8D鎖存器74LS273、74LS373、74LS377等組成輸出口。

采用這些簡(jiǎn)單接口芯片進(jìn)行系統(tǒng)擴(kuò)展,接口電路簡(jiǎn)單、配置靈活、編程方便、且價(jià)格低廉,是I/O端口擴(kuò)展的一種首選方案。6.4并行I/O端口擴(kuò)展技術(shù)圖6.19給出了74LS244的引腳圖與真值表,它是8位三態(tài)緩沖器,在系統(tǒng)設(shè)計(jì)時(shí)常常用作系統(tǒng)總線的單向驅(qū)動(dòng)或輸入接口芯片。圖6.20給出了74LS273的引腳圖與真值表。74LS273是8D觸發(fā)器,為低電平有效的清0端,當(dāng)其為0時(shí),輸出全為0,且與其他輸入端無關(guān);CP端是時(shí)鐘信號(hào),當(dāng)CP由低電平向高電平跳變時(shí),D端輸入數(shù)據(jù)傳送到Q端輸出。在系統(tǒng)設(shè)計(jì)時(shí)常用74LS273作為輸出接口芯片。圖6.1974LS244引腳圖與真值表圖6.2074LS273引腳圖與真值表

例6.4.1

采用74LS244和74LS273為AT89C51單片機(jī)擴(kuò)展8位輸入端口和8位輸出端口。

解單片機(jī)擴(kuò)展74LS244和74LS273的硬件電路圖如圖6.21所示。

圖6.21中,P0口作為雙向8位數(shù)據(jù)線,既能夠從74LS244輸入數(shù)據(jù),又能夠從74LS273輸出數(shù)據(jù)。P2.0分別與、“或運(yùn)算”作為輸入口和輸出口的選通及鎖存信號(hào)。因?yàn)?4LS244和74LS273都是在P2.0為0時(shí)被選通的,所以二者的口地址都為FEFFH(這個(gè)地址不是惟一的,只要保證P2.0=0,其他地址位無關(guān))。圖6.21簡(jiǎn)單I/O端口擴(kuò)展在51單片機(jī)中,擴(kuò)展的I/O端口采用與片外數(shù)據(jù)存儲(chǔ)器相同的尋址方法,所有擴(kuò)展的I/O端口與片外RAM統(tǒng)一編址,因此,對(duì)片外I/O端口的輸入/輸出指令就是訪問片外RAM的指令,即:

MOVXA,@DPTR;產(chǎn)生讀信號(hào)

MOVXA,@Ri;產(chǎn)生讀信號(hào)

MOVX@DPTR,A;產(chǎn)生寫信號(hào)

MOVX@Ri,A;產(chǎn)生寫信號(hào)針對(duì)圖6.21中的電路可編寫程序,實(shí)現(xiàn)用開關(guān)S0~S7控制對(duì)應(yīng)的發(fā)光二極管L0~L7發(fā)光。程序如下:

NEXT:MOVDPTR,#0FEFFH;數(shù)據(jù)指針指向口地址

MOVXA,@DPTR;輸入數(shù)據(jù)

MOVX@DPTR,A;向74LS273輸出數(shù)據(jù)

LJMPNEXT;循環(huán)6.4.2LED數(shù)碼顯示器擴(kuò)展

LED數(shù)碼顯示器(又稱為L(zhǎng)ED數(shù)碼管)是單片機(jī)應(yīng)用系統(tǒng)中最常用的顯示設(shè)備之一。

它由8個(gè)發(fā)光二極管(以下簡(jiǎn)稱字段)構(gòu)成,通過不同的組合可用來顯示數(shù)字0~9、字符A~F、P、空白字符、符號(hào)“-”及小數(shù)點(diǎn)“.”等。LED數(shù)碼管分為共陽極和共陰極兩種,無論是共陽極還是共陰極其外形結(jié)構(gòu)與封裝形式相同,其封裝形式和等效電路如圖6.22所示。圖6.22LED數(shù)碼顯示器共陽極數(shù)碼管的8個(gè)發(fā)光二極管的陽極(二極管正端)連接在一起,即公共端COM。

通常,公共陽極COM端接高電平,其他管腳接發(fā)光段驅(qū)動(dòng)電路輸出端。當(dāng)某段驅(qū)動(dòng)電路的輸出端為低電平時(shí),則該端所連接的字段導(dǎo)通并點(diǎn)亮。根據(jù)發(fā)光字段的不同組合

可顯示出各種數(shù)字或字符。此時(shí),要求段驅(qū)動(dòng)電路能吸收發(fā)光段的導(dǎo)通電流,還需根據(jù)外接電源及發(fā)光段的導(dǎo)通電流來確定相應(yīng)的限流電阻(發(fā)光段的導(dǎo)通電流一般為5~20mA)。共陰極數(shù)碼管的8個(gè)發(fā)光二極管的陰極(二極管負(fù)端)連接在一起,即COM端。通常,公共陰極COM端接低電平,其他管腳接段驅(qū)動(dòng)電路輸出端。當(dāng)某段驅(qū)動(dòng)電路的輸出端為高電平時(shí),該端所連接的字段導(dǎo)通并點(diǎn)亮,根據(jù)發(fā)光字段的不同組合可顯示出各種數(shù)字或字符。此時(shí),要求段驅(qū)動(dòng)電路能提供額定的導(dǎo)通電流,還需根據(jù)外接電源及導(dǎo)通電流來確定相應(yīng)的限流電阻。

要使數(shù)碼管顯示出相應(yīng)的數(shù)字或字符,必須為L(zhǎng)ED顯示器提供顯示段碼(也稱為字形代碼)。因?yàn)長(zhǎng)ED顯示器共有8個(gè)發(fā)光段,所以一個(gè)字形代碼正好為一個(gè)8位二進(jìn)制數(shù)。設(shè)字形代碼的各二進(jìn)制位與發(fā)光段的連接對(duì)應(yīng)關(guān)系如下:如使用共陽極數(shù)碼管時(shí),若字形代碼的某位數(shù)據(jù)為0,則表示對(duì)應(yīng)字段亮,數(shù)據(jù)為1表示對(duì)應(yīng)字段不亮;若使用共陰極數(shù)碼管,則字形代碼的某位數(shù)據(jù)為0表示對(duì)應(yīng)字段不

亮,數(shù)據(jù)為1表示對(duì)應(yīng)字段亮。如要顯示“0”,共陽極數(shù)碼管的字形代碼應(yīng)為:

11000000B(即C0H);共陰極數(shù)碼管的字形代碼應(yīng)為:00111111B(即3FH)。依此類推,可求得數(shù)碼管常用的字形代碼如表6.2所示。表6.2LED顯示器字形代碼(顯示段碼)

1.靜態(tài)顯示器接口

靜態(tài)顯示是指數(shù)碼管顯示某一字符時(shí),相應(yīng)的發(fā)光二極管恒定導(dǎo)通或恒定截止。就是在同一時(shí)刻只顯示1種字符,或者說被顯示的字符在同一時(shí)刻是穩(wěn)定不變的。這種顯

示方式的各位數(shù)碼管相互獨(dú)立,公共端恒定接地(共陰極)或接正電源(共陽極)。每個(gè)數(shù)碼管的8個(gè)字段分別與一個(gè)8位I/O接口相連,I/O端口只要有字形代碼輸出,相應(yīng)字符即顯示出來,并保持不變,直到I/O端口輸出新的字形代碼。采用靜態(tài)顯示方式,雖然具有較高的顯示亮度,占用CPU時(shí)間少,編程簡(jiǎn)單等優(yōu)點(diǎn),但其占用的端口線多,硬件電路復(fù)雜,成本高,只適合于顯示位數(shù)較少的場(chǎng)合。圖6.23是數(shù)碼管靜態(tài)顯示方式的一種典型應(yīng)用,用兩片74LS273驅(qū)動(dòng)2位靜態(tài)LED顯示器(共陰極數(shù)碼管)。P2.7=0時(shí)選通1#顯示器,其地址為7FFFH;P2.6=0時(shí)選通2#顯示器,其地址為BFFFH。用下列程序可在顯示器上顯示字符“1”和“2”:圖6.232位靜態(tài)LED顯示器MOV DPTR,#7FFFH

MOV A,#06H ;“1”的字形代碼

MOVX@DPTR,A

MOV DPTR,#0BFFFH

MOV A,#5BH ;“2”的字形代碼

MOVX@DPTR,A

2.動(dòng)態(tài)顯示接口

動(dòng)態(tài)顯示是一位一位地輪流點(diǎn)亮各位數(shù)碼管,這種逐位點(diǎn)亮顯示器的方式稱為動(dòng)態(tài)掃描。通常,各位數(shù)碼管的段選線相應(yīng)并聯(lián)在一起,由一個(gè)8位的I/O端口控制;各位LED顯示器的位選線(COM端)由另外的I/O端口控制。動(dòng)態(tài)方式顯示時(shí),各數(shù)碼管分時(shí)輪流選通,要使其穩(wěn)定顯示,必須采用動(dòng)態(tài)掃描方式,即在某一時(shí)刻只選通一位數(shù)碼管,并送出相應(yīng)的字形代碼,在另一時(shí)刻選通另一位數(shù)碼管,并送出相應(yīng)的字形代碼。依此規(guī)律循環(huán),逐個(gè)循環(huán)點(diǎn)亮各位數(shù)碼管,每位顯示1ms左右,即可使各位數(shù)碼管顯示要顯示的字符。雖然這些字符是在不同的時(shí)刻分別顯示的,但由于人眼存在視覺暫留效應(yīng),可以給人以同時(shí)顯示的感覺。采用動(dòng)態(tài)顯示方式節(jié)省I/O端口,硬件電路也較靜態(tài)顯示方式簡(jiǎn)單,但其亮度不如靜態(tài)顯示方式,而且在顯示位數(shù)較多時(shí),CPU要依次掃描,仍占用CPU較多的時(shí)間。

用51系列單片機(jī)構(gòu)建數(shù)碼管動(dòng)態(tài)顯示系統(tǒng)時(shí),采用簡(jiǎn)單的接口芯片即可進(jìn)行系統(tǒng)擴(kuò)展,其特點(diǎn)是接口電路簡(jiǎn)單,編程方便,價(jià)格低廉。6位動(dòng)態(tài)LED顯示器如圖6.24所示。圖6.246位動(dòng)態(tài)LED顯示器圖6.24中,數(shù)碼管采用共陰極LED,字形碼輸出口74LS273經(jīng)過8路同相驅(qū)動(dòng)電路7407后接至數(shù)碼管的各段,當(dāng)位線輸出“1”時(shí),驅(qū)動(dòng)數(shù)碼管發(fā)光。7407是集電極

開路的同相驅(qū)動(dòng)器,能為發(fā)光段提供更大的導(dǎo)通電流,增強(qiáng)LED的發(fā)光亮度,其輸出端經(jīng)110Ω的限流電阻接至+5V電源,改變電阻的大小即可調(diào)節(jié)發(fā)光亮度。用另一個(gè)輸出口74LS273作為L(zhǎng)ED的位選控制口,其輸出經(jīng)過6路反相驅(qū)動(dòng)器75452后接至數(shù)碼管的COM端。當(dāng)位選控制口的某位輸出“1”時(shí),75452反相器驅(qū)動(dòng)相應(yīng)的LED位發(fā)光。字形碼輸出口和位選控制口的地址分別為:

字形碼輸出口地址:DFFFH(地址不是惟一的);

位選控制口的地址:EFFFH(地址不是惟一的)。

3.動(dòng)態(tài)掃描程序

在單片機(jī)應(yīng)用系統(tǒng)中,為了便于對(duì)LED顯示器進(jìn)行管理,需要建立一個(gè)顯示緩沖區(qū)。顯示緩沖區(qū)DISBUF是片內(nèi)RAM的一個(gè)區(qū)域,它的作用是存放要顯示的字符,其長(zhǎng)度與LED的位數(shù)相同。圖6.24中的動(dòng)態(tài)顯示器,DISBUF為6個(gè)字節(jié),設(shè)DISBUF占用片內(nèi)RAM的70H~75H單元。顯示緩沖區(qū)DISBUF中的內(nèi)容是由其他處理程序事先存入DISBUF中的,再由顯示程序進(jìn)行顯示。設(shè)要顯示“P89C51”(P89C51是PHILIPS公司的51系列單片機(jī)產(chǎn)品),則“P89C51”在DISBUF中的存放形式見表6.3所示。數(shù)碼顯示器的低位(最右邊的位)顯示的是顯示緩沖區(qū)中的低地址單元中的數(shù),因此在顯示緩沖區(qū)中存放的次序?yàn)榈偷刂穯卧娴臀?,高地址單元存高位。?.3顯示緩沖區(qū)要說明的是,顯示程序是利用查表方法來得到要顯示字符的字形代碼的。在顯示程序的字形代碼(顯示段碼)表中,字形代碼存放的次序依次為“0~9”,“A~F”,“空白”和“P”。其中,“P”的序號(hào)為18(即11H),故在DISBUF中的75H單元用11H代表“P”。

顯示程序的任務(wù)是把顯示緩沖區(qū)中待顯示的字符送往LED顯示器顯示。在進(jìn)行動(dòng)態(tài)掃描顯示時(shí),從DISBUF中依次取出待顯示的字符,采用查表的方法得到其對(duì)應(yīng)的字

形代碼,逐個(gè)地循環(huán)點(diǎn)亮各位數(shù)碼管,每位顯示1ms左右,即可使各位數(shù)碼管顯示要顯示的字符。設(shè)DISBUF中的信息為“P89C51”,可由下列程序在顯示器上顯示“P89C51”:

LOOP1: LCALLDISPLAY ;調(diào)用顯示子程序 LJMP LOOP1 ;循環(huán)

DISPLAY:MOV R0,#70H ;R0指向DISBUF首地址

MOV R3,#01H ;右起第1個(gè)LED的選擇字

NEXT:MOV A,#00H ;取位選控制字為全滅

MOV DPTR,#0EFFFH ;取位選控制口地址

MOVX @DPTR,A ;瞬時(shí)關(guān)顯示器

MOV A,@R0 ;從DISBUF中取出字符MOV DPTR,#DSEG ;取段碼表首地址

MOVCA,@A+DPTR ;查表,取對(duì)應(yīng)的字形碼

MOV DPTR,#0DFFFH ;取字形碼輸出口地址

MOVX@DPTR,A ;輸出字形碼

MOV DPTR,#0EFFFH ;取位選控制口地址

MOV A,R3 ;取當(dāng)前位選控制字

MOVX@DPTR,A ;點(diǎn)亮當(dāng)前LED顯示位LCALLDELAY ;延時(shí)1ms

INC R0 ;R0指向下一個(gè)字符

JB ACC.5,EXIT;若當(dāng)前顯示位是第6位則結(jié)束

RL A ;下一個(gè)LED的選擇字

MOV R3,A

SJMP NEXTEXIT: RET ;返回段碼表0~9,A~F,空白,

DSEG:DB3FH,06H,5BH,4FH,66H,6DH,7DH,

DB07H,7FH6FH,77H,7CH,39H,5EH,

DB79H,71H,00H,73H

DELAY:MOV R7,#02H ;延時(shí)1ms的子程序

DEL1: MOV R6,#0FFH

DEL2: DJNZ R6,DEL2

DJNZR7,DEL1

RET

例6.4.2

針對(duì)圖6.24所示的電路,編一顯示程序,調(diào)用動(dòng)態(tài)掃描顯示子程序

DISPLAY,使數(shù)碼顯示器顯示“012345”共6個(gè)字符。

解參考程序如下:

MOVA,#05H;取最右邊1位字符

MOVR0,#70H;指向DISBUF首址(最低位)

MOVR1,#06H;共送入6個(gè)字符

LOP2:MOV@R0,A;將字符送入DISBUF

INCR0;指向下一顯示單元

DECA;下一個(gè)顯示字符

DJNZR1,LOP2;若6個(gè)數(shù)未送完,則重復(fù)

LOP3:LCALLDISPLAY;掃描顯示一遍

SJMPLOP3;重復(fù)掃描6.4.3鍵盤接口

1.按鍵的分類

鍵盤實(shí)際上是由排列成矩陣形式的一系列按鍵開關(guān)組成的,用戶通過鍵盤可向CPU輸入數(shù)據(jù)信息、地址信息和各種命令。鍵盤按照其接口原理可分為編碼鍵盤與非編碼鍵盤兩類,這兩類鍵盤的主要區(qū)別是識(shí)別鍵符及給出相應(yīng)鍵碼的方法不同。

編碼鍵盤主要是用硬件來實(shí)現(xiàn)對(duì)按鍵的識(shí)別,鍵盤接口電路能夠由硬件邏輯自動(dòng)提供與鍵對(duì)應(yīng)的編碼。此外,編碼鍵盤一般還具有去抖動(dòng)和多鍵、竄鍵保護(hù)電路。這種鍵盤使用方便,但需要較多的硬件,價(jià)格較貴,一般的單片機(jī)應(yīng)用系統(tǒng)較少采用。

非編碼鍵盤的接口電路只是簡(jiǎn)單地提供按鍵的行列矩陣,對(duì)按鍵的識(shí)別、編碼、去抖動(dòng)等工作均由軟件完成。由于其經(jīng)濟(jì)實(shí)用,因此常應(yīng)用于單片機(jī)系統(tǒng)中。下面將重點(diǎn)

介紹非編碼鍵盤。

2.矩陣鍵盤的結(jié)構(gòu)及原理

在單片機(jī)應(yīng)用系統(tǒng)中,除了復(fù)位按鍵有專門的復(fù)位電路及專一的復(fù)位功能外,其他按鍵都是以開關(guān)狀態(tài)來設(shè)置控制功能或輸入數(shù)據(jù)的。當(dāng)所設(shè)置的功能鍵或數(shù)字鍵按下時(shí),單片機(jī)應(yīng)用系統(tǒng)完成該按鍵所設(shè)定的功能。一組鍵或一個(gè)鍵盤,總有一個(gè)接口電路與CPU相連。當(dāng)按鍵較多時(shí)一般采用行列式結(jié)構(gòu)并按矩陣形式排列,如圖6.25所示。圖6.25矩陣鍵盤的結(jié)構(gòu)圖6.25給出了4×4行列式鍵盤的基本結(jié)構(gòu)示意圖。4×4表示有4根行線和4根列線,在每根行線和列線的交叉點(diǎn)上有1個(gè)按鍵,組成了一個(gè)有16個(gè)按鍵的矩陣鍵盤。

列線通過上拉電阻接到+5V上。當(dāng)無鍵按下時(shí),列線處于高電平狀態(tài);當(dāng)有鍵按下時(shí),行、列線將導(dǎo)通,此時(shí),列線電平將由與此列線相連的行線電平?jīng)Q定,這是識(shí)別按鍵是否按下的關(guān)鍵。然而,矩陣鍵盤中的行線、列線和多個(gè)鍵相連,因此,必須將行線、列線信號(hào)配合起來作適當(dāng)處理,才能確定閉合鍵的位置。識(shí)別按鍵是否按下的方法很

多,其中,最常見的方法是行掃描法。

3.矩陣鍵盤的行掃描法

所謂行掃描法,就是通過行線逐行發(fā)出低電平信號(hào)。如果該行線所連接的鍵沒有按下,則列線的電平信號(hào)是全“1”;如果有鍵按下的話,則列線得到的是非全“1”信號(hào),即根據(jù)列線的電平信號(hào)是否有“0”信號(hào)來判斷有無鍵按下。

在使用行掃描法時(shí),為了提高效率,首先快速檢查整個(gè)鍵盤中是否有鍵按下。若無鍵按下,則結(jié)束鍵盤掃描程序;若有鍵按下,則再用逐行掃描的方法來確定閉合鍵的具體位置(按下的是哪一個(gè)鍵)。方法是:先掃描第0行,行輸出值為1110B,第0行為

“0”,其余3行為“1”(通常,把行輸出值為0的行稱為當(dāng)前行),然后讀入列信號(hào),判斷是否為全“1”。若列輸入值為全“1”,則當(dāng)前行無鍵按下,行輸出1101(第1行

為“0”,其余3行為“1”),再掃描下一行……依此規(guī)律逐行掃描,直到掃描某行時(shí),其列輸入值不為全“1”,則根據(jù)行輸出值和列輸入值中0的位置確定閉合鍵的具體位置,從而用計(jì)算法或查表法得到閉合鍵的鍵值。

例6.4.3為單片機(jī)設(shè)計(jì)一個(gè)8×4矩陣鍵盤,并編寫鍵盤掃描程序。

解接口電路如圖6.26所示。用74LS273作為行輸出口,輸出8位行掃描信號(hào)。

用74LS244作為列輸入口,輸入4位列輸入值。其口地址分別是:

行輸出口地址:F7FFH;

列輸入口地址:FBFFH。圖6.26一個(gè)8×4矩陣鍵盤電路鍵盤采用行掃描法方式工作,鍵盤掃描子程序應(yīng)具有以下功能:

(1)判斷有無鍵按下。其方法為:行輸出口輸出全為0,讀列輸入口信息,若列輸入值為全1,則說明無鍵按下;若不為全1,則說明有鍵按下。

(2)消除按鍵的抖動(dòng)。

微機(jī)鍵盤通常使用機(jī)械觸點(diǎn)式按鍵開關(guān)。機(jī)械式按鍵在按下或釋放時(shí),由于機(jī)械彈性作用的影響,通常伴隨有一定時(shí)間的觸點(diǎn)機(jī)械抖動(dòng),然后其觸點(diǎn)才穩(wěn)定下來。其抖動(dòng)過程如圖6.27所示,抖動(dòng)時(shí)間的長(zhǎng)短與開關(guān)的機(jī)械特性有關(guān),一般為5~10ms。圖6.27按鍵抖動(dòng)示意圖在觸點(diǎn)抖動(dòng)期間檢測(cè)按鍵的通斷狀態(tài),可能導(dǎo)致判斷出錯(cuò),即一次按下按鍵被錯(cuò)誤地認(rèn)為是多次操作,這種情況是不允許出現(xiàn)的。為了克服由于按鍵觸點(diǎn)機(jī)械抖動(dòng)所致的檢測(cè)誤判,必須采取消抖動(dòng)措施。

在此,使用軟件延時(shí)的方法消除按鍵的抖動(dòng)。當(dāng)檢測(cè)到有按鍵按下時(shí),調(diào)用兩次顯示子程序,每調(diào)用一次延時(shí)6ms,共延時(shí)12ms。這樣既實(shí)現(xiàn)了按鍵的消抖動(dòng),又可保持顯示器有穩(wěn)定的顯示。同樣,在檢測(cè)到閉合鍵釋放后,也采用軟件延時(shí)的方法消除按鍵的抖動(dòng)。

(3)逐行掃描。若有鍵按下,則逐行掃描,以判別閉合鍵的具體位置。

(4)計(jì)算閉合鍵的鍵值。計(jì)算公式為

鍵值=行號(hào)×4+列號(hào)

(5)判斷按鍵是否釋放。計(jì)算出閉合鍵的鍵值后,再判斷按鍵是否釋放。若按鍵未釋放,則等待;若鍵已釋放,則再延時(shí)消抖。

(6)命令處理。根據(jù)閉合鍵的鍵值,程序應(yīng)完成該按鍵所設(shè)定的功能。若按下的是命令鍵,則轉(zhuǎn)入命令鍵處理程序,完成命令鍵的功能;若按下的是數(shù)字鍵,則轉(zhuǎn)入數(shù)字

鍵處理程序,進(jìn)行數(shù)字的存儲(chǔ)和顯示等操作。鍵盤掃描程序如下:

;KEY鍵盤掃描程序

;入口參數(shù): 無

;出口參數(shù): A為返回值

;若有鍵按下,則A為閉合鍵的鍵值0~31;若無鍵按

;下,則A為FFH

;占用寄存器:R3為行計(jì)數(shù)器,R2存放行掃描值

; R4、R5為暫存器

KEY: LCALLKS1;快速檢查整個(gè)鍵盤中是否有鍵按

;下JNZLK1;A非0,若有鍵按下,

;則轉(zhuǎn)至LK1

LJMPLK8;若無鍵按下,則返回

LK1: LCALLDISPLAY;若有鍵閉合,則調(diào)顯示

;子程,延時(shí)12ms

LCALLDISPLAY;消抖動(dòng)

LCALLKS1;再次檢查有鍵閉合否

JNZLK2;若有鍵閉合,則轉(zhuǎn)入逐行掃描LJMPLK8;若無鍵閉合,則返回

KL2:MOVR3,#00H;行號(hào)初值送R3

MOVR2,#0FEH;行掃描初值送R2LK3: MOVDPTR,#0F7FFH;行輸出口地址,F(xiàn)7FFHMOVA,R2;行掃描值送A

MOVX@DPTR,A;掃描當(dāng)前行

MOVDPTR,#0FBFFH;列輸入口地址,

;FBFFH

MOVXA,@DPTR;讀入列值

ANLA,#0FH;保留低4位

MOVR4,A;暫存列值

CJNEA,#0FH,LK4;列值非全“1”則轉(zhuǎn)MOVA,R2;行掃描值送AJNBACC.7,LK8;已掃到最后1行則轉(zhuǎn)

RLA;若未掃完,則準(zhǔn)備掃下一行MOVR2,A;行值存入R2中

INCR3;行號(hào)加1

LJMPLK3;轉(zhuǎn)至掃描下一行

LK4: MOVA,R3;行號(hào)送入A

ADDA,R3;行號(hào)×2

MOVR5,A;暫存

ADDA,R5;行號(hào)×4

MOVR5,A;存入R5中MOVA,R4 ;列值送入A

LK5: RRCA ;列值右移1位

JNCLK6 ;該位為0則轉(zhuǎn)

INCR5 ;鍵值加1

SJMPLK5 ;列號(hào)未判完繼續(xù)

LK6: PUSHR5 ;保護(hù)鍵值

LK7: LCALLDISPLAY;掃描一遍顯示器

LCALLKS1 ;發(fā)全掃描信號(hào)

JNZLK7 ;鍵未釋放則等待

LCALLDISPLAY;鍵已釋放LCALLDISPLAY;延時(shí)12ms,消抖

POPA;鍵值存入A中

KND:RET;返回

LK8:MOVA,#0FFH;無閉合鍵標(biāo)志,F(xiàn)FH存入A中RET;返回

KS1:MOVDPTR,#0F7FFH ;行輸出口地址:F7FFHMOVA,#00H;取8行全掃描信號(hào)MOVX@DPTR,A ;同時(shí)掃描8行

MOVDPTR,#0FBFFH ;列輸入口地址:FBFFH

MOVXA,@DPTR;列輸入

ANLA,#0FH;保留低4位

ORLA,#0F0H;高4位取“1”

CPLA ;取反,若無鍵按下,則全0

RET ;返回6.4.48255A可編程并行I/O接口擴(kuò)展

所謂可編程的接口芯片,是指其功能可由微處理機(jī)的指令來加以改變的接口芯片,利用編程的方法,可以使一個(gè)接口芯片執(zhí)行不同的接口功能。目前,各生產(chǎn)廠家已提供了很多系列的可編程接口器件,51單片機(jī)常用的可編程接口芯片是Intel8255A。

1.8255A的內(nèi)部結(jié)構(gòu)與端口選擇

8255A是一種8位并行接口芯片,它為用戶提供了3個(gè)8位并行端口PA、PB和PC口,3個(gè)端口都可以和外設(shè)相連,分別傳送外設(shè)的輸入/輸出數(shù)據(jù)或控制信息,圖6.28給出了8255A的內(nèi)部結(jié)構(gòu)和引腳圖。3個(gè)端口在8255A內(nèi)部分成A、B兩組控制電路,這兩組控制電路根據(jù)CPU發(fā)出的方式選擇字來控制8255A的工作方式,每個(gè)控制組都接收來自讀/寫控制邏輯的“命令”和內(nèi)部數(shù)據(jù)總線的“控制字”,并向與其相

連的端口發(fā)出適當(dāng)?shù)目刂菩盘?hào)。A組控制部件用來控制PA口和PC口高4位(PC7~PC4),B組控制部件用來控制PB口和PC口低4位(PC3~PC0)。圖6.288255A的內(nèi)部結(jié)構(gòu)和引腳圖讀/寫控制邏輯用來管理數(shù)據(jù)信息、控制字和狀態(tài)字的傳送,它接收來自CPU地址總線的A1、A0和控制總線有關(guān)信號(hào)(、、RESET等),向8255A的A、B兩組控制部件發(fā)送命令,用于對(duì)8255的端口選擇及讀/寫控制,表6.4給出了8255A的端口選擇及讀/寫控制狀態(tài)表。表6.48255A端口選擇及讀/寫控制狀態(tài)表

2.8255A的控制字與工作方式

8255A有兩種控制命令字:一個(gè)是方式選擇控制字,另一個(gè)是C口按位置位/復(fù)位控制字,其控制字格式如圖6.29所示。初始化時(shí),CPU首先對(duì)8255A的控制寄存器寫入方式選擇控制字,選擇8255A的工作方式。在8255A工作期間,如果把一個(gè)置位/復(fù)位控制字送入8255A的控制寄存器,就能將C口的某一位置1或清0,而不影響其他位的狀態(tài),使C口具有位操作功能。圖6.298255A控制字格式(a)方式選擇控制字格式;(b)C口置位/復(fù)位控制字格式

8255有3種工作方式:方式0、方式1和方式2。工作方式的選擇是通過上述寫控制字的方法來完成的。

(1)方式0(基本輸入/輸出方式):A口、B口及C口高4位、低4位都可以設(shè)置為方式0輸入或輸出,不需要選通信號(hào)。單片機(jī)可以用8255A進(jìn)行數(shù)據(jù)的無條件傳送,數(shù)據(jù)在8255A的各端口能得到鎖存和緩沖。在方式0下,輸入口為緩沖輸入方式,輸出口具有鎖存功能。

(2)方式1(選通輸入/輸出方式):A口和B口都可以獨(dú)立地設(shè)置為方式1,在這種方式下,8255A的A口和B口通常用于傳送和它們相連外設(shè)的數(shù)據(jù),C口作為A口和B口的握手聯(lián)絡(luò)線,以實(shí)現(xiàn)中斷方式傳送數(shù)據(jù)。

A口和B口為方式1輸入時(shí),C口的定義及握手信號(hào)的時(shí)序如圖6.30所示。其中,為選通信號(hào),低電平有效,當(dāng)外設(shè)送來信號(hào)時(shí),輸入的數(shù)據(jù)被裝入8255A的輸入鎖存器中;IBF是輸入緩沖器滿信號(hào),高電平有效。

IBF是一個(gè)狀態(tài)信號(hào),當(dāng)其為高電平表示輸入口的數(shù)據(jù)尚未被CPU取走時(shí),外設(shè)暫時(shí)不能向輸入口送新的數(shù)據(jù);INTR是中斷請(qǐng)求信號(hào),高電平有效。當(dāng)IBF為高電平,且中斷允許信號(hào)INTE=1時(shí),INTR=1,向CPU請(qǐng)求中斷。CPU響應(yīng)中斷后,執(zhí)行輸入指令(產(chǎn)生讀信號(hào)為負(fù)脈沖),讀取輸入口的數(shù)據(jù),同時(shí)的下降沿清除中斷請(qǐng)求信號(hào),的上升沿使IBF=0。圖6.30方式1輸入時(shí)的握手信號(hào)及時(shí)序

INTE為中斷允許控制信號(hào)。A口由PC4位的置位/復(fù)位狀態(tài)進(jìn)行控制,B口由PC2位的置位/復(fù)位狀態(tài)進(jìn)行控制。只有PC4或PC2置位時(shí),8255A的A口或B口才會(huì)產(chǎn)生中斷請(qǐng)求。若A口和B口為方式1輸入時(shí),PC7、PC6可以用作I/O線,即方式0下的輸入或輸出。

A口和B口為方式1輸出時(shí),C口的定義及握手信號(hào)的時(shí)序如圖6.31所示。其中,OBF是輸出緩沖器滿信號(hào),低電平有效。該信號(hào)為低電平表示CPU已將數(shù)據(jù)送到輸出端口,通知外設(shè)可將數(shù)據(jù)取走;是外設(shè)產(chǎn)生的響應(yīng)信號(hào),若該信號(hào)有效表示數(shù)據(jù)被外設(shè)所接收。當(dāng)外設(shè)接收了輸出端口的數(shù)據(jù)后,INTR為高電平向CPU發(fā)出中斷請(qǐng)求,請(qǐng)求CPU輸出新的數(shù)據(jù)。圖6.31方式1輸出時(shí)的握手信號(hào)及時(shí)序

INTE為中斷允許控制信號(hào)。A口由PC6位的置位/復(fù)位狀態(tài)進(jìn)行控制,B口由PC2位的置位/復(fù)位狀態(tài)進(jìn)行控制。只有PC6或PC2置位時(shí),8255A的A口或B口才會(huì)產(chǎn)生中斷請(qǐng)求。若A口和B口為方式1輸入時(shí),PC5、PC4可以用作I/O線,即方式0下的輸入或輸出。

(3)方式2(A口的雙向選通輸入輸出方式):只有A口可以設(shè)置為方式2,在這種方式下,既能輸入,又能輸出。無論是輸入或輸出都可以用中斷方式,也可以用查詢方式進(jìn)行數(shù)據(jù)交換。A口為方式2時(shí),C口的定義及握手信號(hào)的時(shí)序如圖6.32所示。

這時(shí),中斷允許控制信號(hào)INTE1由PC6位的置位/復(fù)位狀態(tài)進(jìn)行控制,INTE2由PC4位的置位/復(fù)位狀態(tài)進(jìn)行控制。其他握手信號(hào)的定義類似于方式1。

當(dāng)A口工作在方式2時(shí),B口既可工作在方式0下,又可工作在方式1下。圖6.32方式2的握手信號(hào)及時(shí)序

3.8255A與系統(tǒng)的連接及應(yīng)用

由于8255A是Intel公司專為其主機(jī)配套設(shè)計(jì)制造的標(biāo)準(zhǔn)化外圍接口芯片,因此它與51單片機(jī)的連接是非常簡(jiǎn)單的。圖6.33給出了一個(gè)8255A與系統(tǒng)的連接實(shí)例。圖6.338255A與系統(tǒng)的連接圖6.33中,P0口為地址/數(shù)據(jù)復(fù)用口,數(shù)據(jù)通過P0口直接傳送,地址的低8位通過74LS373鎖存。系統(tǒng)的讀/寫控制及復(fù)位信號(hào)與8255A的讀/寫及復(fù)位端對(duì)應(yīng)相連。系統(tǒng)地址總線的A1、A0直接與8255A的地址線A1、A0對(duì)應(yīng)相連。利用高8位地址線的P2.1作為選通信號(hào),直接與8255A的片選端相連,8255A各個(gè)端口的地址如下:

A口地址:FD00H(地址不是惟一的,下同);

B口地址:FD01H;

C口地址:FD02H;

控制寄存器地址:FD03H。例6.4.4

針對(duì)圖6.33所示的電路進(jìn)行編程,用位操作方式進(jìn)行控制,使8255A的PC5端向外輸出一個(gè)寬度為1ms的正脈沖信號(hào)。

解若要從PC5端輸出一個(gè)正脈沖信號(hào),則可通過對(duì)PC5位的置位/復(fù)位控制來實(shí)現(xiàn)。

由于每送1個(gè)控制字,只能對(duì)1位作1次置位或復(fù)位操作,因此產(chǎn)生1個(gè)正脈沖要對(duì)PC5位先送置位控制字,經(jīng)過一定的延時(shí)后再送復(fù)位控制字即能實(shí)現(xiàn)。程序如下:

MOVDPTR,#0FD03H;指向8255A的控制口

MOV A,#80H;方式字,A、B和C口均為方式

;0輸出

MOVX@DPTR,A;8255A初始化

MOVA,#OBH;置位/復(fù)位控制字,對(duì)PC5置1

MOVX@DPTR,A

LCALLDELAY1ms;調(diào)用延時(shí)子程序DELAY1ms

DECA;對(duì)PC5置0

MOVX@DPTR,A

例6.4.5

使用8255A芯片為單片機(jī)系統(tǒng)設(shè)計(jì)打印機(jī)接口電路,并編寫打印子程序。

解打印機(jī)的主要信號(hào)及時(shí)序如圖6.34所示。其中,DB0~DB7為數(shù)據(jù)線,向打印機(jī)提供數(shù)據(jù)。是數(shù)據(jù)選通信號(hào),利用的負(fù)脈沖將DB0~DB7上的數(shù)據(jù)鎖存于打印機(jī)內(nèi)部,由打印機(jī)處理并打印該字符。在打印該字符期間BUSY為高電平,表示打印機(jī)處于“忙”狀態(tài)。一旦BUSY變?yōu)榈碗娖?,就表示打印機(jī)可以接收下一個(gè)數(shù)據(jù)。

打印機(jī)的接口電路如圖6.35所示。設(shè)8255A的地址為FD00H~FD03H,8255A與系統(tǒng)的具體連接方法如圖6.33所示。圖6.34打印機(jī)的主要信號(hào)及時(shí)序圖圖6.35打印機(jī)的接口電路打印子程序采用查詢方式傳送數(shù)據(jù),其功能是打印片內(nèi)RAM30H單元中的ASCII碼字符。程序如下:

;主程序

MOVDPTR,#0FD03H;指向8255A的命令口

MOVA,#88H;取方式字:A口輸出,C口

;低出高入

MOVX@DPTR,A;送入方式字,8255A初始化MOVA,#01H;C口置位/復(fù)位命令字

;(PC0=1)

MOVX@DPTR,A;置PC0初始狀態(tài)為1LCALLPRINT;調(diào)打印子程序

;調(diào)打印子程序

PRINT:MOVDPTR,#0FD02H;指向C口

LOOP1:MOVXA,@DPRT;讀入C口信息

JBA.7,LOOP1;若BUSY=1,則繼

;續(xù)查詢

MOVDPTR,#0FD00H;指向A口

MOVA,30H;取RAM數(shù)據(jù)

MOVX@DPTR,A;數(shù)據(jù)輸出到A口MOVDPTR,#0FD03H;指向命令口

MOVA,#00H;C口置位/復(fù)位命令字(PC0=0)MOVX@DPTR,A;產(chǎn)生STB的下降沿

NOP

MOVA,#01H;改變C口置位/復(fù)位命令字

;(PC0=1)

MOVX@DPTR,A;產(chǎn)生STB的上升沿

RET ;返回6.5.1LED點(diǎn)陣式大屏幕顯示器設(shè)計(jì)

無論是單個(gè)LED(發(fā)光二極管)還是LED七段碼顯示器(數(shù)碼管),都不能顯示字符(含漢字)及更為復(fù)雜的圖形信息,這主要是因?yàn)樗鼈儧]有足夠的信息顯示單位。點(diǎn)陣式LED顯示是把很多的LED按矩陣方式排列在一起,通過對(duì)各LED發(fā)光與不發(fā)光的控制來完成各種字符或圖形的顯示。最常見的LED點(diǎn)陣顯示模塊為8×8結(jié)構(gòu),其顯示原理如圖6.36所示。在圖6.36中,只要使LED處于正偏(X方向?yàn)?,Y方向?yàn)?),

對(duì)應(yīng)的LED就發(fā)光。如X7=1,Y7=0時(shí),則與其對(duì)應(yīng)的右下角的LED會(huì)發(fā)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論