單片機(jī)常用總線講解_第1頁(yè)
單片機(jī)常用總線講解_第2頁(yè)
單片機(jī)常用總線講解_第3頁(yè)
單片機(jī)常用總線講解_第4頁(yè)
單片機(jī)常用總線講解_第5頁(yè)
已閱讀5頁(yè),還剩46頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、精選文檔第8章 單片機(jī)常用總線講解8.1 I2C總線接口80C51單片機(jī)本身不具有I2C總線接口,但是通過軟件進(jìn)行模擬,可以掛接具有I2C接口的芯片。8.1.1 I2C總線的介紹串行擴(kuò)展總線在單片機(jī)系統(tǒng)中的應(yīng)用是目前單片機(jī) 技術(shù)發(fā)展的一種趨勢(shì)。在目前比較流行的幾種串行擴(kuò)展總線中,I2C總線以其嚴(yán)格的規(guī)范和眾多帶I2C接口的外圍器件而獲得廣泛應(yīng)用。I2C總線是PHILIPS公司推出的芯片間串行傳輸總線,它由兩根線組成,一根是串行時(shí)鐘線(SCL),一根是串行數(shù)據(jù)線(SDA)。主控器利用串行時(shí)鐘線發(fā)出時(shí)鐘信號(hào),利用串行數(shù)據(jù)線發(fā)送或接收數(shù)據(jù)。I2C總線由主控器電路引出,凡具有I2C接口的電路(受控器)

2、都可以掛接在I2C總線上,主控器通過I2C總線對(duì)受控器進(jìn)行控制。隨著I2C總線研究的深入,I2C總線已經(jīng)廣泛應(yīng)用于視/音頻領(lǐng)域、IC卡行業(yè)和一些家電產(chǎn)品中,在智能儀器、儀表和工業(yè)測(cè)控領(lǐng)域也越來越多地得到應(yīng)用。8.1.2 I2C總線的特點(diǎn)I2C總線的廣泛應(yīng)用是同它卓越的性能和簡(jiǎn)便的操作方法分不開的。I2C總線的特點(diǎn)主要表現(xiàn)在以下幾個(gè)方面:硬件結(jié)構(gòu)上具有相同的硬件接口界面。I2C總線系統(tǒng)中,任何一個(gè)I2C總線接口的外圍器件,不論其功能差別有多大,都是通過串行數(shù)據(jù)線(SDA)和串行時(shí)鐘線(SCL)連接到I2C總線上。這一特點(diǎn)給用戶在設(shè)計(jì)用用系統(tǒng)中帶來了極大的便利性。用戶不必理解每個(gè)I2C總線接口器件

3、的功能如何,只需將器件的SDA和SCL引腳連到I2C總線上,然后對(duì)該器件模塊進(jìn)行獨(dú)立的電路設(shè)計(jì),從而簡(jiǎn)化了系統(tǒng)設(shè)計(jì)的復(fù)雜性,提高了系統(tǒng)抗干擾的能力。線接口器件地址具有根大的獨(dú)立性。每個(gè)I2C接口芯片具有唯一的器件地址,由于不能發(fā)出串行時(shí)鐘信號(hào)而只能作為從器件使用。各器件之間互不干擾,相互之間不能進(jìn)行通信,各個(gè)器件可以單獨(dú)供電。單片機(jī)與I2C器件之間的通信是通過獨(dú)一無二的器件地址來實(shí)現(xiàn)的。軟件操作的一致性。由于任何器件通過I2C總線與單片機(jī)進(jìn)行數(shù)據(jù)傳送的方式是基本一樣的,這就決定了I2C總線軟件編寫的一致性。PHILIPS公司在推出I2C總線的同時(shí),也為I2C總線制訂了嚴(yán)格的規(guī)范,如:接口的電氣

4、特性、信號(hào)時(shí)片、信號(hào)傳輸?shù)亩x等。規(guī)范的嚴(yán)密性,結(jié)構(gòu)的獨(dú)立性和硬、軟件接口界面的一致性.極大地方便了I2C總線設(shè)計(jì)的模塊化和規(guī)范化,伴隨面來的是用戶在使用I2C總線時(shí)的“傻瓜”化。8.1.3 I2C總線數(shù)據(jù)的傳輸規(guī)則在I2C總線上的數(shù)據(jù)線SDA和時(shí)鐘線SCL都是雙向傳輸線,它們的接口各自通過一個(gè)上拉電阻接到電源正端。當(dāng)總線空閑時(shí),SDA和SCL必須保持高電平。為了使總線上所有電路的輸出能完成一個(gè)線“與”的功能,各接口電路的輸出端必須是開路漏極或開路集電極。進(jìn)行數(shù)據(jù)傳送時(shí).在時(shí)鐘信號(hào)高電平期間.數(shù)據(jù)線上的數(shù)據(jù)必須保持穩(wěn)定;只有時(shí)鐘線上的信號(hào)為低電平期間.數(shù)據(jù)線上的高電平或低電平才允許變化,如圖8

5、.1.1所示。 圖8-1 數(shù)據(jù)的有效性在I2C總線的工作過程中,當(dāng)時(shí)鐘線保持高電平期間,數(shù)據(jù)線由高電平向低電平變化定義為起始信號(hào)(S)。而數(shù)據(jù)線由低電平向高電平的變化定義為一個(gè)終止倌號(hào)(P),如圖8.1.2所示,起始信號(hào)和終止信號(hào)均由主控器產(chǎn)生。 起始條件 停止條件圖8-2 起始和停止條件I2C總線傳送的每一字節(jié)均為8位,但每啟動(dòng)一次總線,傳輸?shù)淖止?jié)數(shù)沒有限制,由主控器發(fā)送時(shí)鐘脈沖及起始信號(hào)、尋址字節(jié)和停止信號(hào),受控器件必須在收到每個(gè)數(shù)據(jù)字節(jié)后做出響應(yīng),在傳送一個(gè)字節(jié)后的第9個(gè)時(shí)鐘脈沖位,受控器輸出低電平作為應(yīng)答信號(hào)。此時(shí).要求發(fā)送器在第9個(gè)時(shí)鐘脈沖位上釋放SDA線,以便受控器演出應(yīng)答信號(hào),將

6、SDA線拉或低電平,表示對(duì)接收數(shù)據(jù)的認(rèn)可,應(yīng)答信號(hào)用或表示.非應(yīng)答信號(hào)用或表示,當(dāng)確認(rèn)后,主控器可通過產(chǎn)生一個(gè)停止信號(hào)來終止總線數(shù)據(jù)傳輸。I2C總線數(shù)據(jù)傳輸示意圖如圖8.1.3所示。起始 地址 讀/寫 應(yīng)答 數(shù)據(jù) 應(yīng)答 數(shù)據(jù) 應(yīng)答 停止信號(hào) 信號(hào) 圖8-3 I2C總線數(shù)據(jù)傳輸示意圖需要說明的是,當(dāng)主控器接收數(shù)據(jù)時(shí),在最后一個(gè)數(shù)據(jù)字節(jié),必須發(fā)送一個(gè)非應(yīng)答位,使受控器釋放SDA線,以便主控器產(chǎn)生一個(gè)停止信號(hào)來終止總線數(shù)據(jù)傳輸。3. I2C總線數(shù)據(jù)的讀寫格式總線上傳送數(shù)據(jù)的格式是指為被傳送的各項(xiàng)有用數(shù)據(jù)安排的先后順序,這種格式是人們根據(jù)串行通信的特點(diǎn),傳送數(shù)據(jù)的有效性、準(zhǔn)確性和可靠性而制定的。另外,

7、總線上數(shù)據(jù)的傳送還是雙向的,也就是說主控器在指令操縱下,既能向受控器發(fā)送數(shù)據(jù)(寫入),也能接收受控器中某寄存器中存放的數(shù)據(jù)(讀取).所以傳送數(shù)據(jù)的格式有“寫格式”與“讀格式”之分。(1)寫格式I2C總線數(shù)據(jù)的寫格式如圖8-4所示圖8-4 I2C總線數(shù)據(jù)的寫格式 寫格式是指主控器向受控器發(fā)送數(shù)據(jù),工作過程是:先由主控器發(fā)出啟動(dòng)信號(hào)(S),隨后傳送一個(gè)帶讀/寫(R/)標(biāo)記的從地址(SLAVE ADD)字節(jié),從地址只有7bit長(zhǎng),第8位是讀/寫位(R/),用來確定數(shù)據(jù)傳送的方向,對(duì)于寫格式,R/應(yīng)為“0”,表示主控器將發(fā)送數(shù)據(jù)給受控器,接著傳送第二個(gè)字節(jié),即從地址的子地址(SUB ADD),若受控器

8、有多字節(jié)的控制項(xiàng)目,該子地址是指首(第一個(gè))地址,因?yàn)樽拥刂吩谑芸仄髦卸际前错樞蚓幹频?這就便于某受控器的數(shù)據(jù)一次傳送完畢;接著才是若干字節(jié)的控制數(shù)據(jù)的傳送,每傳送一個(gè)字節(jié)的地址或數(shù)據(jù)后的第9位是受控器的應(yīng)答信號(hào),數(shù)據(jù)傳送的順序要靠主控器中程序的支持才能實(shí)現(xiàn),數(shù)據(jù)發(fā)送完畢后,由主控器發(fā)出停止信號(hào)(P)。(2)讀格式 讀格式如圖8.1.5所示。與寫格式不同,讀格式首先要找到讀取數(shù)據(jù)的受控器的地址,包括從地址和子地址,所以格式中在啟動(dòng)讀之前,用寫格式發(fā)送受控器,再啟動(dòng)讀格式,不過前3個(gè)應(yīng)答信號(hào)因?yàn)槭侵赶蚴芸仄?所以應(yīng)由受控器發(fā)出;然后,所有數(shù)據(jù)字節(jié)的應(yīng)答信號(hào)因?yàn)槭侵赶蛑骺刂破?因此由主控器發(fā)出。不

9、過最后的A=1。圖8-5 受控器向主控器發(fā)送數(shù)據(jù)(讀格式)重點(diǎn)提示 在設(shè)置眾多受控器中,為了將控制數(shù)據(jù)可靠地傳逆給指定的受控IC,必須使每一塊IC編制一個(gè)地址碼,通常稱為從地址,顯然從地址不能在不同的IC間重復(fù)使用。主控器發(fā)送尋址字節(jié)時(shí),總線上所有受控器都將尋址字節(jié)中的7位地址與自己的從地址相比較,如果兩者相同,則該器件就是被尋址的受控器(從器件),受控器內(nèi)部的n個(gè)數(shù)據(jù)地址(子地址)的首地址由子地址數(shù)據(jù)字節(jié)指出, I2C總線接口內(nèi)部具有子地址指針自動(dòng)加1功能,所以主控器不必一一發(fā)送n個(gè)數(shù)據(jù)字節(jié)的子地址。4.單片機(jī)模擬I2C總線通信 單片機(jī)在模擬I2C總線通信時(shí),需寫出如下幾個(gè)關(guān)鍵部分的程序:總

10、線初始化、啟動(dòng)信號(hào)、應(yīng)答信號(hào)、停止信號(hào)、寫個(gè)字節(jié)、讀個(gè)字節(jié)。下面分別給出具體函數(shù)的寫法供大家參考,在閱讀代碼時(shí)請(qǐng)參考前面相關(guān)部分的文字描述及時(shí)序圖。(1) 總線初始化void int() /將總線都拉高以釋放總線 SCL=1; delay(); SDA=1; delay();(2) 啟動(dòng)信號(hào)void start() /SCL在高電平期間,SDA一個(gè)下降沿啟動(dòng)信號(hào)。 SDA=1; delay(); SCL=1; delay(); SDA=0; delay();(3) 應(yīng)答信號(hào)void respons() uchar i=0; SCL=1; delay(); while(SDA=1)&&a

11、mp;(i<255) i+; SCL=0; delay();SCL在高電平期間,SDA被從設(shè)備拉為低電平表示應(yīng)答。上面代碼中有一個(gè)(SDA=1)和(i<255)相與的關(guān)系,表示若在一段時(shí)間內(nèi)沒有收到從器件的應(yīng)答則主器件默認(rèn)從器件已經(jīng)收到數(shù)據(jù)而不在等待應(yīng)答信號(hào),這一點(diǎn)是作者后加的一步,大家可不必深究,因?yàn)槿绻患舆@個(gè)延時(shí)退出,一旦從器件沒有發(fā)送應(yīng)答信號(hào),程序?qū)⒂肋h(yuǎn)停止在這里,而真正的程序中是不允許這樣的情況發(fā)生的。(4) 停止信號(hào)void stop() /SCL在高電平期間,SDA一個(gè)上升沿停止信號(hào)。 SDA=0; delay(); SCL=1; delay(); SDA=1; de

12、lay();(5) 寫一個(gè)字節(jié)void writebyte(uchar date) uchar i,temp; temp=date; for(i=0;i<8;i+) Temp=temp<<1; SCL=0; delay(); SDA=CY; delay(); SCL=1; delay();SCL=0;delay();SDA=1;delay();串行發(fā)送一個(gè)字節(jié)時(shí),需要把這個(gè)字節(jié)中的8位一位一位地發(fā)出去,“Temp=temp<<1;”表示將temp左移位,最高位將移入PSW寄存器的CY位中,然后將CY賦給SDA進(jìn)而在SCL的控制下發(fā)送出去。(6) 讀一個(gè)字節(jié)ucha

13、r readbyte() uchar i,k; SCL=0; delay(); SDA=1; for(i=0;i<8;i+) SCL=1; delay(); k=(k<<1)|SDA; SCL=0; delay();delay();return k;同樣的,串行接收個(gè)字節(jié)時(shí)需將8位一位一位地接收,然后再組合成一個(gè)字節(jié),上面代碼中我們定義了一個(gè)臨時(shí)變量k,將k左移一位后與SDA進(jìn)行“或運(yùn)算,依次把8個(gè)獨(dú)立的位放入一個(gè)字節(jié)中來完成接收。8.1.4 I2C總線實(shí)例應(yīng)用(AT24C02)具有I2C總線接口的E2PROM有多個(gè)廠家的多種類型產(chǎn)品。在此僅介紹ATMEL公司生產(chǎn)的AT24C

14、系列E2PROM。主要型號(hào)有AT24C01/02/04/08/16等,其對(duì)應(yīng)的存儲(chǔ)容量分別為128x8/256x8/521x8/1024x8/2048x8。采用這類芯片可解決掉電數(shù)據(jù)保存問題,可對(duì)所存數(shù)據(jù)保存100年.并可多次擦寫,擦寫次數(shù)可達(dá)10萬次以上。在一些應(yīng)用系統(tǒng)設(shè)計(jì)中,有時(shí)需要對(duì)工作數(shù)據(jù)進(jìn)行掉電保護(hù),如電子式電能表等智能化產(chǎn)品。若采用普通存儲(chǔ)器,在掉電時(shí)需要備引電池供電,并需要在硬件上增加掉電檢測(cè)電路。但存在電池不可靠及擴(kuò)展存儲(chǔ)芯片占用單片機(jī)過多口線的缺點(diǎn)。采用具有I2C總線接口的串行E2PROM器件可很好地解決掉電數(shù)據(jù)保存問題,且硬件電路簡(jiǎn)單。下面以AT24C02芯片為例,介紹具有

15、I2C總線接口的E2PROM的具體應(yīng)用。AT24C02芯片的常用封裝形式有直插(DIP8)式和貼片(SO-8)式兩種,實(shí)物圖分別如圖8.1.6和圖8.1.7所示。 圖8-6直插式AT24C02 圖8-7 貼片式AT24C02無論是直插式還是貼片式,其引腳功能與序號(hào)都一樣,引腳圖如圖8.1.8所示。 圖8-8 AT24C02引腳圖各引腳功能如下:1,2,3,(A0、A1、A2)可編程地址輸入端。4(GND)電源地。5(SDA)串行數(shù)據(jù)輸入/輸出端。6(SCL)串行時(shí)鐘輸入端。7(WP)寫保護(hù)輸入端,用于硬件數(shù)據(jù)保護(hù)。當(dāng)其為低電平時(shí),可以對(duì)整個(gè)存儲(chǔ)器進(jìn)行正常的讀/寫操作;當(dāng)其為高電平時(shí),存儲(chǔ)器具有

16、寫保護(hù)功能,但讀操作不受影響。8(Vcc)電源正端。2.存儲(chǔ)結(jié)構(gòu)與尋址AT24C02的存儲(chǔ)容量為2KB,內(nèi)部分成32頁(yè),每頁(yè)8B,共2S6B,操作時(shí)有兩種尋址方式;芯片尋址和片內(nèi)子地址尋址。(1)芯片尋址。AT24C02的芯片地址為1010,其地址控制字格式為1010A2A1A0R/W。其中A2,A1,A0為可編程地址選擇位。A2,A1,A0引腳接高、低電平后得到確定的三位編碼,與1010形成7位編碼,即為該器件的地址碼。R/為芯片讀寫控制位,該位為0,表示對(duì)芯片進(jìn)行寫操作;該位為1,表示對(duì)芯片進(jìn)行讀操作。(2)片內(nèi)子地址尋址。芯片尋址可對(duì)內(nèi)部256B中的任一個(gè)進(jìn)行讀/寫操作,其尋址范圍為00

17、FF,共256個(gè)尋址單元。3.讀/寫操作時(shí)序串行E2PROM一般有兩種寫入方式:一種是字節(jié)寫入方式,另一種是頁(yè)寫入方式。頁(yè)寫入方式允許在一個(gè)寫周期內(nèi)(10ms左右)對(duì)一個(gè)字節(jié)到一頁(yè)的若干字節(jié)進(jìn)行編程寫入,AT24C02的頁(yè)面人小為8B。采用頁(yè)寫方式可提高寫入效率,但也容易發(fā)生事故。AT24C系列片內(nèi)地址在接收到每個(gè)數(shù)據(jù)字節(jié)后自動(dòng)加1,故裝載頃以內(nèi)數(shù)據(jù)字節(jié)時(shí),只需輸入首地址,如果寫到此頁(yè)的最后個(gè)字節(jié),主器件繼續(xù)發(fā)送數(shù)據(jù),數(shù)據(jù)將重新從該頁(yè)的首地址寫入,進(jìn)而造成原來的數(shù)據(jù)丟失,這就是頁(yè)地址空間的“上卷”現(xiàn)象。解決“上卷”的方法是:在第8個(gè)數(shù)據(jù)后將地址強(qiáng)制加1,或是將下一頁(yè)的旨地址重新賦給寄存器。(1

18、)字節(jié)寫入方式。單片機(jī)在次數(shù)據(jù)幀巾只訪問E2PROM一個(gè)單元。該方式下,單片機(jī)先發(fā)送啟動(dòng)信號(hào),然后送個(gè)字節(jié)的控制字,再送一個(gè)字節(jié)的存儲(chǔ)器單元子地址,上述幾個(gè)寧節(jié)都得到E2PROM響應(yīng)后,再發(fā)送8位數(shù)據(jù),最后發(fā)送1位停止信號(hào)。發(fā)送格式如圖8.1.9所示。 圖8-9字節(jié)寫入方式發(fā)送格式(2)頁(yè)寫入方式。單片機(jī)在一個(gè)數(shù)據(jù)與周期內(nèi)可以連續(xù)訪問1頁(yè)(8個(gè)) E2PROM存儲(chǔ)單元。在該方式中,單片機(jī)先發(fā)送啟動(dòng)信號(hào),接著送個(gè)字節(jié)的控制字,再送1個(gè)字節(jié)的存儲(chǔ)器起始單元地址,上述幾個(gè)字節(jié)都得到E2PROM應(yīng)答后就可以發(fā)送最多1頁(yè)的數(shù)據(jù),并順序存放在以指定起始地址開始的相繼單元中,最后以停止信號(hào)結(jié)束。頁(yè)寫入幀格式

19、如圖8.1.10所示。 圖8-10頁(yè)寫入幀格式(3)指定地址讀操作。讀指定地址單元的數(shù)據(jù)。單片機(jī)在啟動(dòng)信號(hào)后先發(fā)送含有片選地址的寫操作控制字, E2PROM應(yīng)答后再發(fā)送1個(gè)(2KB以內(nèi)的E2PROM)字節(jié)的指定單元的地址, E2PROM應(yīng)答后再發(fā)送1含有片選地址的讀操作控制字,此時(shí)如果E2PROM做出應(yīng)答,被訪問單元的數(shù)據(jù)就會(huì)按SCL信號(hào)同步出現(xiàn)在串行數(shù)據(jù)/地址線SDA上。這種讀操作的數(shù)據(jù)幀格式如叫8.1.11所示。 圖8-11指定地址讀操作數(shù)據(jù)幀格式(4)指定地址連續(xù)讀。此種方式的讀地址控制與前面指定地址讀相同。單片機(jī)接收到每個(gè)字節(jié)數(shù)據(jù)后應(yīng)做出應(yīng)答,只要E2PROM檢測(cè)到應(yīng)答信號(hào),其內(nèi)部的地

20、址寄存器就自動(dòng)加1指向下一單元,并順序?qū)⒅赶虻膯卧臄?shù)據(jù)送到SDA串行數(shù)據(jù)線上。當(dāng)需要結(jié)束讀操作時(shí),單片機(jī)接收到數(shù)據(jù)后在需要應(yīng)答的時(shí)刻發(fā)送一個(gè)非應(yīng)答信號(hào),接著再發(fā)送一個(gè)停止信號(hào)即可。這種讀操作的數(shù)據(jù)幀格式如圖8.1.12所示。 圖8-12指定地址連續(xù)讀數(shù)據(jù)幀格式4.TX-1C實(shí)驗(yàn)板上AT24C02連接圖。TX-1C實(shí)驗(yàn)板上AT24C02與單片機(jī)連接如圖8.1.13所示,其中A0,A1,A2與WP都接地,SDA接單片機(jī)P2.0腳,SCL接單片機(jī)P2.1腳,SDA與SCL分別與Vcc之 間接一10k上拉電阻,因?yàn)锳T24C02總線內(nèi)部是漏極開路形式,不接上拉電阻無法確定總線空隊(duì)列的電平狀

21、態(tài)。圖8-13 TX-1實(shí)驗(yàn)板上AT24C02連接圖例:用C語言編寫程序,在TX1C實(shí)驗(yàn)板上實(shí)現(xiàn)如下功能:利用定時(shí)器產(chǎn)生一個(gè)099秒變化的秒表,并且顯示在數(shù)碼管上,每過一秒將這個(gè)變化的數(shù)寫入板上AT24C02內(nèi)部。當(dāng)關(guān)閉實(shí)驗(yàn)板電源,并再次打開實(shí)驗(yàn)板電源時(shí),單片機(jī)先從ATZ4C02中將原來寫入的數(shù)讀取出來,接著此數(shù)繼續(xù)變化并顯示在數(shù)碼管上。通過本實(shí)驗(yàn)可以看到,若向AT24C02中成功寫入,并且成功讀取則數(shù)碼管上顯示的數(shù)會(huì)接著關(guān)閉實(shí)驗(yàn)板時(shí)的數(shù)繼續(xù)顯示,否則有可能顯示亂碼。新建文件part2.6_1.c.程序代碼如下:#include<reg52.h>#define uchar unsi

22、gned char#define uint unsigned intbit write=0; /寫24C02的標(biāo)志;sbit sda=P20;sbit scl=P21;sbit dula=P26;sbit wela=P27;uchar sec,tcnt;uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;void delay();void delay1m(uint z) uint x,y; for(x=z;x>0;x-) for(y=110;y&g

23、t;0;y-);void start() /開始信號(hào) sda=1; delay(); scl=1; delay(); sda=0; delay();Void stop() /停止 sda=0; delay(); scl=1; delay(); sda=1; delay();Void respons() /應(yīng)答 uchar i; scl=1; delay(); while(sda=1)&&(i<255) i+; scl=0; delay();Void int() /將總線都拉高以釋放總線 scl=1; delay(); sda=1; delay();void write_b

24、yte(uchar date) uchar i,temp; temp=date; for(i=0;i<8;i+) Temp=temp<<1; scl=0; delay(); sda=CY; delay(); scl=1; delay();scl=0;delay();sda=1;delay();uchar read_byte() uchar i,k; scl=0; delay(); sda=1; for(i=0;i<8;i+) scl=1; delay(); k=(k<<1)|sda; scl=0; delay();delay();return k; void

25、 write_add(uchar sddress,uchar date) start(); write_byte(0xa0); respons(); write_byte(address); respons(); write_byte(date); respons(); stop();uchar read_add(uchar sddress) uchar date;start(); write_byte(0xa0); respons(); write_byte(address); respons(); start(); write_byte(0xa1); respons(); date=rea

26、d_byte(); stop(); return date;void display(uchar bai_c,uchar sh_c) /顯示程序 dula=0; P0=tablebai_c; /顯示第一位 duan=1; duan=0; wela=0; P0=0x7e; wela=1; wela=0; delay1ms(5); dula=0; P0=tablesh_c; /顯示第二位 dula=1; dula=0; wela=0; P0=0x7d; wela=1; wela=0; delay1ms(5);void main() init(); sec=read_add(2); if(sec&g

27、t;100) sec=0; TMOD=0x01; /定時(shí)器工作在方式1 ET0=1; EA=1; TH0=(65536-50000)/256; /對(duì)TH0 TL0賦值 TL0=(65536-50000)%256; /使定時(shí)器0.05秒中斷一次 TR0=1; while(1) display(sec/10,sce%10); if(write=1) write=0; /清0 write_add(2,sec); /在24c02的地址2中寫入數(shù)據(jù)secvoid t0() interrupt 1 /定時(shí)中斷服務(wù)函數(shù) TH0=(65536-50000)/256; /對(duì)TH0 TL0賦值 TL0=(6553

28、6-50000)%256; /對(duì)裝計(jì)數(shù)初值 tcnt+; /每過50ms tcnt加一 if(tcnt=20) /計(jì)滿20次(1秒)時(shí) tcnt=0; /重新再計(jì) sec+; write=1; /1秒寫一次24C02 if(sce=100) /定時(shí)100秒,再?gòu)牧汩_始計(jì)時(shí) sec=0;分析如下:(1)“void delay();”是個(gè)微秒級(jí)延時(shí)函數(shù),以前編寫的延時(shí)函數(shù)內(nèi)部都是用變量遞增或是遞減來實(shí)現(xiàn)延時(shí),而這個(gè)函數(shù)是用空語句來實(shí)現(xiàn)短時(shí)間延時(shí)的,在Keil軟件中設(shè)置晶振為11.0592MHz時(shí),該延時(shí)函數(shù)延時(shí)人概45微秒,用來操作I2C總線時(shí)用。(2)“void write_add(uchar

29、sddress,uchar date)”和“uchar read_add(uchar sddress)”兩個(gè)函數(shù)分別實(shí)現(xiàn)向AT24CO2的任地址寫字節(jié)的數(shù)據(jù)和從AT24CO2中任一地址讀取字節(jié)數(shù)據(jù)的功能,函數(shù)操作步驟完全遵循前面講解的操作原理,請(qǐng)人家參考對(duì)照。(3) sec=read_add(2); /讀出保存的數(shù)據(jù)賦給secif(sec>100) /以防止首次讀取出錯(cuò)誤數(shù)據(jù) sec=0;在主程序的開始處先讀取上次寫入AT24C02的數(shù)據(jù),下面兩句是為了防止第一次操作AT24C02時(shí)出現(xiàn)意外而加的,若是全新的AT24C02芯片或是以前已經(jīng)被別人寫過的不知道是什么內(nèi)容的芯片,首次上電后讀出

30、來的數(shù)據(jù)我們無法知道,若是大于100的數(shù)將無法在數(shù)碼管上顯示向造成亂碼,若是100以內(nèi)的數(shù)還好處理。人家可自行修改程序使錯(cuò)誤出現(xiàn),再嘗試修改程序看能否將錯(cuò)誤排除。實(shí)例演示實(shí)際現(xiàn)象如圖8.1.14所示。 圖8-14 實(shí)際現(xiàn)象效果圖8.2 SPI總線接口8.2.1 SPI總線的介紹     SPI, Serial Perripheral Interface, 串行外圍設(shè)備接口, 是 Motorola 公司推出的一種同步串行接口技術(shù). SPI 總線在物理上是通過接在外圍設(shè)備微控制器(PICmicro) 上面的微處理控制單元 (MCU) 上叫作同步串行端口(Sy

31、nchronous Serial Port) 的模塊(Module)來實(shí)現(xiàn)的, 它允許 MCU 以全雙工的同步串行方式, 與各種外圍設(shè)備進(jìn)行高速數(shù)據(jù)通信.     SPI 主要應(yīng)用在 EEPROM, Flash, 實(shí)時(shí)時(shí)鐘(RTC), 數(shù)模轉(zhuǎn)換器(ADC), 數(shù)字信號(hào)處理器(DSP) 以及數(shù)字信號(hào)解碼器之間. 它在芯片中只占用四根管腳 (Pin) 用來控制以及數(shù)據(jù)傳輸, 節(jié)約了芯片的 pin 數(shù)目, 同時(shí)為 PCB 在布局上節(jié)省了空間. 正是出于這種簡(jiǎn)單易用的特性, 現(xiàn)在越來越多的芯片上都集成了 SPI技術(shù).8.2.2 SPI總線實(shí)例應(yīng)用(DS1302)

32、DS1302簡(jiǎn)介:DS1302是美國(guó)DALLAS公司推出的一種高性能、低功耗的實(shí)時(shí)時(shí)鐘芯片,附加31字節(jié)靜態(tài)RAM,采用SPI三線接口與CPU進(jìn)行同步通信,并可采用突發(fā)方式一次傳送多個(gè)字節(jié)的時(shí)鐘信號(hào)和RAM數(shù)據(jù)。實(shí)時(shí)時(shí)鐘可提供秒、分、時(shí)、日、星期、月和年,一個(gè)月小與31天時(shí)可以自動(dòng)調(diào)整,且具有閏年補(bǔ)償功能。引腳及其功能結(jié)構(gòu)如圖8.3.1所示圖8-15 DS1302外部引腳分配DS1302的引腳排列,其中Vcc1為后備電源,VCC2為主電源。在主電源關(guān)閉的情況下,也能保持時(shí)鐘的連續(xù)運(yùn)行。DS1302由Vcc1或Vcc2兩者中的較大者供電。當(dāng)Vcc2大于Vcc1+0.2V時(shí),Vcc2給DS1302

33、供電。當(dāng)Vcc2小于Vcc1時(shí),DS1302由Vcc1供電。 X1和X2是振蕩源,外接32.768kHz晶振。 CE:輸入信號(hào),在讀、寫數(shù)據(jù)期間,必須為高。該引腳有兩個(gè)功能:第一,CE開始控制字訪問為寄存器的控制邏輯;其次,CE提供結(jié)束單字節(jié)或多字節(jié)數(shù)據(jù)傳輸?shù)姆椒?。I/O:串行數(shù)據(jù)輸入輸出端(雙向),后面有詳細(xì)說明。 SCLK:時(shí)鐘輸入端。命令字節(jié)每一數(shù)據(jù)傳送都需要由命令字節(jié)初始化。命令字節(jié)的最高位(位7)必須為1;位6為0表示對(duì)時(shí)鐘數(shù)據(jù)操作,為1表示對(duì)RAM數(shù)據(jù)操作;位15指定讀寫操作的寄存器;位0為0表示寫操作,位1表示讀操作;命令字節(jié)總是從最低有效位開始傳送的。命令字節(jié)格式如下: 圖8-

34、16 控制字(即地址及命令字節(jié))芯片復(fù)位與時(shí)鐘控制CE復(fù)位引腳有兩種功能:CE引腳接通控制邏輯,允許地址/命令序列送入移位寄存器;CE引腳可以終止單字節(jié)或多字節(jié)數(shù)據(jù)的傳送。當(dāng)CE為高電平時(shí),所有的數(shù)據(jù)傳送被初始化,允許對(duì)DS1302進(jìn)行操作。時(shí)鐘周期是下降沿跟隨上升沿的序列,對(duì)于數(shù)據(jù)輸入,則在時(shí)鐘上升沿時(shí)數(shù)據(jù)必須有效,輸出數(shù)據(jù)時(shí),數(shù)據(jù)在時(shí)鐘的下降沿輸出。如果在傳送過程中將CE引腳置為低電平,則會(huì)終止此次數(shù)據(jù)傳送,使I/O引腳變?yōu)楦咦钁B(tài)。上電運(yùn)行時(shí),在VCC2.0V之前,CE必須保持低電平。只有在SCLK為低電平時(shí),才能將CE置為高電平。讀數(shù)據(jù)/寫數(shù)據(jù)如圖8.2.3和圖8.2.4 圖8-17 單

35、字節(jié)讀 圖8-18 單字節(jié)寫數(shù)據(jù)輸入 緊跟寫命令字節(jié)的8個(gè)SCLK之后的8個(gè)SCLK周期的上升沿,將數(shù)據(jù)寫入DS1302,數(shù)據(jù)從低位開始寫入。數(shù)據(jù)輸出 緊跟寫命令字節(jié)的8個(gè)SCLK之后的8個(gè)SCLK周期的下降沿,將數(shù)據(jù)從DS1302輸出。輸出的第一個(gè)數(shù)據(jù)位出現(xiàn)在寫命令字節(jié)的最后一位后的第1個(gè)下降沿。多字節(jié)方式讀寫 通過對(duì)地址31尋址(地址命令位15全為1),則可以對(duì)時(shí)鐘和RAM寄存器實(shí)現(xiàn)多字節(jié)讀寫操作,又稱為突發(fā)模式。同樣,地址命令位6選擇時(shí)鐘或RAM,而位0選擇讀或?qū)?。再多字?jié)操作方式下,不能操作地址為931的時(shí)鐘寄存器,也不能操作地址為31的RAM寄存器。在多字節(jié)讀寫操作中,從地址0的0位

36、開始。時(shí)鐘時(shí)間與日期可以通過讀DS1302的某些字節(jié)得到。通過寫某些寄存器字節(jié)可以設(shè)置時(shí)間和日期,這些寄存器如表8-1所示。 表8-1 DS1302寄存器表中每個(gè)寄存器都有讀地址與寫地址,前七個(gè)寄存器為:秒、分、小時(shí)、日期、月、星期、年,隨后是寫保護(hù)寄存器和充電保護(hù)寄存器。時(shí)間和日期以BCD格式保存。小時(shí)寄存器的第7位為1,為12小時(shí)模式;位5顯示AM/PM,當(dāng)位5為1時(shí),表示PM,為0時(shí),表示AM。位7為0時(shí)是24小時(shí)模式,這時(shí)位5是小時(shí)的最高位。秒寄存器的第7位為始終暫停位(CH),該位為1時(shí),時(shí)鐘停止,DS1302處于低功耗狀態(tài),消耗電流為100nA;該位為0時(shí),啟動(dòng)時(shí)鐘??刂萍拇嫫鞯牡?/p>

37、7位(WP)是寫保護(hù)位,該位為0才能進(jìn)行寫時(shí)鐘與RAM寄存器操作;為1時(shí),阻止寫操作。上電后該位狀態(tài)不定,所以在寫操作前應(yīng)該先清除該位。一些參數(shù) 表8-2 DS1302參數(shù)時(shí)序圖讀數(shù)據(jù)與寫數(shù)據(jù)時(shí)CE、SCLK和I/O之間的時(shí)序圖8-19如圖8-19與圖8-20所示。圖中的時(shí)間參數(shù)如表8-3所示。由表8-3可以看出,芯片工作在5V,最小時(shí)間中最大的時(shí)間長(zhǎng)度都小于1s,也就是說只要時(shí)間大于1s,就可以滿足DS1302芯片的動(dòng)作要求。例如,tcc時(shí)間,在CE跳到高電平之后,SCLK應(yīng)該在1s后才能跳到高電平。因此對(duì)已工作在11.0592MHz的51單片機(jī),其每條指令的執(zhí)行時(shí)間大于1s。若第一條指令使

38、CE跳到高電平,第二條指令使SCLK上跳到高電平,則間隔時(shí)間為1s,因此可以滿足時(shí)序要求。表8-3 時(shí)間參數(shù)(條件:VCC=5V)參數(shù)參數(shù)值數(shù)據(jù)與CLK建立tDC最小50ns時(shí)鐘與數(shù)據(jù)保持tCDH最小70ns時(shí)鐘與數(shù)據(jù)延時(shí) tCDD最大200s時(shí)鐘低電平tCL最小250ns時(shí)鐘高電平tCH最小250ns時(shí)鐘頻率tCLK直流 最大2MHz時(shí)鐘上升與下降tR,tF最大500nsCE與CLK建立tCC最小1sCLK與CE保持tCCH最小60nsCE無效時(shí)間tCWH最小1sCE與I/O高阻tCDZ最大70nsSCLK與I/O高阻tCCZ最大70ns 圖8-19 讀數(shù)據(jù)時(shí)CE、SCLK、和I/O之間的時(shí)

39、序圖 圖8-20 寫數(shù)據(jù)時(shí)CE、SCLK和I/O之間的時(shí)序圖一些經(jīng)典程序從DS1302讀出一個(gè)字節(jié)數(shù)據(jù)的51單片機(jī)程序sclk=0; /使sclk為低電平ce=0; /使ce為低電平ce=1; /ce信號(hào)上跳,到此DS1302已經(jīng)準(zhǔn)備好接收數(shù)據(jù)i/o=a0; /將輸出的命令a0送上i/o數(shù)據(jù)線sclk=1; / sclk信號(hào)上跳sclk=0; /返回低電平,為下次上跳做準(zhǔn)備i/o=a1; /將輸出的命令a1送上i/o數(shù)據(jù)線sclk=1; / sclk信號(hào)上跳sclk=0; /返回低電平,為下次上跳做準(zhǔn)備.i/o=a7; /直到命令最后一位sclk=1; / sclk信號(hào)上跳,到此為止,命令字節(jié)

40、發(fā)送完畢 /以下為讀數(shù)據(jù)操作sclk=0; / sclk信號(hào)下跳,使DS1302的數(shù)據(jù)送上i/o線clock_dat=1; /準(zhǔn)雙向口設(shè)置為輸出a0=i/o; /從i/o數(shù)據(jù)線上接收數(shù)據(jù)a0sclk=1; /為下次下跳做準(zhǔn)備sclk=0; /下跳,使DS1302輸出數(shù)據(jù)a1=i/o; /接收數(shù)據(jù).sclk=1; sclk=0;a7=i/o; /接收最后一位數(shù)據(jù)a7ce=0; /一次讀操作完畢sclk=1;向DS1302寫入一個(gè)字節(jié)數(shù)據(jù)的51單片機(jī)程序sclk=0; /使sclk為低電平ce=0; /使ce為低電平ce=1; /ce信號(hào)上跳,到此DS1302已經(jīng)準(zhǔn)備好接收數(shù)據(jù)i/o=a0; /將

41、輸出的命令a0送上i/o數(shù)據(jù)線sclk=1; / sclk信號(hào)上跳sclk=0; /返回低電平,為下次上跳做準(zhǔn)備i/o=a1; /將輸出的命令a1送上i/o數(shù)據(jù)線sclk=1; / sclk信號(hào)上跳sclk=0; /返回低電平,為下次上跳做準(zhǔn)備.i/o=a7; /直到命令最后一位sclk=1; / sclk信號(hào)上跳,到此為止,命令字節(jié)發(fā)送完畢 /以下為寫數(shù)據(jù)操作sclk=0; / sclk信號(hào)下跳,為發(fā)送數(shù)據(jù)做準(zhǔn)備i/o=a0; /將輸出的命令a0送上i/o數(shù)據(jù)線sclk=1; / sclk信號(hào)上跳sclk=0; /返回低電平,為下次上跳做準(zhǔn)備i/o=a1; /將輸出的命令a1送上i/o數(shù)據(jù)線

42、sclk=1; / sclk信號(hào)上跳sclk=0; /返回低電平,為下次上跳做準(zhǔn)備.i/o=a7; /直到寫入命令最后一位sclk=1; / sclk信號(hào)上跳,到此為止,命令字節(jié)發(fā)送完畢sclk=0; / sclk信號(hào)下跳,為下次上跳做準(zhǔn)備ce=0; /結(jié)束一次數(shù)據(jù)寫入操作sclk=1;例:試驗(yàn)數(shù)碼管顯示時(shí)鐘 實(shí)驗(yàn)鏈接圖8-21如下所示: 圖8-21 DS1302與89C2051的連接圖 注意:短路冒一定要接上。通過本例程了解 DS1302時(shí)鐘芯片的基本原理和使用 ,理解并掌握DS1302時(shí)鐘芯片驅(qū)動(dòng)程序的編寫以及實(shí)現(xiàn)數(shù)字字符在數(shù)碼管中的顯示。請(qǐng)學(xué)員認(rèn)真消化本例程,懂DS1302在C語言中的操

43、作 #include<reg52.h> /包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義#include <intrins.h>sbit SCK=P36; /時(shí)鐘sbit SDA=P34; /數(shù)據(jù)sbit RST = P35; / DS1302復(fù)位sbit LS138A=P22; sbit LS138B=P23;sbit LS138C=P24; bit ReadRTC_Flag; /定義讀DS1302標(biāo)志unsigned char l_tmpdate7=0,0,12,15,5,3,8;/秒分時(shí)日月周年08-05-15 12:00:00unsigned c

44、har l_tmpdisplay8;code unsigned char write_rtc_address7=0x80,0x82,0x84,0x86,0x88,0x8a,0x8c; /秒分時(shí)日月周年 最低位讀寫位code unsigned char read_rtc_address7=0x81,0x83,0x85,0x87,0x89,0x8b,0x8d; code unsigned char table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40; /共陰數(shù)碼管 0-9 '-' '熄滅表/*/* 函數(shù)聲明 */*/void Write_Ds1302_byte(unsigned char temp); void Write_Ds1302( unsigned char address,unsigned char dat );unsigned char Read_Ds1302 ( unsigned char address )

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論