⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eeprom.c

📁 手把手教你单片机
💻 C
字号:
#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();
		}
	 }
	
		
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -