//////////////////////////////////////////////////////// 头文件 /////////////////////////////////////////////////////////////////////////////////////////
/******************************************************************************
*标题: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
#include #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 #include"at2402.h" #include 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(读取的数据)
备注:无
**