尊敬的用户:端午节放假期间(5月31日-6月2日),本站所有审核统一于节后处理,如不便之处敬请谅解!祝端午安康!
实现AT24C02的数据读写操作
来源:互联网 发布时间:2018-11-05 分享至微信


/***************************************************************


功能:11:32 2008-6-27


作者:SG


时间:2004-03-15


版本:V1.0


***************************************************************/




#include "INTRINS.H"


#include "reg52.h"




#define WriteDeviceAddress 0xa0 //写驱动地址指令


#define ReadDeviceAddress 0xa1 //读驱动地址指令




sbit AT24C02_SCL = 0xa4;


sbit AT24C02_SDA = 0xa5;




/*-------------------------------------------------------------


功能:发起始信号


------------------------------------------------------------*/


void Start_Cond()


{


AT24C02_SCL = 0;


_nop_();


AT24C02_SDA = 1;


_nop_();


AT24C02_SCL = 1;


_nop_();


AT24C02_SDA = 0;


_nop_();


}




/*-------------------------------------------------------------


功能:发停止信号


------------------------------------------------------------*/


void Stop_Cond()


{


AT24C02_SCL = 0;


_nop_();


AT24C02_SDA = 0;


_nop_();


AT24C02_SCL = 1;


_nop_();


AT24C02_SDA = 1;


_nop_();


}




/*-------------------------------------------------------------


功能:发确认信号


------------------------------------------------------------*/


void Ack()


{


AT24C02_SCL = 0;


_nop_();


AT24C02_SDA = 0;


AT24C02_SCL = 1;


_nop_();


AT24C02_SCL = 0;


_nop_();


AT24C02_SDA = 1;


}




/*-------------------------------------------------------------


功能:发无确认信号


------------------------------------------------------------*/


void NoAck()


{


AT24C02_SCL = 0;


_nop_();


AT24C02_SDA = 1;


_nop_();


AT24C02_SCL = 1;


_nop_();


AT24C02_SCL = 0;


_nop_();


}




/*-------------------------------------------------------------


功能:写一个字节数据


------------------------------------------------------------*/


bit Write8Bit(unsigned char input)


{


unsigned char i;


for (i=0;i<8;i++)


{


AT24C02_SCL = 0;


input <<= 1;


AT24C02_SDA = CY;


AT24C02_SCL = 1;



}


AT24C02_SCL = 0;


_nop_();


AT24C02_SDA = 1;


AT24C02_SCL = 1;


_nop_();


CY = AT24C02_SDA;


return(CY) ;


}




/*-------------------------------------------------------------


功能:读一个字节数据


------------------------------------------------------------*/


unsigned char Read8Bit()


{


unsigned char temp,rbyte=0;


for (temp = 8;temp != 0;temp--)


{


AT24C02_SCL = 0;


_nop_();


rbyte = (rbyte << 1) | AT24C02_SDA;


AT24C02_SCL = 1;


_nop_();


}


return rbyte;


}




/*-------------------------------------------------------------


功能:从EEPROM中给定一个地址连续读NLEN个字节数据存放在以指针


nContent开头的往下内容。


------------------------------------------------------------*/


bit Read_Flash ( unsigned char *nContent, unsigned char nAddr, unsigned char nLen )


{


unsigned char Addr;


Addr = nAddr;


Start_Cond(); //写开始信号


Write8Bit(WriteDeviceAddress); //写驱动地址


Write8Bit(Addr); //写从EEPROM中读的开始地址


Start_Cond(); //写开始信号


Write8Bit(ReadDeviceAddress); //写读数据指令


while(--nLen)


{


*nContent=Read8Bit(); //读出内容


nContent++; //指针加1


Ack(); //发确认信号


}


*nContent=Read8Bit(); //读一字节


NoAck(); //没有确认信号


Stop_Cond(); //发停止信号


return(0); //返回


}




/*-------------------------------------------------------------


功能:初始化EEPROM子程序内容为FF


------------------------------------------------------------*/


bit Init_Flash ( unsigned int nPage ) // 8 Byte/1Page init 0xFF


{


unsigned char nLen;


unsigned char Addr;


nLen=8;


Addr=8 *nPage;



Start_Cond();


Write8Bit(WriteDeviceAddress);


Write8Bit(Addr);


for(;nLen!=0;nLen--)


{


if(Write8Bit(0xff)) break; //if Write8Bit() Return 1 Write Flase


}


Stop_Cond();


return(CY);


}




/*-------------------------------------------------------------


功能:从EEPROM中给定一个地址连续写NLEN个字节数据存放在以指针


nContent开头的往下内容。


------------------------------------------------------------*/


bit Write_Flash ( unsigned char *nContent, unsigned char nAddr,unsigned char nLen)


{


unsigned char i,temp;


unsigned char Addr;


Addr = nAddr;


Start_Cond(); //写开始信号


Write8Bit(WriteDeviceAddress); //写驱动地址


Write8Bit(Addr); //写从EEPROM中写的开始地址


for(i = 0;i < nLen;i++)


{


if(Addr%8==0) //每页8字节 //换页


{


Stop_Cond();


_nop_();


Start_Cond();


Write8Bit(WriteDeviceAddress);


Write8Bit(Addr);


}


temp = *nContent;


if(Write8Bit(temp)) break; //CY


nContent++;


Addr++;


}


Stop_Cond(); //发停止信号


return(CY);


}




/*-------------------------------------------------------------


主程序


功能:实现存储器EEPROM AT24C02的数据读写操作


------------------------------------------------------------*/


void main()


{


unsigned char dat[16],i;



Read_Flash(dat,0,16); //读出AT24C02中从地址0开始依次往后16个字节放入dat数组中


Init_Flash(0); //将AT24C02的第0页初始化为FF


Read_Flash(dat,0,16); //读出AT24C02中从地址0开始依次往后16个字节放入dat数组中



for(i = 0;i < 16;i++ )


{


dat[i] = i; //对数组dat初始化为0---F


}


Write_Flash(dat,0,16); //将dat数组中的数据写入AT24C02中地址从0开始


Read_Flash(dat,1,16); //读出AT24C02中从地址1开始依次往后16个字节放入dat数组中


while(1)


{


i = 9;


}


}




[ 新闻来源:互联网,更多精彩资讯请下载icspec App。如对本稿件有异议,请联系微信客服specltkj]
存入云盘 收藏
举报
全部评论

暂无评论哦,快来评论一下吧!