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/qq_43474959/article/details/88373714
*/
#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处写入0x01a=rom_read(0x00);  //从AT24C02的地址0x00处读取数据,赋值给awhile(1){/*自行验证:在第一次向AT24C02写入数据后,将代码中的rom_write(0x00,0x01)删除后烧写进入单片机,仅保留读取函数,如果还能读到,则验证成功*/}}

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

  1. 单片机12864电子锁c语言代码,51单片机+LCD12864实现密码锁Proteus仿真和代码

    #include       //  包含51单片机寄存器定义的头文件 #include     //包含_nop_()函数定义的头文件 #include #include <12864.h&g ...

  2. 单片机温度控制器c语言代码,51单片机两路温度控制器设计方案

    原标题:51单片机两路温度控制器设计方案 本文提出了基于 两路 的设计方案,该设计方案采用两个DS18B20温度 ,采集两个不同地方的温度,通过AT89C51处理进行,由四位 数码管显示所测量温度,前 ...

  3. 51单片机用c语言写音符代码,51单片机电子琴设计C语言程序实例

    51单片机C程序实例,电子琴设计 #define uchar unsigned char //定义一下方便使用 #define uint unsigned int #define ulong unsi ...

  4. 单片机测距雷达c语言代码,51单片机超声波测距倒车雷达Proteus仿真+源代码

    #include #include #include "LCD.H" #include "delay.h" #define  uint unsigned int ...

  5. c语言编手机蓝牙软件的代码,51单片机C语言的简易蓝牙锁代码

    #include #define uint unsigned int #define uchar unsigned char uchar r_buf; //蓝牙接收到的字符存储缓冲区 sbit PWM ...

  6. 51单片机15单片机 温度传感器DS18B20

    目录 1 温度传感器DS18B20的工作原理 2 一线通信接口的使用(单总线) 2.1 单总线系统 2.2 执行序列 2.3 单总线信号 3 DS18B20寄存器的配置 4 根据传感器使用说明书时序图 ...

  7. 51单片机串口多机通信的原理与编程实现

    51单片机串口多机通信 需要用的的寄存器 (了解的可直接跳到下一节) TMOD 定时器/计数器模式控制寄存器 TCON 定时器控制寄存器 SCON 串口控制寄存器 PCON 电源控制位寄存器 IE 中 ...

  8. 简易电子钟c语言程序,(最新整理)基于51单片机的电子钟C语言程序

    <(最新整理)基于51单片机的电子钟C语言程序>由会员分享,可在线阅读,更多相关<(最新整理)基于51单片机的电子钟C语言程序(9页珍藏版)>请在人人文库网上搜索. 1.完整) ...

  9. 蓄水池问题c语言编程,基于51单片机的蓄水池自动控制系统(35页)-原创力文档...

    广西民族大学 第二次综合课程设计报告 论文题目 : 基于 51 单片机的蓄水池自动控制系统 学 院: 物理与电子工程学院 专 业 : 自动化 年 级 : 2007 级 学 号 : 1072630101 ...

最新文章

  1. NHibernate学习手记(3) - NH的配置信息
  2. 微信小程序:开发之前要知道的三件事
  3. java中Pattern和Matcher的使用
  4. 如何对android菜单,Android菜单构造技巧
  5. mysql国际化_Java的Struts框架中的主题模板和国际化设置
  6. 江苏涟水中学2021高考成绩查询,2021年涟水县高考状元名单资料,今年涟水县高考状元多少分...
  7. linux nm命令_Linux的networkmanager
  8. .NET Framework第一二课(7/26、27)
  9. EXCEL 制作下拉选项,限制输入内容范围
  10. 网卡变慢_解Bug之路记一次线上请求偶尔变慢的排查
  11. 干涉测量技术的应用_特殊工程的施工测量技术应用分享
  12. GitHub上下载代码
  13. 大数据分析平台搭建指南
  14. 移动端旅游电商靠什么吸引了金主?
  15. 名帖222 赵孟頫 行书《行书三段卷》
  16. 尚元钓(Fishing Game)
  17. windows无法连接到打印机_打印机无法连接怎么办
  18. 爱奇艺搜索排序算法实践(内附福利)
  19. 一文搞懂什么是SaaS、BaaS、PaaS和IaaS
  20. applet调用js:导入netscape.javascript.JSObject包

热门文章

  1. TensorRT上首次运行demo(sampleSSD)笔记
  2. 西安历史美食休闲三日游【规划】
  3. 正大国际期货:外盘恒指股指期货交易
  4. django-redis 字符串操作
  5. 运维服务体系总结(思维导图)
  6. linux中.log文件是什么,linux 下log文件夹简介
  7. 玩坏的Bad Apple之DOS
  8. 微型计算机访问速度最快的是,在微型计算机中的下列存储介质中,访问速度最快的是()...
  9. 输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如,153是一水仙花数,因为153=1^ 3+5^3+3^ 3
  10. 常用CSS标签属性重置