女人被狂躁到高潮视频免费无遮挡,内射人妻骚骚骚,免费人成小说在线观看网站,九九影院午夜理论片少妇,免费av永久免费网址

當(dāng)前位置:首頁 > 單片機 > 單片機
[導(dǎo)讀]I2C總線是Philips公司提出的一種集成電路IC器件之間相連接的總線協(xié)議,其目的是使電子系統(tǒng)(不只 限于單片機系統(tǒng))各個IC器件之間的連線變得容易。因為使用傳統(tǒng)的并行總線在IC器件之間連接,往往會使得IC之間連線較多

I2C總線是Philips公司提出的一種集成電路IC器件之間相連接的總線協(xié)議,其目的是使電子系統(tǒng)(不只 限于單片機系統(tǒng))各個IC器件之間的連線變得容易。因為使用傳統(tǒng)的并行總線在IC器件之間連接,往往會使得IC之間連線較多,顯得非常復(fù)雜。而I2C總線 則使IC器件之間只需SDA、SCL兩條連線就可以傳送數(shù)據(jù),因而十分方便。由于I2C在印刷體中不容易書寫(需要上標(biāo)),所以實際書寫時,還常見到 IIC、I2C等書寫方法,本文采用IIC的寫法,敬請注意。關(guān)于IIC總線的知識,請參閱相關(guān)書籍,此處不再做進(jìn)一步介紹。

下面我們用一個使用IIC總線連接器件的例子來簡單說明IIC總線的仿真。

例.EEPROM24C02是采用IIC接口的一種常用2Kbit(256×8bit)的存儲器。編寫程序使用AT89C51的IO口模擬實現(xiàn)IIC總線協(xié)議進(jìn)行通信,并向24C02存儲器內(nèi)從字節(jié)0到字節(jié)FF寫入數(shù)字0到FF。

51系列單片機本身沒有IIC接口,但一些本身具有IIC接口的單片機往往是高端產(chǎn)品,一方面價格不菲,另一方面我們的系統(tǒng)也沒有必要使用之。通常我們就使用軟件通過51系列單片機的IO口來模擬實現(xiàn)IIC總線通信。

本例事實上比較簡單,但需要對IIC總線時序有較好的理解。源文件如下圖所示(采用C51語言編寫):







在Keil中編輯好源文件以后,接下來就可以建立工程文件并生成相應(yīng)的源代碼了,然后我們來繪制電路圖。
此例的電路圖極其簡單。只需兩個IC,即AT89C51和24C02C,和兩個上拉電阻,而且上拉電阻還可以省略。至于連接,就更為簡單了。最后得到繪制好的電路圖如下圖所示:



繪制好電路圖,我們就可以將前面剛剛生成的程序源代碼裝入單片機了,裝入以后,下面我們就可以來進(jìn)行仿真了。

首先點擊仿真按鈕,系統(tǒng)沒有什么反映,只有高低電平變化的顏色。我們要想查看結(jié)果,還要用前文中仿真擴展 RAM存儲器的方法,先點擊暫停,然后點擊“Debug”菜單下的“I2C Memory Internal Memory – U2”子菜單來打開U2即EEPROM存儲器24C02C的內(nèi)容窗口“I2C Memory Internal Memory – U2”,然后我們就看到了其中的內(nèi)容,也就是我們仿真程序的結(jié)果。如下圖所示:



從圖中我們能清楚地看到我們的仿真結(jié)果,程序完全正確地執(zhí)行了我們的命令。

當(dāng)然,如果你過早地點擊了暫停按鈕,那么你得到的結(jié)果可能和上圖略有不同,那可能是因為程序尚未執(zhí)行完畢。此時你可以繼續(xù)點擊運行按鈕,或者點擊單步按鈕來仔細(xì)查看程序執(zhí)行過程中24C02C存儲器內(nèi)容的改變情況。


完整代碼如下:

/*----------------------------------------------------------------

Acess the eeprom--24c04

----------------------------------------------------------------*/

#include


#ifndef INT8U

#define INT8U unsigned char

#endif


#ifndef INT8S

#define INT8S signed char

#endif


#ifndef INT16U

#define INT16U unsigned int

#endif


#define I2C_DELAY; _nop_();_nop_();_nop_();_nop_();_nop_(); // >=4.7uS


//----------------------------------------------------------------

// delay 100us

//----------------------------------------------------------------

void mDelay(INT8U k)

{

INT16U i ;


for(; k>0; k--)

{

for(i=0; i<93; i++)

;

}

}




//----------------------------------------------------------------

//OK

//----------------------------------------------------------------

void I2C_Start(void)

{

SDA = 1;

I2C_DELAY;


SCL = 1;

I2C_DELAY;


SDA = 0;

I2C_DELAY;

I2C_DELAY;

}




//----------------------------------------------------------------

//OK

//----------------------------------------------------------------

void I2C_Stop(void)

{

SDA = 0 ;

I2C_DELAY;


SCL = 1 ;

I2C_DELAY;


SDA = 1 ;

I2C_DELAY;

I2C_DELAY;

}




//----------------------------------------------------------------

//

//----------------------------------------------------------------

void sendAck(void)

{

SCL = 0;

I2C_DELAY;


SDA = 0;

I2C_DELAY;


SCL = 1;

I2C_DELAY;


}



//----------------------------------------------------------------

//

//----------------------------------------------------------------

void sendNoAck(void)

{

SCL = 0;

I2C_DELAY;


SDA = 1;

I2C_DELAY;


SCL = 1;

I2C_DELAY;


}



//----------------------------------------------------------------

// 0 = noACK; 1 = ACK ;

//----------------------------------------------------------------

bit checkAck()

{

bit tempbit;

/*發(fā)送完一個字節(jié)后檢驗設(shè)備的應(yīng)答信號*/

SDA = 1;

I2C_DELAY;


SCL = 0;

I2C_DELAY;


tempbit = SDA;


SCL = 1;

I2C_DELAY;


if(tempbit==1)

{

return 0; //noACK

}

else

{

return 1; //ACK

}

}




//----------------------------------------------------------------

//OK

// a positive clock edge clock a bit into the ROM

//----------------------------------------------------------------

void writeByte(INT8U datum)

{

INT8U bitCnt = 0 ;


for(bitCnt=0; bitCnt<8; bitCnt++)

{

SCL = 0 ;

I2C_DELAY;


if ((datum&0x80) == 0x80) //if the MSb is 1

SDA = 1 ;

else

SDA = 0 ;

I2C_DELAY;


SCL = 1 ;

I2C_DELAY;


datum<<=1 ;

}


}




//----------------------------------------------------------------

//OK

//----------------------------------------------------------------

INT8U readByte(void)

{

bit tempbit = 1 ;

INT8U temp = 0 ;

INT8U bitCnt ;


SDA = 1 ; // release the bus,ready to receive byte??????????????

I2C_DELAY;


for(bitCnt=0; bitCnt<8; bitCnt++)

{

SCL = 0; //?????????????????????????huan???????????????

I2C_DELAY;


tempbit = SDA ;

if (tempbit)

temp |= 0x01 ;

else

temp &= 0xfe ;


SCL = 1 ;

I2C_DELAY;


if(bitCnt<7)

temp <<= 1 ;


}


return(temp) ;

}




/*~~~~~~~~~~~~~~~~~~~~~~~ API ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/


/*-----------------------------------------------------------------

write some bytes to sequential address

-----------------------------------------------------------------*/

void writeToROM(INT8U datum[], INT8U address, INT8U num)

{

bit tempbit ;

INT8U i ;

INT8U *datum_P ;

datum_P = datum ;


I2C_Start() ;


writeByte(0xa0) ;

tempbit = checkAck();


writeByte(address) ;

tempbit = checkAck();


for(i=0; i

{

writeByte(*(datum_P+i)) ;



if(!checkAck())

{

I2C_Stop() ;

mDelay(100) ;

}

}


I2C_Stop() ;

}




/*-----------------------------------------------------------------

read some bytes from ROM`s sequential address

-----------------------------------------------------------------*/

void readFromROM(INT8U datum[], INT8U address, INT8U num)

{

bit tempbit ;

INT8U i ;

INT8U *datum_P ;


datum_P = datum;


I2C_Start() ;


writeByte(0xa0) ;

tempbit = checkAck();


writeByte(address) ;

tempbit = checkAck();


I2C_Start() ;

writeByte(0xa1) ;

tempbit = checkAck();


for(i=0; i

{

*(datum_P+i) = readByte() ;


if(i!=num-1)

{

sendAck() ;

}

else

{

sendNoAck() ;

}

}


I2C_Stop() ;

}




/*-----------------------------------------------------------------

wirte one byte to ROM --random write

-----------------------------------------------------------------*/

void writeOneByte(INT8U addr, INT8U datum)

{

bit tempbit ;

/*write a byte to mem*/


I2C_Start();


writeByte(0xa0);

tempbit = checkAck();


writeByte(addr); /*address*/

tempbit = checkAck();


writeByte(datum); /*the data*/


tempbit = checkAck();


I2C_Stop();

mDelay(100) ;


}




/*-----------------------------------------------------------------

read one byte from rom --random read

-----------------------------------------------------------------*/

INT8U readOneByte(INT8U addr)

{

bit tempbit = 1;

INT8U mydata;

/*read a byte from mem*/


I2C_Start();


writeByte(0xa0);

tempbit = checkAck();


writeByte(addr); /*address*/

tempbit = checkAck();


I2C_Start();


writeByte(0xa1);

tempbit = checkAck();


mydata = readByte();

tempbit = checkAck();


return (mydata) ;


I2C_Stop();

}

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

7月25日消息,據(jù)媒體報道,SpaceX衛(wèi)星互聯(lián)網(wǎng)服務(wù)星鏈周四表示,其業(yè)務(wù)正在經(jīng)歷網(wǎng)絡(luò)故障。

關(guān)鍵字: 星鏈 通訊

上海2025年3月17日 /美通社/ -- 3月14日, "2025 英飛凌消費、計算與通訊創(chuàng)新大會"(ICIC 2025,以下同)在深圳舉行。本屆大會匯聚600多位業(yè)界精英,就AI、機器人、邊緣計算、氮化鎵應(yīng)用等話題展...

關(guān)鍵字: 英飛凌 通訊 數(shù)據(jù)中心 氮化鎵

中山2025年3月6日 /美通社/ -- 2025年3月3-6日,領(lǐng)先的無線技術(shù)創(chuàng)新企業(yè)通宇通訊在巴塞羅那2025年世界移動通信大會(MWC)上發(fā)布了其開創(chuàng)性的MacroWiFi產(chǎn)品。這款新產(chǎn)品標(biāo)志著無線通信技術(shù)在大型戶...

關(guān)鍵字: MACRO Wi-Fi 通訊 世界移動通信大會

現(xiàn)代通訊電子設(shè)備的抗干擾測試己經(jīng)成為必須的測試項目,主要的干擾類型為噪聲干擾。在通信信道測試和電子對抗領(lǐng)域里,噪聲始終是聲始終是最基本、最常用的干擾源之一。

關(guān)鍵字: 通訊 電子設(shè)備

香港2024年10月31日 /美通社/ -- 2024年10月17日,2024 CAHK STAR Award(2024香港通訊業(yè)聯(lián)會非凡年獎)頒獎典禮在香港圓滿落幕。中國電信國際榮獲"Best AI Appl...

關(guān)鍵字: 中國電信 ST AI 通訊

加利福尼亞州貝爾蒙特2024年10月21日 /美通社/ -- 全球領(lǐng)先的AI驅(qū)動的企業(yè)通訊解決方案提供商RingCentral, Inc.(紐約證券交易所代碼:RNG)宣布,Gartner已將RingCentral評為2...

關(guān)鍵字: CENTRAL 通信 GARTNER 通訊

隨著現(xiàn)代電子技術(shù)的發(fā)展,在通訊、雷達(dá)、宇航、電視廣播、遙控遙測和電子測量等使用領(lǐng)域,對信號源的頻率穩(wěn)定度、頻譜純度、范圍和輸出頻率提出了越來越高的要求。

關(guān)鍵字: 通訊 雷達(dá) 宇航

中國烏魯木齊2024年10月15日 /美通社/ -- 以"人工智能與媒體變革"為主題的第六屆世界媒體峰會14日上午在烏魯木齊開幕。 10月14日,新華通訊社社長傅華在第六屆世界媒體峰會上發(fā)言 來自...

關(guān)鍵字: 人工智能 人工智能技術(shù) 通訊 數(shù)字化

全球電源解決方案領(lǐng)導(dǎo)者全漢集團(tuán)將于2024 年臺北國際電腦展(Computex 2024) 上展示其創(chuàng)新產(chǎn)品。包含邊緣AI、網(wǎng)路通訊和 USB PD 電源解決方案。

關(guān)鍵字: USB 電腦 通訊 電源解決方案

無線通訊技術(shù)在現(xiàn)代社會中發(fā)揮著越來越重要的作用,然而在實際使用過程中,會遭遇各種形式的干擾,影響通信質(zhì)量。

關(guān)鍵字: 無線通信 通訊 噪聲干擾
關(guān)閉