AT24C02的使用说明和完整代码-51单片机

AT24C02的使用说明和完整代码-51单片机EEROM AT24C02 的使用说明和参考代码 at24c02 的原理及使用方法在其说明资料中已有充分的讲述 本篇仅对其使用的关键步骤进行罗列 以及说明一下具体的使用代码 at24c02 使用 iic 驱动 需要对其进行启动 停止 等待相应 写字节 读字节的操作 iic 启动

AT24C02的使用说明和完整代码-51单片机

简述:at24c02为存储器芯片,可以使用单片机将数据存入其中,同时也可以任意读取。

at24c02的原理及使用方法在其说明资料中已有充分的讲述,本篇仅对其使用的关键步骤进行罗列,以及说明一下具体的使用代码。

at24c02使用iic驱动,需要对其进行启动、停止、等待响应、写字节、读字节的操作

  • iic启动和停止:启动/关闭总线
    void IIC_Start(void)
    {

    SDA = 1;
    SCL = 1;
    somenop;
    SDA = 0;
    somenop;
    SCL = 0;
    }
    void IIC_Stop(void)
    {

    SDA = 0;
    SCL = 1;
    somenop;
    SDA = 1;
    }
    2.等待相应,在每次对at24c02操作后,at24c02会对单片机发出相应信号,以代表at24c02接收到了主机发来的信号,单片机需要等待接收响应。
    bit IIC_WaitAck(void)
    {

    SDA = 1;
    somenop;
    SCL = 1;
    somenop;
    if(SDA)
    {

    SCL = 0;
    IIC_Stop();
    return 0;
    }
    else
    {

    SCL = 0;
    return 1;
    }
    }
    3.发送一个字节的数据:向at24c02发送一个字节的数据
    void IIC_SendByte(unsigned char byt)
    {

    unsigned char i;
    for(i=0;i<8;i++)
    {

    if(byt&0x80)
    {

    SDA = 1;
    }
    else
    {

    SDA = 0;
    }
    somenop;
    SCL = 1;
    byt <<= 1;
    somenop;
    SCL = 0;
    }
    }
    4.接收一个字节的数据:读取总线上的一个字节的数据
    unsigned char IIC_RecByte(void)
    {

    unsigned char da;
    unsigned char i;
    for(i=0;i<8;i++)
    {

    SCL = 1;
    somenop;
    da <<= 1;
    if(SDA)
    da |= 0x01;
    SCL = 0;
    somenop;
    }
    return da;
    }
    至此,我们有了基本的总线驱动,开始封装功能函数
    1.单片机向at24c02的某地址写入一个字节的数据:启动总线,第一次发送(发送8位一个字节),发送硬件地址(at24c0的a0,a1,a2的电平即为此三位的硬件地址,通常为000)和读写类型(最后一位,RW低RD高),等待响应,第二次发送,发送要写入的地址,等待响应,第三次发送,发送要写入的数据,等待响应,关闭总线,略作延时。
    void rom_write(char add,da)
    {

    IIC_Start();
    IIC_SendByte(0xa0);
    IIC_WaitAck();
    IIC_SendByte(add);
    IIC_WaitAck();
    IIC_SendByte(da);
    IIC_WaitAck();
    IIC_Stop();
    delay(30);
    }
    2单片机从at24c02的某个地址读取一个字节的数据:先向at24c02写地址,再重新启动总线,发送读当前地址指令,等待响应后读取总线数据。
    char rom_read(char add)
    {

    char t;
    IIC_Start();
    IIC_SendByte(0xa0);
    IIC_WaitAck();
    IIC_SendByte(add);
    IIC_WaitAck();
    IIC_Start();
    IIC_SendByte(0xa1);
    IIC_WaitAck();
    t=IIC_RecByte();
    return t;
    delay(30);
    }
    至此,单片机控制at24c02的功能函数封装完毕,以下是完整的参考程序,程序为向eeprom的0x00地址写入0x01,并且再读取,具体验证方式读者可使用数码管显示来验证。







































































































/* 作者:FarryNiu https://blog.csdn.net/_/article/details/ */ #include <reg52.h> #include "intrins.h" #define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();} sbit SDA = P2^1; /* 数据线 */ sbit SCL = P2^0; /* 控制线 */ char a; //a为读取出的数据 void delay(int z) { int x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } //启动 void IIC_Start(void) { SDA = 1; SCL = 1; somenop; SDA = 0; somenop; SCL = 0; } //停止 void IIC_Stop(void) { SDA = 0; SCL = 1; somenop; SDA = 1; } //等待响应 bit IIC_WaitAck(void) { SDA = 1; somenop; SCL = 1; somenop; if(SDA) { SCL = 0; IIC_Stop(); return 0; } else { SCL = 0; return 1; } } //发送一个字节 void IIC_SendByte(unsigned char byt) { unsigned char i; for(i=0;i<8;i++) { if(byt&0x80) { SDA = 1; } else { SDA = 0; } somenop; SCL = 1; byt <<= 1; somenop; SCL = 0; } } //接收一个字节 unsigned char IIC_RecByte(void) { unsigned char da; unsigned char i; for(i=0;i<8;i++) { SCL = 1; somenop; da <<= 1; if(SDA) da |= 0x01; SCL = 0; somenop; } return da; } void rom_write(char add,da) { IIC_Start(); IIC_SendByte(0xa0); IIC_WaitAck(); IIC_SendByte(add); IIC_WaitAck(); IIC_SendByte(da); IIC_WaitAck(); IIC_Stop(); delay(30); } char rom_read(char add) { char t; IIC_Start(); IIC_SendByte(0xa0); IIC_WaitAck(); IIC_SendByte(add); IIC_WaitAck(); IIC_Start(); IIC_SendByte(0xa1); IIC_WaitAck(); t=IIC_RecByte(); return t; delay(30); } void main() { rom_write(0x00,0x01); //向AT24C02的地址0x00处写入0x01 a=rom_read(0x00); //从AT24C02的地址0x00处读取数据,赋值给a while(1) { /*自行验证:在第一次向AT24C02写入数据后,将代码中的rom_write(0x00,0x01)删除后烧写进入单片机,仅保留读取函数,如果还能读到,则验证成功*/ } } 

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232563.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 长短期记忆神经网络(LSTM)介绍以及简单应用分析「建议收藏」

    长短期记忆神经网络(LSTM)介绍以及简单应用分析「建议收藏」本文分为四个部分,第一部分简要介绍LSTM的应用现状;第二部分介绍LSTM的发展历史,并引出了受众多学者关注的LSTM变体——门控递归单元(GRU);第三部分介绍LSTM的基本结构,由基本循环神经网络

    2022年8月1日
    6
  • WPF 精修篇 Winform 嵌入WPF控件「建议收藏」

    首先创建WPF控件库这样就有了一个WPF界面在wpf中增加界面等在winform中增加WPFDLL重新生成解决方案在左侧工具栏出现WPF控件拖到窗体效果…

    2022年4月12日
    43
  • Nginx+keepalived+tomcat实现tomcat高可用性负载均衡

    Nginx+keepalived+tomcat实现tomcat高可用性负载均衡

    2021年8月16日
    73
  • 蓝桥杯算法比赛题目_蓝桥杯一般大几参加

    蓝桥杯算法比赛题目_蓝桥杯一般大几参加欢迎回到:遇见蓝桥遇见你,不负代码不负卿!前言:提到深度优先搜索(DFS),我们很容易就会想到广度优先搜索(BFS),它们两合在一起成为一个搜索专题,今天笔者先把DFS讲清楚,BFS的内容留在下一章详细讲解。OK,废话不多说,走着…先送你一朵小红花…一、引入:深度优先搜索(DFS)这块内容很重要哦,为了方便大家理解,先举一个(来自胡凡、曾磊老师编写的《算法笔记》一书)的栗子。举个栗子:设想我们现在以第一视角身处一个巨大的迷宫当中,没有上帝视角,没有通..

    2025年6月19日
    7
  • Linux安装jdk步骤_jdk linux安装

    Linux安装jdk步骤_jdk linux安装Linux的使用相信大家都要用到java吧!在使用java前我们得先安装jdk以及配置环境变量等工作;下面小编给大家分享关于Linux安装jdk的详细步骤:一、登录虚拟机进入终端切换到root用户,输入:su接着输入密码再输入:cd…回到root用户二、查看Linux系统是否有自带的jdk:1、输入:java-version2、发现有输入:rpm-qa|grepjav…

    2025年11月13日
    3
  • java buttongroup方框_Swing之ButtonGroup用法实例 | 学步园

    java buttongroup方框_Swing之ButtonGroup用法实例 | 学步园1就是起作用范围的,不是组件,不能被容器添加,目的让其中一个起作用,例如radiobuttonpackagecom.szsm.swing.framepanel;importjava.awt.FlowLayout;importjavax.swing.ButtonGroup;importjavax.swing.JRadioButton;importcom.szsm.swing.parent…

    2025年7月27日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号