/****************************************************/
/*EEPROM读写演示程序 */
/*目标器件:AT89S51 */
/*晶振:11.0592MHZ */
/****************************************************************************
函数功能:主程序
入口参数:
出口参数:
****************************************************************************/
/*void main(void)
{
int eepromdata=0; //从EEPROM中读出来的数据存放空间
SDA = 1;
SCL = 1;
write_byte(0x01, 0x55); //向0x01地址写入0x55(85)的数据
delayms(250);
write_byte(0x02, 0xAA); //向0x02地址写入0xAA(170)的数据
delayms(250);
delayms(250);
eepromdata= read_random(0x02); // 读取其中一个地址内的数据来验证
delayms(250);
while(1);
}*/
/****************************************************/
#ifndef __I2C_H__
#define __I2C_H__
/*********************************包含头文件********************************/
#include "at89x51.h"
#include "intrins.h"
/*********************************数据定义**********************************/
#define OP_READ 0xa1 // 器件地址以及读取操作
#define OP_WRITE 0xa0 // 器件地址以及写入操作
//0xa0可以用来写24C04的第一页的256字节,那么0xa2,就用来写第二页
/*********************************端口定义**********************************/
sbit SDA = P3^3;
sbit SCL = P3^4;
/****************************************************************************
函数功能:延时子程序
入口参数:ms
出口参数:
****************************************************************************/
void delayms(unsigned char ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}
/****************************************************************************
函数功能:开始信号
入口参数:
出口参数:
****************************************************************************/
void start()
{
SDA = 1;
SCL = 1;
_nop_();
_nop_();
SDA = 0;
_nop_();
_nop_();
_nop_();
_nop_();
SCL = 0;
}
/****************************************************************************
函数功能:停止信号
入口参数:
出口参数:
****************************************************************************/
void stop()
{
SDA = 0;
_nop_();
_nop_();
SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
SDA = 1;
}
/****************************************************************************
函数功能:读取数据
入口参数:
出口参数:read_data
****************************************************************************/
unsigned char shin()
{
unsigned char i,read_data;
for(i = 0; i < 8; i++)
{
SCL = 1;
read_data <<= 1;
read_data |= (unsigned char)SDA;
SCL = 0;
}
return(read_data);
}
/****************************************************************************
函数功能:向EEPROM写数据
入口参数:write_data
出口参数:ack_bit
****************************************************************************/
bit shout(unsigned char write_data)
{
unsigned char i;
bit ack_bit;
for(i = 0; i < 8; i++)
{
SDA = (bit)(write_data & 0x80);
_nop_();
SCL = 1;
_nop_();
_nop_();
SCL = 0;
write_data <<= 1;
}
SDA = 1;
_nop_();
_nop_();
SCL = 1;
_nop_();
_nop_();
_nop_();
_nop_();
ack_bit = SDA; // 读取应答
SCL = 0;
return ack_bit; // 返回AT24Cxx应答位
}
/****************************************************************************
函数功能:向指定地址写数据
入口参数:addr,write_data
出口参数:
****************************************************************************/
void write_byte(unsigned char addr, unsigned char write_data)
{
start();
shout(OP_WRITE);
shout(addr);
shout(write_data);
stop();
delayms(10);
}
/****************************************************************************
函数功能:读取当前地址数据
入口参数:
出口参数:read_data
****************************************************************************/
unsigned char read_current()
{
unsigned char read_data;
start();
shout(OP_READ);
read_data = shin();
stop();
return read_data;
}
/****************************************************************************
函数功能:向指定地址读数据
入口参数:random_addr
出口参数:read_data
****************************************************************************/
unsigned char read_random(unsigned char random_addr)
{
start();
shout(OP_WRITE);
shout(random_addr);
return(read_current());
}
#endif
以上是个头文件,你可以去验证一下,顺便说一下,你太吝啬了,一分都不赏,如果我不是保存的有以前写过的代码,是不会来答的。