蓝桥杯单片机之AT24C02(基于自己对AT24C02的学习和理解)

一、先用抽象法说明原理,让原理变得简单易懂:

1、向AT24C02写入数据:

        有个关系户,他想安排自己的儿子进某个大厦里某个楼层的公司,那么他就要先找到这个公司的地址,然后再找到该公司是第几楼,最后把自己儿子安排进这个楼所在的公司。

        说明:

                (1)找到公司所在大厦:写入设备地址

                (3)找到公司楼层:要写入数据的地址,也就是你想把数据存哪个数据存储单元

                (4)儿子:你要写入的数据

2、向AT24C02读取数据:

        儿子下班了,要老爸接他下班,但是老爸没空,打电话给司机,告诉司机公司所在的大厦地址,公司楼层,然后司机到了这个地址,问HR小姐姐找要找的人,司机准备接待,最后HR带人来了。

        说明:

                (1)司机需要先找到正确的大厦(写入设备地址0xA0)

                (2)然后精确到具体楼层(写入存储地址Address)

                (3)司机开始准备接待(写入0xA1)

                (4)HR小姐姐找到了指定的人,并带来司机面前(读取数据Temp)

                (5)接到后立刻离开(NACK+Stop)

二、原理图

1、设备地址:其中A2、A1、A0都是0,所以唯一要改的就是R/W

 2、写入流程图:

3、读取流程图:

三、代码:

1、重点代码:(注:能看懂这里就可以了)

/*
参数:Address:范围是0x00 到 0xFF, Data:范围是0x00到0xff(0 - 255)
功能:向某个数据存储地址Address写入数据Data
返回值:无
*/
void AT24C02_Write(unsigned char Address,unsigned char Data)
{I2CStart();I2CSendByte(0xA0);I2CWaitAck();I2CSendByte(Address);I2CWaitAck();I2CSendByte(Data);I2CWaitAck();I2CStop();
}/*
参数:Address:范围是0x00 到 0xFF
功能:向某个数据存储地址Address读取数据
返回值:Temp
*/
unsigned char AT24C02_Read(unsigned char Address)
{unsigned char Temp;I2CStart();I2CSendByte(0xA0);I2CWaitAck();I2CSendByte(Address);I2CWaitAck();I2CStart();I2CSendByte(0xA1);I2CWaitAck();Temp = I2CReceiveByte();I2CSendAck(1);I2CStop();return Temp;
}

2、主要代码:(注:并非所有代码,直接复制运行必错)

/*	#   I2C代码片段说明1. 	本文件夹中提供的驱动代码供参赛选手完成程序设计参考。2. 	参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题中对单片机时钟频率的要求,进行代码调试和修改。
*/
#include "sys.h"
#define DELAY_TIME	10//
static void I2C_Delay(unsigned char n)
{do{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();		}while(n--);      	
}//
void I2CStart(void)
{sda = 1;scl = 1;I2C_Delay(DELAY_TIME);sda = 0;I2C_Delay(DELAY_TIME);scl = 0;    
}//
void I2CStop(void)
{sda = 0;scl = 1;I2C_Delay(DELAY_TIME);sda = 1;I2C_Delay(DELAY_TIME);
}//
void I2CSendByte(unsigned char byt)
{unsigned char i;for(i=0; i<8; i++){scl = 0;I2C_Delay(DELAY_TIME);if(byt & 0x80){sda = 1;}else{sda = 0;}I2C_Delay(DELAY_TIME);scl = 1;byt <<= 1;I2C_Delay(DELAY_TIME);}scl = 0;  
}//
unsigned char I2CReceiveByte(void)
{unsigned char da;unsigned char i;for(i=0;i<8;i++){   scl = 1;I2C_Delay(DELAY_TIME);da <<= 1;if(sda) da |= 0x01;scl = 0;I2C_Delay(DELAY_TIME);}return da;    
}//
unsigned char I2CWaitAck(void)
{unsigned char ackbit;scl = 1;I2C_Delay(DELAY_TIME);ackbit = sda; scl = 0;I2C_Delay(DELAY_TIME);return ackbit;
}//
void I2CSendAck(unsigned char ackbit)
{scl = 0;sda = ackbit; I2C_Delay(DELAY_TIME);scl = 1;I2C_Delay(DELAY_TIME);scl = 0; sda = 1;I2C_Delay(DELAY_TIME);
}/*
参数:Address:范围是0x00 到 0xFF, Data:范围是0x00到0xff(0 - 255)
功能:向某个数据存储地址Address写入数据Data
返回值:无
*/
void AT24C02_Write(unsigned char Address,unsigned char Data)
{I2CStart();I2CSendByte(0xA0);I2CWaitAck();I2CSendByte(Address);I2CWaitAck();I2CSendByte(Data);I2CWaitAck();I2CStop();
}/*
参数:Address:范围是0x00 到 0xFF
功能:向某个数据存储地址Address读取数据
返回值:Temp
*/
unsigned char AT24C02_Read(unsigned char Address)
{unsigned char Temp;I2CStart();I2CSendByte(0xA0);I2CWaitAck();I2CSendByte(Address);I2CWaitAck();I2CStart();I2CSendByte(0xA1);I2CWaitAck();Temp = I2CReceiveByte();I2CSendAck(1);I2CStop();return Temp;
}
unsigned char temp;
void main()
{AT24C02_Write(0x01,122);  // 向0x01数据存储地址写入122while(1){temp = AT24C02_Read(0x01);  // 从0x01数据存储地址读取数据,理论上应该是122SMG(1,temp / 100);       // 显示百位SMG(2,temp % 100 / 10);  // 显示十位SMG(3,temp % 10);        // 显示个位}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/72709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java面试易忽略知识点

1. CompletableFuture中thenApply()与thenCompose()的区别 考察点&#xff1a;组合式异步编程 解析&#xff1a; ​**thenApply()**&#xff1a;接收前序任务结果&#xff0c;返回普通对象&#xff08;同步转换&#xff09;&#xff0c;适用简单数据处理。​**thenCompose()*…

VLLM专题(十九)—兼容 OpenAI 的服务器

vLLM 提供了一个 HTTP 服务器,能够实现 OpenAI 的 Completions API、Chat API 等功能! 您可以通过 vllm serve 命令启动服务器,或者通过 Docker 启动: vllm serve NousResearch/Meta-Llama-3-8B-Instruct --dtype auto --api-key token-abc123要调用服务器,您可以使用官…

【云原生之kubernetes实战】在k8s环境中高效部署minio对象存储(详细教程)

【云原生之kubernetes实战】在k8s环境中高效部署minio对象存储(详细教程) 前言一、minio介绍1.1 MinIO简介1.2 主要特点1.3 主要使用场景二、相关知识介绍2.1 本次实践存储介绍2.2 k8s存储介绍三、本次实践介绍3.1 本次实践简介3.2 本次环境规划3.3 部署前需准备工作四、检查…

【高项】信息系统项目管理师(八)项目质量管理【3分】

项目质最管理包括把组织的质量政策应用于规划、管理、控制项目和产品质量要求。以满足干系人目标的各个过程。项目质量管理以执行组织的名义支持过程的持续改进活动,项目质量管理需要兼顾项目管理与项目可交付成果两个方面,它适用于所有项目无论项目的可付成果具有何种特性。质…

python-leetcode 48.括号生成

题目&#xff1a; 数字n代表生成括号的对数&#xff0c;设计一个函数&#xff0c;用于生成所有可能并且有效的括号组合。 方法一&#xff1a;回溯 可以生成所有 2**2n 个 ‘(’ 和 ‘)’ 字符构成的序列&#xff0c;然后检查每一个是否有效即可 为了生成所有序列&#xff0c…

TDE透明加密技术:免改造实现华为云ECS中数据库和文件加密存储

在数字经济与云计算深度融合的今天&#xff0c;华为云ECS&#xff08;弹性云服务器&#xff09;已成为企业数字化转型的核心载体&#xff0c;承载着数据库、文件存储、AI训练等关键业务。然而&#xff0c;云上数据安全形势日益严峻&#xff1a;2024年全球云环境勒索攻击同比激增…

3D点云数据处理中的聚类算法总结

1.欧式聚类&#xff1a; 基于点的空间距离&#xff08;欧几里得距离&#xff09;来分割点云&#xff0c;将距离较近的点归为同一簇。 欧式聚类需要的参数&#xff1a;邻域半径R,簇的最小点阈值minPts&#xff0c;最大点数阈值maxPts。 实现效率&#xff1a; O(n * log n) 实现…

PCL--点云可视化

用于单个显示、多个显示的头文件<visual_.h> visual_.h #pragma once #include <iostream> #include <thread> #include <pcl/visualization/pcl_visualizer.h>using namespace std::chrono_literals;/********************************************…

火星探测发展概述2025.3.20

一.火星探测历程 1.1 探索启蒙 火星探测的启蒙阶段可追溯至20世纪60年代,标志着人类对这颗神秘行星的科学探索正式拉开帷幕。这一时期的标志性事件包括: 1960年10月至1964年11月间,苏联和美国进行了6次火星探测尝试,但均以失败告终。 1964年11月28日,美国成功发射“水手…

DAPO:一个开源的大规模大型语言模型LLM强化学习系统

推断扩展赋予了大型语言模型前所未有的推理能力,强化学习作为激发复杂推理的核心技术,清华大学联合字节提出了解耦片段与动态采样策略优化(DAPO)算法,并全面开源了一个最先进的大规模强化学习系统,该系统使用Qwen2.5-32B基础模型在AIME 2024上取得了50分的高分。还开源了…

力扣刷题46. 全排列

46. 全排列 - 力扣&#xff08;LeetCode&#xff09; 使用dfs搜索&#xff0c;查找所有的情况&#xff0c;首先定义所有的链表集合list&#xff0c;在定义每一种情况的链表res&#xff0c;在主函数中遍历所有的初始元素&#xff0c;首先初始化res&#xff0c;并且添加到res中&…

Metasploit Framework(MSF)使用教程与命令详解

Metasploit Framework&#xff08;简称MSF&#xff09;是一款功能强大的开源渗透测试工具&#xff0c;广泛应用于网络安全领域。它集成了大量的漏洞利用模块&#xff08;exploits&#xff09;、辅助模块&#xff08;auxiliary&#xff09;和载荷&#xff08;payloads&#xff0…

【Netty】客户端功能完善

超时控制 public class RequestTimeoutManager {private final HashedWheelTimer timer new HashedWheelTimer();private final ConcurrentMap<Long, Timeout> pendingRequests new ConcurrentHashMap<>();public void addRequest(long requestId, long timeout…

【鸿蒙开发】Hi3861学习笔记- DS18B20温度传感器

00. 目录 文章目录 00. 目录01. DS18B20简介02. DS18B20引脚及电路03. DS18B20内部结构框图04. DS18B20内存映射05. 硬件设计06. 软件设计07. 实验现象08. 附录 01. DS18B20简介 DS18B20 是常用的数字温度传感器&#xff0c;其输出的是数字信号&#xff0c;具有体积小&#xf…

跨境大文件传输如何突破延迟与丢包双重困局

一、行业痛点&#xff1a;跨国传输的挑战 在全球化业务场景中&#xff0c;跨境大文件传输常面临网络延迟高、丢包率频发等问题。传统TCP协议因其“先建联再传输”的机制&#xff0c;在高时延、高丢包环境下效率骤降&#xff0c;导致跨国协作、影视渲染、科研数据共享等场景中传…

uni-app——计时器和界面交互API

API 基本概要 概念说明 API&#xff08;应用程序接口&#xff09;是预先定义的方法集合&#xff0c;用于实现特定功能。在 uni-app 中&#xff0c;通过全局对象 uni 调用 API&#xff0c;例如 uni.getSystemInfoSync 获取设备信息。 API 分类与调用规则 事件监听型 以 on 开…

Dify 升级攻略:从0.15.3迈向1.1.0,元数据管理全攻略!

嘿&#xff0c;小伙伴们&#xff01;今天给大家带来一个超实用的干货分享——Dify从0.15.3升级到1.1.0版本的详细攻略。这次升级不仅带来了功能上的更新&#xff0c;还特别强化了元数据管理。相信很多小伙伴和我一样&#xff0c;一直在使用Dify来提升工作效率&#xff0c;但每次…

15.三数之和-力扣(python)

给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 示例 1&a…

numpy学习笔记14:模拟随机游走过程

numpy学习笔记14&#xff1a;模拟随机游走过程 随机游走是一种数学统计模型&#xff0c;其中的每一步方向和大小都是随机的。下面使用 NumPy 模拟一维和二维的随机游走过程&#xff1a; 1.代码示例 import numpy as np import matplotlib.pyplot as plt plt.rcParams[font.s…

YOLOv11 目标检测

本文章不再赘述anaconda的下载以及虚拟环境的配置&#xff0c;博主使用的python版本为3.8 1.获取YOLOv11的源工程文件 链接&#xff1a;GitHub - ultralytics/ultralytics: Ultralytics YOLO11 &#x1f680; 直接下载解压 2.需要自己准备的文件 文件结构如下&#xff1a;红…