Ⅰ 單片機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上的一致。
不一致的話,就修改延時時間,直到一致為止。