導航:首頁 > 操作系統 > 51單片機iic

51單片機iic

發布時間:2023-12-06 01:13:14

A. 單片機任意引腳都可以做IIC介面嗎

可以的,51單片機使用引腳模擬iic時序,所以對引腳沒限制

B. 兩個51單片機如何通過i2c通訊

一般情況下,要進行I2C通訊,你最起碼其中有一個晶元要本身就帶有I2C通訊介面,用這個帶有I2C介面的晶元來作從器件,這樣就相對好處理一點。你要是兩個都不帶這個介面,來模擬的話,很有難度。除非你對I2C協議很清楚,不過從樓主的提問來看,估計就不怎麼熟悉這種協議。
所以建議還是用別的通訊方式吧,比如用SPI,相對會好處理一點,用其中一個晶元的INTx來模擬CS介面,作為從器件在中斷中來處理,另外一個就模擬主器件來控制從器件,這樣或許會好弄點。如果樓主確實需要通訊,還是趕快換個思路吧,要是卡在一個地方動不了,會耽誤你的進程的,祝你好運!

C. 51單片機如何模擬I2C匯流排中從機接收ID,發送數據的程序

#include /*頭文件的包含*/
#include
#define uchar unsigned char /*宏定義*/
#define uint unsigned int

/*埠位定義*/
sbit BELL_OUT=P3^5;
sbit SCL="P1"^3;/*模擬I2C數據傳送位*/
sbit SDA="P1"^4;/*模擬I2C時鍾控制位*/

bit ack; /*應答標志位*/

/*********************************************************************
起動匯流排函數
函數原型: void Start_I2c();
功能:啟動I2C匯流排,即發送I2C起始條件
********************************************************************/
void Start_I2c()
{
SDA="1"; /*發送起始條件的數據信號*/
_nop_();
SCL="1"; /*起始條件建立時間大於4.7us,延時*/
_nop_();
SDA="0"; /*發送起始信號*/
_nop_(); /* 起始條件鎖定時間大於4μs*/
SCL="0"; /*鉗住I2C匯流排,准備發送或接收數據 */
_nop_();
}

/***********************************************
結束匯流排函數
函數原型: void Stop_I2c();
功能:結束I2C匯流排,即發送I2C結束條件
***********************************************/
void Stop_I2c()
{

SDA="0"; /*發送結束條件的數據信號*/
_nop_(); /*發送結束條件的時鍾信號*/
SCL="1"; /*結束條件建立時間大於4μs*/
_nop_();
SDA="1"; /*發送I2C匯流排結束信號*/
_nop_();
}

/*******************************************************************
位元組數據傳送函數
函數原型: void SendByte(uchar c);
功能:將數據c發送出去,可以是地址,也可以是數據,發完後等待應答,並對此狀
態位進行操作(不應答或非應答都使ack=0 假) 。發送數據正常,ack=1;
ack=0表示被控器無應答或損壞。
********************************************************************/
void SendByte(uchar c)
{
uchar BitCnt;

for(BitCnt=0;BitCnt<8;BitCnt++) /*要傳送的數據長度為8位*/
{
SCL="0";
if((c<
else SDA="0";
SCL="1"; /*置時鍾線為高,通知被控器開始接收數據位*/
_nop_(); /*保證時鍾高電平周期大於4μs*/
}

//從機應答,可以用應答和非應答信號代替
_nop_();
SCL="0";
_nop_();
SDA="1"; //
_nop_();
SCL="1";
_nop_();

if(SDA==1){ack=0;} /*判斷是否接收到應答信號*/
else ack="1";

SCL="0";
_nop_();

}

/*******************************************************************
位元組數據傳送函數
函數原型: uchar RcvByte();
功能:用來接收從器件傳來的數據,並判斷匯流排錯誤(不發應答信號),
發完後請用應答函數。
********************************************************************/
uchar RcvByte()
{
uchar retc;
uchar BitCnt;

retc="0";

for(BitCnt=0;BitCnt<8;BitCnt++)
{
SCL="1"; /*置時鍾線為高使數據線上數據有效*/
_nop_();
retc="retc"<<1;
if(SDA==1) retc="retc"+1; /*讀數據位,接收的數據位放入retc中 */
SCL="0";
}
return(retc);
}

/********************************************************************
應答子函數
原型: void Ack_I2c();
功能:主控器進行應答信號
********************************************************************/
void Ack_I2c()
{
SDA="0"; /*在此發出應答信號 */
_nop_();
SCL="0";
_nop_();
SCL="1";
_nop_();
SCL="0"; /*清時鍾線,鉗住I2C匯流排以便繼續接收*/
_nop_();
SDA="1";
_nop_();
}

/********************************************************************
非應答子函數
原型: void NoAck_I2c();
功能:主控器進行非應答信號
********************************************************************/
void NoAck_I2c()
{
SDA="1"; /*在此發出非應答信號 */
_nop_();
SCL="1";
_nop_();
SCL="0"; /*清時鍾線,鉗住I2C匯流排以便繼續接收*/
}

/*******************************************************************
向無子地址器件發送位元組數據函數
函數原型: bit ISendByte(uchar sla,ucahr c);
功能:從啟動匯流排到發送地址,數據,結束匯流排的全過程,從器件地址sla。如果
返回1表示操作成功,否則操作有誤。
********************************************************************/
bit ISendByte(uchar sla,uchar c)
{
Start_I2c(); /*啟動匯流排*/
SendByte(sla); /*發送器件地址*/
if(ack==0)return(0);

SendByte(c); /*發送數據*/
if(ack==0)return(0);

Stop_I2c(); /*結束匯流排*/
return(1);
}

/*******************************************************************
向有子地址器件發送多位元組數據函數
函數原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);
功能:從啟動匯流排到發送地址,子地址,數據,結束匯流排的全過程,從器件地址sla,
子地址suba,發送內容是s指向的內容,發送no個位元組。如果返回1表示
操作成功,否則操作有誤。
********************************************************************/
bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
{
uchar i;

Start_I2c(); /*啟動匯流排*/
SendByte(sla); /*發送器件地址*/
if(ack==0)return(0);

SendByte(suba); /*發送器件子地址*/
if(ack==0)return(0);

for(i=0;i
{
SendByte(*s); /*發送數據*/
if(ack==0)return(0);
s++;
}
Stop_I2c(); /*結束匯流排*/
//delayMs(1); //
return(1);
}

/*******************************************************************
向無子地址器件讀位元組數據函數
函數原型: bit IRcvByte(uchar sla,ucahr *c);
功能:從啟動匯流排到發送地址,讀數據,結束匯流排的全過程,從器件地址sla,返
回值在c。如果返回1表示操作成功,否則操作有誤。
********************************************************************/
bit IRcvByte(uchar sla,uchar *c)
{
Start_I2c(); /*啟動匯流排*/
SendByte(sla+1); /*發送器件地址*/
if(ack==0)return(0);

*c=RcvByte(); /*讀取數據*/
NoAck_I2c(); /*發送非就答位*/
Stop_I2c(); /*結束匯流排*/
return(1);
}

/**********************************************************************
向有子地址器件讀取多位元組數據函數
函數原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no);
功能:從啟動匯流排到發送地址,子地址,讀數據,結束匯流排的全過程,從器件地址sla,
子地址suba,讀出的內容放入s指向的存儲區,讀no個位元組。如果返回1
表示操作成功,否則操作有誤。
**********************************************************************/
bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
{
Start_I2c(); /*啟動匯流排*/
SendByte(sla); /*發送器件地址*/
if(ack==0)return(0);

SendByte(suba); /*發送器件子地址*/
if(ack==0)return(0);

Start_I2c();
SendByte(sla+1);
if(ack==0)return(0);

while(no!=1)
{
*s=RcvByte();/*發送數據*/
Ack_I2c(); /*發送就答位*/
s++;
no--;
}
*s=RcvByte();
NoAck_I2c(); /*發送非應位*/
Stop_I2c(); /*結束匯流排*/
return(1);
}

D. 求教:兩個51單片機之間的IIC通訊

IIC通訊只能是TTL連接通信,要求兩個單片機是近距離的,應在1米以內。既然是TTL連接,為何不用串口呢,也是TTL連接,串口通信簡單多了。
而IIC通信,兩個單片機都是用引腳來模擬的,通信協議比較麻煩,寫程序很麻煩的,又何苦呢?

E. 51單片機iic匯流排有哪些io口

IO口模擬其實就是數據口配合時鍾口一位一位地接受或發送數據,然後存到內存里。

單片機又稱單片微控制器,它不是完成某一個邏輯功能的晶元,而是把一個計算機系統集成到一個晶元上。

相當於一個微型的計算機,和計算機相比,單片機只缺少了I/O設備。概括的講:一塊晶元就成了一台計算機。它的體積小、質量輕、價格便宜、為學習、應用和開發提供了便利條件。同時,學習使用單片機是了解計算機原理與結構的最佳選擇。

單片機的使用領域已十分廣泛,如智能儀表、實時工控、通訊設備、導航系統、家用電器等。

運算器有兩個功能:

(1)執行各種算術運算。

(2)執行各種邏輯運算,並進行邏輯測試,如零值測試或兩個值的比較。

運算器所執行全部操作都是由控制器發出的控制信號來指揮的,並且,一個算術操作產生一個運算結果,一個邏輯操作產生一個判決。

F. 單片機的幾種傳輸方式的總結

學習了51單片機以及STM32後總結下單片機與外設或者上位機通訊的幾種傳輸方式

串口、COM口是指的物理介面形式(硬體)。而TTL、RS-232、RS-485是指的電平標准(電信號)

串列通信:指數據一位一位順序傳送

串列介面:簡稱串口(COM口)

並行通信:一組數據的各數據位在多線上同時被傳輸

並行介面:一種介面,各數據位同時被傳輸,傳輸速度快,效率高,一般用於MCU

串列通信分為:

    單工:數據單項傳送

    半雙工:數據能雙向傳送但不能同時

    全雙工:數據能同時雙向傳送

    通用的、及支持同步也支持非同步的接收、發送「模塊」,在晶元內部,與SPI、I2C一起構成單片機的匯流排「枝幹」,對於串口,串口通信指串口按位(bit)發送和接收位元組,盡管比按位元組(byte)的並行通信慢,但是串口可以在使用一根線發送數據的同時用另一根線接收數據。

串列通信技術標准EIA-232/485也就是以前所稱的RS-232/485。

232是PC機與通信工業中應用最廣泛的一種串列介面,RS232單端通信,傳輸距離可達15米,最高速率20Kbps。

RS485傳輸速率為10Mbps,最大傳輸距離1219米,,採用二線制時可實現真正的多點雙向通信,而采

用四線連接時只能實現點對多點通信,無論四線還是二線連接方式匯流排上可接多達 32 個設備。

串列通信傳輸速率用於說明傳輸的快慢。在串列通信中,數據是按位進

行傳送的,因此傳輸速率用每秒鍾傳送格式位的數目來表示,稱之波特率

(band rate)。每秒傳送一個格式位就是 1 波特。常用的波特率有:4800、

9600、19200、115200 波特。

串口三個腳:TX、RX、GND

IIC匯流排是一種兩線式串列匯流排,支持多主控,其中任何能夠進行發送和接收的設備都可以成為主匯流排,一個主控能夠控制信號的傳輸和時鍾頻率,當然在任何時間點上只能有一個主控。IIC匯流排是由數據線SDA和時鍾SCl構成的串列匯流排,可發送和接收數據,在CPU與被控IC之間,IC與IC之間進行雙向傳送,最高傳送速率100Kbps,各種被控制電路均並聯在這條匯流排上,每個設備模塊都有唯一的地址,IIC匯流排上的每一個設備模塊既是主控器或被控器,又是發送器或接收器,這取決於你要實現的功能是怎樣的。

CPU發出的控制信號分為地址碼和控制量兩部分

IIC匯流排傳輸過程中有三種信號:起始信號,終止信號,應答信號。

 起始信號:SCL 為高電平時,SDA 由高電平向低電平跳變,開始傳送數據;

 終止信號:SCL 為低電平時,SDA 由低電平向高電平跳變,結束傳送數據;

 應答信號:接收數據的 IC 在接收到 8bit 數據後,向發送數據的 IC 發出

特定的低電平脈沖,表示已收到數據。CPU 向受控單元發出一個信號後,

等待受控單元發出一個應答信號,CPU 接收到應答信號後,根據實際情

況作出是否繼續傳遞信號的判斷。若未收到應答信號,由判斷為受控單

元出現故障。

    SPI允許單片機和外圍設備或者單片機之間高速同步數據傳輸,SPI可以有主機和從機模式之選,通信的主從機之間通過移位寄存器同時交換數據。目前自己用的以主機模式居多。SPI需要四線:SS,MISO,MOSI,SCK。

   通信過程:在設置好SPI的工作模式:包括SCK頻率(數據傳輸速率),工作速度,主從模式,以及數據接收發送對應的時鍾極性。在主模式下,將SS拉低表示通信的開始,然後通過向SPI數據寄存器中寫入一位元組的數據後自動啟動時鍾SCK開始進行一次通信,通信完成後會產生相應的中斷標志,標志一個位元組數據的傳送完成。通信完成後將SS腳拉高,表示通信過程已經結束。

   注意SS引腳的設置:當設置為從機模式時,SS引腳應設置為輸入,拉低的時候SPI才能起作用,拉高的話是消極的SPI模式;在主機模式下,SS引腳可以設置,一般應設置為輸出,如果設置為輸入的話應保持為高,否則將不能進行正常的主機模式操作。

單片機通訊方式

G. 51單片機I2C匯流排問題,郭天祥51的188頁,有3個問題不懂,第一,這個write是個啥,為啥用

bit和uchar 之類的差不多,只不過uchar=8位, bit=1位而已。都是變數,編譯器在編譯過程中分配地址。除非你指定,否則這個地址是隨機的。這個地址是整個可定址空間,RAM+FLASH+
擴展空間。
bit只有0和1兩種值。uchar有256種值。

code是存儲在單片機的flash裡面,不是存在內存裡面了。所以一般固定意義的數據,比如數碼管的段碼,一個圖片的數據信息,都是用code定義,讓這些數據放在flash裡面,節省內存空間。因為51單片機的RAM很少,只有128(或者256)位元組,要是定義的數據(而且是在使用時不做改變的)太多,RAM肯存不下。所以定義code,放在flash裡面。要知道52單片機的flash有8K位元組!遠比256位元組的RAM多。

H. 什麼51單片機型號支持iic

大部分51單片機都不支持iic,好象只有C8051F410系列支持,估計這個晶元不便宜
一般都用普通IO引腳來模擬iic匯流排時序

閱讀全文

與51單片機iic相關的資料

熱點內容
2g視頻怎麼壓縮 瀏覽:607
康佳電視伺服器異常怎麼解決 瀏覽:838
怎麼用c語言編譯簡單的小游戲 瀏覽:814
伺服器如何以域用戶登錄 瀏覽:602
安卓os14怎麼默認桌面 瀏覽:549
應用市場下載在哪個文件夾 瀏覽:895
安卓上的谷歌地圖怎麼用 瀏覽:183
安卓命令行打包 瀏覽:516
編程文字與數字教學視頻 瀏覽:817
如何看手機號碼注冊哪些app 瀏覽:413
linux查看總內存 瀏覽:852
python進程間共享 瀏覽:438
js如何獲取本地伺服器地址 瀏覽:70
gfx什麼時候支持安卓十一系統 瀏覽:942
壓縮機90兆帕 瀏覽:932
程序員調侃語句 瀏覽:582
不是php函數的是 瀏覽:1002
壓縮文件好處 瀏覽:787
3d266期神童三膽計演算法 瀏覽:191
通過愛思助手怎麼下載app 瀏覽:323