新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > I2C總線在8051單片機系統(tǒng)中的應(yīng)用

I2C總線在8051單片機系統(tǒng)中的應(yīng)用

作者: 時間:2013-01-06 來源:網(wǎng)絡(luò) 收藏


  4、虛擬軟件結(jié)構(gòu)

  對于虛擬來說要實現(xiàn)其功能主要是要軟件要注意I2C器件的操作時序,總線的運行由主機控制。所謂主機即啟動數(shù)據(jù)的傳送即發(fā)出啟動信號,發(fā)出時鐘信號,傳送結(jié)束時發(fā)出停止信號的設(shè)備,通常主機是微處理器。被主機尋訪的設(shè)備都稱為從機。為了進行通訊,每個接到的設(shè)備都有一個唯一的地址,以便于主機尋訪。主機和從機的數(shù)據(jù)傳送,可以由主機發(fā)送數(shù)據(jù)到從機,也可以是從機發(fā)到主機。凡是發(fā)送數(shù)據(jù)到總線的設(shè)備稱為發(fā)送器,從總線上接收數(shù)據(jù)的設(shè)備被稱為接受器。根據(jù)I2C的時序,軟件分為開始、停止、應(yīng)答、檢查應(yīng)答、不產(chǎn)生應(yīng)答、讀操作、寫操作。以下為C程序清單調(diào)試成功。


  #include
  Sbit sda=P1^7;
  Sbit SCL=P1^6;


  啟動函數(shù),在SCL為高時,SDA的下降沿為啟動信號。

void Start(void)

{ scl=0; //SCL處于低電平時,SDA才能改變
sda=1;// 一個"開始"狀態(tài),該狀態(tài)必須在其他命令之前執(zhí)行
scl=1; // 當(dāng)scl為高電平時sda的下降沿表示開始狀態(tài)
_nop_(); _nop_(); _nop_(); //給一個延時
sda=0; //給下降沿表示開始
_nop_(); _nop_(); _nop_(); _nop_();
scl=0; //恢復(fù)低電平以改變sda的值
sda=1; }


  停止函數(shù),在SCL為高時,SDA的上升沿為停止信號。

void Stop(void)
{scl=0; //SCL處于低電平時,SDA改變數(shù)值 */
sda=0; //scl為高電平時,sda的上升沿表示停止,
scl=1; //scl為高電平時改變sda的狀態(tài)表示啟動,停止
_nop_(); _nop_(); _nop_(); // 延時
sda=1;
_nop_(); _nop_(); _nop_();
scl=0; }
/* * * * * 檢查應(yīng)答位 * * * * */
bit RecAck(void)
{ scl=0; //在scl為0的時候改變sda的值
sda=1;
scl=1; //在scl為1的時候等待sda值的變化,在器件接受到數(shù)據(jù)后會把sda拉低。
_nop_(); _nop_(); _nop_(); _nop_();
CY=sda; // 因為返回值總是放在CY中的
scl=0;
_nop_();
return(CY); //如果為CY為低則表示接受成功,如果為高,則表示接受失敗。
}
/* * * * *對I2C總線產(chǎn)生應(yīng)答(一般用在讀操作中) * * * * */
void Ack(void)
{
sda=0;// EEPROM通過在收到每個地址或數(shù)據(jù)之后,
_nop_();_nop_();
scl=1;//置SDA低電平的方式確認表示收到讀SDA口狀態(tài)
_nop_(); _nop_(); _nop_(); _nop_();
scl=0;
_nop_();
sda=1;
}

/* * * * * * * * * 不對I2C總線產(chǎn)生應(yīng)答 * * * * */
void NoAck(void)
{ sda=1;
scl=1;
_nop_(); _nop_(); _nop_(); _nop_();
scl=0;
}


  向I2C總線寫數(shù)據(jù),每次寫8位數(shù)據(jù)。

void Send(uchar sendbyte)
{uchar j=8;
for(;j>0;j--)
{scl=0;//拉低scl準(zhǔn)備給上升沿
delay(5);//延時
sendbyte = 1;// 使CY=sendbyte^7;
sda=CY; // CY 進位標(biāo)志位
scl=1; //給上升沿,發(fā)出sda的狀態(tài)值
}
scl=0;
}


  從I2C總線上讀數(shù)據(jù)子程序 ,每次讀8位數(shù)據(jù)。

uchar Receive(void)
{ register receivebyte,i=8;
scl=0;
while(i--)
{ scl=1; //拉高scl準(zhǔn)備給下降沿
receivebyte=(receivebyte 1)|sda; //接受值左移一位把低位和sda相或得到sda的狀態(tài)值
scl=0; //給下降沿發(fā)出sda的狀態(tài)值
}
return(receivebyte);
}


  5、結(jié)論

  本文介紹了I2C總線的組成及時序,并以ATMEL公司的為例給出了用C語言模擬I2C總線的時序的起始、停止及CPU向I2C總線的發(fā)送和接收8位字節(jié)的程序。


  6、參考文獻

  【1】馬忠梅.籍順心.張凱.馬巖.單片機的C語言應(yīng)用程序設(shè)計【M】.北京航空航天大學(xué)出版社.2003

  【2】楊將新.李華軍.劉東駿.單片機程序設(shè)計及應(yīng)用從基礎(chǔ)到實踐【M】.電子工業(yè)出版社.2006

  【3】邊春遠.王志強.MCS-51單片機應(yīng)用開發(fā)實用子程序【M】.人民郵電出版社.2005

  【4】陳小忠.黃寧.趙小俠.單片機接口技術(shù)實用子程序【M】.人民郵電出版社.2006

  【5】陳柄和.C語言與C++語言程序設(shè)計【M】. 北京航空航天大學(xué)出版社.2004

c++相關(guān)文章:c++教程



上一頁 1 2 下一頁

關(guān)鍵詞: I2C總線 8051 AT24C256

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉