//////////////////////////////////////////////////////// 頭文件 /////////////////////////////////////////////////////////////////////////////////////////
/******************************************************************************
* 標題: 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 atread 0xa1 // 器件地址以及讀取操作
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移出數據到MCU
參數:無
返回: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到EEPROM內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(讀取的數據)
備注:無
*************************************/
uchar readrandom(uchar random_addr)
{
atstart();
mcuat(atwrite);
mcuat(random_addr);
return(reatbyte());
}