版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第10章
AT89S51單片機(jī)
系統(tǒng)的串行擴(kuò)展
1單片機(jī)系統(tǒng)擴(kuò)展除并行擴(kuò)展外,串行擴(kuò)展技術(shù)也得到廣泛應(yīng)用。與并行擴(kuò)展比,串口器件與單片機(jī)相連的I/O口線少(僅需1~4條),極大簡化器件間連接,進(jìn)而提高可靠性;串行接口器件體積小,占用電路板空間小,減少電路板空間和成本。除上述優(yōu)點(diǎn)外,還有工作電壓寬、抗干擾能力強(qiáng)、功耗低、數(shù)據(jù)不易丟失等特點(diǎn)。因此,目前串行擴(kuò)展技術(shù)在單片機(jī)系統(tǒng)中已得到廣泛應(yīng)用。常用串行擴(kuò)展接口有I2C(InterInterfaceCircuit,內(nèi)部接口電路)串行總線接口、單總線(1-Wire)接口以及SPI串行外設(shè)接口。2本章介紹上述幾種串行接口總線的工作原理及特點(diǎn),以及串行擴(kuò)展的典型設(shè)計(jì)案例。10.1單總線串行擴(kuò)展
單總線(也稱1-Wirebus)由美國DALLAS公司推出的外圍串行擴(kuò)展總線。只有一條數(shù)據(jù)輸入/輸出線DQ,總線上所有器件都掛在DQ上,電源也通過這條信號線供給。單總線系統(tǒng)中配置的各種器件,由DALLAS公司提供的專用芯片實(shí)現(xiàn)。每個(gè)芯片都有64位ROM,廠家對每一芯片都用激光燒寫編碼,其中存有16位十進(jìn)制編碼序列號,它是器件的地址編號,確保它掛在總線上后,可以唯一被確定。除了器件的地址編碼外,芯片內(nèi)還包含收發(fā)控制和電源存儲電路,見圖11-1。這些芯片耗電量都很?。臻e時(shí)幾μW,工作時(shí)幾mW),工作時(shí)從總線上饋送電能到大電容中就可以工作,故一般不需另加電源。34圖10-1
單總線芯片內(nèi)部結(jié)構(gòu)示意圖10.1.1單總線擴(kuò)展的典型應(yīng)用-DS18B20的溫度測量系統(tǒng)
單總線應(yīng)用典型案例是采用單總線溫度傳感器DS18B20的溫度測量系統(tǒng)。1.單總線溫度傳感器DS18B20簡介
DS18B20是美國DALLAS公司生產(chǎn)的數(shù)字溫度傳感器,體積小、低功耗、抗干擾能力強(qiáng)。可直接將溫度轉(zhuǎn)化成數(shù)字信號傳送給單片機(jī)處理,因而可省去傳統(tǒng)的信號放大、A/D轉(zhuǎn)換等外圍電路。DS18B20測量溫度范圍-55~+128℃,在-10~+85℃范圍內(nèi),測量精度可達(dá)±0.5℃,非常適合于惡劣環(huán)境的現(xiàn)場溫度測量,也可用于各種狹小空間內(nèi)設(shè)備的測溫,如環(huán)境控制、過程監(jiān)測過程監(jiān)測、測溫類消費(fèi)電子產(chǎn)品以及多點(diǎn)溫度測控系統(tǒng)。5圖10-2為單片機(jī)與多個(gè)帶有單總線接口的數(shù)字溫度傳感器DS18B20芯片的分布式溫度監(jiān)測系統(tǒng),圖11-2中多個(gè)DS18B20都掛在單片機(jī)的1根I/O口線(即DQ線)上。單片機(jī)對每個(gè)DS18B20通過總線DQ尋址。DQ為漏極開路,須加上拉電阻。DS18B20的一種封裝形式見圖10-2。除DS18B20外,在該數(shù)字溫度傳感器系列中還有DS1820、DS18S20、DS1822等其他型號,工作原理與特性基本相同。DS18B20每芯片都有唯一64位光刻ROM編碼,它是DS18B20地址序列碼,目的使每個(gè)DS18B20地址都不相同,這樣可實(shí)現(xiàn)在一根總線上掛接多個(gè)DS18B20的目的。圖10-2
單總線構(gòu)成的分布式溫度監(jiān)測系統(tǒng)片內(nèi)有9個(gè)字節(jié)的高速暫存器RAM單元,9個(gè)字節(jié)具體分布如下:第1字節(jié)和第2字節(jié)是在單片機(jī)發(fā)給DS18B20溫度轉(zhuǎn)換命令發(fā)布后,經(jīng)轉(zhuǎn)換所得的溫度值,以兩字節(jié)補(bǔ)碼形式存放其中。一般情況下,用戶多使用第1字節(jié)和第2字節(jié)。單片機(jī)通過單總線可讀得該數(shù)據(jù),讀取時(shí)低位在前,高位在后。第3、4字節(jié)分別是由軟件寫入用戶報(bào)警的上下限值TH和TL。第5個(gè)字節(jié)為配置寄存器,可對其更改DS18B20的測溫分辨率,高速暫存器的第6、7、8字節(jié)未用,為全1。第9字節(jié)是前面所有8個(gè)字節(jié)的CRC碼,用來保證正確通信。片內(nèi)還有1個(gè)E2PROM為TH、TL以及配置寄存器的映像。配置寄存器各位的定義如下:其中,TM位出廠時(shí)已被寫入0,用戶不能改變;低5位都為1;R1和R0用來設(shè)置分辨率。表10-1列出了R1、R0與分辨率和轉(zhuǎn)換時(shí)間的關(guān)系。用戶可通過修改R1、R0位的編碼,獲得合適的分辨率。10由表10-1,DS18B20轉(zhuǎn)換時(shí)間與分辨率有關(guān)。當(dāng)設(shè)定為9位時(shí),轉(zhuǎn)換時(shí)間為93.75ms;設(shè)定10位時(shí),轉(zhuǎn)換時(shí)間為187.5ms;當(dāng)設(shè)定11位時(shí),轉(zhuǎn)換時(shí)間為375ms;當(dāng)設(shè)定為12位時(shí),轉(zhuǎn)換時(shí)間為750ms。表10-2列出了DS18B20溫度轉(zhuǎn)換后所得到的16位轉(zhuǎn)換結(jié)果的典型值。下面介紹溫度轉(zhuǎn)換的計(jì)算方法。當(dāng)DS18B20采集的溫度為+125℃時(shí),輸出為0x07d0,則:實(shí)際溫度=(0x07d0)/16=(0×163+7×162+13×161+0×160)/16=125℃當(dāng)DS18B20采集的溫度為-55℃時(shí),輸出為0xfc90,由于是補(bǔ)碼,則先將11位數(shù)據(jù)取反加1得0x0370,注意符號位不變,也不參加運(yùn)算,則
實(shí)際溫度=(0x0370)/16=(0×163+3×162+7×161+0×160)/16=55℃
注意,負(fù)號則需對采集的溫度進(jìn)行判斷后,再予以顯示。11122.DS18B20的工作時(shí)序DS18B20對工作時(shí)序要求嚴(yán)格,延時(shí)時(shí)間需準(zhǔn)確,否則容易出錯(cuò)。DS18B20的工作時(shí)序包括初始化時(shí)序、寫時(shí)序和讀時(shí)序。(1)初始化時(shí)序,單片機(jī)將數(shù)據(jù)線DQ電平拉低480~960μs后釋放,等待15~60μs,單總線器件即可輸出一持續(xù)60~240μs的低電平,單片機(jī)收到此應(yīng)答后即可進(jìn)行操作。(2)寫時(shí)序,當(dāng)單片機(jī)將數(shù)據(jù)線DQ電平從高拉到低時(shí),產(chǎn)生寫時(shí)序,有寫“0”和寫“1”兩種時(shí)序。寫時(shí)序開始后,DS18B20在15~60μs期間從數(shù)據(jù)線上采樣。如果采樣到低電平,則向DS18B20寫的是“0”;如果采樣到高電平,則向DS18B20寫的是“1”。這兩個(gè)獨(dú)立的時(shí)序間至少需要拉高總線電平1μs的時(shí)間。2.DS18B20的工作時(shí)序工作時(shí)序要求嚴(yán)格,延時(shí)時(shí)間需準(zhǔn)確,否則容易出錯(cuò)。DS18B20的工作時(shí)序包括初始化時(shí)序、寫時(shí)序和讀時(shí)序。(1)初始化時(shí)序,單片機(jī)將數(shù)據(jù)線電平拉低480~960μs后釋放,等待15~60μs,單總線器件即可輸出一持續(xù)60~240μs的低電平,單片機(jī)收到此應(yīng)答后即可進(jìn)行操作。(2)寫時(shí)序,當(dāng)單片機(jī)將數(shù)據(jù)線電平從高拉到低時(shí),產(chǎn)生寫時(shí)序,有寫“0”和寫“1”兩種時(shí)序。寫時(shí)序開始后,DS18B20在15~60μs期間從數(shù)據(jù)線上采樣。如果采樣到低電平,則向DS18B20寫的是“0”;如果采樣到高電平,則向DS18B20寫的是“1”。這兩個(gè)獨(dú)立時(shí)序間至少需拉高總線電平1μs時(shí)間。13(3)讀時(shí)序,當(dāng)單片機(jī)從DS18B20讀取數(shù)據(jù)時(shí),產(chǎn)生讀時(shí)序。此時(shí)單片機(jī)將數(shù)據(jù)線電平從高拉到低使讀時(shí)序被初始化。如果在此后15μs內(nèi),單片機(jī)在數(shù)據(jù)線上采樣到低電平,則從DS18B20讀的是“0”;如果在此后的15μs內(nèi),單片機(jī)在數(shù)據(jù)線上采樣到高電平,則從DS18B20讀的是“1”。3.DS18B20的命令
DS18B20片內(nèi)都有唯一的64位光刻ROM編碼,出廠時(shí)已刻好。它是DS18B20的地址序列碼,目的是使每個(gè)DS18B20的地址都不相同,這樣就可實(shí)現(xiàn)在一根總線上掛接多個(gè)DS18B20的目的。64位光刻ROM的各位定義如下:DS18B20所有命令均為8位長,常用的命令代碼見表10-3。1415表10-3DS18B20的部分命令下面介紹表10-3中命令的用法。當(dāng)主機(jī)需要對多個(gè)單總線上的某一DS18B20進(jìn)行操作時(shí),首先應(yīng)將主機(jī)逐個(gè)與DS18B20掛接,讀出其序列號(33H);然后再將所有的DS18B20掛接到總線上,單片機(jī)發(fā)出匹配ROM命令(55H),緊接著主機(jī)提供的64位序列號之后的操作就是針對該DS18B20的。如果主機(jī)只對一個(gè)DS18B20進(jìn)行操作,就不需要讀取ROM編碼以及匹配ROM編碼,只要用跳過ROM(CCH)命令,就可按表10-4執(zhí)行如下溫度轉(zhuǎn)換和讀取命令。表10-4DS18B20的部分命令10.1.2設(shè)計(jì)案例:單總線DS18B20溫度測量系統(tǒng)
【例10-1】利用DS18B20和LED數(shù)碼管實(shí)現(xiàn)單總線溫度測量系統(tǒng),原理電路見圖11-3。DS18B20測量范圍是?55~128℃。本例只顯示00~99。通過本例讀者應(yīng)掌握DS18B20特性及單片機(jī)I/O實(shí)現(xiàn)單總線協(xié)議的方法。Proteus仿真時(shí),用手動,即用鼠標(biāo)單擊DS18B20圖標(biāo)上的“↑”或“↓”來改變溫度,注意手動調(diào)節(jié)溫度同時(shí),LED數(shù)碼管會顯示出與DS18B20窗口相同的2位溫度數(shù)值。電路中74LS47是BCD-7段譯碼器/驅(qū)動器,用于將單片機(jī)P0口輸出欲顯示的BCD碼轉(zhuǎn)化成相應(yīng)的數(shù)字顯示的段碼,并直接驅(qū)動LED數(shù)碼管顯示。1819圖10-3
單總線DS18B20溫度測量與顯示系統(tǒng)參考程序如下:#include"reg51.h"#include"intrins.h"#defineucharunsignedchar#defineuintunsignedint
#defineoutP0sbitsmg1=out^4;sbitsmg2=out^5;sbitDQ=P3^7;voiddelay5(uchar);voidinit_ds18b20(void);uchar
readbyte(void);voidwritebyte(uchar);uchar
retemp(void);20voidmain(void) //主函數(shù){
uchar
i,temp; delay5(1000); while(1) { temp=retemp();
for(i=0;i<10;i++) //連續(xù)掃描數(shù)碼管10次
{ out=(temp/10)&0x0f; smg1=0; smg2=1; delay5(1000); //延時(shí)5ms out=(temp%10)&0x0f; smg1=1; smg2=0; delay5(1000); //延時(shí)5ms } }}21voiddelay5(ucharn) //函數(shù)功能:延時(shí)5μs { do { _nop_(); _nop_(); _nop_(); n--; }
while(n);}voidinit_ds18b20(void) //函數(shù)功能:18B20初始化{
ucharx=0; DQ=0; delay5(120); DQ=1; delay5(16); delay5(80);}22uchar
readbyte(void) //函數(shù)功能:讀取1字節(jié)數(shù)據(jù){
uchari=0;
uchardate=0; for(i=8;i>0;i--) { DQ=0; delay5(1); DQ=1; //15μs內(nèi)拉釋放總線
date>>=1;
if(DQ) date|=0x80; delay5(11); }
return(date);}23voidwritebyte(uchar
dat) //函數(shù)功能:寫1字節(jié){
uchari=0;
for(i=8;i>0;i--){ DQ=0; DQ=dat&0x01; //寫"1"
在15μs內(nèi)拉低
delay5(12); //寫"0"
拉低60μs DQ=1;
dat>>=1; delay5(5); }}24uchar
retemp(void) //函數(shù)功能:讀取溫度{
uchar
a,b,tt;
uintt; init_ds18b20(); writebyte(0xCC); writebyte(0x44); init_ds18b20(); writebyte(0xCC); writebyte(0xBE); a=readbyte(); b=readbyte(); t=b; t<<=8; t=t|a;
tt=t*0.0625;
return(tt);}25DS18B20體積小、適用電壓范圍寬,是世界上第一片支持“單總線”接口的溫度傳感器?,F(xiàn)場溫度測量直接以“單總線”數(shù)字方式傳輸,大大提高系統(tǒng)抗干擾性。所以單總線系統(tǒng)特別適用于測控點(diǎn)多、分布面廣、環(huán)境惡劣以及狹小空間內(nèi)設(shè)備的測溫以及現(xiàn)場溫度測量,如環(huán)境控制、設(shè)備或過程控制、測溫類消費(fèi)電子產(chǎn)品等。2610.2SPI總線串行擴(kuò)展SPI(SerialPeriperalInterface,串行外設(shè)接口)是Motorola公司推出的一種同步串行外設(shè)接口,允許單片機(jī)與多個(gè)廠家生產(chǎn)的帶有標(biāo)準(zhǔn)SPI接口的外圍設(shè)備直接連接,以串行方式交換信息。10.2.1SPI總線的擴(kuò)展結(jié)構(gòu)SPI外圍串行擴(kuò)展結(jié)構(gòu)見圖10-4。使用4條線:串行時(shí)鐘SCK,主器件輸入/從器件輸出數(shù)據(jù)線MISO,主器件輸出/從器件輸入數(shù)據(jù)線MOSI和從器件選擇線。典型SPI系統(tǒng)是單主器件系統(tǒng),從器件通常是外圍接口器件,如存儲器、I/O接口、A/D、D/A、鍵盤、日歷/時(shí)鐘和顯示驅(qū)動等。2728圖10-4SPI外圍串行擴(kuò)展結(jié)構(gòu)圖單片機(jī)擴(kuò)展多個(gè)外圍器件時(shí),SPI無法通過數(shù)據(jù)線譯碼選擇,故外圍器件都有片選端。在擴(kuò)展單個(gè)SPI器件時(shí),外圍器件的片選端CS*可接地或通過I/O口控制;在擴(kuò)展多個(gè)SPI器件時(shí),單片機(jī)應(yīng)分別通過I/O口線來分時(shí)選通外圍器件。在SPI串行擴(kuò)展系統(tǒng)中,如某一從器件只作輸入(如鍵盤)或只作輸出(如顯示器)時(shí),可省去一條數(shù)據(jù)輸出(MISO)線或一條數(shù)據(jù)輸入(MOSI)線,從而構(gòu)成雙線系統(tǒng)(接地)。SPI系統(tǒng)中單片機(jī)對從器件選通需控制其CS*端,由于省去傳輸時(shí)的地址字節(jié),數(shù)據(jù)傳送軟件十分簡單。但在擴(kuò)展器件較多時(shí),需制較多的從器件CS*端,連線較多。在SPI串行擴(kuò)展系統(tǒng)中,主器件單片機(jī)在啟動一次傳送時(shí),便產(chǎn)生8個(gè)時(shí)鐘,傳給接口芯片作為同步時(shí)鐘,控制數(shù)據(jù)的輸入和輸出。數(shù)據(jù)的傳送格式是高位(MSB)在前,低位(LSB)在后,見圖11-5。數(shù)據(jù)線上輸出數(shù)據(jù)的變化以及輸入數(shù)據(jù)時(shí)的采樣,都取決于SCK。但對不同的外圍芯片,有的可能是SCK的上升沿起作用,有的可能是SCK的下降沿起作用。SPI有較高的數(shù)據(jù)傳輸速度,最高可達(dá)1.05Mbit/s。圖11-5SPI數(shù)據(jù)傳送格式目前世界各芯片公司為廣大用戶提供一系列具有SPI接口的單片機(jī)和外圍接口芯片,例如Motorola公司存儲器MC2814、顯示驅(qū)動器MC14499和MC14489等各種芯片;美國TI公司的8位串行A/D轉(zhuǎn)換器TLC549、12位串行A/D轉(zhuǎn)換器TLC2543等。SPI外圍串行擴(kuò)展系統(tǒng)的從器件要具有SPI接口。主器件是單片機(jī)。目前許多機(jī)型都帶有SPI接口。由于AT89S51不帶有SPI接口,可采用軟件與I/O口結(jié)合來模擬SPI的接口時(shí)序。10.2.2設(shè)計(jì)案例:擴(kuò)展帶有SPI接口的8位串行A/D轉(zhuǎn)換器TLC549下面介紹SPI接口串行擴(kuò)展應(yīng)用案例,AT89S51擴(kuò)展低價(jià)位、高性能的8位A/D轉(zhuǎn)換器TLC549。TLC549是美國TI推出的一種低價(jià)位、高性能的8位
A/D轉(zhuǎn)換器,它以8位開關(guān)電容逐次逼近方法實(shí)現(xiàn)A/D轉(zhuǎn)換,其轉(zhuǎn)換速度小于17μs,最大轉(zhuǎn)換速率為40kHz,內(nèi)部系統(tǒng)時(shí)鐘的典型值為4MHz,電源為3~6V。它能方便地采用SPI串行接口方式與各種單片機(jī)連接,構(gòu)成廉價(jià)的測控應(yīng)用系統(tǒng)。1.TLC549的引腳及功能引腳見圖11-6。圖11-6TLC549的引腳
引腳功能如下:
REF+:正基準(zhǔn)電壓輸入2.5V≤REF+≤Vcc+0.1V。
REF-:負(fù)基準(zhǔn)電壓輸入端,-0.1V≤REF-≤2.5V。且:(REF+)-(REF-)≥1V。
VCC:電源3V≤Vcc≤6V。
GND:地。
CS*:片選端。
DATAOUT:轉(zhuǎn)換結(jié)果數(shù)據(jù)串行輸出端,與TTL電平兼容,輸出時(shí)高位在前。
ANALOGIN:模擬信號輸入端,0≤ANALOGIN≤Vcc,當(dāng)
ANALOGIN≥REF+電壓時(shí),轉(zhuǎn)換結(jié)果為全“1”(0xff),
ANALOGIN≤REF-電壓時(shí),轉(zhuǎn)換結(jié)果為全“0”(0x00)。
I/OCLOCK:外接輸入/輸出時(shí)鐘輸入端,同于同步芯片的輸入輸出操作,無需與芯片內(nèi)部系統(tǒng)時(shí)鐘同步。2.TLC549工作時(shí)序工作時(shí)序見圖11-7。從圖可知:(1)串行數(shù)據(jù)中高位A7先輸出,最后輸出低位A0;(2)在每一次I/OCOLCK高電平期間DATAOUT線上數(shù)據(jù)產(chǎn)生有效輸出,每出現(xiàn)一次I/OCOLCK,DATAOUT線就輸出1位數(shù)據(jù)。一個(gè)周期出現(xiàn)8次I/OCOLCK信號并對應(yīng)8位數(shù)據(jù)輸出;(3)在CS*變?yōu)榈碗娖胶螅罡哂行唬ˋ7)自動置于DATAOUT總線。其余7位(A6~A0)在前7個(gè)I/OCLOCK下降沿由時(shí)鐘同步輸出。B7~B0以同樣方式跟在其后;(4)tsu在片選信號CS*變低后,I/OCOLCK開始正跳變的最小時(shí)間間隔1.4μs;(5)ten是從CS*變低到DATAOUT線上輸出數(shù)據(jù)最小時(shí)間(1.2μs);(6)只要I/OCOLCK變高就可讀取DATAOUT線上數(shù)據(jù);圖11-7TLC549工作時(shí)序(7)只有在CS*端為低時(shí),TLC549才工作;(8)TLC549的A/D轉(zhuǎn)換電路沒有啟動控制端,只要讀取前一次數(shù)據(jù)后馬上就可以開始新的A/D轉(zhuǎn)換。轉(zhuǎn)換完成后就進(jìn)入保持狀態(tài)。TLC549每次轉(zhuǎn)換所需時(shí)間是17μs,它開始于變?yōu)榈碗娖胶驣/OCLOCK的第8個(gè)下降沿,沒有轉(zhuǎn)換完成標(biāo)志信號。當(dāng)CS*變?yōu)榈碗娖胶?,TLC549芯片被選中,同時(shí)前次轉(zhuǎn)換結(jié)果的最高有效位MSB(A7)自DATAOUT端輸出,接著要求從I/OCLOCK端輸入8個(gè)外部時(shí)鐘信號,前7個(gè)I/OCLOCK信號的作用,是配合TLC549輸出前次轉(zhuǎn)換結(jié)果的的A6~A0位,并為本次轉(zhuǎn)換做準(zhǔn)備:在第4個(gè)I/OCLOCK信號由高至低的跳變之后,片內(nèi)采樣/保持電路對輸入模擬量采樣開始,第8個(gè)I/OCLOCK信號的下降沿使片內(nèi)采樣/保持電路進(jìn)入保持狀態(tài)并啟動A/D開始轉(zhuǎn)換。轉(zhuǎn)換時(shí)間為36個(gè)時(shí)鐘周期,最大為17μs。直到A/D轉(zhuǎn)換完成前的這段時(shí)間內(nèi),TLC549的控制邏輯要求:或者CS*保持高電平,或者I/OCLOCK時(shí)鐘端保持36個(gè)系統(tǒng)時(shí)鐘周期低電平。由此可見,在TLC549的I/OCLOCK端輸入8個(gè)外部時(shí)鐘信號期間需要完成以下工作:讀入前次A/D轉(zhuǎn)換結(jié)果;對本次轉(zhuǎn)換的輸入模擬信號采樣并保持;啟動本次轉(zhuǎn)換開始。3.單片機(jī)與TLC549的接口設(shè)計(jì)
【例11-2】單片機(jī)控制串行8位A/D轉(zhuǎn)換器TLC549進(jìn)行A/D轉(zhuǎn)換,原理電路與仿真結(jié)果見圖11-8。由電位計(jì)RV1提供給TLC549模擬量輸入,通過調(diào)節(jié)RV1上的“+”、“?”端,改變輸入電壓值。編寫程序?qū)⒛M電壓量轉(zhuǎn)換成二進(jìn)制數(shù)字量,本例用P0口輸出控制8個(gè)發(fā)光二極管的亮與滅顯示轉(zhuǎn)換結(jié)果的二進(jìn)制碼,也可通過LED數(shù)碼管將轉(zhuǎn)換完畢的數(shù)字量以16進(jìn)制數(shù)形式顯示出來。圖11-8
單片機(jī)與TLC549接口的原理電路參考程序如下:#include<reg51.h>#include<intrins.h> //包含_nop_()函數(shù)頭文件#defineucharunsignedchar#defineuintunsignedint#defineledP0sbit
sdo=P1^0; //定義P1.0與TLC549的SDO腳(即5腳DATAOUT)連接sbit
cs=P1^1; //定義P1.1與TLC549的腳連接sbit
sclk=P1^2;//定義P1.2與TLC549的SCLK腳(即7腳I/OCLOCK)連接voiddelayms(uintj) //延時(shí)函數(shù){
uchari=250;
for(;j>0;j--) {while(--i); i=249; while(--i); i=250; }}voiddelay18us(void)
延時(shí)約18μs函數(shù){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();nop_();_nop_();}uchar
convert(void){
uchar
i,temp;
cs=0;delay18us();for(i=0;i<8;i++) {
if(sdo==1)temp=temp|0x01;
if(i<7)temp=temp<<1;
sclk=1; _nop_();_nop_();_nop_();_nop_();
sclk=0; _nop_();_nop_(); }
cs=1;
return(temp);}voidmain(){
ucharresult; led=0;
cs=1;
sclk=0;
sdo=1; while(1) { result=convert(); led=result; //轉(zhuǎn)換結(jié)果從P0口輸出驅(qū)動LED delayms(1000); }}由于TLC549轉(zhuǎn)換時(shí)間應(yīng)大于17μs,本例采用延時(shí)操作方案,延時(shí)時(shí)間大約18μs,每次讀取轉(zhuǎn)換數(shù)據(jù)時(shí)間大于17μs即可。10.3I2C總線的串行擴(kuò)展I2C(InterInterfaceCircuit)全稱為芯片間總線,是目前使用廣泛的芯片間串行擴(kuò)展總線。目前世界上采用I2C總線有兩個(gè)規(guī)范,荷蘭飛利浦公司和日本索尼公司,現(xiàn)多采用飛利浦公司I2C總線技術(shù)規(guī)范,已成為電子行業(yè)認(rèn)可的總線標(biāo)準(zhǔn)。采用I2C技術(shù)單片機(jī)以及外圍器件種類很多,已廣泛用于各類電子產(chǎn)品、家用電器及通信設(shè)備中。10.3.1I2C串行總線系統(tǒng)的基本結(jié)構(gòu)I2C串行總線只有兩條信號線,一條是數(shù)據(jù)線SDA,另一條是時(shí)鐘線SCL。SDA和SCL是雙向的,I2C總線上各器件數(shù)據(jù)線都接到SDA線上,各器件時(shí)鐘線均接到SCL線上。I2C總線系統(tǒng)基本結(jié)構(gòu)見圖10-6。帶有I2C接口單片機(jī)可直接與I2C總線接口的各種擴(kuò)展器件(如存儲器、I/O芯片、A/D、D/A、鍵盤、顯示器、日歷/時(shí)鐘)連接。由于I2C總線采用純軟件尋址方法,無需片選線連接,大大簡化總線數(shù)量。圖10-6I2C串行總線系統(tǒng)基本結(jié)構(gòu)I2C串行總線運(yùn)行由主器件控制。主器件是指啟動數(shù)據(jù)的發(fā)送(發(fā)出起始信號)、發(fā)出時(shí)鐘信號、傳送結(jié)束時(shí)發(fā)出終止信號的器件,通常由單片機(jī)來擔(dān)當(dāng)。從器件可以是存儲器、LED或LCD驅(qū)動器、A/D或D/A轉(zhuǎn)換器、時(shí)鐘/日歷器件等,從器件須帶有I2C串行總線接口。I2C總線空閑時(shí),SDA和SCL兩條線均為高。連接到總線上器件輸出級必須是漏級或集電極開路,只要有一器件任意時(shí)刻輸出低電平,都將使總線上信號變低,即各器件SDA及SCL都是“線與”關(guān)系。由于各器件輸出為漏級開路,故須通過上拉電阻接正電源(見圖10-6中兩個(gè)電阻),以保證SDA和SCL在空閑時(shí)被上拉為高電平。SCL線上時(shí)鐘信號對SDA線上各器件間數(shù)據(jù)傳輸起同步控制作用。SDA線上數(shù)據(jù)起始、終止及數(shù)據(jù)的有效性均要根據(jù)SCL線上的時(shí)鐘信號來判斷。在標(biāo)準(zhǔn)I2C普通模式下,數(shù)據(jù)傳輸速率為100kbit/s,高速模式下可達(dá)400kbit/s。總線上擴(kuò)展器件數(shù)量不是由電流負(fù)載決定的,而是由電容負(fù)載確定。I2C總線每個(gè)器件接口都有一定等效電容,連接器件越多,電容值就越大,這會造成信號傳輸延遲??偩€上允許器件數(shù)以器件電容量不超過400pF(通過驅(qū)動擴(kuò)展可達(dá)4000pF)為宜,據(jù)此可計(jì)算出總線長度及連接器件數(shù)量。每個(gè)I2C總線器件都有唯一地址,擴(kuò)展器件時(shí)也要受器件地址數(shù)目限制。
I2C總線應(yīng)用系統(tǒng)允許多主器件,由哪一個(gè)主器件來控制總線要通過總線仲裁來決定。如何進(jìn)行總線仲裁,讀者可查閱I2C總線仲裁協(xié)議。但是在實(shí)際應(yīng)用中,經(jīng)常遇到的是以單一單片機(jī)為主器件,其他外圍接口器件為從器件的情況。
10.3.2I2C總線的數(shù)據(jù)傳送規(guī)定1.?dāng)?shù)據(jù)位的有效性規(guī)定I2C總線數(shù)據(jù)傳送時(shí),每一數(shù)據(jù)位傳送都與時(shí)鐘脈沖相對應(yīng)。時(shí)鐘脈沖為高電平期間,數(shù)據(jù)線上數(shù)據(jù)須保持穩(wěn)定,在I2C總線上,只有在時(shí)鐘線為低電平期間,數(shù)據(jù)線上電平狀態(tài)才允許變化,見圖10-7。圖10-7
數(shù)據(jù)位有效性規(guī)定2.起始信號和終止信號由I2C總線協(xié)議,總線上數(shù)據(jù)信號傳送由起始信號(S)開始、由終止信號(P)結(jié)束。起始信號和終止信號都由主機(jī)發(fā)出,在起始信號產(chǎn)生后,總線就處于占用狀態(tài);在終止信號產(chǎn)生后,總線就處于空閑狀態(tài)。下面結(jié)合圖10-8介紹有關(guān)起始信號和終止信號的規(guī)定。圖10-8
起始信號和終止信號
(1)起始信號(S)。在SCL線為高期間,SDA線由高電平向低電平的變化表示起始信號,只有在起始信號以后,其他命令才有效。
(2)終止信號(P)。在SCL線為高期間,SDA線由低電平向高電平的變化表示終止信號。隨著終止信號出現(xiàn),所有外部操作都結(jié)束。3.I2C總線上數(shù)據(jù)傳送的應(yīng)答I2C總線數(shù)據(jù)傳送時(shí),傳送字節(jié)數(shù)沒有限制,但每字節(jié)須為8位長。數(shù)據(jù)傳送時(shí),先傳送最高位(MSB),每一個(gè)被傳送的字節(jié)后面都必須跟隨1位應(yīng)答位(即1幀共有9位),見圖10-9。圖10-9I2C總線上的應(yīng)答信號I2C總線在傳送每1字節(jié)數(shù)據(jù)后都須有應(yīng)答信號A,應(yīng)答信號在第9個(gè)時(shí)鐘位上出現(xiàn),與應(yīng)答信號對應(yīng)的時(shí)鐘信號由主器件產(chǎn)生。這時(shí)發(fā)方須在這一時(shí)鐘位上使SDA線處于高電平狀態(tài),以便收方在這一位上送出低電平應(yīng)答信號A。
由于某種原因收方不對主器件尋址信號應(yīng)答時(shí),例如收方正在進(jìn)行其他處理而無法接收總線上數(shù)據(jù)時(shí),必須釋放總線,將數(shù)據(jù)線置為高電平,而由主器件產(chǎn)生一個(gè)終止信號以結(jié)束總線的數(shù)據(jù)傳送。當(dāng)主器件接收來自從機(jī)數(shù)據(jù)時(shí),接收到最后一個(gè)數(shù)據(jù)字節(jié)后,須給從器件發(fā)送一個(gè)非應(yīng)答信號(A*),使從機(jī)釋放數(shù)據(jù)總線,以便主機(jī)發(fā)送一終止信號,從而結(jié)束數(shù)據(jù)傳送。4.I2C總線上的數(shù)據(jù)幀格式I2C總線上傳送數(shù)據(jù)信號即包括真正的數(shù)據(jù)信號,也包括地址信號。I2C總線規(guī)定,在起始信號后必須傳送一從器件地址(7位),第8位是數(shù)據(jù)傳送的方向位(R/W*),用“0”表示主器件發(fā)送數(shù)據(jù)(W*),“1”表示主器件接收數(shù)據(jù)(R)。每次數(shù)據(jù)傳送總是由主器件產(chǎn)生的終止信號結(jié)束。但是,若主器件希望繼續(xù)占用總線進(jìn)行新的數(shù)據(jù)傳送,則可不產(chǎn)生終止信號,馬上再次發(fā)出起始信號對另一從器件進(jìn)行尋址。因此,在總線一次數(shù)據(jù)傳送過程中,可有以下幾種組合方式:(1)主器件向從器件發(fā)送n字節(jié)的數(shù)據(jù),數(shù)據(jù)傳送方向在整個(gè)傳送過程中不變,數(shù)據(jù)傳送格式:其中:字節(jié)1~字節(jié)n為主機(jī)寫入從器件的n字節(jié)的數(shù)據(jù)。格式中陰影部分表示主器件向從機(jī)發(fā)送數(shù)據(jù),無陰影部分表示從器件向主器件發(fā)送,以下同。上述格式中的“從器件地址”為7位,緊接其后的“1”和“0”表示主器件的讀/寫方向,“1”-讀,“0”-寫。(2)主器件讀出來自從機(jī)的n字節(jié)。除第1個(gè)尋址字節(jié)由主機(jī)發(fā)出,n字節(jié)都由從器件發(fā)送,主器件接收,數(shù)據(jù)傳送格式如下:其中:字節(jié)1~字節(jié)n為從器件被讀出的n字節(jié)數(shù)據(jù)。主器件發(fā)送終止信號前應(yīng)發(fā)送非應(yīng)答信號,向從器件表明讀操作要結(jié)束。(3)主器件的讀、寫操作。在一次數(shù)據(jù)傳送過程中,主器件先發(fā)送1字節(jié)數(shù)據(jù),然后再接收1字節(jié)數(shù)據(jù),此時(shí)起始信號和從器件地址都被重新產(chǎn)生一次,但兩次讀寫的方向位正好相反。數(shù)據(jù)傳送格式如下:格式中的“Sr”表示重新產(chǎn)生的起始信號,“從器件地址r”表示重新產(chǎn)生的從器件地址。由上可見,無論哪種方式,起始信號、終止信號和從器件地址均由主器件發(fā)送,數(shù)據(jù)字節(jié)傳送方向則由主器件發(fā)出的尋址字節(jié)中的方向位規(guī)定,每個(gè)字節(jié)傳送都須有應(yīng)答位(A或A*)相隨。605.尋址字節(jié)在上面介紹的數(shù)據(jù)幀格式中,均有7位從器件地址和緊跟其后的1位讀/寫方向位,即尋址字節(jié)。I2C總線的尋址采用軟件尋址,主器件在發(fā)送完起始信號后,立即發(fā)送尋址字節(jié)來尋址被控的從器件,尋址字節(jié)格式如下:
7位從器件地址為“DA3、DA2、DA1、DA0”和“A2、A1、A0”,其中“DA3、DA2、DA1、DA0”為器件地址,即器件固有地址編碼,出廠時(shí)就已給定。“A2、A1、A0”為引腳地址,由器件“A2、A1、A0”為引腳地址,由器件引腳A2、A1、A0在電路中接高電平或接地決定(見圖10-11)。61
數(shù)據(jù)方向位(R/W*)規(guī)定了總線上的單片機(jī)(主器件)與從器件數(shù)據(jù)傳送方向。R/W*=1,表示主器件接收(讀)。R/W*=0,表示主器件發(fā)送(寫)6.?dāng)?shù)據(jù)傳送格式I2C總線每傳送一位數(shù)據(jù)都與一個(gè)時(shí)鐘脈沖對應(yīng),傳送的每一幀數(shù)據(jù)均為一字節(jié)。但啟動I2C總線后傳送的字節(jié)數(shù)沒有限制,只要求每傳送一個(gè)字節(jié)后,對方回答一個(gè)應(yīng)答位。在時(shí)鐘線為高電平期間,數(shù)據(jù)線的狀態(tài)就是要傳送的數(shù)據(jù)。數(shù)據(jù)線上數(shù)據(jù)改變須在時(shí)鐘線為低電平間完成。在數(shù)據(jù)傳輸期間,只要時(shí)鐘線為高電平,數(shù)據(jù)線都必須穩(wěn)定,否則數(shù)據(jù)線上任何變化都當(dāng)作起始或終止信號。I2C總線數(shù)據(jù)傳送必須遵循規(guī)定的數(shù)據(jù)傳送格式。圖10-10所示為一次完整的數(shù)據(jù)傳送應(yīng)答時(shí)序。由總線規(guī)范,起始信號表明一次數(shù)據(jù)傳送的開始,其后為尋址字節(jié)。在尋址字節(jié)后是按指定讀、寫的數(shù)據(jù)字節(jié)與應(yīng)答位。在數(shù)據(jù)傳送完成后主器件都必須發(fā)送終止信號。在起始與終止信號之間傳輸?shù)臄?shù)據(jù)字節(jié)數(shù)由主器件(單片機(jī))決定,理論上講沒有字節(jié)限制。6364圖10-10I2C總線一次完整的數(shù)據(jù)傳送應(yīng)答時(shí)序由上述數(shù)據(jù)傳送格式可看出:(1)無論何種數(shù)據(jù)傳送格式,尋址字節(jié)都由主器件發(fā)出,數(shù)據(jù)字節(jié)傳送方向則由尋址字節(jié)中方向位來規(guī)定。(2)尋址字節(jié)只表明從器件的地址及數(shù)據(jù)傳送方向。從器件內(nèi)部的n個(gè)數(shù)據(jù)地址,由器件設(shè)計(jì)者在該器件的I2C總線數(shù)據(jù)操作格式中,指定第1個(gè)數(shù)據(jù)字節(jié)作為器件內(nèi)的單元地址指針,并且設(shè)置地址自動加減功能,以減少從器件地址的尋址操作。(3)每個(gè)字節(jié)傳送都必須有應(yīng)答信號(A/A*)相隨。(4)從器件接收到起始信號后都必須釋放數(shù)據(jù)總線,使其處于高電平,以便主器件發(fā)送從機(jī)地址。10.3.3AT89S51的I2C總線擴(kuò)展系統(tǒng)許多公司都推出帶有I2C接口的單片機(jī)及各種外圍擴(kuò)展器件,常見的有ATMEL的AT24C××系列存儲器、PHILIPS的PCF8553(時(shí)鐘/日歷且?guī)в?56×8RAM)和PCF8570(256×8RAM)、MAXIM的MAX117/118(A/D轉(zhuǎn)換器)和MAX517/518/519(D/A轉(zhuǎn)換器)等。I2C系統(tǒng)中主器件通常由帶有I2C接口的單片機(jī)擔(dān)當(dāng)。從器件必須帶有I2C總線接口。AT89S51單片機(jī)沒有I2C接口,可利用并行I/O口線結(jié)合軟件來模擬I2C總線時(shí)序,可使AT89S51不受沒有I2C接口限制。因此,在許多應(yīng)用中,都將I2C總線模擬傳送作為常規(guī)設(shè)計(jì)方法。66圖10-11為AT89S51單片機(jī)與具有I2C總線器件的擴(kuò)展接口電路。圖中,AT24C02為E2PROM芯片,PCF8570為靜態(tài)256×8RAM,PCF8574為8位I/O接口,SAA1064為4位LED驅(qū)動器。雖然各種器件的原理和功能有很大的差異,但它們與AT89S51單片機(jī)連接是相同的。68圖10-11AT89S51單片機(jī)擴(kuò)展I2C總線器件的接口電路10.3.4I2C總線數(shù)據(jù)傳送的模擬由于AT89S51沒有I2C接口,通常用I/O口線結(jié)合軟件來實(shí)現(xiàn)I2C總線上的信號模擬。AT89S51為單主器件方式下,沒有其他主器件對總線競爭與同步,只存在著主器件單片機(jī)對I2C總線上各從器件的讀、寫操作。1.典型信號模擬為保證數(shù)據(jù)傳送的可靠性,標(biāo)準(zhǔn)I2C總線數(shù)據(jù)傳送有嚴(yán)格的時(shí)序要求。I2C總線的起始信號、終止信號、應(yīng)答/數(shù)據(jù)“0”及非應(yīng)答/數(shù)據(jù)“1”的模擬時(shí)序見圖10-12~圖10-17。
69對于終止信號,要保證有大于4.7μs信號建立時(shí)間。終止信號結(jié)束時(shí),要釋放總線,使SDA、SCL維持在高電平上,在大于4.7μs后才可進(jìn)行第1次起始操作。在單主器件系統(tǒng)中,為防止非正常傳送,終止信號后SCL可設(shè)置在低電平。對發(fā)送應(yīng)答位、非應(yīng)答位來說,與發(fā)送數(shù)據(jù)“0”和“1”的信號定時(shí)要求完全相同。只要滿足在時(shí)鐘高電平大于4.0μs期間,SDA線上有確定的電平狀態(tài)即可。2.典型信號及字節(jié)收發(fā)的模擬子程序AT89S51單片機(jī)在模擬I2C總線通信時(shí),需編寫以下5個(gè)函數(shù):總線初始化、起始信號、終止信號、應(yīng)答/數(shù)據(jù)“0”以及非應(yīng)答/數(shù)據(jù)“1”函數(shù)。(1)總線初始化函數(shù)。初始化函數(shù)的功能是將SCL和SDA總線拉高以釋放總線。參考程序如下: #include<reg51.h> #include<intrins.h> //包含函數(shù)_nop_()的頭文件
sbit
sda=P1^0; //定義I2C模擬數(shù)據(jù)傳送位
sbit
scl=P1^1; //定義I2C模擬時(shí)鐘控制位71voidinit() //總線初始化函數(shù){
scl=1; //scl為高電平 _nop_(); //延時(shí)約1μs
sda=1; //sda為高電平 delay5us(); //延時(shí)約5μs}(2)起始信號S函數(shù)。圖10-12的起始信號S,要求一個(gè)新的起始信號前總線的空閑時(shí)間大于4.7μs,而對于一個(gè)重復(fù)的起始信號,要求建立時(shí)間也須大于4.7μs。圖10-12為起始信號的時(shí)序波形在SCL高電平期間SDA發(fā)生負(fù)跳變。起始信號到第1個(gè)時(shí)鐘脈沖負(fù)跳沿的時(shí)間間隔應(yīng)大于4μs。7273圖10-12
起始信號S的模擬時(shí)序起始信號S的函數(shù)如下:voidstart(void) //起始信號函數(shù){
scl=1;
sda=1; delay5us();
sda=0; delay4us();
scl=0;}74(3)終止信號P函數(shù)。圖10-13為終止信號P的時(shí)序波形。在SCL高電平期間SDA的一個(gè)上升沿產(chǎn)生終止信號。75圖10-13
終止信號P的模擬時(shí)序終止信號函數(shù)如下:voidstop(void) //終止信號函數(shù){scl=0;sda=0;delay4us();scl=1;delay4us();sda=1;delay5us();sda=0;}76(4)應(yīng)答位函數(shù)。發(fā)送接收應(yīng)答位與發(fā)送數(shù)據(jù)“0”相同,即在SDA低電平期間SCL發(fā)生一個(gè)正脈沖,產(chǎn)生圖10-14的模擬時(shí)序。77圖10-14
發(fā)送應(yīng)答位的模擬時(shí)序發(fā)送接收應(yīng)答位的函數(shù)如下:voidAck(void){
uchari;
sda=0;
scl=1; delay4us();
while((sda==1)&&(i<255))i++;
scl=0;delay4us();}78SCL在高電平期間,SDA被從器件拉為低表示應(yīng)答。命令行中的(SDA=1)和(i<255))相與,表示若在這一段時(shí)間內(nèi)沒有收到從器件的應(yīng)答,則主器件默認(rèn)從器件已收到數(shù)據(jù)而不再等待應(yīng)答信號,要是不加該延時(shí)退出,一旦從器件沒有發(fā)應(yīng)答信號,程序?qū)⒂肋h(yuǎn)停在這里,而在實(shí)際中是不允許這種情況發(fā)生。(5)非應(yīng)答位/數(shù)據(jù)“1”函數(shù)。發(fā)送非應(yīng)答位與發(fā)送數(shù)據(jù)“1”相同,即在SDA高電平期間SCL發(fā)生一個(gè)正脈沖,產(chǎn)生圖10-15的模擬時(shí)序。79圖10-15
非應(yīng)答位/數(shù)據(jù)“1”的模擬時(shí)序發(fā)送非接收應(yīng)答位/數(shù)據(jù)“1”的函數(shù)如下:voidNoAck(void) { sda=1;scl=1;delay4us();scl=0;sda=0;}3.字節(jié)收發(fā)的子程序除上述典型信號模擬外,在I2C總線數(shù)據(jù)傳送中,經(jīng)常使用單字節(jié)數(shù)據(jù)的發(fā)送與接收。81(1)發(fā)送1字節(jié)數(shù)據(jù)子程序下面是模擬I2C數(shù)據(jù)線由SDA發(fā)送1字節(jié)數(shù)據(jù)(可以是地址,也可是數(shù)據(jù)),發(fā)送完后等待應(yīng)答,并對狀態(tài)位ack進(jìn)行操作,即應(yīng)答或非應(yīng)答都使ack=0。發(fā)送數(shù)據(jù)正常ack=1,從器件無應(yīng)答或損壞,則ack=0。發(fā)送1字節(jié)數(shù)據(jù)參考程序如下:
voidSendByte(uchardata) {
uchar
i,temp; temp=data;
for(i=0;i<8;i++) { temp=temp<<1; //左移一位
scl=0;
82 delay4us();
sda=Cy; delay4us();
scl=1;delay4us();}scl=0;delay4us();sda=1; delay4us();83串行發(fā)送1字節(jié)時(shí),需把該字節(jié)8位逐位發(fā)出,“temp=temp<<1;”就是將temp中的內(nèi)容左移1位,最高位將移入Cy位中,然后將Cy賦給SDA,進(jìn)而在SCL的控制下發(fā)送出去。(2)接收1字節(jié)數(shù)據(jù)子程序下面是模擬從I2C的數(shù)據(jù)線SDA接收從器件傳來的1字節(jié)數(shù)據(jù)的子程序:voidrcvbyte(){
uchar
i,temp;
scl=0; delay4us();
sda=1;
for(i=0;i<8;i++) {
scl=1; delay4us(); temp=(temp<<1)|sda;
scl=0; delay4us(); } delay4us(); returntemp;}同理,串行接收1字節(jié)時(shí),需將8位一位一位地接收,然后再組合成1個(gè)字節(jié)?!皌emp=(temp<<1)|SDA;”是將變量temp左移1位后與SDA進(jìn)行邏輯“或”運(yùn)算,依次把8位數(shù)據(jù)組合成1字節(jié)來完成接收。11.3.5利用I2C總線擴(kuò)展E2PROMAT24C02的IC卡設(shè)計(jì)通用存儲器IC卡由通用存儲器芯片封裝而成,由于結(jié)構(gòu)和功能簡單,成本低、使用方便,因此在各個(gè)領(lǐng)域都得到了廣泛的應(yīng)用。目前用于IC卡的通用存儲器芯片多為E2PROM,且采用I2C總線接口,典型代表為ATMEL公司的I2C接口的AT24Cxx系列。該系列具有AT24C01/02/04/08/16等型號,它們封裝形式、引腳及內(nèi)部結(jié)構(gòu)類似,只是容量不同,分別為128B/256B/512B/1KB/2KB。下面以AT24C02為例,介紹單片機(jī)通過I2C總線對AT24C02/進(jìn)行讀寫,即IC卡的制作。1.AT24C02芯片簡介(1)封裝與引腳AT24C02的封裝形式有雙列直插(DIP)8腳式和貼片8腳式兩種,無論何種封裝,其引腳功能都是一樣的。AT24C02的DIP形式引腳如圖10-16所示,引腳功能見表10-1。(2)存儲單元的尋址AT24C02存儲容量為256B,分為32頁,每頁8B。有兩種尋址方式:芯片尋址和片內(nèi)子地址尋址。圖10-16AT24C02的DIP引腳表10-1 AT24C02的引腳功能
①芯片尋址。AT24C02芯片地址固定為1010,它是I2C總線器件的特征編碼,其地址控制字的格式為1010A2A1A0R/W*。A2A1A0引腳接高、低電平后得到確定的3位編碼,與1010形成7位編碼,即為該器件的地址碼。由于A2A1A0共有8種組合,故系統(tǒng)最多可外接8片AT24C02,R/W*是對芯片的讀/寫控制位。②片內(nèi)子地址尋址。在確定了AT24C02芯片的7位地址碼后,片內(nèi)的存儲空間可用1字節(jié)的地址碼進(jìn)行尋址,尋址范圍為00H~FFH,即可對片內(nèi)的256個(gè)單元進(jìn)行讀/寫操作。(3)寫操作AT24C02有兩種寫入方式,字節(jié)寫入與頁寫入。①字節(jié)寫入方式。單片機(jī)(主器件)先發(fā)送啟動信號和1字節(jié)的控制字,從器件發(fā)出應(yīng)答信號后,單片機(jī)再發(fā)送1字節(jié)的存儲單元子地址(AT24C02內(nèi)部單元的地址碼),單片機(jī)收到AT24C02應(yīng)答后,再發(fā)送8位數(shù)據(jù)和1位終止信號。②頁寫入方式。單片機(jī)先發(fā)送啟動信號和1字節(jié)控制字,再發(fā)送1字節(jié)存儲器起始單元地址,上述幾個(gè)字節(jié)都得到AT24C02應(yīng)答后,就可發(fā)送最多1頁的數(shù)據(jù),并順序存放在已指定的起始地址開始的相繼單元,最后以終止信號結(jié)束。(4)讀操作AT24C02讀操作也有兩種方式,即指定地址讀和指定地址連續(xù)讀。①指定地址讀方式。單片機(jī)發(fā)送啟動信號后,先發(fā)送含有芯片地址的寫操作控制字,AT24C02應(yīng)答后,單片機(jī)再發(fā)送1字節(jié)的指定單元地址,AT24C02應(yīng)答后再發(fā)送1個(gè)含有芯片地址讀操作控制字,此時(shí)如AT24C02應(yīng)答,被訪問單元的數(shù)據(jù)就會按SCL信號同步出現(xiàn)在SDA線上,供單片機(jī)讀取。②指定地址連續(xù)讀方式。指定地址連續(xù)讀方式是單片機(jī)收到每個(gè)字節(jié)數(shù)據(jù)后要做出應(yīng)答,只有AT24C02檢測到應(yīng)答信號后,其內(nèi)部的地址寄存器就自動加1指向下一個(gè)單元,并順序?qū)⒅赶騿卧臄?shù)據(jù)送到SDA線上。當(dāng)需要結(jié)束讀操作時(shí),單片機(jī)接收到數(shù)據(jù)后,在需要應(yīng)答的時(shí)刻發(fā)送一個(gè)非應(yīng)答信號,接著再發(fā)送一個(gè)終止信號即可?!纠?0-2】單片機(jī)通過I2C串行總線擴(kuò)展1片AT24C02,實(shí)現(xiàn)單片機(jī)對存儲器AT24C02的讀、寫。由于Proteus元件庫中沒有AT24C02,可用FM24C02芯片代替,即在Proteus中“關(guān)鍵字”對話框元件查找欄中輸入“24C02”,就會在左側(cè)的元件列表中顯示,然后在元件列表中選擇即可。AT89S51與FM24C02的接口原理電路見圖10-17。圖10-17AT89S51與AT24C02接口的原理電路圖中KEY1作為外部中斷0的中斷源,當(dāng)按下KEY1,單片機(jī)通過I2C總線發(fā)送數(shù)據(jù)0xaa給AT24C02,等發(fā)送數(shù)據(jù)完畢后,將0xaa送P2口通過LED顯示。
KEY2作為外部中斷1的中斷源,當(dāng)按下KEY2時(shí),單片機(jī)通過I2C總線讀AT24C02,等讀數(shù)據(jù)完畢后,將讀出的最后數(shù)據(jù)0x55送P2口的LED顯示出來。最終顯示的仿真效果是:按下KEY1,標(biāo)號為D1~D8的8個(gè)LED中D3、D4、D5、D6燈亮,如圖10-17所示。按下KEY2,則D1、D3、D5、D7燈亮。Proteus提供的I2C調(diào)試器是調(diào)試I2C系統(tǒng)的得力工具,使用I2C調(diào)試器的觀測窗口可觀察I2C總線上的數(shù)據(jù)流,查看I2C總線發(fā)送的數(shù)據(jù),也可作為從器件向I2C總線發(fā)送數(shù)據(jù)。在原理電路中添加I2C調(diào)試器具體操作:先單擊圖4-2左側(cè)工具箱中的虛擬儀器圖標(biāo),此時(shí)在預(yù)覽窗口中顯示出各種虛擬儀器選項(xiàng),單擊“I2CDEBUGGER”項(xiàng),并在原理圖編輯窗口單擊鼠標(biāo)左鍵,就會出現(xiàn)I2C調(diào)試器符號,如圖10-18所示。然后把I2C調(diào)試器的“SDA”端和“SCL”端分別連接在I2C總線的“SDA”和“SCL”線上。仿真運(yùn)行時(shí),用鼠標(biāo)右鍵單擊I2C調(diào)試器符號,出現(xiàn)下拉菜單,單擊“Terminal”選項(xiàng),即可出現(xiàn)I2C調(diào)試器的觀測窗口,如圖10-18所示。從觀測窗口上可看到按一下KEY1時(shí),出現(xiàn)在I2C總線上的數(shù)據(jù)流。圖10-18I2C調(diào)試器的觀測窗口本例參考程序:#include"reg51.h"#include"intrins.h" //包含有函數(shù)_nop_()的頭文件#defineucharunsignedchar#defineuintunsigned
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025屆湖南省長沙市開福區(qū)第一中學(xué)高一數(shù)學(xué)第一學(xué)期期末考試模擬試題含解析
- 天津市軍糧城第二中學(xué)2025屆數(shù)學(xué)高一上期末監(jiān)測試題含解析
- 2025屆吉林省北大附屬長春實(shí)驗(yàn)學(xué)校生物高一第一學(xué)期期末統(tǒng)考模擬試題含解析
- 甘肅省白銀市會寧四中2025屆數(shù)學(xué)高一上期末監(jiān)測試題含解析
- 山東省青島市嶗山區(qū)第二中學(xué)2025屆高一上數(shù)學(xué)期末預(yù)測試題含解析
- 2025屆山東省棗莊、滕州市數(shù)學(xué)高一上期末經(jīng)典試題含解析
- 2025屆湖南省瀏陽市高一數(shù)學(xué)第一學(xué)期期末質(zhì)量檢測模擬試題含解析
- 江蘇省鹽城市時(shí)楊中學(xué)2025屆英語高三第一學(xué)期期末綜合測試試題含解析
- 坐井觀天課件圖片
- 2025屆安徽省六安一中、舒城中學(xué)、霍邱一中數(shù)學(xué)高二上期末達(dá)標(biāo)檢測試題含解析
- 2024年稅務(wù)考試-稅務(wù)稽查員筆試考試歷年高頻考點(diǎn)試題摘選含答案
- 市政工程單位分部分項(xiàng)檢驗(yàn)批工程劃分表
- 教科版小學(xué)科學(xué)四上《3.3用橡皮筋驅(qū)動小車》課件
- 高考英語復(fù)習(xí)-600分策略-專題2-七選五閱讀市賽課公開課一等獎省名師獲獎?wù)n件
- 安全風(fēng)險(xiǎn)分級管控清單
- 小班語言故事《小烏龜找朋友》課件
- 建筑施工承插型盤扣式鋼管支架安全技術(shù)標(biāo)準(zhǔn)
- 關(guān)于激發(fā)興趣轉(zhuǎn)化初中物理學(xué)困生的個(gè)案研究的開題報(bào)告
- 民用無人機(jī)身份識別編碼規(guī)則
- 鐵路專用線設(shè)計(jì)規(guī)范(試行)(TB 10638-2019)
- 食品安全管理人員工作手冊
評論
0/150
提交評論