#include <reg52.h>
#include <INTRINS.H>
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long uint32;
sbit SCL = P3^7;
sbit SDA = P3^6;
/*****************************************************************************
** 函数名称:Delay
** 功能描述:延时子程序
******************************************************************************/
void Delay(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
/*****************************************************************************
** 函数名称:InitI2C
** 功能描述:配置模拟I2C的IO端口
** 可移植性:注意IO口需支持漏开输出
******************************************************************************/
void InitI2C(void)
{
SDA = 1;
SCL = 1;
}
/*****************************************************************************
** 函数名称:I2CStart
** 功能描述:发送I2C总线起始状态
** 输 入:无
** 输 出:无
** 全局变量:无
** 调用模块:Delay_us()
** 可移植性:直接移植
******************************************************************************/
void I2CStart(void)
{
SDA = 1;
Delay(); // 延时子程序
SCL = 1;
Delay();
SDA = 0;
Delay();
SCL = 0;
}
/*****************************************************************************
** 函数名称:I2CStop
** 功能描述:发送I2C总线停止起始状态
** 输 入:无
** 输 出:无
** 全局变量:无
** 调用模块:Delay_us()
** 可移植性:直接移植
******************************************************************************/
void I2CStop(void)
{
SCL = 0;
Delay();
SDA = 0;
Delay();
SCL = 1;
Delay();
SDA = 1;
Delay();
}
/*****************************************************************************
** 函数名称:I2CSend
** 功能描述:向I2C总线发送一个字节数据,并检测应答
** 输 入:待发送字节byte
** 输 出:无
** 全局变量:无
** 调用模块:Delay_us()
** 可移植性:直接移植
******************************************************************************/
void I2CSend(uint8 byte)
{
uint8 mask;
uint8 i;
uint8 j;
mask = 0x80;
for(i = 0; i < 8; i++)
{
SCL = 0;
Delay();
if((mask & byte) == 0)
{
SDA = 0;
}
else
{
SDA = 1;
}
mask >>= 1;
Delay();
SCL = 1;
Delay();
}
SCL = 0;
SDA = 1;
Delay();
SCL = 1;
j = SDA;
Delay();
SCL = 0;
}
/*****************************************************************************
** 函数名称:I2CRead
** 功能描述:从I2C总线读取最后一个字节数据,并发送非应答位
** 输 入:无
** 输 出:接收到的字节byte
** 全局变量:无
** 调用模块:Delay_us()
** 可移植性:直接移植
******************************************************************************/
uint8 I2CRead(void)
{
uint8 byte;
uint8 i;
byte = 0;
for(i = 0; i < 8; i++)
{
SCL = 0;
SDA = 1;
Delay();
SCL = 1;
Delay();
byte <<= 1;
if(SDA == 1)
{
byte |= 0x01;
}
Delay();
}
SCL = 0;
SDA = 1;
Delay();
SCL = 1;
Delay();
SCL = 0;
return byte;
}
/*****************************************************************************
** 函数名称:I2CReadAck
** 功能描述:从I2C总线读取一个字节数据,并发送应答
** 输 入:无
** 输 出:接收到的字节byte
** 全局变量:无
** 调用模块:Delay_us()
** 可移植性:直接移植
******************************************************************************/
uint8 I2CReadAck(void)
{
uint8 i;
uint8 byte;
byte = 0;
for(i=0;i<8;i++)
{
SCL = 0;
SDA = 1;
Delay();
SCL = 1;
Delay();
byte <<= 1;
if(SDA==1) {byte |= 0x01;}
Delay();
}
SCL = 0;
Delay();
SDA = 0;
Delay();
SCL = 1;
Delay();
SCL = 0;
return byte;
}
/*****************************************************************************
** 函数名称:read_eeprom
** 功能描述:读取EEPROM数据函数(可多片共存)
** 输 入:E2中目的地址addr
** 输 出:读取的数据
** 全局变量:无
** 调用模块:I2CStart(),I2CSend(),I2CStop()
******************************************************************************/
uint8 read_eeprom(uint8 addr)
{
uint8 databyte;
I2CStart();
I2CSend(0xa0);
I2CSend(addr);
I2CStart();
I2CSend(0xa1);
databyte = I2CRead();
I2CStop();
return databyte;
}
/*****************************************************************************
** 函数名称:write_eeprom
** 功能描述:读取EEPROM数据函数(可多片共存)
** 输 入:E2中目的地址addr
** 输 出:读取的数据
** 全局变量:无
** 调用模块:I2CStart(),I2CSend(),I2CStop()
******************************************************************************/
void write_eeprom(uint8 addr, uint8 databyte)
{
I2CStart();
I2CSend(0xa0);
I2CSend(addr);
I2CSend(databyte);
I2CStop();
}
void UART_init(void)
{
SCON = 0x50;
TMOD = 0x20;
TH1 = 0xFD;
TL1 = 0xFD;
TR1 = 1;
// ES = 1;
// EA = 1;
}
void UART_send_byte(uint8 dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}
/*****************************************************************************
** 函数名称:主函数main
** 功能描述:读写EEPROM
** 输 入:
** 输 出:
******************************************************************************/
main()
{
uint8 addr = 0x00, databyte = 0xe4;
uint8 c = 0;
uint16 i;
UART_init();
InitI2C();
while(1)
{
write_eeprom(addr, databyte);
for(i = 0; i < 1000; i++)
{
Delay();
}
c = read_eeprom(addr);
UART_send_byte(c);
addr++;
databyte++;
if(addr == 0xff) {addr = 0;}
if(databyte == 0xff) {databyte = 0;}
for(i = 0; i < 1000; i++)
{
Delay();
}
}
}