#define uchar unsigned char
#define uint unsigned int
sbit scl=P3^4;
sbit sda=P3^5;
void delay0()//大约4us的延时
{
;;
}
void delay(uint z)//大约1ms的延时
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void start()//起始信号
{
sda=1;
delay0();
scl=1;
delay0();
sda=0;
delay0();
}
void stop()//终止信号
{
sda=0;
delay0();
scl=1;
delay0();
sda=1;
delay0();
}
void respons()//应答信号
{
uchar i;
scl=1;
delay0();
while(sda==1&&i<250)i++;//等待应答
scl=0;
delay0();
}
void write_byte(uchar date)//写数据,写一个字节
{
uchar i;
scl=0;
delay0();
for(i=0;i<8;i++)
{
date=date<<1;
sda=CY;//最高位移入PSW的CY位
delay0();
scl=1;
delay0();
scl=0;
delay0();
}
sda=1;//释放sda线
delay0();
}
uchar read_byte()//读数据,读一个字节
{
uchar i,j;
scl=0;
delay0();
sda=1;
delay0();
for(i=0;i<8;i++)
{
scl=1;
delay0();
j=(j<<1)|sda;
scl=0;
delay0();
}
return j;
}
void write_add(uchar address,uchar date)//向某个地址写一个字节的数据
{
start();//起始信号
write_byte(0xa0);//器件地址+0,即1010 000 0,最后的'0'为写方向位
respons();//应答
write_byte(address);//写入器件的首地址
respons();
write_byte(date);//写入数据
respons();
stop();//终止信号
}
uchar read_add(uchar address)//读出某个地址的数据
{
uchar l;
start();//起始信号
write_byte(0xa0);//器件地址+0,即1010 000 0,最后的'0'为写方向位
respons();
write_byte(address);//要读出的首地址
respons();
start();//再次来起始信号
write_byte(0xa1);//器件地址+1,即1010 000 1,最后的'1'为读方向位
respons();
l=read_byte();//读数据
stop();
return l;//返回数据
}
void init_24C02()//24C02初始化
{
sda=1;//释放数据线
delay0();
scl=1;//释放时钟线
delay0();
}
void main()
{
init_24C02();
while(1)
{
write_add(1,0x00);
delay(100);//延时很有必要,因为器件写和读之间要一定的时间间隔,不然反应不过来
P2=read_add(1);//读取24C02里的数据,"1"为其存储地址
while(1);
}
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』