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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

8、一個)地址,因為子地址在受控器中都是按順序編制的,這就便于某受控器的數(shù)據(jù)一次傳送完畢;接著才是若干字節(jié)的控制數(shù)據(jù)的傳送,每傳送一個字節(jié)的地址或數(shù)據(jù)后的第9位是受控器的應(yīng)答信號,數(shù)據(jù)傳送的順序要靠主控器中程序的支持才能實現(xiàn),數(shù)據(jù)發(fā)送完畢后,由主控器發(fā)出停止信號(P)。(2)讀格式 讀格式如圖所示。與寫格式不同,讀格式首先要找到讀取數(shù)據(jù)的受控器的地址,包括從地址和子地址,所以格式中在啟動讀之前,用寫格式發(fā)送受控器,再啟動讀格式,不過前3個應(yīng)答信號因為是指向受控器,所以應(yīng)由受控器發(fā)出;然后,所有數(shù)據(jù)字節(jié)的應(yīng)答信號因為是指向主控制器,因此由主控器發(fā)出。不過最后的A=1。圖8-5 受控器向主控器發(fā)送數(shù)據(jù)

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

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

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

12、 uchar i,temp; temp=date; for(i=0;i8;i+) Temp=temp1; SCL=0; delay(); SDA=CY; delay(); SCL=1; delay();SCL=0;delay();SDA=1;delay();串行發(fā)送一個字節(jié)時,需要把這個字節(jié)中的8位一位一位地發(fā)出去,“Temp=temp1;”表示將temp左移位,最高位將移入PSW寄存器的CY位中,然后將CY賦給SDA進而在SCL的控制下發(fā)送出去。(6) 讀一個字節(jié)uchar readbyte() uchar i,k; SCL=0; delay(); SDA=1; for(i=0;i8;i+)

13、 SCL=1; delay(); k=(k1)|SDA; SCL=0; delay();delay();return k;同樣的,串行接收個字節(jié)時需將8位一位一位地接收,然后再組合成一個字節(jié),上面代碼中我們定義了一個臨時變量k,將k左移一位后與SDA進行“或運算,依次把8個獨立的位放入一個字節(jié)中來完成接收。8.1.4 I2C總線實例應(yīng)用(AT24C02)具有I2C總線接口的E2PROM有多個廠家的多種類型產(chǎn)品。在此僅介紹ATMEL公司生產(chǎn)的AT24C系列E2PROM。主要型號有AT24C01/02/04/08/16等,其對應(yīng)的存儲容量分別為128x8/256x8/521x8/1024x8/20

14、48x8。采用這類芯片可解決掉電數(shù)據(jù)保存問題,可對所存數(shù)據(jù)保存100年.并可多次擦寫,擦寫次數(shù)可達10萬次以上。在一些應(yīng)用系統(tǒng)設(shè)計中,有時需要對工作數(shù)據(jù)進行掉電保護,如電子式電能表等智能化產(chǎn)品。若采用普通存儲器,在掉電時需要備引電池供電,并需要在硬件上增加掉電檢測電路。但存在電池不可靠及擴展存儲芯片占用單片機過多口線的缺點。采用具有I2C總線接口的串行E2PROM器件可很好地解決掉電數(shù)據(jù)保存問題,且硬件電路簡單。下面以AT24C02芯片為例,介紹具有I2C總線接口的E2PROM的具體應(yīng)用。AT24C02芯片的常用封裝形式有直插(DIP8)式和貼片(SO-8)式兩種,實物圖分別如圖和圖所示。圖8

15、-6直插式AT24C02 圖8-7 貼片式AT24C02無論是直插式還是貼片式,其引腳功能與序號都一樣,引腳圖如圖所示。圖8-8 AT24C02引腳圖各引腳功能如下:1,2,3,(A0、A1、A2)可編程地址輸入端。4(GND)電源地。5(SDA)串行數(shù)據(jù)輸入/輸出端。6(SCL)串行時鐘輸入端。7(WP)寫保護輸入端,用于硬件數(shù)據(jù)保護。當其為低電平時,可以對整個存儲器進行正常的讀/寫操作;當其為高電平時,存儲器具有寫保護功能,但讀操作不受影響。8(Vcc)電源正端。2.存儲結(jié)構(gòu)與尋址AT24C02的存儲容量為2KB,內(nèi)部分成32頁,每頁8B,共2S6B,操作時有兩種尋址方式;芯片尋址和片內(nèi)子

16、地址尋址。(1)芯片尋址。AT24C02的芯片地址為1010,其地址控制字格式為1010A2A1A0R/W。其中A2,A1,A0為可編程地址選擇位。A2,A1,A0引腳接高、低電平后得到確定的三位編碼,與1010形成7位編碼,即為該器件的地址碼。R/為芯片讀寫控制位,該位為0,表示對芯片進行寫操作;該位為1,表示對芯片進行讀操作。(2)片內(nèi)子地址尋址。芯片尋址可對內(nèi)部256B中的任一個進行讀/寫操作,其尋址范圍為00FF,共256個尋址單元。3.讀/寫操作時序串行E2PROM一般有兩種寫入方式:一種是字節(jié)寫入方式,另一種是頁寫入方式。頁寫入方式允許在一個寫周期內(nèi)(10ms左右)對一個字節(jié)到一頁

17、的若干字節(jié)進行編程寫入,AT24C02的頁面人小為8B。采用頁寫方式可提高寫入效率,但也容易發(fā)生事故。AT24C系列片內(nèi)地址在接收到每個數(shù)據(jù)字節(jié)后自動加1,故裝載頃以內(nèi)數(shù)據(jù)字節(jié)時,只需輸入首地址,如果寫到此頁的最后個字節(jié),主器件繼續(xù)發(fā)送數(shù)據(jù),數(shù)據(jù)將重新從該頁的首地址寫入,進而造成原來的數(shù)據(jù)丟失,這就是頁地址空間的“上卷”現(xiàn)象。解決“上卷”的方法是:在第8個數(shù)據(jù)后將地址強制加1,或是將下一頁的旨地址重新賦給寄存器。(1)字節(jié)寫入方式。單片機在次數(shù)據(jù)幀巾只訪問E2PROM一個單元。該方式下,單片機先發(fā)送啟動信號,然后送個字節(jié)的控制字,再送一個字節(jié)的存儲器單元子地址,上述幾個寧節(jié)都得到E2PROM響

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

19、節(jié)的指定單元的地址, E2PROM應(yīng)答后再發(fā)送1含有片選地址的讀操作控制字,此時如果E2PROM做出應(yīng)答,被訪問單元的數(shù)據(jù)就會按SCL信號同步出現(xiàn)在串行數(shù)據(jù)/地址線SDA上。這種讀操作的數(shù)據(jù)幀格式如叫所示。 圖8-11指定地址讀操作數(shù)據(jù)幀格式(4)指定地址連續(xù)讀。此種方式的讀地址控制與前面指定地址讀相同。單片機接收到每個字節(jié)數(shù)據(jù)后應(yīng)做出應(yīng)答,只要E2PROM檢測到應(yīng)答信號,其內(nèi)部的地址寄存器就自動加1指向下一單元,并順序?qū)⒅赶虻膯卧臄?shù)據(jù)送到SDA串行數(shù)據(jù)線上。當需要結(jié)束讀操作時,單片機接收到數(shù)據(jù)后在需要應(yīng)答的時刻發(fā)送一個非應(yīng)答信號,接著再發(fā)送一個停止信號即可。這種讀操作的數(shù)據(jù)幀格式如圖所示。

20、 圖8-12指定地址連續(xù)讀數(shù)據(jù)幀格式4.TX-1C實驗板上AT24C02連接圖。TX-1C實驗板上AT24C02與單片機連接如圖所示,其中A0,A1,A2與WP都接地,SDA接單片機P2.0腳,SCL接單片機P2.1腳,SDA與SCL分別與Vcc之間接一10k上拉電阻,因為AT24C02總線內(nèi)部是漏極開路形式,不接上拉電阻無法確定總線空隊列的電平狀態(tài)。圖8-13 TX-1實驗板上AT24C02連接圖例:用C語言編寫程序,在TX1C實驗板上實現(xiàn)如下功能:利用定時器產(chǎn)生一個099秒變化的秒表,并且顯示在數(shù)碼管上,每過一秒將這個變化的數(shù)寫入板上AT24C02內(nèi)部。當關(guān)閉實驗板電源,并再次打開實驗板電

21、源時,單片機先從ATZ4C02中將原來寫入的數(shù)讀取出來,接著此數(shù)繼續(xù)變化并顯示在數(shù)碼管上。通過本實驗可以看到,若向AT24C02中成功寫入,并且成功讀取則數(shù)碼管上顯示的數(shù)會接著關(guān)閉實驗板時的數(shù)繼續(xù)顯示,否則有可能顯示亂碼。新建文件.程序代碼如下:#include#define uchar unsigned char#define uint unsigned intbit write=0; /寫24C02的標志;sbit sda=P20;sbit scl=P21;sbit dula=P26;sbit wela=P27;uchar sec,tcnt;uchar code table=0x3f,0x

22、06,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;x0;x-) for(y=110;y0;y-);void start() /開始信號 sda=1; delay(); scl=1; delay(); sda=0; delay();Void stop() /停止 sda=0; delay(); scl=1; delay(); sda=1; delay();Void respons() /應(yīng)答 uch

23、ar i; scl=1; delay(); while(sda=1)&(i255) i+; scl=0; delay();Void int() /將總線都拉高以釋放總線 scl=1; delay(); sda=1; delay();void write_byte(uchar date) uchar i,temp; temp=date; for(i=0;i8;i+) Temp=temp1; scl=0; delay(); sda=CY; delay(); scl=1; delay();scl=0;delay();sda=1;delay();uchar read_byte() uchar i,k;

24、 scl=0; delay(); sda=1; for(i=0;i8;i+) scl=1; delay(); k=(k100) sec=0; TMOD=0x01; /定時器工作在方式1 ET0=1; EA=1; TH0=(65536-50000)/256; /對TH0 TL0賦值 TL0=(65536-50000)%256; /使定時器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

25、 1 /定時中斷服務(wù)函數(shù) TH0=(65536-50000)/256; /對TH0 TL0賦值 TL0=(65536-50000)%256; /對裝計數(shù)初值 tcnt+; /每過50ms tcnt加一 if(tcnt=20) /計滿20次(1秒)時 tcnt=0; /重新再計 sec+; write=1; /1秒寫一次24C02 if(sce=100) /定時100秒,再從零開始計時 sec=0;分析如下:(1)“void delay();”是個微秒級延時函數(shù),以前編寫的延時函數(shù)內(nèi)部都是用變量遞增或是遞減來實現(xiàn)延時,而這個函數(shù)是用空語句來實現(xiàn)短時間延時的,在Keil軟件中設(shè)置晶振為11.059

26、2MHz時,該延時函數(shù)延時人概45微秒,用來操作I2C總線時用。(2)“void write_add(uchar sddress,uchar date)”和“uchar read_add(uchar sddress)”兩個函數(shù)分別實現(xiàn)向AT24CO2的任地址寫字節(jié)的數(shù)據(jù)和從AT24CO2中任一地址讀取字節(jié)數(shù)據(jù)的功能,函數(shù)操作步驟完全遵循前面講解的操作原理,請人家參考對照。(3) sec=read_add(2); /讀出保存的數(shù)據(jù)賦給secif(sec100) /以防止首次讀取出錯誤數(shù)據(jù) sec=0;在主程序的開始處先讀取上次寫入AT24C02的數(shù)據(jù),下面兩句是為了防止第一次操作AT24C02時

27、出現(xiàn)意外而加的,若是全新的AT24C02芯片或是以前已經(jīng)被別人寫過的不知道是什么內(nèi)容的芯片,首次上電后讀出來的數(shù)據(jù)我們無法知道,若是大于100的數(shù)將無法在數(shù)碼管上顯示向造成亂碼,若是100以內(nèi)的數(shù)還好處理。人家可自行修改程序使錯誤出現(xiàn),再嘗試修改程序看能否將錯誤排除。實例演示實際現(xiàn)象如圖所示。 圖8-14 實際現(xiàn)象效果圖8.2 SPI總線接口8.2.1 SPI總線的介紹 SPI, Serial Perripheral Interface, 串行外圍設(shè)備接口, 是 Motorola 公司推出的一種同步串行接口技術(shù). SPI 總線在物理上是通過接在外圍設(shè)備微控制器(PICmicro) 上面的微處理

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

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

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

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

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

33、到。通過寫某些寄存器字節(jié)可以設(shè)置時間和日期,這些寄存器如表8-1所示。 表8-1 DS1302寄存器表中每個寄存器都有讀地址與寫地址,前七個寄存器為:秒、分、小時、日期、月、星期、年,隨后是寫保護寄存器和充電保護寄存器。時間和日期以BCD格式保存。小時寄存器的第7位為1,為12小時模式;位5顯示AM/PM,當位5為1時,表示PM,為0時,表示AM。位7為0時是24小時模式,這時位5是小時的最高位。秒寄存器的第7位為始終暫停位(CH),該位為1時,時鐘停止,DS1302處于低功耗狀態(tài),消耗電流為100nA;該位為0時,啟動時鐘。控制寄存器的第7位(WP)是寫保護位,該位為0才能進行寫時鐘與RAM

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

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

36、時序圖一些經(jīng)典程序從DS1302讀出一個字節(jié)數(shù)據(jù)的51單片機程序sclk=0; /使sclk為低電平ce=0; /使ce為低電平ce=1; /ce信號上跳,到此DS1302已經(jīng)準備好接收數(shù)據(jù)i/o=a0; /將輸出的命令a0送上i/o數(shù)據(jù)線sclk=1; / sclk信號上跳sclk=0; /返回低電平,為下次上跳做準備i/o=a1; /將輸出的命令a1送上i/o數(shù)據(jù)線sclk=1; / sclk信號上跳sclk=0; /返回低電平,為下次上跳做準備.i/o=a7; /直到命令最后一位sclk=1; / sclk信號上跳,到此為止,命令字節(jié)發(fā)送完畢 /以下為讀數(shù)據(jù)操作sclk=0; / scl

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

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

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

40、,頭文件包含特殊功能寄存器的定義#include sbit SCK=P36; /時鐘sbit SDA=P34; /數(shù)據(jù)sbit RST = P35; / DS1302復(fù)位sbit LS138A=P22; sbit LS138B=P23;sbit LS138C=P24; bit ReadRTC_Flag; /定義讀DS1302標志unsigned char l_tmpdate7=0,0,12,15,5,3,8;/秒分時日月周年08-05-15 12:00:00unsigned char l_tmpdisplay8;code unsigned char write_rtc_address7=0x8

41、0,0x82,0x84,0x86,0x88,0x8a,0x8c; /秒分時日月周年 最低位讀寫位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 );void Read_RTC(void);/read RTC void Set_RTC(void);

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論