//////////////////////////////////////////////////////
//基于I2C传输协议24c02读写操作程序,硬件为51单片机P1.0接
//24c02的WP端口,P1.1接24c02的SCL,P1.2接24c02的SDA,
//24C02地址口A0,A1,A2全接高电平;下面程序已经经过硬件测试
//欢迎大家参考学习,如有copy请注明来源;
// Copyright 田峰 QQ:413336413
/////////////////////////////////////////////////////////
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define TRUE 1
#define FALSE 0
sbit WP=P1^0;
sbit scl=P1^1;
sbit sda=P1^2;
void delay(uchar z)
{
uchar x,y;
for(x=z;x>0;x++)
for(y=100;y>0;y++);
}
void start()
{
sda=1;
_nop_();
scl=1;//起始建立时间大于4.7us
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
sda=0;//起始锁定时间大于4us
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
_nop_();
}
void stop()
{
sda=0;
_nop_();
scl=1;//发送停止条件的时钟信号,停止总线时间大于4us
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
sda=1;//结束总线
_nop_();//保证一个终止信号和起始信号的空闲时间大于4.7us
_nop_();
_nop_();
_nop_();
}
uchar cheak_ack()//主机发送一个字节数据后检查应答位
{
bit FO=0;
sda=1;//释放数据线等待接收应答信号ACK
_nop_();
_nop_();
scl=1;//应答位时钟拉高
_nop_();
_nop_();
F0=sda;
scl=0;
_nop_();
_nop_();
if(F0==1)
return FALSE;
else
return TRUE;
}
void master_ack()//主机接收一个字节数据应答
{
sda=0;
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
sda=1;
}
void master_uack()//主机接收一个字节数据非应答
{
sda=1;
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
sda=0;
}
void write_byte(uchar date)//在EEPROM上写一个字节数据
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
sda=CY;
_nop_();
scl=1;
_nop_();
scl=0;
_nop_();
}
}
uchar read_byte()//从EEPROM上读一个字节数据
{
uchar i,j,k;
sda=1;
_nop_();
for(i=0;i<8;i++)
{
scl=1;
_nop_();
k=sda;
scl=0;
_nop_();
j=(j<<1)|k;
}
return j;
}
void write_add(uchar address,uchar date)//在EEPROM的地址address上写数据date
{
bit acktemp;
start();
write_byte(0xae);
acktemp=cheak_ack();
write_byte(address);
acktemp=cheak_ack();
write_byte(date);
acktemp=cheak_ack();
stop();
}
uchar read_add(uchar address)//从EEPROM的地址address上读数据date
{
bit acktemp;
uchar date;
start();
write_byte(0xae);
acktemp=cheak_ack();
write_byte(address);
acktemp=cheak_ack();
start();
write_byte(0xaf);
master_ack();
date=read_byte();
master_uack();
stop();
return date;
}
void main()
{
WP=0;
P2=1;
write_add(23,0x71);
delay(100);
P0=read_add(23);
while(1);
} |