51单片机 AT24C02(I2C总线)
存储器

随机存储 RAM
只读存储 ROM
AT24C02芯片
是一种可以实现掉电不丢失的存储器,可用于保存单片机运行时想要永久保存的数据信息
存储材质:E2PROM
通讯接口:I2C总线
容量:256字节

I2C总线
一种通用的数据总线
两根通信线:SCL,SDA
同步、半双工、带数据应答
I2C电路规范
所有I2C设备的SCL连在一起,SDA连在一起
设备的SCL和SDA均要配置成开漏输出模式
SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右
开漏输出和上拉电阻的共同作用实现了“线与"的功能,此设计主要
是为了解决多机通信互相干扰的问题

I2C时序结构
起始条件
SCL高电平期间,SDA从高电平切换到低电平
终止条件
SCL高电平期间,SDA从低电平切换到高电平

// 生成I2C启动条件void I2c_Start(){I2C_SDA = 1; // 拉高SDA线I2C_SCL = 1; // 拉高SCL线I2C_SDA = 0; // SDA线从高电平变为低电平,产生启动条件I2C_SCL = 0; // 拉低SCL线}// 生成I2C停止条件void I2C_Stop(){I2C_SDA = 0; // 拉低SDA线I2C_SCL = 1; // 拉高SCL线I2C_SDA = 1; // SDA线从低电平变为高电平,产生停止条件}
发送一个字节
SCL低电平期间,主机将数据位依次放到SDA线上
(高位在前),然后拉高SCL,从机将在SCL高电平期间读取数据位,
所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,
即可发送一个字节

// 发送一个字节数据void I2C_SendByte(unsigned char Byte){unsigned char i;for (i = 0; i < 8; i++) {I2C_SDA = Byte & (0x80 >> i); // 依次发送字节的每一位I2C_SCL = 1; // 拉高SCL线,产生时钟信号I2C_SCL = 0; // 拉低SCL线}}
接收一个字节
SCL低电平期间,从机将数据位依次放到SDA线上
(高位在前),然后拉高SCL,主机将在SCL高电平期间读取数据位
所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次
即可接收一个字节(主机在接收之前,需要释放SDA)

// 接收一个字节数据unsigned char I2C_ReceiveByte(){unsigned char i, Byte = 0x00;I2C_SDA = 1; // 释放SDA线,准备接收数据for (i = 0; i < 8; i++) {I2C_SCL = 1; // 拉高SCL线,产生时钟信号if (I2C_SDA) {Byte |= (0x80 >> i); // 读取SDA线上的数据位}I2C_SCL = 0; // 拉低SCL线}return Byte; // 返回接收到的字节}
发送应答
在接收完一个字节之后,主机在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
接收应答
在发送完一个字节之后,主机在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)

// 发送应答信号void I2C_SendAck(unsigned char AckBit){I2C_SDA = AckBit; // 设置SDA线为应答信号I2C_SCL = 1; // 拉高SCL线,产生时钟信号I2C_SCL = 0; // 拉低SCL线}// 接收应答信号unsigned char I2C_ReceiveAck(){unsigned char AckBit;I2C_SDA = 1; // 释放SDA线,准备接收应答信号I2C_SCL = 1; // 拉高SCL线,产生时钟信号AckBit = I2C_SDA; // 读取SDA线上的应答信号I2C_SCL = 0; // 拉低SCL线return AckBit; // 返回接收到的应答信号}

SLAVE ADDRESS: A6-A3是固定的
A2-A0是可配的
最后一位是确定读或写的0是写,1是读
过程:
开始——>发送从机地址 + write——>接收应答——>发送一个字节——>接受应答——>……发送字节——>接受应答——>结束

过程:
开始——>发送从机地址 + read——>接收应答——>接收一个字节——>发送应答——>……接收字节——>发送应答or发送非应答——>结 束

字节写入和读取

// 向AT24C02的指定地址写入一个字节数据void AT24C02_WriteByte(unsigned char WordAddress, unsigned char Data){I2c_Start(); // 生成启动条件I2C_SendByte(AT24C02_ADDRESS); // 发送设备地址和写命令I2C_ReceiveAck(); // 接收应答信号I2C_SendByte(WordAddress); // 发送字地址I2C_ReceiveAck(); // 接收应答信号I2C_SendByte(Data); // 发送数据I2C_ReceiveAck(); // 接收应答信号I2C_Stop(); // 生成停止条件}// 从AT24C02的指定地址读取一个字节数据unsigned char AT24C02_ReadByte(unsigned char WordAddress){unsigned char Data;I2c_Start(); // 生成启动条件I2C_SendByte(AT24C02_ADDRESS); // 发送设备地址和写命令I2C_ReceiveAck(); // 接收应答信号I2C_SendByte(WordAddress); // 发送字地址I2C_ReceiveAck(); // 接收应答信号I2c_Start(); // 生成重复启动条件I2C_SendByte(AT24C02_ADDRESS | 0x01); // 发送设备地址和读命令I2C_ReceiveAck(); // 接收应答信号Data = I2C_ReceiveByte(); // 接收数据I2C_SendAck(1); // 发送非应答信号I2C_Stop(); // 生成停止条件return Data; // 返回读取的数据}
I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化
每次数据传输都以字节为单位,每次传输的字节数不受限制。
相关文章:
51单片机 AT24C02(I2C总线)
存储器 随机存储 RAM 只读存储 ROM AT24C02芯片 是一种可以实现掉电不丢失的存储器,可用于保存单片机运行时想要永久保存的数据信息 存储材质:E2PROM 通讯接口:I2C总线 容量:256字节 I2C总线 一种通用的数据总线 两根通信线…...
Shell正则表达式与文本处理三剑客(grep、sed、awk)
一、正则表达式 Shell正则表达式分为两种: 基础正则表达式:BRE(basic regular express) 扩展正则表达式:ERE(extend regular express),扩展的表达式有、?、|和() 1.1 基本正则表…...
Docker Desktop 中安装 MySQL 并开启远程访问的详细教程
是在 Docker Desktop 中安装 MySQL 并开启远程访问的详细教程: 一、安装 MySQL 容器 拉取 MySQL 镜像: docker pull mysql:latest这将从 Docker Hub 上拉取最新版本的 MySQL 镜像。如果你想使用特定版本的 MySQL,可以将 latest 替换为具体…...
计算机网络 (39)TCP的运输连接管理
前言 TCP(传输控制协议)是一种面向连接的、可靠的传输协议,它在计算机网络中扮演着至关重要的角色。TCP的运输连接管理涉及连接建立、数据传送和连接释放三个阶段。 一、TCP的连接建立 TCP的连接建立采用三次握手机制,其过程如下&…...
麦田物语学习笔记:构建游戏的时间系统
基本流程 1.代码思路 (1)新建一个TimeManager.cs (2)创建枚举变量来表示四季,在TimeManager里需要的变量有: 游戏内的秒,分钟,小时,天,月,年;游戏内的季节;控制一个季节有多少个月;控制时间的暂停;计时器tikTime (3)在Settings里添加计时器的阈值,以及各个时间的进位 (4)初始化…...
Tauri教程-进阶篇-第二节 命令机制
“如果结果不如你所愿,就在尘埃落定前奋力一搏。”——《夏目友人帐》 “有些事不是看到了希望才去坚持,而是因为坚持才会看到希望。”——《十宗罪》 “维持现状意味着空耗你的努力和生命。”——纪伯伦 Tauri 技术教程 * 第五章 Tauri的进阶教程 第二节…...
candb++ windows11运行报错,找不到mfc140.dll
解决问题记录 mfc140.dll下载 注意:放置位置别搞错了...
提供的 IP 地址 10.0.0.5 和子网掩码位 /26 来计算相关的网络信息
网络和IP地址计算器 https://www.sojson.com/convert/subnetmask.html提供的 IP 地址 10.0.0.5 和子网掩码位 /26 来计算相关的网络信息。 子网掩码转换 子网掩码 /26 的含义二进制表示:/26 表示前 26 位是网络部分,剩下的 6 位是主机部分。对应的子网掩码为 255…...
vscode离线安装插件--终极解决方案
目录 离线安装插件安装方法 vscode连接远程服务器中的docker远程连接python jupyter开发 离线安装插件 使用vscode开发过程中,有一些内网服务器没法连接外网,造成安装插件不方便,网络上很多文章提供了很多方法,比较常见的一种是&…...
LabVIEW启动时Access Violation 0xC0000005错误
问题描述 在启动LabVIEW时,可能出现程序崩溃并提示以下错误:Error 0xC0000005 (Access Violation) Access Violation错误通常是由于权限不足、文件冲突或驱动问题引起的。以下是解决此问题的全面优化方案: 解决步骤 1. 以管理员身份运行…...
string(一)
一、了解string 可以看成是字符顺序表。 二、string遍历方式 1、下标[ ] 重载了[] for(int i 0; i < s.size(); i) {cout << s[i]; } 2、迭代器 auto it s.begin(); while(it ! s.end()) {cout << *it;it; } 3、范围for for(auto ch : s) {cout <&l…...
计算机网络 (41)文件传送协议
前言 一、文件传送协议(FTP) 概述: FTP(File Transfer Protocol)是互联网上使用得最广泛的文件传送协议。FTP提供交互式的访问,允许客户指明文件的类型与格式(如指明是否使用ASCII码࿰…...
C++ STL之容器介绍(vector、list、set、map)
1 STL基本概念 C有两大思想,面向对象和泛型编程。泛型编程指编写代码时不必指定具体的数据类型,而是使用模板来代替实际类型,这样编写的函数或类可以在之后应用于各种数据类型。而STL就是C泛型编程的一个杰出例子。STL(Standard …...
redisson 连接 redis5报错 ERR wrong number of arguments for ‘auth‘ command
依赖版本 org.redisson:redisson-spring-boot-starter:3.25.2 现象 启动报错 org.redisson.client.RedisException: ERR wrong number of arguments for ‘auth’ command. channel: [xxx] command: (AUTH), params: (password masked) 原因 redis6以下版本认证参数不包含用…...
LeetCode:131. 分割回文串
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:131. 分割回文串 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文串。返回 s 所…...
React-useState讲解
useState 让页面“动”起来 例如实现一个 click 计数功能,普通变量无法实现。即:修改普通变量无法触发组件的更新 rerender 通过 useState 即可实现。 state 是什么 State, A component’s memory —— 这个比喻非常好! props 父组件传…...
混币器是什么,波卡跨链交易平台
混币器是什么 混币器是一种加密货币工具,主要功能是将用户的加密货币与其他众多用户的加密货币混合在一起,打乱资金的流向和交易痕迹,使得加密货币的来源和去向难以追踪,从而增加交易的匿名性和隐私性。以下是对其工作流程和相关举例的介绍: 工作流程 用户首先将自己的加…...
【PHP】双方接口通信校验服务
请求方 使用 ApiAuthService::buildUrl($domain, [terminal > 1, ts > time()]); //http://域名/adminapi/login/platformLogin?signF7FE8A150DEC18BE8A71C5059742C81A&terminal1&ts1736904841接收方 $getParams $this->request->get();$validate ApiA…...
Web第一次作业
目录 题目 html代码 index login register css代码 base index login register 效果展示 index login register 题目 实现一个登录页面、实现一个注册页面;实现一个主页 - 登录页面:login.html - 注册页面:register.html - 主页…...
CentOS 6.8 安装 Nginx
个人博客地址:CentOS 6.8 安装 Nginx | 一张假钞的真实世界 提前安装: # sudo yum install yum-utils 一般情况下这个工具系统已经安装。 创建文件/etc/yum.repos.d/nginx.repo,输入内容如下: [nginx-stable] namenginx stab…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
