《單片微型計算機原理及應(yīng)用》課件第5章_第1頁
《單片微型計算機原理及應(yīng)用》課件第5章_第2頁
《單片微型計算機原理及應(yīng)用》課件第5章_第3頁
《單片微型計算機原理及應(yīng)用》課件第5章_第4頁
《單片微型計算機原理及應(yīng)用》課件第5章_第5頁
已閱讀5頁,還剩80頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

5.1I/O概述5.2輸入/輸出傳送方式5.3存儲器的擴展5.4I/O口的擴展第5章輸入/輸出及存儲器擴展5.1I/O概述5.1.1I/O接口電路的作用一個計算機系統(tǒng)的組成,除了CPU、存儲器外,還必須有外部設(shè)備。計算機通過I/O(輸入/輸出)設(shè)備和外界進(jìn)行通信。計算機所用的數(shù)據(jù)以及現(xiàn)場采集的各種信息都要通過輸入設(shè)備送到計算機;而計算的結(jié)果和計算機產(chǎn)生的各種控制信號又需通過輸出設(shè)備輸出到外部設(shè)備。

計算機的I/O操作,即CPU和外部設(shè)備之間的數(shù)據(jù)傳送卻十分復(fù)雜。主要表現(xiàn)在以下幾個方面:

(1)外部設(shè)備的工作速度與計算機相比要低得多。

(2)外部設(shè)備的種類繁多,有機械式、機電式及電子式等等。

(3)外部設(shè)備的數(shù)據(jù)信號是多種多樣的,既有電壓信號,也有電流信號;既有數(shù)字量,還有模擬量。

(4)外部設(shè)備的數(shù)據(jù)傳送有近距離的,也有遠(yuǎn)距離的;有的使用并行數(shù)據(jù)傳送,而有的則使用串行傳送數(shù)據(jù)。

具體說來,接口電路主要有以下幾項功能:

(1)速度協(xié)調(diào)。

(2)數(shù)據(jù)鎖存。

(3)三態(tài)緩沖。

(4)數(shù)據(jù)轉(zhuǎn)換。5.1.2接口與端口

“接口”一詞是從英文interface翻譯過來的,具有界面、相互聯(lián)系等含義。接口這個術(shù)語在計算機領(lǐng)域中應(yīng)用十分廣泛,

本章所講述的接口則特指計算機與外設(shè)之間在數(shù)據(jù)傳送方面的聯(lián)系,其功能主要是通過電路實現(xiàn)的,因此稱之為接口電路,簡稱接口。5.1.3I/O的編址方式在計算機中,凡需進(jìn)行讀寫操作的設(shè)備都存在著編址問題。具體說來在計算機中有兩種需要編址的器件:一種是存儲器,另一種就是接口電路。存儲器是對存儲單元進(jìn)行編址,而接口電路則是對其中的端口進(jìn)行編址。對端口編址是為I/O操作而進(jìn)行的,因此也稱為I/O編址。常用的I/O編址有兩種方式:獨立編址方式和統(tǒng)一編址方式。

1.獨立編址方式

2.統(tǒng)一編址方式

5.2輸入/輸出傳送方式

5.2.1無條件傳送方式無條件傳送也稱為同步程序傳送,類似于CPU和存儲器之間的數(shù)據(jù)傳送。只有那些一直為數(shù)據(jù)I/O傳送作好準(zhǔn)備的外部設(shè)備,才能使用無條件傳送方式。這種傳送方式不需要測試外部設(shè)備的狀態(tài),可以根據(jù)需要隨時進(jìn)行數(shù)據(jù)傳送操作。無條件傳送方式適用于以下兩類外部設(shè)備的輸入輸出:(1)外設(shè)的工作速度非常快,足以和CPU同步工作。

(2)具有常駐的或變化緩慢的數(shù)據(jù)信號的外設(shè)。5.2.2查詢傳送方式查詢傳送又稱為條件傳送,即數(shù)據(jù)的傳送是有條件的。在輸入/輸出之前,先要檢測外設(shè)的狀態(tài),以了解外設(shè)是否已為數(shù)據(jù)輸入輸出作好了準(zhǔn)備,只有在確認(rèn)外設(shè)已“準(zhǔn)備好”的情況下,CPU才能執(zhí)行數(shù)據(jù)輸入/輸出操作。通常把通過程序?qū)ν庠O(shè)狀態(tài)的檢測稱之為“查詢”,所以這種有條件的傳送方式又叫做程序查詢方式。查詢的流程圖如圖5―1所示。圖5―1查詢方式流程圖5.2.3中斷傳送方式由于查詢傳送方式為CPU主動要求傳送數(shù)據(jù),而它又不能控制外設(shè)的工作速度,因此只能用等待的方式來解決配合的問題。中斷方式則是在外設(shè)為數(shù)據(jù)傳送作好準(zhǔn)備之后,就向CPU發(fā)出中斷請求信號(相當(dāng)于通知CPU),CPU接收到中斷請求信號之后立即作出響應(yīng),暫停正在執(zhí)行的原程序(主程序),而轉(zhuǎn)去為外設(shè)的數(shù)據(jù)輸入輸出服務(wù),待服務(wù)完之后,程序返回,CPU再繼續(xù)執(zhí)行被中斷的原程序。

由于CPU的工作速度很快,傳送1次數(shù)據(jù)(包括轉(zhuǎn)入中斷和退出中斷)所需的時間很短。對外設(shè)來講,似乎是對CPU發(fā)出數(shù)據(jù)傳送請求的瞬間,CPU就實現(xiàn)了;對主程序來講,雖然中斷了1個瞬間,但由于時間很短,也不會有什么影響。5.3存儲器的擴展5.3.1存儲器擴展概述

MCS-51系列單片機具有64KB的程序存儲器空間,其中8051、8751型單片機含有4KB的片內(nèi)程序存儲器,而8031型單片機則無片內(nèi)程序存儲器。當(dāng)采用8051、8751型單片機而程序超過4KB,或采用8031型單片機時,就需要進(jìn)行程序存儲器的擴展。

MCS-51系列單片機的數(shù)據(jù)存儲器與程序存儲器的地址空間是互相獨立的,其片外數(shù)據(jù)存儲器的空間可達(dá)64KB,而片內(nèi)的數(shù)據(jù)存儲器空間只有128B。如果片內(nèi)的數(shù)據(jù)存儲器不夠用時,則需進(jìn)行數(shù)據(jù)存儲器的擴展。存儲器擴展的核心問題是存儲器的編址問題。所謂編址就是給存儲單元分配地址。由于存儲器通常由多片芯片組成,為此存儲器的編址分為兩個層次:即存儲器芯片的選擇和存儲器芯片內(nèi)部存儲單元的選擇。存儲器芯片的選擇有兩種方法:線選法和譯碼法。

1.線選法所謂線選法,就是直接以系統(tǒng)的地址線作為存儲器芯片的片選信號,為此只需把用到的地址線與存儲器芯片的片選端直接相連即可。

2.譯碼法所謂譯碼法就是使用地址譯碼器對系統(tǒng)的片外地址進(jìn)行譯碼,以其譯碼輸出作為存儲器芯片的片選信號。

譯碼法又分為完全譯碼和部分譯碼兩種。

(1)完全譯碼。地址譯碼器使用了全部地址線,地址與存儲單元一一對應(yīng),也就是1個存儲單元只占用1個唯一的地址。

(2)部分譯碼。地址譯碼器僅使用了部分地址線,地址與存儲單元不是一一對應(yīng),而是1個存儲單元占用了幾個地址。1根地址線不接,一個單元占用2(21)個地址;2根地址線不接,一個單元占用4(22)個地址;3根地址線不接,則占用8(23)個地址,依此類推。

在設(shè)計地址譯碼器電路時,如果采用地址譯碼關(guān)系圖的話,將會帶來很大的方便。所謂地址譯碼關(guān)系圖,就是一種用簡單的符號來表示全部地址譯碼關(guān)系的示意圖。例如:

從地址譯碼關(guān)系圖上可以看出以下幾點:①屬完全譯碼還是部分譯碼;②片內(nèi)譯碼線和片外譯碼線各有多少根;③所占用的全部地址范圍為多少。例如在上面的關(guān)系圖中,有1個“·”(A15不接),表示為部分譯碼,每個單元占用2個地址。片內(nèi)譯碼線有11根(A10~A0),片外譯碼線有4根。其所占用的地址范圍如下:

當(dāng)A15為0時,所占用地址為0010000000000000~0010011111111111,即2000H~27FFH。當(dāng)A15為1時,所占用地址為1010000000000000~1010011111111111,即A000H~A7FFH。共占用了兩組地址,這兩組地址在使用中同樣有效。

應(yīng)該指出的是,隨著半導(dǎo)體存儲器的不斷發(fā)展,大容量、高性能、低價格的存儲器不斷推出,這就使得存儲器的擴展變得更加方便,譯碼電路也越來越簡單了。5.3.2程序存儲器的擴展

1.只讀存儲器簡介半導(dǎo)體存儲器分為隨機存取存儲器(RandomAccessMemory)和只讀存儲器(ReadOnlyMemory)兩大類,前者主要用于存放數(shù)據(jù),后者主要用于存放程序。只讀存儲器是由MOS管陣列構(gòu)成的,以MOS管的接通或斷開來存儲二進(jìn)制信息。按照程序要求確定ROM存儲陣列中各MOS管狀態(tài)的過程叫做ROM編程。根據(jù)編程方式的不同,ROM可分為以下3種:1)掩膜ROM

掩膜ROM簡稱為ROM,其編程是由半導(dǎo)體制造廠家完成的,即在生產(chǎn)過程中進(jìn)行編程。

2)可編程ROM(PROM)PROM芯片出廠時并沒有任何程序信息,其程序是由用戶寫入的,與掩膜ROM相比,有了一定的靈活性,批量也不一定很大。

3)可擦除ROM(EPROM或EEPROM)

可擦除ROM芯片的內(nèi)容由用戶寫入,并允許反復(fù)擦除重新寫入。EEPROM芯片每個字節(jié)可改寫萬次以上,信息的保存期大于10年。這種芯片給計算機應(yīng)用系統(tǒng)帶來很大的方便,不僅可以修改參數(shù),而且斷電后能保存數(shù)據(jù)。它的缺點是價格偏高。

2.EPROM2764簡介

1)2764的引腳自從EPROM2716芯片被逐漸淘汰后,目前比較廣泛采用的是2764芯片。該芯片為雙列直插式28引腳的標(biāo)準(zhǔn)芯片,容量為8K×8位,其管腳如圖5―2所示。圖5―2EPROM2764引腳圖

其中:

A12~A0:13位地址線。

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

:片選信號,低電平有效。

:輸出允許信號,當(dāng)時,

輸出緩沖器打開,被尋址單元的內(nèi)容才能被讀出。

VPP:編程電源,當(dāng)芯片編程時,該端加上編程電壓(+25V或+12V);正常使用時,該端加+5V電源。(NC為不用的管腳)。2)2764的工作時序

2764在使用時,只能將其所存儲的內(nèi)容讀出,其過程與RAM的讀出十分類似。即首先送出要讀出的單元地址,然后使和均有效(低電平),則在芯片的D0~D7數(shù)據(jù)線上就可以輸出要讀出的內(nèi)容。其過程的時序關(guān)系如圖5―3所示。圖5―3EPROM2764的讀出時序3)2764的編程

EPROM的一個重要特點就在于它可以反復(fù)擦除,即在其存儲的內(nèi)容擦除后可通過編程(重新)寫入新的內(nèi)容。這就為用戶調(diào)試和修改程序帶來很大的方便。EPROM的編程過程如下:

(1)擦除:如果EPROM芯片是第一次使用的新芯片,則它是干凈的。干凈的標(biāo)志通常是每一個存儲單元的內(nèi)容都是FFH。

(2)編程:EPROM的編程有兩種方式:標(biāo)準(zhǔn)編程和靈巧編程。

靈巧編程方式要比標(biāo)準(zhǔn)編程方式快5倍左右。同時,這種方式編程有更高的可靠性和安全性。該方法的時序圖及程序流程圖分別由圖5-4和圖5-5所示。時序圖中的時序僅表示各信號間的相互關(guān)系,而波形的持續(xù)時間并不成比例。這里應(yīng)注意的是,對于不同型號、不同廠家生產(chǎn)的EPROM芯片,其編程電壓Vpp是不一樣的,有+12V,+18V,+21V,+24V等數(shù)種。編程時一定要根據(jù)芯片所要求的電壓來編程。若不注意,極易燒壞芯片。圖5―4靈巧編程時序圖圖5―5EPROM靈巧編程流程圖3.程序存儲器擴展舉例現(xiàn)分3種情況說明程序存儲器的擴展方法。

(1)不用片外譯碼的單片程序存儲器的擴展。例1:試用EPROM2764構(gòu)成8031的最小系統(tǒng)。解:由于8031無片內(nèi)程序存儲器,因此必須外接程序存儲器以構(gòu)成最小系統(tǒng)。其連接方法是在圖4―2的基礎(chǔ)上,將2764按3總線的要求連接,其連接的關(guān)鍵在于地址譯碼。由于一般所采用的芯片其字節(jié)數(shù)均超過256個單元,也就是說片內(nèi)地址線超過8條,故地址譯碼的核心問題是高8位地址線的連接。(2)采用線選法的多片程序存儲器的擴展。例2:在圖5―7所示的連接圖中,使用了兩片2764,一共構(gòu)成了8K×2=16K的有效地址?,F(xiàn)采用線選法編址,以P2.7(A15)直接作為片選信號,當(dāng)P2.7=0時,選中左邊1片2764,其地址范圍為0000H~1FFFH;當(dāng)P2.7=1時,選中右邊1片2764,其地址范圍為8000H~9FFFH。這是部分譯碼,有2根地址線未接,1個單元要占用22=4個地址號。以上只是4組地址中的1組。若需地址連續(xù)的話,可取如下1組地址:6000H~7FFFH和8000H~9FFFH。

(3)采用地址譯碼器的多片程序存儲器的擴展。圖5―62764與8031的連接圖圖5―7兩片程序存儲器擴展連接圖

例3:要求用2764芯片擴展8031的片外程序存儲器空間,分配的地址范圍為0000H~3FFFH。解:本例采用完全譯碼的方法,即所有地址線全部連接,每個單元只占用唯一的1個地址。①確定片數(shù):字片數(shù)為字片數(shù)=(末地址-首地址)+1芯片字?jǐn)?shù)=(3FFFH-0000H)+112000H=4000H2000H=2(片)②分配地址范圍:第1組(1片)所占用的地址范圍為:00000000000000000000H

00011111111111111FFFH第2組(1片)所占用的地址范圍為:00100000000000002000H00111111111111113FFFH位片數(shù)為位片數(shù)=單元位數(shù)芯片位數(shù)=

總片數(shù)=字片數(shù)×位片數(shù)=2×1=2(片)③畫出地址譯碼關(guān)系圖:

第1組

上面打×部分為片內(nèi)譯碼,對于2764來說有13位,其地址變化范圍為從全0變到全1,其余部分為片外譯碼。④設(shè)計外譯碼電路:

本例只介紹采用譯碼器芯片的設(shè)計方法,現(xiàn)采用3-8譯碼器74LS138。片外譯碼只有3根線(P2.7,P2.6,P2.5),分別接至譯碼器的C、B、A輸入端??刂贫薌1,,不參與譯碼,接成常有效。如圖5―8所示。圖5―874LS138譯碼器連接圖⑤畫出存儲器擴展連接圖:

該連接圖如圖5―9所示。圖中3-8譯碼器74LS138只用了兩個譯碼輸出端,如果需要的話,還可利用其余6個譯碼輸出端。圖5―9采用地址譯碼器擴展程序存儲器的連接圖

例4:圖4―14中3—8譯碼器74LS138的譯碼輸出端和所對應(yīng)的地址范圍各為多少?

解:對于來說,其地址變化范圍為1000000000000000~1001111111111111,即8000H~9FFFH。對于來說,其地址變化范圍為1010000000000000~1011111111111111,即A000H~BFFFH。5.3.3數(shù)據(jù)存儲器的擴展

1.數(shù)據(jù)存儲器概述數(shù)據(jù)存儲器即隨機存取存儲器(RandomAccessMemory),簡稱RAM,用于存放可隨時修改的數(shù)據(jù)信息。它與ROM不同,對RAM可以進(jìn)行讀、寫兩種操作。RAM為易失性存儲器,斷電后所存信息立即消失。按其工作方式,RAM又分為靜態(tài)(SRAM)和動態(tài)(DRAM)兩種。靜態(tài)RAM只要電源加上,所存信息就能可靠保存。2.靜態(tài)RAM6264簡介

6264是8K×8位的靜態(tài)數(shù)據(jù)存儲器芯片,采用CMOS工藝制造,為28引腳雙列直插式封裝,其引腳圖如圖5―10所示。

圖5―10RAM6264引腳圖3.數(shù)據(jù)存儲器擴展舉例數(shù)據(jù)存儲器的擴展與程序存儲器的擴展相類似,不同之處主要在于控制信號的接法不一樣,不用信號,而用和信號,且直接與數(shù)據(jù)存儲器的端和端相連即可。圖5―11為外擴1片6264的連接圖。采用線選法,將片選信號與P2.7相連,片選信號CE2與P2.6相連。其地址譯碼關(guān)系為:所占用的地址為:第1組4000H~5FFFH(A13=0)第2組6000H~7FFFH(A13=1)圖5-11擴展一片RAM6264的連接圖5.3.4全地址范圍的存儲器最大擴展系統(tǒng)現(xiàn)以8031為例,說明全地址范圍的存儲器最大擴展系統(tǒng)的構(gòu)成方法,如圖5―12所示。8031的片外程序存儲器和數(shù)據(jù)存儲器的地址各為64K。若采用EPROM2764和RAM6264芯片,則各需8片才能構(gòu)成全部有效地址。芯片的選擇采用3—8譯碼器74LS138,片外地址線只有3根(A15、A14、A13),分別接至74LS138的C、B、A端,其8路譯碼輸出分別接至8個2764和8個6264的片選端。圖5―12單片機外存儲器最大擴展電路5.3.5I2C總線的E2PROM芯片應(yīng)用

1.CAT24WCXX概述

CAT24WCXX是一個1~256K位的支持I2C總線數(shù)據(jù)傳送協(xié)議的串行CMOSE2PROM芯片,可用電擦除。串行E2PROM一般具有兩種寫入方式:一種是字節(jié)寫入方式,另一種頁寫入方式。允許在一個寫周期內(nèi)同時對一個字節(jié)到一頁的若干字節(jié)的編程寫入,一頁的大小取決于芯片內(nèi)頁寄存器的大小。其中,CAT24WC01具有8字節(jié)數(shù)據(jù)的頁面寫能力,CAT24WC02/04/08/16具有16字節(jié)數(shù)據(jù)的頁面寫能力,CAT24WC32/64具有32字節(jié)數(shù)據(jù)的頁面寫能力,CAT24WC128/256具有64字節(jié)數(shù)據(jù)的頁面寫能力。

2.CAT24WCXX的引腳

CAT24WCXX系列E2PROM提供標(biāo)準(zhǔn)的8腳DIP封裝和8腳表面安裝的SOIC封裝。

CAT24WC01/02/04/08/16/32管腳排列圖及管腳功能描述分別如圖5-13(a)、(b)所示。圖5-13CAT24WC02串行管腳排列及管腳功能描述圖

3.CAT24WCXX的器件地址主器件通過發(fā)送一個起始信號啟動發(fā)送過程,然后發(fā)送它所要尋址的從器件的地址。8位從器件地址的高4位D7~D4固定為1010,具體見表5-1所示,接下來的3位D3~D1(A2、A1、A0)為器件的片選地址位或作為存儲器頁地址選擇位,用來定義哪個器件以及器件的哪個部分被主器件訪問,最多可以連接8個CAT24WC01/02,4個CAT24WC04,2個CAT24WC08,8個CAT24WC32/64,4個CAT24WC256器件到同一總線上,這些位必須與硬連線輸入腳A2、A1、A0相對應(yīng)。一個CAT24WC16/128可單獨被系統(tǒng)尋址。從器件8位地址的最低位D0作為讀寫控制位,“1”表示對從器件進(jìn)行讀操作,“0”表示對從器件進(jìn)行寫操作。在主器件發(fā)送起始信號和從器件地址字節(jié)后,CAT24WCXX監(jiān)視總線并當(dāng)其地址與發(fā)送的從地址相符時響應(yīng)一個應(yīng)答信號(通過SDA線)。CAT24WCXX再根據(jù)讀寫控制位(R/W)的狀態(tài)進(jìn)行讀或?qū)懖僮?。?-1CAT24WCXX的器件地址表

1)字節(jié)寫圖5-14所示為CAT24WC01/02/04/08/16字節(jié)寫時序圖。圖5-14CAT24WC01/02/04/08/16字節(jié)寫時序圖2)頁寫圖5-15所示為CAT24WC01/02/04/08/16頁寫時序圖。圖5-15CAT24WC01/02/04/08/16頁寫時序圖3)應(yīng)答查詢可以利用內(nèi)部寫周期時禁止數(shù)據(jù)輸入這一特性啟動應(yīng)答查詢。一旦主器件發(fā)送停止位指示主器件操作結(jié)束時,CAT24WCXX啟動內(nèi)部寫周期,應(yīng)答查詢立即啟動,包括發(fā)送一個起始信號和進(jìn)行寫操作的從器件地址。如果CAT24WCXX正在進(jìn)行內(nèi)部寫操作,不會發(fā)送應(yīng)答信號。如果CAT24WCXX已經(jīng)完成了內(nèi)部自寫周期,將發(fā)送一個應(yīng)答信號,主器件可以繼續(xù)進(jìn)行下一次讀寫操作。4)寫保護寫保護操作特性可避免由于不當(dāng)操作而造成對存儲區(qū)域內(nèi)部數(shù)據(jù)的改寫,當(dāng)WP管腳接高時,整個寄存器區(qū)全部被保護起來而變?yōu)橹豢勺x取。CAT24WCXX可以接收從器件地址和字節(jié)地址,但是裝置在接收到第一個數(shù)據(jù)字節(jié)后不發(fā)送應(yīng)答信號從而避免寄存器區(qū)域被編程改寫。5.CAT24WCXX的讀操作對CAT24WCXX讀操作的初始化方式和寫操作時一樣,僅把R/W位置為1,有三種不同的讀操作方式:讀當(dāng)前地址內(nèi)容、讀隨機地址內(nèi)容、讀順序地址內(nèi)容。

1)當(dāng)前地址讀(立即地址讀)如圖5-16所示為CAT24WCXX立即地址讀時序圖。CAT24WCXX的地址計數(shù)器內(nèi)容為最后操作字節(jié)的地址加1。也就是說,如果上次讀/寫的操作地址為N,則立即讀的地址從地址N+1開始。圖5-16立即地址讀時序2)隨機地址讀如圖5-17所示為CAT24WCXX隨機地址讀時序圖。圖5-17CAT24WC01/02/04/08/16隨機地址讀時序

3)順序地址讀如圖5-18所示為CAT24WCXX順序地址讀時序圖。圖5-18CAT24WCXX順序地址讀時序圖6.CAT24C02C與單片機的接口編程圖5-19所示是AT89C52單片機(U1)與串行E2PROM芯片24C02C(U2)的接口電路圖。

AT89C52單片機的P1.0、P1.1作為I2C總線與24C02C以及I2CDebugger的SCL和SDA相連。P1.2與WP相連,24C02C的地址線A2、A1、A0直接接地。圖5-19AT89C52與串行E2PROM芯片24C02C的接口電路圖C語言編程代碼主要清單如下:/*******************管腳配置*******************/sbitI2C_SCL=P1^0; //定義時鐘線sbitI2C_SDA=P1^1; //定義數(shù)據(jù)線sbitI2C_WP=P1^2; //定義寫保護線voidI2C_Delay(uchart)//模擬I2C總線延時,根據(jù)具體情況調(diào)整延時值{ while(--t!=0); //延時2*t個機器周期}}/***************************************************函數(shù):I2C_Init()功能:I2C總線初始化,使總線處于空閑狀態(tài)說明:在main()函數(shù)的開始處,應(yīng)當(dāng)執(zhí)行一次本函數(shù)***************************************************/voidI2C_Init(){ I2C_WP=0; //寫保護位清0,允許寫入

I2C_SCL=1; //時鐘線為高電平

I2C_Delay(10); I2C_SDA=1; //數(shù)據(jù)線高電平,沒有開始或結(jié)束信號產(chǎn)生

I2C_Delay(10);}/*********************************************************函數(shù):I2C_Start()功能:產(chǎn)生I2C總線的起始條件說明:SCL處于高電平期間,當(dāng)SDA出現(xiàn)下降沿時啟動I2C總線**********************************************************/voidI2C_Start(){ I2C_SDA=1; //數(shù)據(jù)線為高電平

I2C_Delay(5); I2C_SCL=1; //時鐘線為高電平

I2C_Delay(10); I2C_SDA=0; //數(shù)據(jù)線由高跳變到低,發(fā)送開始信號

I2C_Delay(10); I2C_SCL=0; //時鐘線變?yōu)榈碗娖?,?zhǔn)備發(fā)送數(shù)據(jù)

I2C_Delay(5);}/********************************************************函數(shù):I2C_Stop()功能:產(chǎn)生I2C總線的停止條件說明:SCL處于高電平期間,當(dāng)SDA出現(xiàn)上升沿時停止I2C總線******************************************************/voidI2C_Stop(){ I2C_SDA=0; //數(shù)據(jù)線為低電平

I2C_Delay(5); I2C_SCL=1; //時鐘線為高電平

I2C_Delay(10); I2C_SDA=1; //數(shù)據(jù)線由低跳變到高,發(fā)送結(jié)束信號

I2C_Delay(10);}/*****************************************************函數(shù):I2C_Write_Byte()功能:主器件通過I2C總線向從器件寫1個字節(jié)的數(shù)據(jù)參數(shù):dat是要寫入的數(shù)據(jù)******************************************************/voidI2C_Write_Byte(uchardat){ uchart=8; do { if((dat&0x80)==0x80) I2C_SDA=1;//取當(dāng)前發(fā)送位

else I2C_SDA=0; dat<<=1 //dat左移輸入下一位

I2C_SCL=1; //發(fā)送到數(shù)據(jù)線上 I2C_Delay(10); I2C_SCL=0; I2C_Delay(5); }while(--t!=0);}/***********************************************************函數(shù):I2C_Read_Byte()功能:從器件讀取1個字節(jié)的數(shù)據(jù)返回:讀取的1個字節(jié)數(shù)據(jù)********************************************************/ucharI2C_Read_Byte(){ uchardat; uchart=8; I2C_SDA=1; //在讀取數(shù)據(jù)之前,要把SDA拉高,使之處于輸入狀態(tài) do { I2C_SCL=0; //置時鐘線為低電平,準(zhǔn)備接收數(shù)據(jù)

I2C_Delay(10); I2C_SCL=1; //置時鐘線為高電平,數(shù)據(jù)線的數(shù)據(jù)開始有效

I2C_Delay(5); dat<<=1; if(I2C_SDA==1)dat++; //接收當(dāng)前數(shù)據(jù)位并放入dat中

I2C_SCL=0; I2C_Delay(5); }while(--t!=0); return(dat); //返回接收的數(shù)據(jù)}/*************************************************************函數(shù):I2C_Get_Ack()功能:讀取從器件應(yīng)答位(應(yīng)答或非應(yīng)答),用于判斷從器件是否成功接收主器件數(shù)據(jù)返回:0:從機應(yīng)答1:從機非應(yīng)答說明:從器件收到每一個字節(jié)后都要產(chǎn)生應(yīng)答位,主器件如果收到非應(yīng)答則應(yīng)當(dāng)終止傳輸***************************************************************/bitI2C_Get_Ack(void){ ucharack=0;//無應(yīng)答信號到來

I2C_SDA=1; //數(shù)據(jù)線為高電平,處于輸入狀態(tài)

I2C_Delay(10); I2C_SCL=1; //時鐘線為高電平,接收到的數(shù)據(jù)有效

ack=I2C_SDA; //接收到應(yīng)答信號

I2C_SCL=0; returnack; //返回應(yīng)答信號}/***********************************************************函數(shù):I2C_Write_NByte()功能:主器件通過I2C總線向從器件發(fā)送多個字節(jié)的數(shù)據(jù)參數(shù):addr:地址*dat:要發(fā)送的數(shù)據(jù)size:數(shù)據(jù)大?。ㄒ宰止?jié)計)返回:1:發(fā)送成功0:在發(fā)送過程中出現(xiàn)異常***********************************************************/bitI2C_Write_NByte(ucharequ_addr,ucharaddr,uchar*dat,ucharsize){ uchari; I2C_Start(); //發(fā)送開始信號,啟動I2C總線

I2C_Write_Byte(equ_addr);//發(fā)送器件的地址碼

if(!I2C_Get_Ack())return(0);//無應(yīng)答返回0,有應(yīng)答則發(fā)送器件單元地址

I2C_Write_Byte(addr); if(!I2C_Get_Ack())return(0);//無應(yīng)答返回0,否則連續(xù)傳發(fā)送數(shù)據(jù)字節(jié) for(i=0;i<size;i++) { I2C_Write_Byte(*dat); //發(fā)送數(shù)據(jù)字節(jié)

if(!I2C_Get_Ack())return(0); dat++; } I2C_Stop(); //正常結(jié)束后送結(jié)束信號,并返回1 return(1);}/******************************************************函數(shù):I2C_Read_NByte()功能:從器件讀取多個字節(jié)的數(shù)據(jù)參數(shù):addr:地址size:數(shù)據(jù)大小(以字節(jié)計)返回:1:接收成功0:在接收過程中出現(xiàn)異常*******************************************************/bitI2C_Read_NByte(ucharequ_addr,ucharaddr,uchar*dat,ucharsize){ uchari; I2C_Start(); //發(fā)送開始信號,啟動I2C總線

I2C_Write_Byte(equ_addr); //發(fā)送器件的地址碼

if(!I2C_Get_Ack())return(0); //無應(yīng)答返回0,否則發(fā)送器件單元地址

I2C_Write_Byte(addr); if(!I2C_Get_Ack())return(0); //無應(yīng)答返回0,有應(yīng)答則重發(fā)開始信號,并啟動總線

I2C_Start(); I2C_Write_Byte(equ_addr+1); //發(fā)送器件地址碼

if(!I2C_Get_Ack())return(0); for(i=0;i<size-1;i++) //連續(xù)讀入字節(jié)數(shù)據(jù)

{ *dat=I2C_Read_Byte(); //讀當(dāng)前字節(jié)并送到目的位置

dat++; } *dat=I2C_Read_Byte(); I2C_Stop(); //正常結(jié)束,發(fā)送結(jié)束信號并返回1 return(1);}5.4I/O口的擴展

雖然單片機本身的I/O口能實現(xiàn)簡單的I/O操作,但其功能畢竟十分有限。因為在單片機本身的I/O口電路中,只有數(shù)據(jù)鎖存和緩沖功能,而沒有狀態(tài)寄存和命令寄存功能,因此難以滿足復(fù)雜的I

溫馨提示

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

評論

0/150

提交評論