IIC要有延時的,你在所有的時鐘和數據后面加上一個空操作或者延時
你的程序都是沒有延時的
你參考一下
/*IIC讀寫函數*/
#include "IIC.H"
//=================================================================================================
void Delay() //用于IIC延時,CY有變化,根據不同單片機的時鐘可以適當調整延時時長
{
unsigned char i;
for(i=0;i<1;i++);
}
//=================================================================================================
void Delay_ms(unsigned int a) //@24.000MHz,1mS延時函數,這個代碼從STC下載器復制來
{
unsigned char i, j;
for(a;a>0;a--)
{
i = 32;
j = 40;
do
{
while (--j);
} while (--i);
}
}
//=================================================================================================
void IIC_Start() //IIC啟動信號
{
SCL=0;
Delay(); //延時1mS
SDA=1;
Delay();
SCL=1;
Delay();
SDA=0;
Delay();
SCL=0;
}
//=================================================================================================
void IIC_Stop() //IIC停止信號
{
SCL=0;
Delay(); //延時1mS
SDA=0;
Delay();
SCL=1;
Delay();
SDA=1;
Delay();
}
//=================================================================================================
void IIC_Ask() //IIC應答信號
{
SCL=0;
Delay(); //延時
SDA=0;
Delay();
SCL=1;
Delay();
SCL=0;
Delay();
}
//=================================================================================================
void IIC_Nask() //IIC不應答信號
{
SCL=0;
Delay(); //延時
SDA=1;
Delay();
SCL=1;
Delay();
SCL=0;
Delay();
}
//=================================================================================================
void Write_Byte(unsigned char byte) //寫入器件的應答信號由從機給出
{
unsigned char i,temp;
unsigned int k;
temp=byte;
SCL=0;
Delay();
for(i=0;i<8;i++)
{
if(temp&0x80)SDA=1;
else SDA=0;
Delay();
SCL=1;
Delay();
SCL=0;
Delay();
temp=temp<<1;
}
SCL=1; //給出一個上升沿,用于產生應答信號
Delay();
SDA=1;
while((SDA==1)&&(k<1000))
{
k++;
Delay();
} //等待SDA出現低電平,出現低電平就表示器件已經應答
SCL=1;
SDA=0;
Delay();
}
//=================================================================================================
unsigned char Read_Byte() //讀取的應答信號由單片機給出
{
unsigned char i,k;
SCL=0;
Delay();
SDA=1; //置位SDA等于釋放SDA端口.讓內部可以讀取到這個端口的電平狀態
Delay();
for(i=0;i<8;i++)
{
SCL=0;
Delay();
SCL=1;
k=(k<<1)|SDA;
Delay();
}
return k;
}
//=================================================================================================*/ |