当前位置: 首页 > news >正文

【STC15单片机】模拟I2C操作AT24C02数据读取【更新中】

目录

I2C时序结构

I2C代码

AT24C02代码(继承I2C底层代码)

PCF8591


 PCB上线的长短可能影响数据传输的时间,写I2C时序可能就要加一点延时

I2C时序结构

  • 起始条件:SCL高电平期间,SDA从高电平切换到低电平
  • 终止条件:SCL高电平期间,SDA从低电平切换到高电平


发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位在前),然后拉高SCL,从机将在SCL高电平期间读取数据位,素有SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节

 接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位在前),然后拉高SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)


  • 发送应答:在接收完一个字节之后,主机在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
  • 接收应答:在发送完一个字节之后,主机在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收前,需要释放SDA)

I2C代码

#include "I2C.h"//15开发板中AT24C02的IIC通信引脚
sbit I2C_SDA = P2^1;
sbit I2C_SCL = P2^0;/*** @brief	I2C起始信号* @param	无* @retval	无*/
void I2C_Start(void)
{I2C_SDA = 1;	//拼接其他块,确保默认是1I2C_SCL = 1;I2C_SDA = 0;	//时序上先拉低I2C_SCL = 0;
}/*** @brief	I2C停止信号* @param	无* @retval	无*/
void I2C_Stop(void)
{I2C_SDA = 0;	//确保默认0,保证由低电平拉高至高电平I2C_SCL = 1;I2C_SDA = 1;
}/*** @brief	I2C发送一个字节数据* @param	Byte 要发送的字节* @retval	无*/
void I2C_SendByte(unsigned char Byte)
{unsigned char i;
//	I2C_SCL = 0;	//起始信号已经拉低了,无需重复for (i = 0; i < 8; i ++){		I2C_SDA = Byte & (0x80>>i);	//把Byte最高位取出,赋值给I2C_SDA,依次从高到底I2C_SCL = 1;
//		_nop_();_nop_();_nop_();_nop_();_nop_();//需要0.4usI2C_SCL = 0;}
}/*** @brief	I2C接收一个字节数据* @param	无* @retval	接受到的一个字节数据	*/
unsigned char I2C_ReceiveByte(void)
{unsigned char i,Byte=0x00;I2C_SDA = 1;	//接收之前,先把I2C_SDA置1,释放总线for(i=0;i<8;i++){I2C_SCL = 1;	//拉高SCL,SCL读取SDAif(I2C_SDA == 1){Byte |= (0x80>>i);}/*如果读取到的SDA为1,把Byte最高位置1,如果读取到的SDA为0,不处理,默认最高位为0,放在循环里从高位到低位依次读取*/I2C_SCL = 0;	//拉低SCL,结束当前循环}return Byte;
}/*** @brief	I2C发送应答* @param	AckBit 应答位,0为应答,1为非应答* @retval	无*/
void I2C_SendAck(unsigned char AckBit)
{				I2C_SDA = AckBit;//给应答就是0,不给应答就是1I2C_SCL = 1;I2C_SCL = 0;
}/*** @brief	I2C接收应答* @param	无* @retval	接收到的应答位,0为应答,1为非应答*/
unsigned char I2C_ReceiveAck(void)
{unsigned char AckBit;I2C_SDA = 1;	//先释放SDAI2C_SCL = 1;	//高电平期间读取SDAAckBit=I2C_SDA;	//读取到什么,就返回什么I2C_SCL = 0;return AckBit;	//返回0,代表有应答,返回1,代表无应答
}
#ifndef __I2C_H__
#define __I2C_H__#include <STC15F2K60S2.H>
#include "intrins.h"void I2C_Start(void);
void I2C_Stop(void);
void I2C_SendByte(unsigned char Byte);
unsigned char I2C_ReceiveByte(void);
void I2C_SendAck(unsigned char AckBit);
unsigned char I2C_ReceiveAck(void);#endif

 AT24C02设备地址: 

 A2A1A0这三个引脚是用来扩展的,如果不用就默认是000

所以默认设备地址是10100000(0xA0   写数据),10100001(0xA1   读数据)

AT24C02代码(继承I2C底层代码)

#include "AT24C02.h"#define AT24C02_ADDRESS   0xA0   //从机地址+写  1010 0000/***@brief   名称:AT24C02写入一个字节*@param   参数:WordAddess 要写入字节的地址(0~255)*@param   参数: Data 要写入的数据*@retval返回值:无*/
void AT24C02_WriteByte(unsigned char WordAddress, unsigned char Data)
{
//	unsigned char Ack;I2C_Start();I2C_SendByte(AT24C02_ADDRESS);//从机地址+写
//	Ack = I2C_ReceiveAck();
//	if(Ack == 0) 
//	{
//		P2 = 0x80;	// 1000 0000
//		P0 = 0x00;
//	}	//先测试是否有应答,定义的Ack被I2C_ReceiveAck();赋值,然后就可以测试了I2C_ReceiveAck();I2C_SendByte(WordAddress);	//要写入数据的地址I2C_ReceiveAck();I2C_SendByte(Data);	//写入数据I2C_ReceiveAck();I2C_Stop();
}/***@brief   名称:AT24C02读取一个字节*@param   参数:WordAddess 要读出字节的地址*@retval返回值:读出的数据*/
unsigned char AT24C02_ReadByte(unsigned char WordAddess)
{unsigned char Data;I2C_Start();I2C_SendByte(AT24C02_ADDRESS);	//从机地址+写I2C_ReceiveAck();				//接受应答I2C_SendByte(WordAddess);		//数据的地址I2C_ReceiveAck();I2C_Start();I2C_SendByte(AT24C02_ADDRESS | 0x01);//发送从机地址+读本函数第二个函数,或上0x01变成读地址(0xA1)I2C_ReceiveAck();Data = I2C_ReceiveByte();I2C_SendAck(1);	//不发送应答I2C_Stop();return Data;
}
#ifndef __AT24C02_H__
#define __AT24C02_H__#include <STC15F2K60S2.H>
#include "I2C.h"void AT24C02_WriteByte(unsigned char WordAddress, unsigned char Data);
unsigned char AT24C02_ReadByte(unsigned char WordAddress);#endif

测试:先写入,不读取,然后下载只读取的函数,如果读出数值没有问题,那就正确了

#include <STC15F2K60S2.H>
#include "smg.h"
#include "I2C.h"
#include "AT24C02.h"unsigned char Data;void main()
{All_Init();AT24C02_WriteByte(0,88);Delay_ms(5);		//写数据的周期 5msData = AT24C02_ReadByte(0);	while(1){Nixie(1,Data/10);Nixie(2,Data%10);}
}

PCF8591

PCF8591地址:1001 0000(0x90   写),1001 0001(0x91   读)

 

 支持四路AD转换(模拟信号转数字信号),支持一路DA转换(数字信号转模拟信号)

 程序有问题,不粘贴了,调成功了在粘贴过来


学习资料:

江科大自化协---51单片机入门教程-2020版 程序全程纯手打 从零开始入门【12-2】

相关文章:

【STC15单片机】模拟I2C操作AT24C02数据读取【更新中】

目录 I2C时序结构 I2C代码 AT24C02代码&#xff08;继承I2C底层代码&#xff09; PCF8591 PCB上线的长短可能影响数据传输的时间&#xff0c;写I2C时序可能就要加一点延时 I2C时序结构 起始条件&#xff1a;SCL高电平期间&#xff0c;SDA从高电平切换到低电平终止条件&…...

Hadoop

Hadoop Hadoop1.x 2.x 3.x区别 Hadoop1.x组成&#xff1a;MapReduce负责计算和资源调度&#xff0c;HDFS负责数据存储&#xff0c;Common辅助工具。 Hadoop2.x组成&#xff1a;MapReduce负责计算&#xff0c;Yarn负责资源调度&#xff0c;HDFS负责数据存储&#xff0c;Commo…...

ArrayList源码+扩容机制分析

1. ArrayList 简介 ArrayList 的底层是数组队列&#xff0c;相当于动态数组。与 Java 中的数组相比&#xff0c;它的容量能动态增长。在添加大量元素前&#xff0c;应用程序可以使用ensureCapacity操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。 ArrayLis…...

数据库(第四次作业)

学生表&#xff1a;Student (Sno, Sname, Ssex , Sage, Sdept) 学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系 Sno为主键 课程表&#xff1a;Course (Cno, Cname,) 课程号&#xff0c;课程名 Cno为主键 学生选课表&#xff1a;SC (Sno, Cno, Score)…...

传统档案管理,为什么影响企业上市进度?

企业上市&#xff0c;对于很多创业者来说&#xff0c;是他们奋发努力的首要目标。企业通过上市&#xff0c;进行股权融资&#xff0c;扩大经营规模&#xff0c;加速促进公司成长&#xff0c;最终达到企业的可持续发展。而要实现成功上市&#xff0c;企业除了需要满足股份公司上…...

9个EXCEL舍入函数公式的用法和实例

用法和实例 1. ROUND ROUND函数可以将数字四舍五入到指定的小数位数。 语法&#xff1a;ROUND(number, num_digits) number&#xff1a;要四舍五入的数字。 num_digits&#xff1a;要保留的小数位数。 举例&#xff1a; ROUND(3.14159,2)&#xff0c;结果为3.14 ROUND(3.141…...

设计模式:代理模式给原始类附加功能

一、代理模式 1、定义 在不改变原始类&#xff08;被代理类&#xff09;的情况下&#xff0c;通过引入代理类来给原始类附加功能。 一般情况下&#xff0c;让代理类和原始类实现同样的接口。 但是&#xff0c;如果原始类并没有定义接口&#xff0c;并且原始类代码并不是我们…...

JavaScript刷LeetCode拿offer-链表篇

一、链表 链表&#xff08;Linked List&#xff09;是一种常见的基础数据结构&#xff0c;也是线性表的一种。 一个线性表是 n 个具有相同特性的数据元素的有限序列&#xff0c;线性表的存储结构分为两类&#xff1a;顺序表&#xff08;数组&#xff09;和链表。 链表相比较顺…...

CPP2022-28-期末模拟测试01

6-1 实现一个计算三角形面积的简单函数&#xff08;假设输入的边长合理&#xff09;。 分数 10 全屏浏览题目 切换布局 作者 王和兴 单位 东北大学秦皇岛分校 实现一个计算三角形面积的简单函数&#xff08;假设输入的边长合理&#xff09;。 函数接口定义&#xff1a; do…...

牛客网Python篇数据分析习题(五)

1.现有牛客网12月每天练习题目的数据集nowcoder.csv。包含如下字段&#xff08;字段之间用逗号分隔&#xff09;&#xff1a; user_id:用户id question_id&#xff1a;问题编号 result&#xff1a;运行结果 date&#xff1a;练习日期 请你统计答对和答错的总数分别是多少。 imp…...

华为OD机试真题JAVA实现【人数最多的站点】真题+解题思路+代码(20222023)

🔥系列专栏 华为OD机试(JAVA)真题目录汇总华为OD机试(Python)真题目录汇总华为OD机试(C++)真题目录汇总华为OD机试(JavaScript)真题目录汇总文章目录 🔥系列专栏题目输入输出示例一输入输出说明解题思路核心知识点Code运行结果版权说...

ROS2机器人编程简述humble-第四章-IMPROVED DETECTOR .4

ROS2之TF2小练习-颜色随机器人和障碍物直接距离变化ROS2之TF2小练习-有哪些bug找找看里面给出了&#xff1a;ROS2机器人编程简述humble-第四章-BASIC DETECTOR .3需要改进哪些地方呢&#xff1f;检测之后&#xff0c;距离不变了……如何变化&#xff1f;这个问题可以问chatgpt吗…...

依存句法分析 -- tag和dep释义

依存句法分析&#xff08;Dependency Parsing, DP&#xff09;是通过分析语言单位内成分之间的依存关系揭示其句法结构&#xff0c;主张橘子 中核心动词是支配其它成分的中心成分&#xff0c;而它本身却不受其他任何成分的支配&#xff0c;所有受支配成分都以某种关系从属于支配…...

服务器常见的网络攻击以及防御方法

网络安全威胁类别 网络内部的威胁&#xff0c;网络的滥用&#xff0c;没有安全意识的员工&#xff0c;黑客&#xff0c;骇客。 木马攻击原理 C/S 架构&#xff0c;服务器端被植入目标主机&#xff0c;服务器端通过反弹连接和客户端连接。从而客户端对其进行控制。 病毒 一…...

Python期末复习知识点大合集(期末不挂科版)

Python期末复习知识点大合集&#xff08;期末不挂科版&#xff09; 文章目录Python期末复习知识点大合集&#xff08;期末不挂科版&#xff09;一、输入及类型转换二、格式化输出&#xff1a;字符串的format方法三、流程控制四、随机数生成五、字符串六、序列索&#xff08;含字…...

Echarts 雷达图设置拐点大小和形状,tooltip后文字不居中对齐

第017个点击查看专栏目录Echarts的雷达图的拐点大小和形状是可以设置的&#xff0c;在series中设置symbol 相应的属性即可。 使用tooltip的时候&#xff0c;默认状态文字是居中对齐的&#xff0c;不好看。需要在tooltip属性中设置一下&#xff0c;如图所示&#xff0c;效果比较…...

Lesson 7.1 无监督学习算法与 K-Means 快速聚类

文章目录一、聚类算法与无监督学习二、K-Means 快速聚类的算法原理1. K-Means 快速聚类的基本执行流程2. K-Means 快速聚类的背后的数学意义三、K-Means 快速聚类的 sklearn 实现方法1. sklearn 中实现 K-Means 快速快速聚类2. 轮廓系数基本概念与 sklearn 中实现方法从现在开始…...

优维低代码:Legacy Templates 构件模板

优维低代码技术专栏&#xff0c;是一个全新的、技术为主的专栏&#xff0c;由优维技术委员会成员执笔&#xff0c;基于优维7年低代码技术研发及运维成果&#xff0c;主要介绍低代码相关的技术原理及架构逻辑&#xff0c;目的是给广大运维人提供一个技术交流与学习的平台。 连载…...

最全面的SpringBoot教程(五)——整合框架

前言 本文为 最全面的SpringBoot教程&#xff08;五&#xff09;——整合框架 相关知识&#xff0c;下边将对SpringBoot整合Junit&#xff0c;SpringBoot整合Mybatis&#xff0c;SpringBoot整合Redis等进行详尽介绍~ &#x1f4cc;博主主页&#xff1a;小新要变强 的主页 &…...

信息安全保障

信息安全保障信息安全保障基础信息安全保障背景信息安全保障概念与模型基于时间的PDR模型PPDR模型&#xff08;时间&#xff09;IATF模型--深度防御保障模型&#xff08;空间&#xff09;信息安全保障实践我国信息安全保障实践各国信息安全保障我国信息安全保障体系信息安全保障…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率&#xff08;或其他自定义指标&#xff09;来调整这些对象的规模&#xff0c;从而帮助应用程序在负…...

Mac flutter环境搭建

一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...

深度解析云存储:概念、架构与应用实践

在数据爆炸式增长的时代&#xff0c;传统本地存储因容量限制、管理复杂等问题&#xff0c;已难以满足企业和个人的需求。云存储凭借灵活扩展、便捷访问等特性&#xff0c;成为数据存储领域的主流解决方案。从个人照片备份到企业核心数据管理&#xff0c;云存储正重塑数据存储与…...

k8s从入门到放弃之Pod的容器探针检测

k8s从入门到放弃之Pod的容器探针检测 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;容器探测是指kubelet对容器执行定期诊断的过程&#xff0c;以确保容器中的应用程序处于预期的状态。这些探测是保障应用健康和高可用性的重要机制。Kubernetes提供了两种种类型…...