導航:首頁 > 編程語言 > 430模擬iic程序

430模擬iic程序

發布時間:2023-12-07 01:55:46

Ⅰ 單片機iic程序不懂給分析下啊

貼個程序給你看看,,,單片機沒有I2C匯流排介面,只能靠軟體模擬
/*程序的I2C從器件地址為1010,片選地址為000*/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SDA=P1^7;
sbit SCL=P1^6;

void Delay(uint us)
{
for(us;us>0;us--);
}

void start_iic() // 啟動I2C匯流排
{
SDA=1; // 發送起始條件數據信號,啟動時,
SCL=1; // 必需使數據線、時鍾信號線處於高電平(空閑態)
Delay(10); // 使用I2C匯流排必需考慮保持時間和建立時間,故延時
SDA=0; //產生下降沿,發送起始信號
Delay(10);
SCL=0;
}

void stop_iic()
{
SDA=0; //為產生上跳沿做准備
SCL=1; //打開時鍾線
Delay(10);
SDA=1; //產生停止信號(上跳沿有效)
Delay(10);
SCL=0; //時鍾線恢復無效態//
}

void ack_iic()
{
SDA=0; // 接受器件發送應答信號
SCL=1;
Delay(10);
SCL=0;
SDA=1; //應答信號低電平有效,故需將其重新置高電平
}

void nack_iic()
{
SDA=1; //主器件發非應答信號,通知AT24C08不再發送數據
SCL=1;
Delay(10);
SCL=0;
SDA=0; //非應答信號高電平有效,故需將其重新置低電平
}

Write_byte(uchar c)
{
uchar i;
for(i=0;i<8;i++)
{
if(c&0x80)SDA=1;
else SDA=0;
SCL=1;
Delay(10);
SCL=0; //因為當時鍾線有效是,數據線必須保持穩定的電平,
c=c<<1; //要改變SDA電平,應先將SCL拉低
}
SDA=1; //釋放I2C匯流排,准備接受應答信號
SCL=1;
Delay(10);
if(SDA==1)F0=0; //沒有接到應答位
else F0=1;
SCL=0;
}

uchar Read_byte()
{
uchar i;
uchar r=0;
SDA=1; //置數據線為輸入方式
for(i=0;i<8;i++)
{
r=r<<1;
SCL=1;
Delay(10); //保證一定的電平保持時間
if(SDA==1)r++; //從高位開始,一位一位的讀
SCL=0;
}
return r;
}

main()
{
uchar slave=0xa0; //I2C匯流排從器件地址(注意:硬體電路的接法要是片選地址為0,否則不能工作)
uchar Rslave=slave+1; //主器件發送讀控制字位元組
uchar addre=0x20; // 指定的寫數據地址
uchar wbuf=0x23; //將要寫進addre的數據
uchar rbuf; //存放讀出的數據的臨時變數
start_iic(); //產生起始信號
Write_byte(slave); //發送從器件地址
if(F0==0)return 0; //檢查應答位
Write_byte(addre); //發送目的地址
if(F0==0)return 0;
Write_byte(wbuf); //發送8為數據
if(F0==0)return 0;
stop_iic(); //停止信號

/*8位的數據發送完畢*/

Delay(1000);
start_iic();
Write_byte(slave);
if(F0==0)return 0;
Write_byte(addre);
if(F0==0)return 0;

start_iic(); //再次產生起始信號,不能少
Write_byte(Rslave); //送讀控制字
if(F0==0)return 0;
rbuf=Read_byte(); //讀出指定單元的內容
nack_iic(); //非應答信號
stop_iic();

/*8位的數據讀取完畢*/

TMOD=0x20; //串口調試
TL1=0xfd;
TH1=0xfd;
SCON=0x40;
PCON=0x00;
TR1=1;
while(1)
{
SBUF=rbuf; //放入緩沖
while(TI==0);
TI=0;
Delay(10000);
}

}

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

I2C是單主多從的,不是樓主說的從機接受ID,而是單片機發送ID(由晶元的地址和晶元地址管腳的高低電平決定),然後對應ID的從機發送應答信號。
然後兩者再進行數據傳輸。多看一下IIC的Datasheet,不是很難的。收發時的時序是關鍵。

Ⅲ 求MSP430讀取MLX90615的c語言程序,即使用IIC串列通信的方法讀取MLX90615的RAM中的溫度值,求大神幫忙!!

你可以下載MLX90615其他MCU平台的驅動,51的 avr的或者STM8/32的都可以,只要不是用硬體IIC的就行。
然後下載MLX90615的datasheet,來看IIC的時序。
將其他平台的常式移植到MSP430上,用示波器看SCL 和SDA的波形是否和datasheet上的一致。
不一致的話,就修改延時時間,直到一致為止。

閱讀全文

與430模擬iic程序相關的資料

熱點內容
什麼編程可以控制瀏覽器 瀏覽:277
微信文愛聊天截圖圖片 瀏覽:427
糖果小號密碼查看工具 瀏覽:191
pm一般做什麼編程 瀏覽:937
linux共享文件給mac 瀏覽:428
ps另存為時找不到文件 瀏覽:818
iphone6s朋友圈視頻沒聲音 瀏覽:728
win10系統工具文件夾 瀏覽:862
微信扔出去的怎樣找回來 瀏覽:744
編程怎麼錄視頻 瀏覽:470
東方財富app解套率怎麼計算 瀏覽:74
win10系統為excel文件在哪裡 瀏覽:578
字幕文件哪個網站下載 瀏覽:745
app怎麼推廣推廣 瀏覽:674
小鳥壁紙哪個文件夾刪不掉 瀏覽:419
閨蜜圈app怎麼樣 瀏覽:931
新版天貓app如何查看詳情 瀏覽:390
sql資料庫同步 瀏覽:492
網路面板線錯了怎麼辦 瀏覽:343
cs6畫筆工具在哪 瀏覽:290

友情鏈接