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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • fstream的用法_fun 的用法

    fstream的用法_fun 的用法在C++中输入输出到指定文件,或者从指定文件中读出数据使用fstream类较为方便。C++中处理文件类似于处理标准输入和标准输出。类ifstream、ofstream(向文件中写入)和fstream分别从类istream、ostream和iostream派生而来。作为派生的类,它们继承了插入和提取运算符(以及其他成员函数),还有与文件一起使用的成员和构造函数。可将文件&lt;fstream&gt…

    2022年9月19日
    2
  • 制作系统U盘详细教程,以及分盘等基础操作

    制作系统U盘详细教程,以及分盘等基础操作制作系统U盘详细教程,以及分盘等基础操作一、简介相信很多朋友都会遇到系统崩溃,然后捧着电脑去电脑店,或者百度一番后做出系统盘无法使用的情况;综上:本人计算机系大三学生,虽经验较少但男女同学电脑都有我给做过的系统,因此为方便他人等,特制此教程。二、制作系统U盘前期准备制作U盘软件市面上的软件会有:大白菜、老毛桃、深度,U启动等,我也都用过,但目前我在用优启通。(一是:制作简单。二是:安…

    2022年6月25日
    30
  • js – form表单提交不刷新

    大家已经发现了,当我们点击submit提交form表单的时候,他会刷新一次,如果不想它刷新的话有下面两种方法:利用iframe我们可以利用一个隐藏的iframe来实现,主要是我们把提交目标放到一个隐藏的iframe里,然后让iframe提交数据(ps:这个未实测,仅仅是网上提供的,我记录一下.以后遇到或者会试一下吧)<formaction=”…

    2022年4月18日
    61
  • pytham激活码_通用破解码

    pytham激活码_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月15日
    53
  • OSI七层模型具体解释

    OSI七层模型具体解释

    2021年11月29日
    41
  • 网络通信常见加密剖析[通俗易懂]

    网络通信常见加密剖析[通俗易懂]系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章Python机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学

    2022年6月2日
    56

发表回复

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

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