AT24C02程序

AT24C02程序
bit write=0;
sbit SDA=P2^0;//定义SDA端口
sbit SCL=P2^1;//定义SCL端口

void delayus()//定义us级延时程序
{;;}

void start()//起始程序
{
SDA=1;
delayus();
SCL=1;
delayus();
SDA=0;
delayus();
}

void stop()//终止程序
{
SDA=1;
delayus();
SCL=1;
delayus();
SDA=0;
delayus();
}

AT24C02程序
void ack()//应答程序
{
uchar i;
SCL=1;
delayus();
while((SDA=1)&&i<250)i++;
SCL=0;
delayus();
}
AT24C02程序

void init()//初始化
{
SDA=1;
delayus();
SCL=1;
delayus();
}

void write_byte(uchar dat)//写一个字节程序
{
uchar i,temp;
temp=dat;
for(i=0;i<8;i++)//1个字节8位二进制数
{
temp=temp<<1;//将temp左移1位,最低位补0
SCL=0;//将SCL置0允许SDA数据变化
delayus();
SDA=CY; //将最高位移出的CY位赋给SDA
delayus();
SCL=1;//置1将数据写入
delayus();
}
SCL=0;//置0允许数据变化
delayus();
SDA=1;//释放总线
delayus();
}

uchar read_byte()//读一个字节程序
{
uchar i,k;
SCL=0;//置0允许数据变化
delayus();
SDA=1;//假设SDA为1
delayus();
for(i=0;i<8;i++)
{
SCL=1;//上升沿时,IIC设备将数据放在SDA线上,并在高电平期间数据已经稳定,可以接收数据了
delayus();
k=(k<<1)|SDA;//将k左移一位跟SDA或运算,再赋给k
SCL=0;//拉低SCL,使发送端可以把数据放在SDA上
delayus();
}
return k;
}

void write_byte(uchar address, uchar dat)//指定地址写一个字节
{
start();
write_byte(0xa0);
ack();
write_byte(address);
ack();
write_byte(dat);
ack();
stop();
}
AT24C02程序
char read_byte(uchar address, uchar dat)//随机读取一个字节
{
start();
write_byte(0xa0);
ack();
write_byte(address);
ack();
start();
write_byte(0xa1);
ack();
dat=read_byte();
stop();
return dat;
}
AT24C02程序