❶ i2c單片機里什麼意思
i2c是一種同步串列數字信號匯流排介面,用於實現多個器件或設備之間的通信。它包含有一根時鍾線和數據線,最高通信速度可達400Kb/s.一些高檔單片機帶有該介面,但普通單片機可以用通用IO口模擬 i2c時序。
❷ 51單片機 iic 匯流排程序,用IO口模擬和用自帶IIC口有什麼不同
其實程序是一模一樣的,唯一的區別是模擬IIC需要CPU運算,這樣就增加了單片機的運算時間,而帶IIC介面的單片機,程序還是需要的,但是IIC的運算通過集成在單片機裡面的寄存器硬體電路來運算,就像定時器電路一樣自己會運算,這樣就不要cpu來運算過程了,從而節省了時間,使cpu運算的更快。當然這樣就的多付出經濟成本哦
❸ 單片機任意引腳都可以做IIC介面嗎
可以的,51單片機使用引腳模擬iic時序,所以對引腳沒限制
❹ 兩個51單片機如何通過i2c通訊
一般情況下,要進行I2C通訊,你最起碼其中有一個晶元要本身就帶有I2C通訊介面,用這個帶有I2C介面的晶元來作從器件,這樣就相對好處理一點。你要是兩個都不帶這個介面,來模擬的話,很有難度。除非你對I2C協議很清楚,不過從樓主的提問來看,估計就不怎麼熟悉這種協議。
所以建議還是用別的通訊方式吧,比如用SPI,相對會好處理一點,用其中一個晶元的INTx來模擬CS介面,作為從器件在中斷中來處理,另外一個就模擬主器件來控制從器件,這樣或許會好弄點。如果樓主確實需要通訊,還是趕快換個思路吧,要是卡在一個地方動不了,會耽誤你的進程的,祝你好運!
❺ 51單片機iic匯流排有哪些io口
IO口模擬其實就是數據口配合時鍾口一位一位地接受或發送數據,然後存到內存里。
單片機又稱單片微控制器,它不是完成某一個邏輯功能的晶元,而是把一個計算機系統集成到一個晶元上。
相當於一個微型的計算機,和計算機相比,單片機只缺少了I/O設備。概括的講:一塊晶元就成了一台計算機。它的體積小、質量輕、價格便宜、為學習、應用和開發提供了便利條件。同時,學習使用單片機是了解計算機原理與結構的最佳選擇。
單片機的使用領域已十分廣泛,如智能儀表、實時工控、通訊設備、導航系統、家用電器等。
運算器有兩個功能:
(1)執行各種算術運算。
(2)執行各種邏輯運算,並進行邏輯測試,如零值測試或兩個值的比較。
運算器所執行全部操作都是由控制器發出的控制信號來指揮的,並且,一個算術操作產生一個運算結果,一個邏輯操作產生一個判決。
❻ 單片機 I2C通信
I2C的時序是比較復雜的,你如果能把I2C的時序弄清,那其他器件的時序都不成問題了。
我就按照我的理解來跟你講吧。
直接用程序來說明吧。
NOP(),一個機器周期時間的延遲,12M晶振時為1微秒
NOPS(),4個NOP()。
sbit
SDA
P2^0;
sbit
SCL
P2^1;
定義數據線和時鍾線介面
首先,I2C有2個重要的線,SDA數據線SCL時鍾線,當匯流排上沒有進行信息傳送時,SDA和SCL都為高電平,我們稱之為釋放匯流排。
開始傳送信息時,要有一個開始信號,
開始信號
:定義為在SCL為高電平的時候,SDA從高電平拉低。
start()
{
SDA=1;
NOP();
//同你圖中
SDA/SCL上升/下降所用時間
1US
SCL=1;
NOPS();
//建立開始信號(同你圖中TSU起始信號建立時間一樣4US)
SDA=0;
//SDA拉低
NOPS();
SCL=0;
//SCL拉低,
鉗住匯流排,准備發送或接收數據
NOP();
}
結束信號:與開始信號相反,在SCL為高電平時,SDA從低拉高
stop()
{
SDA=0;
NOP();
SCL=1;
NOPS();
//建立信號時間
SDA=1;
//拉高
結束。
NOPS();
}
我暈,發現寫了半天還有好多。。算了
幫人幫到底了
發送/接收一個數據:數據的發送和接收都是在SCL為低電平的時候發生,因為SCL為高電平時已給了開始和結束信號。發送數據時,當數據准備讀入時,將SCL線暫時拉高(SCL為高時,SDA無法改變狀態),保持一段時間然後拉低(同你圖中的TDH,數據輸出保持時間),這時數據則發送完畢到SDA上。接收則與之大同小異。當SDA線上有數據過來時,先將SCL拉高,建立好時間,然後拉低,數據則被讀入。(關於如何被發出以及如何被讀入則是晶元做的事,我們不用管,只需記住SCL拉低,數據發出/讀入)
用程序來講就是:
send(uchar
c)
//發送一個位元組
{
uint
i;
for(i=0;i<8;i++)
//該位元組8位從高往低發送
{
if((c<<i)&0x80)
SDA=1;
else
SDA=0;
NOP();
SCL=1;
//建立信號時間
NOPS();
SCL=0;
//發送完畢
}
}
recieve()
{
uchar
r;uint
i;
r=0;SDA=1;
for(i=0;i<8;i++)
//讀取8位數據
{
NOP();
SCL=0;
NOPS();
SCL=1;
NOP();
r<<=1;
if(SDA==1)
r+=1;
NOP();
}
SCL=0;
NOP();
return
(r);
}
程序可能有點難懂,不過沒關系,使用I2C時候,直接調用寫好的程序,如我寫的
start.stop.send
receive
等,這些程序應該有現成的。
發送一個位元組後會有一個應答函數,應答函數定義為,當發送完一個位元組也就是8位的時候,如果這是SDA為低電平,則為有應答,反之則無。如果要發送多個位元組,一個位元組發完後需要一個應答函數才能繼續發下面一個位元組。程序也就大同小異。掌握好時序就行了。
I2C用的最多的就是E2PROM了。
給你舉個例子
如果我想往E2PROM的0x50單元寫一個『a』,則我這樣寫:
start();
//開始
send(0xa0);
//選擇我要發送的器件。0xa0為E2PROM的器件地址
answer();
//應答
send(0x50);
//選擇E2PROM中的0X50地址單元
answer();
//應答
send('a');
//發送數據『a』
stop();
//停止
好累。。。。。就寫這么多