用软件在51上模拟IIC
void delay10us(void) //误差 0us
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=10;a>0;a--);
}
void delay10ms(void) //误差 0us
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=47;a>0;a--);
}
void init()
{
SCL=1;
delay10us();
SDA=1;
delay10us();
}
void startIIC(void) //启动IIC
{
SDA=1;
delay10us();
SCL=1;
delay10us();
SDA=0;
}
void respond() //等待应答
{
char i;
SCL=1;
delay10us();
while(SDA==1&&i<256) //SCL=1时,若SDA接收到低电平则表明接收正常,至于i是防止程序在此处锁死,防止IIC锁死,一定时间未接收到型号后退出
i++;
SCL=0;
delay10us();
}
void stopIIC()
{
SCL=1;
SDA=0;
delay10us();
SDA=1;
delay10us();
SCL=0;
}
void senddata(char udata)
{
char i, temp;
temp=udata;
for(i=0;i<8;i++)
{
temp=temp<<1;
SCL=0;
delay10us();
SDA=CY;
SCL=1;
delay10us();
}
SCL=0; //这之后还要发个1
delay10us();
SDA=1;
delay10us();
}
char readdata()
{
char i, k;
SCL=0;
delay10us();
SDA=1;
for(i=0;i<8;i++)
{
SCL=1;
delay10us();
k=(k<<1)|SDA;
SCL=0;
delay10us();
}
return k;
}
void write_address(char address, char udata)
{
startIIC();
senddata(0xa0);
respond();
senddata(address);
respond();
senddata(udata);
respond();
stopIIC();
}
char read_address(char address)
{
char date;
startIIC();
senddata(0xa0);
respond();
senddata(address);
respond();
startIIC();
senddata(0xa1);
respond();
date=readdata();
respond();
stopIIC();
return date;
}
这个函数中的这个的SDA怎么只有一位啊。发送的时候SDA都是一个字节,怎么到读取时就只有一位啊求指教
char readdata()
{
char i, k;
SCL=0;
delay10us();
SDA=1;
for(i=0;i<8;i++)
{
SCL=1;
delay10us();
k=(k<<1)|SDA;
SCL=0;
delay10us();
}
return k;
} |