//本试验写入N个字节到 24c02 并读出来
//―――――――――――――――――――――――――――――
#include <reg52.h> //包括一个 52 标准内核的头文件
#define uchar unsigned char //定义一下方便使用
#define uint unsigned int
#define WriteDeviceAddress 0xae //定义器件在 IIC 总线中的地址
#define ReadDviceAddress 0xaf
sbit SCL=P0^7;
sbit SDA=P0^6;
bit flag;
uchar readdate;
uchar table[5]={0x01,0x02,0x04,0x08,0x10};
uchar table1[5]=0;
/***********延时函数10us******************/
void delayms(uint z)
{
#if 1
uint i,j;
for(i=z;i>0;i--)
for(j=0;j<340;j++);
#else
z = 20;
while(z--);
#endif
}
/*************开始(正确)**********************/
void start()
{
SDA=1;
delayms(1);
SCL=1;
delayms(1);
SDA=0;
}
/**************结束(正确)*********************/
void stop()
{
SDA=0;
delayms(1);
SCL=1;
delayms(1);
SDA=1;
delayms(5);
}
/**************非应答(正确)***********************/
void NOACK()
{
SDA=1;
delayms(1);
SCL=1;
delayms(1);
SCL=0;
delayms(1);
}
/***************测试 ACK **********************/
bit TestAck()
{
unsigned char i;
SCL=1; //允许读入数据
delayms(1);
flag = 0;
for(i=255;i>0;i--)
{
if(SDA==0)
{
flag=1;
break;
}
}
SCL=0; //保持响应
return(flag);
}
/**************写入 8 个 bit 到 24c02(修改过) **********************************/
void Write8Bit(uchar input)
{
uchar temp;
for(temp=0;temp<8;temp++)
{
SCL=0;
delayms(1);
if(input&0x80)
SDA=1;
else
SDA=0;
delayms(1);
SCL=1;
delayms(1);
input=input<<1;
}
SCL=0;
delayms(1);
SDA=1;//释放SDA数据线
}
/************写入N个字节到 24c02 中****************************/
bit Write24c02(uchar *ch,uchar address)
{
uchar i;
start();//启动I2C
Write8Bit(WriteDeviceAddress); //发送器件地址
TestAck();
Write8Bit(address); //发送器件内部数据地址
TestAck();
for(i=0;i<5;i++)
{
Write8Bit(*(ch+i));
TestAck();
}
stop();
delayms(20);
return(1);
}
/************从 24c02 中读出 8 个 bit*********************************/
uchar Read8Bit()
{
unsigned char temp;
SCL=0;//允许数据变化
delayms(1);
SDA=1;//释放SDA数据线准备读数据
for(temp=8;temp>0;temp--)
{
SCL=1; //保持住地temp个数据使其赋值给readdata
delayms(1);
readdate=readdate<<1;
if(SDA==1)
readdate=readdate|0x01;//低位置1
else
readdate=readdate&0xfe;//低位置0
SCL=0;
}
return(readdate);
}
//从 24c02 中读出 1 个字节
uchar Read24c02(uchar address)
{
uchar ch;
start();
Write8Bit(WriteDeviceAddress);//发送器件地址到2402
TestAck();
Write8Bit(address);//发送器件内部地址
TestAck();
start();
Write8Bit(ReadDviceAddress); //读地址
TestAck();
ch=Read8Bit(); //读出数据
NOACK();
stop();
return(ch);
}
void main() // 主程序
{
uchar c1=0,i,ars=0x01;
P1=0;
Write24c02(table,0x01);//0X01为起始写地址。table为实参首地址
for(i=0;i<5;i++)
{
table1[i]=Read24c02(ars); //读出5个数据存放在数组table1【】中
ars++;
}
P1=table1[4];//传送出来
while(1);
}