(改自周立功软件包)
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
extern void Delay1us(unsigned char );
sbit SDA=P1^6;
sbit SCL=P1^7;
bit ack;
void Start_I2c()
{
SDA=1;
Delay1us(1);
SCL=1;
Delay1us(5);
SDA=0;
Delay1us(5);
SCL=0;
Delay1us(2);
}
void Stop_I2c()
{
SDA=0;
Delay1us(1);
SCL=1;
Delay1us(5);
SDA=1;
Delay1us(4);
}
void SendByte(uchar c)
{
uchar BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++)
{
if((c<<BitCnt)&0x80)SDA=1;
else SDA=0;
Delay1us(1);
SCL=1;
Delay1us(5);
SCL=0;
}
Delay1us(2);
SDA=1;
Delay1us(2);
SCL=1;
Delay1us(3);
if(SDA==1)ack=0;
else ack=1;
SCL=0;
Delay1us(2);
}
uchar RcvByte()
{
uchar retc;
uchar BitCnt;
retc=0;
SDA=1;
for(BitCnt=0;BitCnt<8;BitCnt++)
{
Delay1us(1);
SCL=0;
Delay1us(5);
SCL=1;
Delay1us(3);
retc=retc<<1;
if(SDA==1)retc=retc+1;
Delay1us(2);
}
SCL=0;
Delay1us(2);
return(retc);
}
void Ack_I2c(bit a)
{
if(a==0)SDA=0;
else SDA=1;
Delay1us(3);
SCL=1;
Delay1us(5);
SCL=0;
Delay1us(2);
}
bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
{
uchar i;
Start_I2c();
SendByte(sla);
if(ack==0)return(0);
SendByte(suba);
if(ack==0)return(0);
for(i=0;i<no;i++)
{
SendByte(*s);
if(ack==0)return(0);
s++;
}
Stop_I2c();
return(1);
}
bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
{
uchar i;
Start_I2c();
SendByte(sla);
if(ack==0)return(0);
SendByte(suba);
if(ack==0)return(0);
Start_I2c();
SendByte(sla+1);
if(ack==0)return(0);
for(i=0;i<no-1;i++)
{
*s=RcvByte();
Ack_I2c(0);
s++;
}
*s=RcvByte();
Ack_I2c(1);
Stop_I2c();
return(1);
}
说明:这个软件我删减了一部分,主要是改写了延时子程序部分,使之适合STC12C2052/5410系列的单片机时序!
改动后可以很好的应用在STC单片机上,应用时主要使用
bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
这两个函数,就可以实现对有子地址的器件的读写!