用軟件在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() //等待應(yīng)答
{
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; //這之后還要發(fā)個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;
}
這個函數(shù)中的這個的SDA怎么只有一位啊。發(fā)送的時候SDA都是一個字節(jié),怎么到讀取時就只有一位啊求指教
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;
} |