《單片機(jī)原理及應(yīng)用》第11章:?jiǎn)纹瑱C(jī)應(yīng)用設(shè)計(jì)_第1頁(yè)
《單片機(jī)原理及應(yīng)用》第11章:?jiǎn)纹瑱C(jī)應(yīng)用設(shè)計(jì)_第2頁(yè)
《單片機(jī)原理及應(yīng)用》第11章:?jiǎn)纹瑱C(jī)應(yīng)用設(shè)計(jì)_第3頁(yè)
《單片機(jī)原理及應(yīng)用》第11章:?jiǎn)纹瑱C(jī)應(yīng)用設(shè)計(jì)_第4頁(yè)
《單片機(jī)原理及應(yīng)用》第11章:?jiǎn)纹瑱C(jī)應(yīng)用設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩61頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第11章單片機(jī)應(yīng)用設(shè)計(jì)

11.1基于DS18B20設(shè)計(jì)數(shù)字溫度計(jì)(1—Wire總線)(1)DS18B20是DALLAS公司生產(chǎn)的單總線結(jié)構(gòu)的溫度傳感器,數(shù)據(jù)通過單線接口送入或送出,每個(gè)DS18B20有唯一的系列好,因此單總線上可以掛接多個(gè)溫度傳感器,溫度傳感器具有3引腳TO-92和8引腳SOIC貼片小體積封裝形式,還包括以下基本特性:溫度測(cè)量范圍為-55℃~+125℃,在-10℃~+85℃范圍內(nèi),精度為±0.5℃。等效華氏溫度范圍是-66。F~+257。F。用戶可以從單總線讀出9~12位數(shù)字值,分辨率可達(dá)到0.0625℃??梢杂脭?shù)據(jù)線供電(寄生電源),遠(yuǎn)距離時(shí)不需要增加額外供電電源。內(nèi)部包含ROM可以設(shè)置溫度上下限的報(bào)警。應(yīng)用范圍包括恒溫控制,工業(yè)系統(tǒng),消費(fèi)類產(chǎn)品,溫度計(jì)。引腳說明GND——地DQ——數(shù)字輸入輸出VDD——外接供電電源輸入端。當(dāng)工作在寄生電源時(shí),此引腳需要接地。NC——空引腳DS18B20數(shù)據(jù)輸出格式及溫度計(jì)算

DS18B20讀出的溫度結(jié)果為2字節(jié),讀數(shù)以16位,符號(hào)擴(kuò)展的二進(jìn)制補(bǔ)碼讀數(shù)形式提供。所以需要把補(bǔ)碼轉(zhuǎn)換為原碼,才能計(jì)算出真實(shí)的溫度值。

這2個(gè)字節(jié)的數(shù)據(jù)格式如圖11-2所示。高8位前5位為符號(hào)位,表示溫度是零上還是零下。高8位后三位和低8位中的高四位構(gòu)成溫度的整數(shù)部分。低2位的后四位為溫度的小數(shù)部分。正溫度原碼就是補(bǔ)碼的本身,在12位分辨率的情況下:溫度值=讀取值x0.0625負(fù)溫度原碼是補(bǔ)碼減一取反。在12位分辨率的情況下。溫度值=-(讀取值減一再取反)x0.0625注意:DS18B20上電復(fù)位時(shí)的溫度值固定為+85℃.DS18B20相關(guān)操作指令集合軟件設(shè)計(jì)DS18B20初始化如圖11-5初始化時(shí)序圖。主機(jī)先發(fā)出一個(gè)480~960us的低電平脈沖,然后釋放總線變?yōu)楦唠娖?,這個(gè)變化過程DS18B20需要等待15~60us處于穩(wěn)定,并在隨后的480us時(shí)間內(nèi)對(duì)總線電平進(jìn)行檢測(cè),如果有低電平出現(xiàn),并且持續(xù)時(shí)間在60~240us范圍內(nèi),說明總線上有器件已做出應(yīng)答;若無低電平出現(xiàn),一直都是高電平,說明總線上無器件應(yīng)答。DS18B20初始化程序如下。/*********************************************************函數(shù)名:Ds18b20Init*函數(shù)功能:DS18B20初始化*輸入:無*輸出:初始化成功,返回1;初始化失敗,返回0********************************************************/bit Ds18b20Init(void){bitflag;DQ=1; //先將總線拉高,保持主從同步 for(time=0;time<2;time++); //短暫延時(shí)保持穩(wěn)定 DQ=0; //拉低總線 for(time=0;time<200;time++);//總線低電平保持時(shí)間為480~960us DQ=1; //釋放總線 for(time=0;time<10;time++);//釋放總線后讓DS18B20等待15~60us flag=DQ; for(time=0;time<100;time++); DQ=1; returnflag;//初始化標(biāo)志位0:初始化成功1:初始化失敗}向DS18B20寫入1字節(jié)數(shù)據(jù)如圖11-6向DS18B20寫時(shí)序圖,從時(shí)序圖我們可以看出寫周期時(shí)間范圍為60~120us。進(jìn)行寫操作時(shí)先把總線電平拉低,表示寫周期開始,寫操作一共分為兩種,一種寫“0”操作,另一種寫“1”操作。DS18B20的采樣周期為15~45us。寫“0”操作:先將總線置為低電平保持15us,并在隨后的45us時(shí)間段內(nèi)DS18B20開始對(duì)總線電平進(jìn)行采樣,45us過后采樣結(jié)束,寫周期結(jié)束后釋放總線。寫“1”操作:先將總線置為低點(diǎn)平保持至少1us,隨后恢復(fù)總線置為高電平,15us過后DS18B20在45us時(shí)間段內(nèi)開始對(duì)總線進(jìn)行采樣,寫周期結(jié)束后釋放總線。DS18B20向DS18B20寫入1字節(jié)數(shù)據(jù)程序如下。/*********************************************************函數(shù)功能:向DS18B20寫入1字節(jié)*輸入:datavoidDs18b20WriteByte(unsignedchardata){unsignedchari;DQ=1; //先將總線拉高,保持主從同步for(time=0;time<2;time++); //短暫延時(shí)保持穩(wěn)定for(i=0;i<8;i++){DQ=0; //總線置為低電平_nop_(); //低電平保持至少1usDQ=data&0x01; //開始寫入第一位數(shù)據(jù),從低位開始for(time=0;time<20;time++);//DS18B20采樣時(shí)間不能少于45usDQ=1; //釋放總線for(time=0;time<1;time++); data>>=1; //數(shù)據(jù)右移一位,最高位補(bǔ)零}for(time=0;time<1;time++);}從DS18B20讀出1字節(jié)數(shù)據(jù)如圖11-7從DS18B20讀時(shí)序圖。讀周期期開始時(shí),主機(jī)就要把總線電平拉低1us或2us,隨后就得釋放總線,在15us時(shí)范圍內(nèi)DS18B20把一位數(shù)據(jù)傳送到總線上,因此主機(jī)必須在2~15us范圍內(nèi)對(duì)總線進(jìn)行采樣,15us后采樣結(jié)束,直到讀周期結(jié)束,釋放總線,開始下一位數(shù)據(jù)傳輸。從DS18B20讀出1字節(jié)數(shù)據(jù)程序如下。unsignedcharDs18b20ReadByte(void){unsignedchari,data;DQ=1; //先將總線拉高,保持主從同步for(time=0;time<2;time++); //短暫延時(shí)保持穩(wěn)定for(i=0;i<8;i++){DQ=0;_nop_(); //低電平保持在1~2us左右,_nop_(); DQ=1; //釋放總線,等待DS18B20傳送數(shù)據(jù)dat>>=1;for(time=0;time<2;time++); //延時(shí)大概6usif(DQ==1)data|=0x80;elsedata|=0x00;for(time=0;time<10;time++);}return data;}例11-1使用DS18B20測(cè)溫并顯示#include<reg52.h>#include<intrins.h>

sbitDQ=P2^7;sbitLED0=P2^0;sbitLED1=P2^1;sbitLED2=P2^2;sbitLED3=P2^3;unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};unsignedcharDisplaydata[]={0,0,0,0};unsignedchartime;voiddelayms(unsignedintms){ unsignedchari; while(ms--) { for(i=0;i<120;i++); }}unsignedcharInitDs18b20() //18B20初始化{ bitflag;DQ=1; //先將總線拉高,保持主從同步 for(time=0;time<2;time++); //短暫延時(shí)保持穩(wěn)定 DQ=0; //拉低總線 for(time=0;time<200;time++);//總線低電平保持時(shí)間為480~960us DQ=1; //釋放總線 for(time=0;time<10;time++);//釋放總線后讓DS18B20等待15~60us flag=DQ; for(time=0;time<100;time++); DQ=1; returnflag;//初始化標(biāo)志位0:初始化成功1:初始化失敗}unsignedcharDs18b20ReadByte(){unsignedchari,dat; DQ=1; //先將總線拉高,保持主從同步 for(time=0;time<2;time++); //短暫延時(shí)保持穩(wěn)定

for(i=0;i<8;i++) { DQ=0; _nop_(); //低電平保持在1~2us左右, _nop_(); DQ=1; //釋放總線,等待DS18B20傳送數(shù)據(jù) dat>>=1; for(time=0;time<1;time++); //延時(shí)大概6us if(DQ==1) dat|=0x80; else dat|=0x00; for(time=0;time<10;time++); } return dat;}voidDs18b20WriteByte(unsignedchardat) //18B20寫數(shù)據(jù){ unsignedchari; DQ=1; //先將總線拉高,保持主從同步 for(time=0;time<2;time++); //短暫延時(shí)保持穩(wěn)定

for(i=0;i<8;i++) { DQ=0; //總線置為低電平 _nop_(); //低電平保持至少1us_nop_(); DQ=dat&0x01; //開始寫入第一位數(shù)據(jù),從低位開始 for(time=0;time<20;time++);//DS18B20采樣時(shí)間不能少于45us DQ=1; //釋放總線 for(time=0;time<1;time++); dat>>=1; //數(shù)據(jù)右移一位,最高位補(bǔ)零 }}intDs18b20ReadTemp() //讀取溫度{ unsignedchara,b; inttemp=0; while(InitDs18b20()); Ds18b20WriteByte(0xcc); //跳過序列號(hào) Ds18b20WriteByte(0x44); //啟動(dòng)溫度轉(zhuǎn)換 while(InitDs18b20()); Ds18b20WriteByte(0xcc); Ds18b20WriteByte(0xbe); //讀取溫度 a=Ds18b20ReadByte(); //低八位 b=Ds18b20ReadByte(); //高八位 temp= b; temp<<=8; //合并兩個(gè)無符號(hào)字符型放在整型變量中temp|=a;

returntemp; }/*********************************************************函數(shù)名:datapros()*函數(shù)功能:溫度讀取處理轉(zhuǎn)換后并顯示*輸入:tempvoiddatapros(inttemp){

floattp; if(temp<0) //當(dāng)溫度值為負(fù)數(shù) { Displaydata[0]=0x40; temp=temp-1; temp=~temp; tp=temp;

temp=tp*0.0625*10+0.5;//取溫度小數(shù)點(diǎn)后一位0.0625需要乘十 } else { Displaydata[0]=0x00; tp=temp; temp=tp*0.0625*10+0.5; }Displaydata[1]=temp/100;//取百位 Displaydata[2]=temp%100/10; //取十位 Displaydata[3]=temp%10; //取個(gè)位

if(Displaydata[0]==0x40)//判斷第0位數(shù)碼管符號(hào)位是否有“-” { LED0=0; } else { LED0=1; } P0=0x40; delayms(3); LED0=1; if(table[Displaydata[1]]==0x3f)//判斷第1位是否是零

{ LED1=1; } else

{ LED1=0; } P0=table[Displaydata[1]]; delayms(3); LED1=1;

LED2=0; P0=table[Displaydata[2]]+0x80;//顯示第二位 delayms(3); LED2=1;

LED3=0; P0=table[Displaydata[3]];//顯示第三位 delayms(3); LED3=1;}voidmain(){ while(1) { datapros(Ds18b20ReadTemp()); }}11.2基于DS1302設(shè)計(jì)數(shù)字電子鐘(SPI總線)DS1302是DALLAS公司推出的涓流充電時(shí)鐘芯片,內(nèi)含有一個(gè)實(shí)時(shí)時(shí)鐘/日歷和31字節(jié)靜態(tài)RAM,DS1302通過半雙工SPI串行接口(3個(gè)接口)與單片機(jī)相連進(jìn)行通訊。實(shí)時(shí)時(shí)鐘/日歷電路提供秒,分,時(shí),日,日期,月,年的信息,直到2100年。每個(gè)單位時(shí)間均可自動(dòng)調(diào)整,電子時(shí)鐘芯片具有8引腳DIP直插和8/16引腳SOIC貼片封裝,還包括以下基本特性:1.內(nèi)部具有閏年調(diào)整功能2.31x8位通用暫存RAM3.2.0V~5.5V寬電壓操作范圍(工作在2V時(shí),工作電流小于300nA),與TTL兼容4.讀寫時(shí)鐘或RAM數(shù)據(jù)時(shí)有單字節(jié)或多字節(jié)(脈沖串模式)數(shù)據(jù)傳送方式5.可選工業(yè)級(jí)溫度范圍:-40°C~+85°C引腳說明X1,X2——32.768KHz晶振管腳GND——

地RST——

復(fù)位管腳I/O——

數(shù)據(jù)輸入/輸出引腳SCLK——

串行時(shí)鐘Vcc1,Vcc2——

電源供電管腳,預(yù)備知識(shí)命令字節(jié)傳送每一字節(jié)數(shù)據(jù)都需要命令字節(jié)初始化。如表11-2,命令字節(jié)最高位第七位必須為1,如果為0將禁止寫入。第六位:邏輯0為時(shí)鐘/日歷數(shù)據(jù),邏輯1為RAM數(shù)據(jù)。第1位到第5位表示輸入輸出的指定寄存器。第0位:邏輯0為寫操作,邏輯1為讀操作。命令直接總以最低位開始輸入。(2)RST復(fù)位引腳與時(shí)鐘控制所有數(shù)據(jù)傳送開始時(shí)RST輸入為高電平,可以實(shí)現(xiàn)兩種功能:①RST引腳接通允許對(duì)地址/命令序列的移位寄存器進(jìn)行讀寫操作。②RST引腳信號(hào)可以對(duì)單字節(jié)或多字節(jié)數(shù)據(jù)傳送進(jìn)行終止。讀寫操作如圖11-11所示。時(shí)鐘周期是上升沿伴隨下降沿的連續(xù)序列,當(dāng)進(jìn)行數(shù)據(jù)輸入時(shí),在時(shí)鐘的上升沿期間必須有效,當(dāng)進(jìn)行數(shù)據(jù)輸出時(shí),數(shù)據(jù)需要在時(shí)鐘的下降沿期間輸出。在進(jìn)行數(shù)據(jù)傳送的過程中,如果RST復(fù)位引腳置低,數(shù)據(jù)傳送將被終止,會(huì)使I/O口引腳進(jìn)入高阻抗?fàn)顟B(tài)。在上電運(yùn)行時(shí),在Vcc大于2.0v之前,RST必須為零。而且,只有SCLK為低電平時(shí),RST復(fù)位引腳才能置高。數(shù)據(jù)輸入數(shù)據(jù)輸入如圖11-12,第一個(gè)字節(jié)為命令字節(jié),隨后的8個(gè)SCLK周期的上升沿為數(shù)據(jù)字節(jié)的輸入,輸入的每個(gè)字節(jié)都是低位在前開始寫入。數(shù)據(jù)輸出數(shù)據(jù)輸出如圖10-11,第一個(gè)字節(jié)為命令字節(jié),隨后的8個(gè)SCLK周期的下降沿為數(shù)據(jù)字節(jié)的輸出,需要注意的是第一個(gè)數(shù)據(jù)位的傳送發(fā)生在命令字節(jié)被寫完后的第一個(gè)下降沿,CE保持高電平時(shí)間和日歷寄存器如下表11-3所示時(shí)間和日歷寄存器,我們通過寫地址命令設(shè)置這些寄存器初始時(shí)間,也可以寫讀地址命令,從寄存器讀取想要的時(shí)間。由表可以看出第一列為讀地址命令,第二列為寫地址命令。前七行為時(shí)間寄存器,分別為秒寄存器、分寄存器、小時(shí)寄存器、日期寄存器、月寄存器、星期寄存器、年寄存器,第8個(gè)為寫保護(hù)寄存器第九個(gè)為充電保護(hù)寄存器。時(shí)間日期寄存器內(nèi)部數(shù)據(jù)以二進(jìn)制BCD碼格式存儲(chǔ)。秒寄存器:第6位到第0位表示秒時(shí)間;第7位為時(shí)鐘控制位,為1時(shí)鐘停止,為0時(shí)鐘開啟。小時(shí)寄存器:第7位,置1為12小時(shí)模式,置0為24小時(shí)模式;第5位,為1表示PM,為0表示AM。當(dāng)設(shè)置為24小時(shí)模式時(shí),第5位到第0位表示小時(shí)??刂萍拇嫫鳎旱?位為寫保護(hù)位,置1阻止寫操作,置0允許寫操作表11-3時(shí)間日歷寄存器用DS1302進(jìn)行年月日、時(shí)分秒、星期顯示程序如下:向DS1302寫地址命令和數(shù)據(jù)如圖11-12寫時(shí)序圖可知,先傳送命令字節(jié),然后是數(shù)據(jù)直接,低位在前傳送。/****************************************************函數(shù)名:WriteAddressData()*函數(shù)功能:向DS1302寫地址命令和數(shù)據(jù)*輸入:addressdat*輸出:無********************************************/voidWriteAddressData(unsignedcharaddress,unsignedchardat){unsignedchari;RST=1;SCLK=0;_nop_();for(i=0;i<8;i++){DSIO=address&0x01; //從最低位開始送入address>>=1; //地址左移一位SCLK=1;//上升沿_nop_();SCLK=0;_nop_();}for(i=0;i<8;i++){DSIO=dat&0x01;dat>>=1;SCLK=1;_nop_();SCLK=0;_nop_();}RST=0;}從DS1302讀取一個(gè)地址的數(shù)據(jù)

/********************************************************

*函數(shù)名:ReadAddressData()

*函數(shù)功能:從DS1302讀取一個(gè)地址的數(shù)據(jù)

*輸入:address

*輸出:dat

********************************************************/unsignedcharReadAddressData(unsginedcharaddress){unsignedchardat,dat1;unsignedchari;RST=1;_nop_();SCLK=0;for(i=0;i<8;i++){DSIO=address&0x01;address>>=1;SCLK=1;_nop_();SCLK=0;_nop_();}for(i=0;i<8;i++){dat1=DSIO;//從最低位開始接收dat=(dat>>1)|(dat1<<7);SCLK=1;_nop_();SCLK=0;_nop_();}RST=0;_nop_(); //以下為復(fù)位穩(wěn)定操作。SCLK=1;_nop_();DSIO=0;_nop_();DSIO=1;_nop_();returndat;}DS1302初始化/*********************************************************函數(shù)名:Ds1302Init()*函數(shù)功能:Ds1302初始化*輸入:無

*輸出:無********************************************************/unsignedcharWriteRTCaddress[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //寫地址命令unsignedcharReadRTCaddress[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}; //讀地址命令unsignedchartime[]={0,0,0x12,0x20,0x03,0x03,0x19};//存儲(chǔ)順序是秒分時(shí)日月周年,格式BCD碼。voidDs1302Init(void){unsignedchari;WriteAddressWrite(0x8e,0x00);//往控制寄存器寫0x00關(guān)閉寫保護(hù)for(i=0;i<7;i++){WriteAddress&Data(WriteRTCaddress[i],time[i]); }WriteAddressWrite(0x8e,0x80);//往控制寄存器寫0x80開啟寫保護(hù)}讀取DS1302時(shí)間和日期/*********************************************************函數(shù)名:Ds1302ReadTimeDay()*函數(shù)功能:讀取時(shí)間*輸入:無

*輸出:無********************************************************/voidDs1302ReadTimeDay(void){ unsignedchari; for(i=0;i<7;i++)//讀取7個(gè)字節(jié)的時(shí)鐘信號(hào):分秒時(shí)日月周年 { time[i]=ReadAddress&Data(ReadRTCaddress[i]); }

}11.3AT24C02的存儲(chǔ)應(yīng)用(I2C總線)1.工作原理I2C總線是由Philips公司開發(fā)的一種簡(jiǎn)單、雙向二線制同步串行總線。它只需要兩根線即可在連接于總線上的器件之間傳送信息。I2C總線特點(diǎn)可以概括如下:(1)在硬件上,I2C總線只需要一根數(shù)據(jù)線和一根時(shí)鐘線兩根線,總線接口已經(jīng)集成在芯片內(nèi)部,不需要特殊的接口電路,而且片上接口電路的濾波器可以濾去總線數(shù)據(jù)上的毛刺.因此I2C總線簡(jiǎn)化了硬件電路PCB布線,降低了系統(tǒng)成本,提高了系統(tǒng)可靠性。因?yàn)镮2C芯片除了這兩根線和少量中斷線,與系統(tǒng)再?zèng)]有連接的線,用戶常用I2C可以很容易形成標(biāo)準(zhǔn)化和模塊化,便于重復(fù)利用。(2I2C總線是一個(gè)真正的多主機(jī)總線,如果兩個(gè)或多個(gè)主機(jī)同時(shí)初始化數(shù)據(jù)傳輸,可以通過沖突檢測(cè)和仲裁防止數(shù)據(jù)破壞,每個(gè)連接到總線上的器件都有唯一的地址,任何器件既可以作為主機(jī)也可以作為從機(jī),但同一時(shí)刻只允許有一個(gè)主機(jī)。數(shù)據(jù)傳輸和地址設(shè)定由軟件設(shè)定,非常靈活??偩€上的器件增加和刪除不影響其他器件正常工作。(3)I2C總線可以通過外部連線進(jìn)行在線檢測(cè),便于系統(tǒng)故障診斷和調(diào)試,故障可以立即被尋址,軟件也利于標(biāo)準(zhǔn)化和模塊化,縮短開發(fā)時(shí)間。(4)連接到相同總線上的IC數(shù)量只受總線最大電容的限制,串行的8位雙向數(shù)據(jù)傳輸位速率在標(biāo)準(zhǔn)模式下可達(dá)100Kbit/s,快速模式下可達(dá)400Kbit/s,高速模式下可達(dá)3.4Mbit/s。(5)總線具有極低的電流消耗.抗高噪聲干擾,增加總線驅(qū)動(dòng)器可以使總線電容擴(kuò)大10倍,傳輸距離達(dá)到15m;兼容不同電壓等級(jí)的器件,工作溫度范圍寬。11.3.2I2C總線協(xié)議當(dāng)SCL為高電平而SDA由高到低的跳變,表示產(chǎn)生一個(gè)起始條件;當(dāng)SCL為高而SDA由低到高的跳變,表示產(chǎn)生一個(gè)停止條件。在起始條件產(chǎn)生后,總線處于忙狀態(tài),由本次數(shù)據(jù)傳輸?shù)闹鲝脑O(shè)備獨(dú)占,其他I2C器件無法訪問總線;而在停止條件產(chǎn)生后,本次數(shù)據(jù)傳輸?shù)闹鲝脑O(shè)備將釋放總線,總線再次處于空閑狀態(tài)。主設(shè)備在SCL線上產(chǎn)生每個(gè)時(shí)鐘脈沖的過程中將在SDA線上傳輸一個(gè)數(shù)據(jù)位,當(dāng)一個(gè)字節(jié)按數(shù)據(jù)位從高位到低位的順序傳輸完后,緊接著從設(shè)備將拉低SDA線,回傳給主設(shè)備一個(gè)應(yīng)答位,此時(shí)才認(rèn)為一個(gè)字節(jié)真正的被傳輸完成。當(dāng)然,并不是所有的字節(jié)傳輸都必須有一個(gè)應(yīng)答位,比如:當(dāng)從設(shè)備不能再接收主設(shè)備發(fā)送的數(shù)據(jù)時(shí),從設(shè)備將回傳一個(gè)否定應(yīng)答位。I2C總線上的每一個(gè)設(shè)備都對(duì)應(yīng)一個(gè)唯一的地址,主從設(shè)備之間的數(shù)據(jù)傳輸是建立在地址的基礎(chǔ)上,也就是說,主設(shè)備在傳輸有效數(shù)據(jù)之前要先指定從設(shè)備的地址,地址指定的過程和上面數(shù)據(jù)傳輸?shù)倪^程一樣,只不過大多數(shù)從設(shè)備的地址是7位的,然后協(xié)議規(guī)定再給地址添加一個(gè)最低位用來表示接下來數(shù)據(jù)傳輸?shù)姆较颍?表示主設(shè)備向從設(shè)備寫數(shù)據(jù),1表示主設(shè)備向從設(shè)備讀數(shù)據(jù)。如圖11-18所示:

.I2C總線操作對(duì)總線的操作實(shí)際就是主從設(shè)備之間的讀寫操作。大致可分為以下三種操作情況:

第一,主設(shè)備往從設(shè)備中寫數(shù)據(jù)。數(shù)據(jù)傳輸格式如圖11-19所示

第二主設(shè)備從從設(shè)備中讀數(shù)據(jù)。數(shù)據(jù)傳輸格式如11-20所示第三主設(shè)備往從設(shè)備中寫數(shù)據(jù),然后重啟起始條件,緊接著從從設(shè)備中讀取數(shù)據(jù);或者是主設(shè)備從從設(shè)備中讀數(shù)據(jù),然后重啟起始條件,緊接著主設(shè)備往從設(shè)備中寫數(shù)據(jù)。數(shù)據(jù)傳輸格式如下:

3.數(shù)據(jù)傳輸字節(jié)格式:發(fā)送到SDA線上的每個(gè)字節(jié)必須為8位,每次傳輸可以發(fā)送的字節(jié)數(shù)量不受限制。每個(gè)字節(jié)后必須跟一個(gè)響應(yīng)位。首先傳輸?shù)氖菙?shù)據(jù)的最高位(MSB),如果從機(jī)要完成一些其他功能后(例如一個(gè)內(nèi)部中斷服務(wù)程序)才能接收或發(fā)送下一個(gè)完整的數(shù)據(jù)字節(jié),可以使時(shí)鐘線SCL保持低電平,迫使主機(jī)進(jìn)入等待狀態(tài),當(dāng)從機(jī)準(zhǔn)備好接收下一個(gè)數(shù)據(jù)字節(jié)并釋放時(shí)鐘線SCL后數(shù)據(jù)傳輸繼續(xù)。應(yīng)答響應(yīng):數(shù)據(jù)傳輸必須帶響應(yīng),相關(guān)的響應(yīng)時(shí)鐘脈沖由主機(jī)產(chǎn)生。在響應(yīng)的時(shí)鐘脈沖期間發(fā)送器釋放SDA線(高)。在響應(yīng)的時(shí)鐘脈沖期間,接收器必須將SDA線拉低,使它在這個(gè)時(shí)鐘脈沖的高電平期間保持穩(wěn)定的低電平。傳輸格式如圖11-22所示。11.3.3單片機(jī)模擬I2C總線通信總線初始化:將總線拉高以釋放總線voidinit(){SCL=1;delay();SDA=1;delay();

}2.啟動(dòng)信號(hào):SCL高電平期間,SDA一個(gè)下降沿產(chǎn)生啟動(dòng)信號(hào)。voidstart(){SDA=1;delay();SCL=1;delay();SDA=0;delay();}應(yīng)答信號(hào):voidrespons(){Uchari=0;SCL=1;delay();while((SDA==1)&&(i<255))i++;SCL=0;delay();}4.停止信號(hào):SCL高電平期間SDA產(chǎn)生一上升沿信號(hào)。

voidstop(){SDA=0; delay(); SCL=1; delay(); SDA=1; delay();}

5.寫一個(gè)字節(jié) voidwritebyte(uchardata) { uchari,temp; temp=data; for(i=0;i<8;i++) { temp=temp<<1; SCL=0; delay();

SDA=CY;delay();SCL=1;delay();}SCL=0;delay();SDA=1;delay(); }6.讀一個(gè)字節(jié) voidreadbyte(uchardata) { uchari,temp; SCL=0; delay(); SDA=1; for(i=0;i<8;i++) { SCL=1; delay(); temp=(temp<<1)|SDA; SCL=0; delay();

}

delay(); returntemp; }

串行接收一個(gè)字節(jié)時(shí)需要將8位一位一位接收,然后組合成一個(gè)字節(jié)例11-3具有記憶功能的秒計(jì)數(shù)顯示。電路如圖11-23#include<reg51.h>#include<intrins.h>#defineuintunsignedint#defineucharunsignedcharbitflag=0;//寫24C02的標(biāo)志sbitSDA=P3^7;sbitSCL=P3^6;sbitshi=P3^0;sbitge=P3^1;ucharsec,tcnt;ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//*******延時(shí)函數(shù)

*****//voiddelayms(uintms){ uchari; while(ms--) { for(i=0;i<120;i++); }}//*****起始信號(hào)**********//voidstart(){ SDA=1; SCL=1; _nop_(); _nop_(); SDA=0; _nop_(); _nop_(); _nop_(); _nop_(); SCL=0;}//****停止信號(hào)

*****//voidstop(){ SDA=0; _nop_(); _nop_(); SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); SDA=1; }//****從AT24Cxx讀取數(shù)據(jù)********//ucharread_byte(){ uchari,da; for(i=0;i<8;i++) { SCL=1; da=da<<1; da=da|(uchar)SDA; SCL=0; } return(da);}//****向AT24Cxx寫入數(shù)據(jù)*****//bitwrite_byte(ucharwrite_data){ uchari; bitack_bit;//定義應(yīng)答信號(hào) for(i=0;i<8;i++)//循環(huán)移入8個(gè)位 {

SDA=(bit)(write_data&0x80);

_nop_();

SCL=1;

_nop_(); _nop_();

SCL=0;write_data=write_data<<1; } SDA=1; _nop_(); _nop_(); SCL=1; _n

溫馨提示

  • 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)論