I2C总线AT24C02读写程序
pre>//****************************************************
/*
程序的功能:将数据写入AT24C02中,然后再从其中读取
回来赋给P2口,让流水灯显示。
所涉及芯片:AT24C02
*/
//****************************************************
#includelt;reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit scl=P0^3;//时钟线接在P0^3口
sbit sda=P0^4;//数据线接在P0^4口
void delay()//极短时间的延时
{
; ; ;
}
void delay1()//较长时间的延时
{
uchar i,j;
uchar k=10;
for(i=k;i>0;i--)
for(j=110;j>0;j--);
}
void chushihua()//对总线进行初始化
{
sda=1;
scl=1;
}
//=======================================
void start()//起始函数
{
sda=1;
delay();
scl=1; //时钟线为高电平期间,数据线由高到低的一个跳变表示起始
delay();
sda=0;
delay();
}
//=========================================
void stop()//终止函数
{
sda=0;
delay();
scl=1;//时钟线为高电平期间,数据线由低到高的一个跳变表示终止
delay();
sda=1;
delay();
}
//==========================================
void ack()//应答函数
{
uchar i;
scl=1;
if((sda==1)(ilt;250))i++;//如果数据线一直为高电平,则一段时间后则默认为应答(即时钟线由高到底的一个跳变)
scl=0;
delay();
}
//===========================================
void noack()//非应答函数 ,在数据线为高电平期间,时钟线一个完整的脉冲表示非应答
{
sda=1;
delay();
scl=0;
delay();
scl=1;
delay();
scl=0;
delay();
}
//====================================
void write_byte(uchar date)//写字节函数
{
uint i;
scl=0;//时钟线为低电平期间,允许数据的变化
for(i=0;ilt;8;i++)
{
if(date0x80)//如果写进的数据与0x80进行与运算为“1”(即为真),则数据线为高电平
{
sda=1;
}
else //否则为低电平
{
sda=0;
}
date=datelt;lt;1;//对8位数据进行移位操作
scl=1;//时钟线为高电平(即数据稳定),把数据读走
delay();
scl=0; //把时钟线拉回低电平
delay();
}
sda=1; //释放数据线
delay();
}
//========================================
uchar read_byte()//读字节函数
{
uchar i;
uchar date=0x00;
scl=0;
delay();
sda=1;//将总线释放
delay();
for(i=0;ilt;8;i++)
{
scl=1;//时钟线为高电平(即数据稳定),把数据读走
delay();
date=datelt;lt;1;
if(sda)
{
date++;
}
scl=0;
delay();
}
return date;
}
void xie(uchar add,uchar date)
{
start();
write_byte(0xa0);//指令码0xa0为写操作
ack();
write_byte(add);
ack();
write_byte(date);
ack();
stop();
}
uchar du(uchar t)
{
uchar k;
start();
write_byte(0xa0);
ack();
write_byte(t);
ack();
start();
write_byte(0xa1);//指令码0xa1为读操作
ack();
k=read_byte();
noack();
stop();
return k;//返回K的值
}
void main()
{
chushihua();
xie(10,0x44);//在0~256个地址中随意选一地址10,并在该地址写入一字节0x44
delay1();//此处必须要一个延时函数
P2=du(10);//将在地址10读回的数据赋给P2口(即让流水灯显示)
while(1);//让程序停在此处
}
/pre>
评论