//////////////////////////////////////////////////////// 头文件 /////////////////////////////////////////////////////////////////////////////////////////
/******************************************************************************
*标题:at24c02 e2prom驱动程序 *
*文件:at24c02.h at24c02.c *
*日期:2010-3-11 *
*版本:1.10(试验通过版)可用xl600单片机综合试验仪试验 *
*邮箱:acsdf139@163.com qq:526083029 *
*网站: 无 *
*******************************************************************************
*描述: *
* 用法:首先在主程序内添加头文件#include"at2402.c" *
* 填充 fillbyte(72,0x00);*
* 写入wratbyte(7, 55); *
* 读取a=readrandom(25); *
* *
*******************************************************************************
*【版权】自己参照网上,朋友,以及书本资料上写的,所以没有版权 *
*【声明】此程序,可用于学习,参考及实际设计中,欢迎转载复制以及建议批评 *
*【技术支持】qq:526083029小张 *
******************************************************************************/ #ifndef _AT2402_H_ #define _AT2402_H_ #include<AT89X52.H> #include<intrins.h> #define delayNOP();{_nop_();_nop_();_nop_();_nop_();}; #define uchar unsigned char #define atwrite 0xa0
//
器件地址以及写入操作 #define atread0xa1
//
器件地址以及读取操作 extern void delayms(uchar ms); extern void atstart(); extern void atstop(); extern bit atack(void); extern uchar atmcu(); extern bit mcuat(uchar wratdata); extern void wratbyte(uchar addr, uchar wratdata); extern void fillbyte(uchar fillsize,uchar filldata); extern uchar reatbyte(); extern uchar readrandom(uchar random_addr); #endif
///////////////////////////////////////////////////////////////////////c程序/////////////////////////////////////////////////
#include<AT89X52.H> #include"at2402.h" #include <intrins.h> sbit SDAat=P3^7; sbit SCLat=P3^6; /************************************* 函数名:delayms 函数功能:延时 参数:ms(时间) 返回:无 备注:无 *************************************/ void delayms(uchar ms) { uchar k; while(ms--) { for(k = 0; k < 120; k++); } } /************************************* 函数名:atstart 函数功能:开始位 参数:无 返回:无 备注:无 *************************************/ void atstart() { SDAat= 1; SCLat= 1; delayNOP(); SDAat = 0; delayNOP(); SCLat = 0; } /************************************* 函数名:atstop 函数功能:停止位 参数:无 返回:无 备注:无 *************************************/ void atstop() { SDAat = 0; delayNOP(); SCLat = 1; delayNOP(); SDAat = 1; } /************************************* 函数名:atack 函数功能:应答 参数:无 返回:ackbit 备注:无 ************************************* bit atack(void) { bit ackbit; SDAat = 1;// 读取应答 delayNOP(); SCLat = 1; delayNOP(); ackbit = SDAat; SCLat = 0; return ackbit; } /************************************* 函数名:atmcu 函数功能:从AT24C02移出数据到 参数:无 返回:reatdata 备注:无 *************************************/ uchar atmcu() { uchar i,reatdata; for(i = 0; i < 8; i++) { SCLat = 1; reatdata <<= 1; reatdata |= SDAat; SCLat = 0; } return(reatdata); } /************************************* 函数名:mcuat 函数功能: 从mcu移出数据到24c02 参数:wratdata(数据) 返回:ackbit(应答) 备注:配合wratbyte使用 *************************************/ bit mcuat(uchar wratdata) { uchar i; bit ackbit; for(i = 0; i < 8; i++)// 循环移入8个位 { SDAat = (bit)(wratdata & 0x80); _nop_(); SCLat = 1; delayNOP(); SCLat = 0; wratdata <<= 1; } ackbit=atack(); return ackbit; // 返回AT24C02应答位 } /************************************* 函数名:wratbyte 函数功能: 在指定地址addr处写入数据write_data 参数:addr wratdata 返回:无 备注:无 *************************************/ void wratbyte(uchar addr, uchar wratdata) { atstart(); mcuat(atwrite); mcuat(addr); mcuat(wratdata); atstop(); delayms(10);// 写入周期 } /************************************* 函数名:fillbyte 函数功能:填充数据fill_data到内fill_size字节 参数: fillsize(地址),filldata(数据) 返回:无 备注:无 *************************************/ void fillbyte(uchar fillsize,uchar filldata) { uchar i; for(i = 0; i < fillsize; i++) { wratbyte(i, filldata); } } /************************************* 函数名:reatbyte 函数功能:在当前地址读取 参数:无 返回:reatdata(读取的数据) 备注:配合readrandom使用 *************************************/ uchar reatbyte() { uchar reatdata; atstart(); mcuat(atread); reatdata = atmcu(); atstop(); return reatdata; } /************************************* 函数名:readrandom 函数功能:在指定地址读取 参数:random_addr(地址) 返回:reatdata(读取的数据) 备注:无 **