视频讲解
简介
AT24C02是一款串行电可擦除编程只读存储器(EEPROM)。存储器可存储256个字节数据,分为16页每页16字节,随机字寻址需要8位数据字地址,具有低功耗CMOS技术,自定时编程周期。AT24C02为SOT23-5、SOP-8、DIP-8三种封装。由于其具有接口方便,体积小,数据掉电不丢失等特点,在仪器仪表及工业自动化控制中得到广泛的应用。
AT24C02采用的是IIC的通信方式,因此只需要掌握IIC的通信协议即可轻松的使用AT24C02,具体的IIC讲解请看 【IIC】IIC通信协议-51单片机程序分析 - 电子校园网
软件流程图
AT24C02读一个字节
AT24C02写一个字节
程序分析
at24c02.c
/**********************************
作者:特纳斯电子
网站:https://www.mcude.com
联系方式:46580829(QQ)
淘宝店铺:特纳斯电子
**********************************/
/**********************************
包含头文件
**********************************/
#include "at24c02.h"
/**********************************
函数定义
**********************************/
/****
*******AT24C02延时函数
*****/
void At24c02_Delay(void)
{
uchar i;
i=10;
while(i--);
}
/****
*******AT24C02延时函数
*****/
void At24c02_Delay1(uchar x)
{
unsigned int i;
for(i=0;i<x;i++);
}
/****
*******总线初始化,拉高释放总线函数
*****/
void At24c02_Init(void)
{
AT24C02_SCL=1;
At24c02_Delay();
AT24C02_SDA=1;
At24c02_Delay();
}
/****
*******开始信号,上升沿
*****/
void At24c02_Start(void)
{
AT24C02_SDA=1; //发送起始条件的数据信号
At24c02_Delay();
AT24C02_SCL=1; //发送起始条件的时钟信号
At24c02_Delay();
AT24C02_SDA=0; //发送起始信号
At24c02_Delay();
AT24C02_SCL=0; //钳住IIC总线,准备发送或接收数据
At24c02_Delay();
}
/****
*******结束信号,下降沿
*****/
void At24c02_Stop(void)
{
AT24C02_SDA=0; //发送结束条件的数据信号
At24c02_Delay();
AT24C02_SCL=1; //发送结束条件的时钟信号
At24c02_Delay();
AT24C02_SDA=1; //发送结束信号
At24c02_Delay();
}
/****
*******IIC总线时钟或应答信号
*****/
void At24c02_Clock(void)
{
uchar i=0;
AT24C02_SCL=1;
At24c02_Delay();
while ((AT24C02_SDA==1)&&(i<255))
i++;
AT24C02_SCL=0;
At24c02_Delay();
}
/****
*******写一个字节
*****/
void At24c02_Writex(uchar j)
{
uchar i,temp;
temp=j;
for (i=0;i<8;i++)
{
temp=temp<<1;
AT24C02_SCL=0;
At24c02_Delay();
AT24C02_SDA=CY; //最高位移入PSW寄存器CY位中
At24c02_Delay();
AT24C02_SCL=1;
At24c02_Delay();
}
AT24C02_SCL=0;
At24c02_Delay();
AT24C02_SDA=1;
At24c02_Delay();
}
/****
*******读取一个字节
*****/
uchar At24c02_Readx(void)
{
uchar i,j,k=0;
AT24C02_SCL=0;
At24c02_Delay();
AT24C02_SDA=1;
for (i=0;i<8;i++)
{
At24c02_Delay();
AT24C02_SCL=1;
At24c02_Delay();
if (AT24C02_SDA==1)
j=1;
else
j=0;
k=(k<<1)|j; //将8个独立的位放在一个字节中
AT24C02_SCL=0;
}
At24c02_Delay();
return(k);
}
/****
*******向AT24C02的地址address中写入一个字节的数据info
*****/
void At24c02_Write_Add(uchar address,uchar info)
{
At24c02_Start();
At24c02_Writex(0xa0);
At24c02_Clock();
At24c02_Writex(address);
At24c02_Clock();
At24c02_Writex(info);
At24c02_Clock();
At24c02_Stop();
At24c02_Delay1(50);
}
/****
*******从AT24C02的地址address中读取一个字节的数据
*****/
uchar At24c02_Read_Add(uchar address)
{
uchar i;
At24c02_Start();
At24c02_Writex(0xa0);
At24c02_Clock();
At24c02_Writex(address);
At24c02_Clock();
At24c02_Start();
At24c02_Writex(0xa1);
At24c02_Clock();
i=At24c02_Readx();
At24c02_Stop();
At24c02_Delay1(10);
return(i);
}
at24c02.h
/**********************************
作者:特纳斯电子
网站:https://www.mcude.com
联系方式:46580829(QQ)
淘宝店铺:特纳斯电子
**********************************/
#ifndef _AT24C02_H_
#define _AT24C02_H_
/**********************************
包含头文件
**********************************/
#include "main.h"
/**********************************
PIN口定义
**********************************/
sbit AT24C02_SCL=P1^5; //AT24C02时钟引脚
sbit AT24C02_SDA=P1^6; //AT24C02数据引脚
/**********************************
函数声明
**********************************/
void At24c02_Init(void); //At24c02初始化函数
void At24c02_Write_Add(uchar address,uchar info); //At24c02写入数据函数
uchar At24c02_Read_Add(uchar address); //At24c02读取数据函数
#endif