蓝桥杯单片机学习12——AT24C02&EEPROM存储芯片

上期我们学习了PCF8591A/D&D/A转换芯片的相关内容,这么我们来介绍以下AT24C02

简介

AT24C02是美国Atmel公司的低功耗CMOS型E2PROM,具有以下特点:
【1】:低电平和标准电平工作(2.7~5.5V)
【2】:内置256*8bit(共2k)存储空间
【3】:使用IIC接口通信,可进行双向数据传输
【4】:具有独立的数据写入保护引脚
【5】:内部存储格式为8字节一页,共32页,构成256字节空间
【6】:具有高稳定性,读写次数>1000000次,数据可保存100年不丢失
【7】:广泛应用于汽车、电子等行业

命名格式

AT24CX系列芯片,X表示芯片的存储空间,比如:AT24C02表示存储空间为2K(256byte),不同名称对应着不同的存储空间和分页方式 ,其具体对应关系如下:

名称存储空间分页方式
AT24C011k8Byte为1页
AT24C022k8Byte为1页
AT24C044k16Byte为1页
AT24C088k16Byte为1页
AT24C1616k16Byte为1页

引脚描述

在这里插入图片描述
蓝桥杯单片机使用的封装引脚如图,其中,不同引脚的功能如下表:

引脚功能描述
A0~A2地址引脚,原理图上直接接地
SDAIIC通信数据线
SCLIIC通信时钟线
WP写保护引脚,为0时可读可写,为1时只读
NC没用,啥也不接
GND接地
VCC接电源

原理图

在这里插入图片描述
需要注意的是:

  • A0~A2直接接地,在读写地址中都是0。
  • WP是直接接地,允许读取和写入数据。

IIC通信原理

关于IIC通信原理相关的内容,包括IIC的的驱动代码,我在蓝桥杯单片机学习11——PCF8591A/D&D/A转换芯片中已经详细的介绍,这里不做过多的赘述。

读写地址

在这里插入图片描述
前面我们在学习IIC通信原理的时候提到过,做开始通信之前,需要进行寻址,以此来确定进行通信的设备,每一个通信设备都有一个确定的通信地址,AT24CX芯片的地址如图:

需要注意的是:
【1】:读写地址的第八位控制数据的写入和读出,为1表示读出,为0表示写入
【2】:对于存储空间在2k(256Byte)以内的芯片类型,数据存储的地址可以用0~0xff(一个字节)表示,所以第五位到第七位是A2 ~ A0,但对于存储空间在2k(256Byte)以上的芯片类型,数据存储的地址无法用一个字节表示,所以需要在读写地址的第五位到第七位之间适当的加入P2 ~ P0 来表示数据读写地址所在的页数(Page),再通过发送数据读写地址在该页数的偏移量就可以准确的表示数据写入和读出的地址。

存储地址

对于存储空间在2k(256Byte)以内的芯片类型,数据存储的地址可以用0~0xff(0 ~ 255)表示,
对于存储空间在2k(256Byte)以上的芯片类型,数据存储的地址表示方法更为复位,由于蓝桥杯单片机上没有使用到相对应的型号,因此这也不做过多的赘述。

基本控制方法

AT24C02的基本控制方法是基于IIC通信原理实现的,其基本操作包括单字节写入/读出,以及多字节的写入/读出,我们重点介绍单字节写入/读出,相信掌握了单字节的写入/读出,多字节的内容也就触类旁通了。

单字节写入

在这里插入图片描述
具体流程如下:
【1】:开始通信
【2】:开始寻址/写入写地址
【3】:等待应答
【4】:写入数据存储地址
【5】:等待应答
【6】:写入数据
【7】:等待应答
【8】:结束通信

具体代码如下:


#define AT24C02_WriteByte    0xA0           //AT24C02写地址

//AT24C02写字节函数,Addr为数据写入的地址,dat为需要写入的数据
void AT24C02_Write_Byte(unsigned char Addr,unsigned char dat)
{
        IIC_Start();                        //开始信号
        IIC_SendByte(AT24C02_WriteByte);    //开始寻址,选择为写数据
        IIC_WaitAck();                      //等待应答
        IIC_SendByte(Addr);                 //写入数据存放的地址
        IIC_WaitAck();                      //等待应答
        IIC_SendByte(dat);                  //发送数据
        IIC_WaitAck();                      //等待应答
        IIC_Stop();                         //结束通信

}

单字节读取

在这里插入图片描述
具体流程如下:
【1】:开始通信
【2】:开始寻址/写入写地址
【3】:等待应答
【4】:写入数据存储地址
【5】:等待应答
【6】:开始通信,改变通信方向
【7】:开始寻址/写入读地址
【8】:等待应答
【9】:接收数据
【10】:不应答,接收通信。

具体代码如下:


#define AT24C02_ReadByte    0xA1            //AT24C02读地址

//AT24C02读字节函数,返回值为读出的数据,Addr为数据读出的地址
unsigned char AT24C02_Read_Byte(unsigned char Addr)
{
    unsigned char dat = 0;          //定义变量,存放读出的数据
    IIC_Start();                    //开始通信
    IIC_SendByte(AT24C02_WriteByte);//开始寻址,选择为写数据
    IIC_WaitAck();                  //等待应答
    IIC_SendByte(Addr);             //写入数据读出的地址
    IIC_WaitAck();                  //等待应答
    IIC_Start();                    //开始下一次通信,因为IIC通信每改变一次数据传输方向,必需重新开始通信
    IIC_SendByte(AT24C02_ReadByte); //开始寻址,选择为读数据
    IIC_WaitAck();                  //等待应答
    dat = IIC_RecByte();            //读出数据
    IIC_SendAck(1);                 //发送不应答,(发1表示不应答)
    IIC_Stop();                     //结束通信
    return dat;                     //返回读出的数据
}

测试案例

要求

使用蓝桥杯官方提供的IIC官方驱动代码,实现单片机和AT24C02之间的通信,并且能够使用AT24C02的EEPROM存储功能,实现数据的存入和取出,其具体要求如下:

  • 使用AT02C02完成对全局变量dat的存入和取出,完成对dat 的断电保存
  • 通过数码管将dat显示出来dat的取值范围为0~255
  • 按下按键S4,dat的值增加,按下S5,dat的值减小。

代码实现

Main函数

#include "iic.h"
#include "LS138.h"

#define AT24C02_WriteByte    0xA0           //AT24C02写地址
#define AT24C02_ReadByte    0xA1            //AT24C02读地址

sbit Key1 = P3^3;                  //位定义部分         
sbit Key2 = P3^2;

unsigned char dat = 0;              //存放数码管显示的数字
unsigned int KEY1_Count = 0;        //key1计数变量
unsigned int KEY2_Count = 0;        //key2计数变量

//AT24C02写字节函数,Addr为数据写入的地址,dat为需要写入的数据
void AT24C02_Write_Byte(unsigned char Addr,unsigned char dat)
{
        IIC_Start();                        //开始信号
        IIC_SendByte(AT24C02_WriteByte);    //开始寻址,选择为写数据
        IIC_WaitAck();                      //等待应答
        IIC_SendByte(Addr);                 //写入数据存放的地址
        IIC_WaitAck();                      //等待应答
        IIC_SendByte(dat);                  //发送数据
        IIC_WaitAck();                      //等待应答
        IIC_Stop();                         //结束通信

}
//AT24C02读字节函数,返回值为读出的数据,Addr为数据读出的地址
unsigned char AT24C02_Read_Byte(unsigned char Addr)
{
    unsigned char dat = 0;          //定义变量,存放读出的数据
    IIC_Start();                    //开始通信
    IIC_SendByte(AT24C02_WriteByte);//开始寻址,选择为写数据
    IIC_WaitAck();                  //等待应答
    IIC_SendByte(Addr);             //写入数据读出的地址
    IIC_WaitAck();                  //等待应答
    IIC_Start();                    //开始下一次通信,因为IIC通信每改变一次数据传输方向,必需重新开始通信
    IIC_SendByte(AT24C02_ReadByte); //开始寻址,选择为读数据
    IIC_WaitAck();                  //等待应答
    dat = IIC_RecByte();            //读出数据
    IIC_SendAck(1);                 //发送不应答,(发1表示不应答)
    IIC_Stop();                     //结束通信
    return dat;                     //返回读出的数据
}
//数码管显示函数,分别显示dat的百位、十位、个位
void SEG_Show(unsigned char dat)
{
    SEG_Write(5,dat/100%10);
    SEG_Write(6,dat/10%10);
    SEG_Write(7,dat%10);
}

void main()
{
    LS138_Init();       //初始化数码管
    dat = AT24C02_Read_Byte(0x00);      //读取dat的值,第一次下载程序,则dat默认值位0
    while(1)
    {
        SEG_Show(dat);                  //通过数码管显示dat
        if(Key1 == 0)                   //判断KEY1是否按下            
        {
            KEY1_Count++;
            if(KEY1_Count>=500)         //消抖    
            {
                dat++;                  //dat++
                AT24C02_Write_Byte(0x00,dat);   //写入dat的值
            }
        }                     
        if(Key2 == 0)                   //判断KEY1是否按下  
        {                               
            KEY2_Count++;               
            if(KEY2_Count>=500)         //消抖    
            {                           
                dat--;                  //dat++
                AT24C02_Write_Byte(0x00,dat);   //写入dat的值
            }
        }
    }
}
                                      程序中出现的所有函数,都已经在前面介绍过,在这里不做介绍

总结

由于AT24C02的操作流程和PCF8591大致相同,所有我在介绍的时候,也相对简洁,**重点是需要熟悉IIC通信的基本流程,再一个就是相关的读写地址,**就可以做到融会贯通,运用自如,
emmm,总结完毕。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不想写代码的我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值