24c02的连续读写

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/**********************************************
24c02驱动程序
SDA=P3^6;SCL=P3^7;
可以写一个字节,写一串字符(以'\n'作为结束标志)
可以读一个字节,读一串字符(以'\n'作为结束标志)
**********************************************/
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

#define W24C02 0xA0 //存储器的写地址
#define R24C02 0xA1 //存储器的读地址

/********************/
sbit SDA=P3^6; //AT24C02串行数据 5脚
sbit SCL=P3^7; //AT24C02串行时钟 6脚

void start_24c02(); //开始
void stop_24c02(); //停止
void response_24c02(bit); //应答
void write_8bit(uchar); //写8位
void write_byte(uchar,uchar); //写一字节
void write_list(uchar, uchar *); //写*指向的数据(以'\n'作结束)
uchar read_8bit(); //读8位
uchar read_byte(uchar); //从某一地址读1字节
void read_list(uchar,uchar *); //从某一地址开始连续读,存到*所指位置

/********************
开始,在读\写前调用
********************/
void start_24c02()
{
SDA=1;
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
SDA=0;
_nop_();
_nop_();
}

/********************
结束,在读\写完后调用
********************/
void stop_24c02()
{
SDA=0;
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
SDA=1;
_nop_();
_nop_();
}

/********************
应答
当单片机写时,ack=1,为等待24c02的应答信号
当单片机读时,ack=0,为向24c02发送应答信号
********************/
void respons_24c02(bit ack) //ak为1则单片机接收24c02的应答信号;ak为0则24c02接收单片机的应答信号
{
uchar i=0;
SDA=ack;
while(i<250&&SDA==1)i++;
SCL=1;
_nop_();
_nop_();
SCL=0;
_nop_();
SDA=1;
}

/********************
向24c02写入一字节(8位)的数据
********************/
void write_8bit(uchar dat)
{
uchar i;
SCL=0;
for(i=0;i<8;i++)
{
dat=dat<<1;
SDA=CY;
SCL=1;
_nop_();
_nop_();
SCL=0;
_nop_();
_nop_();
}
}

/********************
从24c02读取一字节(8位)
的数据
********************/
uchar read_8bit()
{
uchar i,k;
for(i=0;i<8;i++)
{
SCL=1;
_nop_();
_nop_();
k=(k<<1)|SDA;
SCL=0;
_nop_();
_nop_();
}
return k;
}

/********************
向地址addr写入数据dat
********************/
void write_byte(uchar addr,uchar dat)
{
start_24c02();
write_8bit(W24C02);
respons_24c02(1);
write_8bit(addr);
respons_24c02(1);
write_8bit(dat);
respons_24c02(1);
stop_24c02();
}

/********************
从地址addr形如连续写入
list中的数据,以'\n'为
结束标志
********************/
void write_list(uchar addr, uchar *list)
{
uchar i=0;
start_24c02();
write_8bit(W24C02);
respons_24c02(1);
write_8bit(addr);
respons_24c02(1);
do
{
if(i==0||i%8!=0) //判断

是否到了页的边缘
{
write_8b
it(list[i]);
respons_24c02(1);
}
else
{
stop_24c02(); //写完一页,则进入启动内部写周期
do
{
start_24c02();
write_8bit(W24C02);
SDA=1;
//delay(2);
}while(SDA==1); //等待24c02完成写周期发出的应答信号,从而继续下一个读写操作
SCL=1;
_nop_();
_nop_();
SCL=0; //应答
write_8bit(i);
respons_24c02(1);
write_8bit(list[i]);
respons_24c02(1);

}
}
while(list[i++]!='\n');
stop_24c02();

}

/********************
从addr中读取一字节数据
返回dat
********************/
uchar read_byte(uchar addr)
{
uchar dat;
start_24c02();
write_8bit(W24C02);
respons_24c02(1);
write_8bit(addr);
respons_24c02(1);
start_24c02();
write_8bit(R24C02);
respons_24c02(1);
dat=read_8bit(); //读取一字节后若发送停止指令,则结束并返回dat
stop_24c02();
return dat;
}

/********************
从地址addr开始连续读
取数据,并存入list中
以'\n'为结束
********************/
void read_list(uchar addr,uchar *list)
{
uchar i=0;
start_24c02();
write_8bit(W24C02);
respons_24c02(1);
write_8bit(addr);
respons_24c02(1);
start_24c02();
write_8bit(R24C02);
respons_24c02(1);
do
{
list[i]=read_8bit(); //读取1字节后,若其不为结束标志,则发送应答信号,继续读下一个
if(list[i]!='\n')
respons_24c02(0);
}
while(list[i++]!='\n');
stop_24c02();
}

相关文档
最新文档