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;
}
//=================================================================================================*/ |