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

📄 eeprom.c

📁 读写串行EEPROM芯片AT24C02实例, 稍微改动也可以读写其他型号的串行I2C总线EEPROM
💻 C
字号:
    /*  读写串行EEPROM芯片AT24C02实例*/
    /************************************************************************/
	#include<string.h>
	#include<reg52.h>
	#include<intrins.h>
	#define TIME 60 			/*延时时间,主频不同时,TIME应作调整*/
	#define TRUE 1
	#define FALSE 0

	sbit SCL=P1^2;				/*定义时钟信号线*/
	sbit SDA=P1^3; 				/*定义数据信号线*/


void main()
{
	int i;
	char mybyte;
	char array1[8];
	char array2[8];
	char rdarray[16];

	for(i=0;i<8;i++)
		{
		array1[i]=i;
		array2[i]=i+0x08; 
		}
	Write_One_Byte(0x20,0x28);
	Write_A_Page(array1,0x10);
	Write_A_Page(array2,0x18);
	mybyte=Read_One_Byte (0x20);
	Read_N_Bytes(rdarray,16,0x10);
}
 
	/*延时函数*/
void DELAY (unsigned int t)
{
	for (;t>=0;t--)
	;
}

	/*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/
void  Start_I2C(void)
	{
	SDA=1;
	SCL=1;
	DELAY(TIME);
	SDA=0;
	DELAY(TIME);
	SCL=0;
	DELAY(TIME);
	}

	/*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/
void  Stop_I2C(void)
{
	SDA=0;
	SCL=1;
	DELAY(TIME);
	SDA=1;
	DELAY(TIME);
	SCL=0;
	DELAY(TIME);
}

	/*发送完一个字节后检验设备的应答信号*/
bit Check_Ack (void)
{
	bit q;
	SDA=1;
	SCL=1;
	DELAY(TIME/2);
	q=SDA;
	DELAY(TIME/2);
	SCL=0;
	DELAY(TIME);
	if  (q==1)
		return(FALSE);
	else
		return(TRUE);
}

	/*发送1,在SCL为高电平时使SDA信号为高*/
void SEND_1 (void)
{
	SDA=1;
	SCL=1;
	DELAY(TIME);
	SCL=0;
	DELAY(TIME);
}

	/*发送0,在SCL为高电平时使SDA信号为低*/
void SEND_0(void)
{
	SDA=0;
	SCL=1;
	DELAY(TIME);
	SCL=0;
	DELAY(TIME);
}
       
	/*从I2C总线读一个字节*/
char ReadI2CByte(void)  reentrant
{
	bit q;
	char b=0,i;
	for (i=0;i<8;i++)
		{
		SDA=1;    			/*释放总线*/
		SCL=1;    			/*接受数据*/
		DELAY(10);
		q=SDA;
		DELAY(10);
		SCL=0;
		if  (q==1)
			{
			b=b<<1;
			b=b|0x01;
			}
		else
			b=b<<1;
		}
	return(b);
}

	/*向I2C总线写一个字节*/ 
void WriteI2CByte(char b)  reentrant
{
	char i;
	for (i=0;i<8;i++)
		if ((b<<i)&0x80)
			SEND_1();
		else
			SEND_0();
}

	/**********以下为读写24c02的函数**********/
void Write_One_Byte(char addr,char d)			//单字节写
{
	bit ack=1;
	Start_I2C();
	WriteI2CByte(0xa0);
	ack=Check_Ack();
	WriteI2CByte(addr);			//地址
	ack=Check_Ack();
	WriteI2CByte(d);			//数据
	ack=Check_Ack();
	Stop_I2C();
}

	/* AT24C02页写 */
void Write_A_Page(char *buffer,char addr)
{
	bit ack=1;
	bit wrtmp;
	int i;
	Start_I2C();
	WriteI2CByte(0xa0);
	ack=Check_Ack();
	WriteI2CByte(addr);			//地址
	ack=Check_Ack();
	for(i=0;i<7;i++)
		{
		WriteI2CByte(buffer[i]);
		if (!Check_Ack())
			{
			Stop_I2C();
			}
		}
	Stop_I2C();
}

	/*从AT24C02指定地址读一个字节*/
char Read_One_Byte(char addr)
{
	bit ack=1;
	char mydata;
	Start_I2C();
	WriteI2CByte(0xa0);
	ack=Check_Ack();
	WriteI2CByte(addr);			/* 地址 */
	ack=Check_Ack();
	Start_I2C();
	WriteI2CByte(0xa1);
	ack=Check_Ack();
	mydata=ReadI2CByte();
	ack=Check_Ack();
	return(mydata);
	Stop_I2C();
}

	/*多字节读*/
void Read_N_Bytes(char *buffer,char n,char addr)
{
	bit ack=1;
	int i=0;
	Start_I2C();
	WriteI2CByte(0xa0);
	ack=Check_Ack();
	WriteI2CByte(addr);			/* 地址 */
	ack=Check_Ack();
	Start_I2C();
	WriteI2CByte(0xa1);
	ack=Check_Ack();
	for (i=0;i<n;i++)
		{
		buffer[i]=ReadI2CByte();
		if (i!=n-1)
			SEND_0();   		 /*发送应答*/
		else
			SEND_1();    		 /*发送非应答*/
		}
	Stop_I2C();
}

⌨️ 快捷键说明

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