📄 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 + -