单片机学习小组
直播中

汪潇潇

7年用户 818经验值
私信 关注

如何实现单片机AT24C02芯片上电自启动读取数据?

如何实现单片机AT24C02芯片上电自启动读取数据?

回帖(1)

李铭冠

2022-1-24 10:12:08
单片机AT24C02芯片上电自启动读取数据,写入数据的实现也是挺重要的一个模块,往年的考试就有考到过,下面就来解说一下具体的分析过程吧。


编写一个记录上电次数的代码,每一次上电自加一,使用数码管显示。


首先,官方提供的数据包中有提供了IIC总线的底层驱动代码,我们是可以直接调用这个底层驱动代码的,方便自己编写代码;
其次,系统设置一个记录上电次数的变量,上电的时候,上电之后把变量自加一,写入到芯片中;
之后,对芯片数据进行读取,读取到的数据进行显示;
最后,大概流程就差不多了,开始动手吧。


#include "reg52.h"
#include "iic.h"
#include "intrins.h"


typedef unsigned char u8;
typedef unsigned int u16;


u8 shuma[12] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xbf};


// 外设初始化
void init_system()
{
    P2 = (P2 & 0x1f) | 0x80;
        P0 = 0xff;
        P2 = (P2 & 0x1f);


        P2 = (P2 & 0x1f) | 0xa0;
        P0 = 0x00;
        P2 = (P2 & 0x1f);


        P2 = (P2 & 0x1f) | 0xc0;
        P0 = 0x00;
        P2 = (P2 & 0x1f);
}


        // 外设导通选择
void select(u8 local)
{
    switch(local)
        {
            case(4): P2 = (P2 & 0x1f) | 0x80; break;
                case(5): P2 = (P2 & 0x1f) | 0xa0; break;
                case(6): P2 = (P2 & 0x1f) | 0xc0; break;
                case(7): P2 = (P2 & 0x1f) | 0xe0; break;
        }
}




void delay()
{
    u8 t = 200;
        while(t--);
}


void display(u8 local, u8 num)
{
    select(6);
        P0 = 0x80 >> (local - 1);
        P2 = P2 & 0x1f;
        delay();


    // 消隐
        select(7);
        P0 = num;
        P2 = P2 & 0x1f;       
}




void write_at24c02(u8 add, u8 data1)    // 往AT24C02芯片写入数据函数
{
    IIC_Start();
        IIC_SendByte(0xa0);
        IIC_WaitAck();


        IIC_SendByte(add);
        IIC_WaitAck();


        IIC_SendByte(data1);
        IIC_WaitAck();
        IIC_Stop();
  
}


unsigned char read_at24c02(u8 add)   //  读取ATC24C02的数据函数
{
    u8 temp;      
    IIC_Start();   // 启动总线 ,函数主体在底层函数中
        IIC_SendByte(0xa0);     //  发送标志字节
        IIC_WaitAck();      // 等待总线响应


        IIC_SendByte(add);  // 发送读取数据的地址
        IIC_WaitAck();     // 等待总线响应


        IIC_Start();          // 重新启动再发送地址单元写进去
        IIC_SendByte(0xa1);   
        IIC_WaitAck();


        temp = IIC_RecByte();
        IIC_WaitAck();
        IIC_Stop();
        return temp;
}




void Delay2ms()                //@11.0592MHz
{
        unsigned char i, j;


        _nop_();
        _nop_();
        i = 22;
        j = 128;
        do
        {
                while (--j);
        } while (--i);
}




void main()
{
    u8 num;
    init_system();
        num = read_at24c02(0x55);  // 读取数据的地址可以0x00-0xff,自行选择,注意写入到那个地址,之后读取数据就在那个地址进行读取
        write_at24c02(0x55,++num);   // 写入数据到上面读取数据的地址(地址需要一致)
    while(1)
        {
                display(1,shuma[num%10]);
                display(2,shuma[num/10]);
                close_display();
                Delay2ms();


        }
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分