蓝桥杯_PCF8591

目录

一 前言

二 引言

三 PCF8591介绍

(1)I2C通信

 (2)原理图中的8591

四 代码层面

(1)根据题目所给的示范代码,实现ADC

1 为什么需要返回值,同时返回值是unsigned char?

2 为什么发送地址是0x90?

 (2)根据题目所给的示范代码,实现DAC

main.c

为什么需要转化成unsigned int?


一 前言

  本次关于PCF8591的学习,我们主要学ADC和DAC板块,主要的目标是通过旋转蓝桥杯板子上的旋钮(电压采集)和边上的光敏电阻,来实现PCK8591_ADC板块的转换,本次也会教DAC的转换,但并不写相关代码调试

二 引言

我们知道,在电路中传输的信号只有两种,分别是数字信号和模拟信号,模拟信号更像一个个具体的数值,数字信号只由0和1构成。将模拟信号转换为数字信号,我们把这个过程称之为ADC转化,A表示模拟信号,D表示数字信号,所衍生出来了两种技术:模拟-数字转换ADC技术、数字-模拟转换DAC技术,一般来说,我们用模拟-数字转换ADC技术用的比较多,我也会着重去讲ADC技术。(大家不要把ADC想成王者荣耀里面的射手位置啊!!)

三 PCF8591介绍

(1)I2C通信

在蓝桥杯比赛中提供的板子原理图中,上面这张照片就是PCF8591的原理图,大家仔细观察本章图片的右下角位置,你会发现:P20、P21后面的SCL和SDA,这两个线就是I2C的核心线,I2C需知道的相关底层知识点,如若不理解I2C通信,推荐大家去哔哩哔哩看这个博主的视频

【4分钟看懂!I2C通讯协议 最简单的总线通讯!】 https://www.bilibili.com/video/BV1dg4y1H773/?share_source=copy_web

1 SDA:提供信息通道       SCL:提供精确的频率        GND:接地线

2 当SCL为高电平时:(1)SDA从高到低的跳变为开始信号(2)SDA从低到高的跳变为结束信号

3 主机每次发送信息只能发送八个二进制数(1字节byte)

4 先写在读

大家先对上面这张图片有所印象,我会在后面结合比赛给提供的代码中进行添加代码讲解,因为比赛所提供的范例代码已经包含上面这个过程了

 (2)原理图中的8591

现在我们观察左上角的这个几个位置,这几个位置是决定着PCF8591该作用到那个地方,例如下图(从原理图中摘出来的部分)+对应功能的地址(代码要写对应的地址):

地址对应的功能
AIN10x41光敏电阻
AIN30x43滑动变阻器

四 代码层面

(1)根据题目所给的示范代码,实现ADC

我们先看一下范例代码给我们提供了什么:

static void I2C_Delay(unsigned char n);//延时函数
void I2CStart(void); //开始信号
void I2CStop(void);  //停止信号
void I2CSendByte(unsigned char byt);//发送一个字节
unsigned char I2CReceiveByte(void); //接收一个字节
unsigned char I2CWaitAck(void);//等待响应
void I2CSendAck(unsigned char ackbit);//发送应答位

我们根据上面比赛提供的代码进行ADC转换,由于我们知道在板子上ADC有两个,分别是光敏电阻和滑动变阻器,所以我们需要在代码书写的时候要进行选择,引入入口参数channel_num,再在对应的.h文件中,将两个参数进行宏定义,我们如果想要用哪个功能只需要给对应的函数进行更换入口参数即可。

#define Photo_Res_Channel 0x41 //光敏电阻
#define Adj_Res_Channel 0x43   //滑动变阻器

在官方给的IIC.c文件中的最下面添加相应的代码:

unsigned char Pcf8591_Adc(unsigned char channel_num_contrl)
{unsigned char temp;I2CStart();//发送开启信号I2CSendByte(0x90);//选择PCF8591芯片,确定写的模式I2CWaitAck();//等待PCF8591反馈I2CSendByte(channel_num_contrl);//确定要转换的通道(顺便,使能DA转换)I2CWaitAck();//等待PCF8591反馈	I2CStart();//发送开启信号I2CSendByte(0x91);//选择PCF8591芯片,确定读的模式I2CWaitAck();//等待PCF8591反馈	temp = I2CReceiveByte();//接收数据I2CSendAck(1);//选择不应答I2CStop();//停止发送return temp;}
1 为什么需要返回值,同时返回值是unsigned char?

函数内部通过 IIC 总线从 PCF8591 读取的数据(存储在 temp中),temp是转换结果,必须通过返回值返回给用户,否则无法获取 ADC 结果

PCF8591 是一个 8 位 ADC(模数转换器)

2 为什么发送地址是0x90?

0x90 = 1001 0000,高四位分别是1001,1001的意思就是PCF8591,然后最后一位决定着读还是写,0是写,1是读,再看上面PCF8591的原理图的A1 2 3部分,他们仨是接地的,所以0x90的意思就是我PCF8591要写数据了,若不理解,就背下来!!!

 整体的一个代码过程就是:

开始信号 -> 写 -> 等待应答

告诉单片机对应的通道 -> 等待应答

开始信号 -> 读 - > 等待应答

将接受到的数据给temp -> 8591告诉单片机不应答 -> 停止信号

 (2)根据题目所给的示范代码,实现DAC

 同样,在iic.c文件中,继续添加相应的DAC转换代码:

void Pcf8591_Dac(unsigned char trans_dat)
{I2CStart();//发送开启信号I2CSendByte(0x90);//选择PCF8591芯片,确定写的模式I2CWaitAck();//等待PCF8591反馈I2CSendByte(0x41);//使能DA转换(随便写通道编号,不影响,主要的功能是使能DA)I2CWaitAck();//等待PCF8591反馈        I2CSendByte(trans_dat);//将待转换的数据发送出去I2CWaitAck();//等待PCF8591反馈    I2CStop();//停止发送    }

注意:

这里和上面ADC很多地方不一样,这里不用接收信号函数  I2CReceiveByte(),以及不用引用其他变量

main.c

在main.c中,仅需添加一种新的情况,全部代码我就不写了,和本专题前面的main文件中的代码类似,请大家认真阅读曾经的文章

case 4:sprintf(seg_string,"%4d%4d",(unsigned int)PCF8591_ADC(Photo_Res_Channel ),(unsigned int)PCF8591_ADC(Adjust_Channel));//为什么最后显示的是左边是光敏电阻,右边是光敏电阻break;

这里面我们也需要将ADC读取的光敏电阻传到数码管上,需要利用上面这行代码

为什么需要转化成unsigned int?

因为PCF8591_ADC,这个函数的返回值是unsigned char,数码管显示不了字符型(char),所以我们需要将返回值强行转化成unsigned int类型

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

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

相关文章

Dify案例-接入飞书云文档实现需求质量评估

dify接入飞书云文档实现需求质量评估 1. 背景与目标2. 系统架构与流程2.1 整体架构图2.2 核心流程2.3 dify工作流概览 3. 实现细节3.1 文档提取3.2 需求评估3.3 参数提取3.4 创建飞书云文档 4. 难点总结4.1 提示词编写4.2 关联飞书云文档4.2.1 安装飞书云文档插件并关联到飞书自…

机器视觉工程师的专业精度决定职业高度,而专注密度决定成长速度。低质量的合群,不如高质量独处

在机器视觉行业,真正的技术突破往往诞生于深度思考与有效碰撞的辩证统一。建议采用「70%高质量独处30%精准社交」的钻石结构,构建可验证的技术能力护城河。记住:你的专业精度决定职业高度,而专注密度决定成长速度。 作为机器视觉工…

字符串移位包含问题

字符串移位包含问题 #include <iostream> #include <algorithm> using namespace std; int main(){string a,b;cin>>a>>b;//谁长遍历谁if(a.size()<b.size()) swap(a,b);//1-对整个字符串进行移位for(int i0; i<a.size(); i){//每次循环都将第一…

SQL 查询执行顺序

SQL 查询的逻辑处理顺序&#xff08;即 SQL 引擎解析和执行查询的顺序&#xff09;与书写顺序不同。以下是 SQL 查询的完整执行顺序&#xff1a; 1. 逻辑执行顺序 FROM 和 JOIN - 确定数据来源表并执行连接操作 WHERE - 对行进行筛选 GROUP BY - 将数据分组 HAVING - 对分组…

核心知识——Spark核心数据结构:RDD

引入 通过前面的学习&#xff0c;我们对于Spark已经有一个基本的认识&#xff0c;并且搭建了一个本地的练习环境&#xff0c;因为本专栏的主要对象是数仓和数分&#xff0c;所以就不花大篇幅去写环境搭建等内容&#xff0c;当然&#xff0c;如果感兴趣的小伙伴可以留言&#x…

Spring Boot 嵌入式容器性能对决:Tomcat vs Undertow!

文章目录 引言理论基础嵌入式容器TomcatUndertow 实战性能测试配置 Tomcat 和 Undertow创建测试控制器使用Jmeter压测 总结 引言 在现代应用开发中&#xff0c;选择合适的嵌入式容器对于提升应用的性能和响应性至关重要。Spring Boot 提供了多种嵌入式容器选项&#xff0c;其中…

计算机系统---GPU

硬件架构 核心处理器&#xff1a; 流处理器&#xff08;SP&#xff09;&#xff1a;是GPU进行计算的核心单元&#xff0c;数量众多。例如&#xff0c;NVIDIA的高端GPU可能拥有数千个流处理器。它们可以并行执行大量的计算任务&#xff0c;如在图形渲染中对每个顶点或像素进行独…

【GPT写代码】动作视频切截图研究器

目录 背景源代码 end 背景 用python写一个windows环境运行的动作视频切截图研究器&#xff0c;用路径浏览的方式指定待处理的视频文件&#xff0c;然后点击分析按钮&#xff0c;再预览区域显示视频预览画面&#xff0c;然后拖动时间轴&#xff0c;可以在预览区域刷新显示相应的…

在 .NET 8 中使用自定义令牌身份验证掌握 SignalR Hub 安全性

最近在练习做一个 Web 开发项目&#xff0c;需要使用 WebSockets 传输数据&#xff0c;实现实时通信。这是一个 React.js 项目&#xff0c;后端是 .NET。 虽然 MSDN 提供了出色的顶级文档&#xff0c;但它通常缺少高级用例所需的低级细节。 一种这样的场景是使用自定义令牌对…

[2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——

前言 类型 太赫兹 + 超表面 太赫兹 + 超表面 太赫兹+超表面 期刊 O p e n A c c e s s Open Access Open

家里网络访问Github有时候打不开,解决办法

1、修改Hosts文件修改法 通过DNS查询工具&#xff08;如&#xff09;获取最新GitHub域名解析IP修改系统hosts文件&#xff08;路径&#xff1a;C:\Windows\System32\drivers\etc\hosts&#xff09;&#xff0c;添加&#xff1a;20.205.243.166 github.com 20.27.177.113 github…

MyBatis操作数据库(1)

1. MyBatis 简介 MyBatis 是一款持久层框架&#xff0c;简化了 JDBC 的复杂操作&#xff0c;通过配置和映射文件将 Java 对象与数据库表关联。核心优势&#xff1a; 自动管理资源&#xff1a;无需手动关闭连接、释放资源。 动态 SQL&#xff1a;支持参数绑定、条件查询等。 …

ModuleNotFoundError: No module named ‘matplotlib_inline‘

ModuleNotFoundError: No module named matplotlib_inline 1. ModuleNotFoundError: No module named matplotlib_inline2. matplotlib-inlineReferences 如果你在普通的 Python 脚本或命令行中运行代码&#xff0c;那么不需要 matplotlib_inline&#xff0c;因为普通的 Python…

SSL证书自动化管理(ACME协议)工作流程介绍

SSL证书自动化管理&#xff08;ACME协议&#xff09;是一种用于自动化管理SSL/TLS证书的协议&#xff0c;以下是其详细介绍&#xff1a; 一、ACME协议概述 ACME协议由互联网安全研究小组&#xff08;ISRG&#xff09;设计开发&#xff0c;旨在实现SSL证书获取流程的自动化。通…

基于FPGA的特定序列检测器verilog实现,包含testbench和开发板硬件测试

目录 1.课题概述 2.系统测试效果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 本课题采用基于伪码匹配相关峰检测的方式实现基于FPGA的特定序列检测器verilog实现,包含testbench和开发板硬件测试。 2.系统测试效果 仿真测试 当检测到序列的时候&#xf…

#管理Node.js的多个版本

在 Windows 11 上管理 Node.js 的多个版本&#xff0c;最方便的方法是使用 nvm-windows&#xff08;Node Version Manager for Windows&#xff09;。它允许你轻松安装、切换和管理多个 Node.js 版本。 &#x1f4cc; 方法 1&#xff1a;使用 nvm-windows&#xff08;推荐 ✅&a…

【已解决】Webstorm 每次使用 git pull/push 都要输入令牌/密码登录

解决办法&#xff1a;勾上【使用凭据帮助程序】&#xff08;英文&#xff1a;Use credential helper&#xff09;

大模型架构记录13【hr agent】

一 Function calling 函数调用 from dotenv import load_dotenv, find_dotenvload_dotenv(find_dotenv())from openai import OpenAI import jsonclient OpenAI()# Example dummy function hard coded to return the same weather # In production, this could be your back…

Spring Boot向Vue发送消息通过WebSocket实现通信

注意&#xff1a;如果后端有contextPath&#xff0c;如/app&#xff0c;那么前端访问的url就是ip:port/app/ws 后端实现步骤 添加Spring Boot WebSocket依赖配置WebSocket端点和消息代理创建控制器&#xff0c;使用SimpMessagingTemplate发送消息 前端实现步骤 安装sockjs-…

【嵌入式学习5】PyQt5模块介绍、创建第一个窗口

目录 1、PyQt介绍 ①特点 ②主要组件 2、创建第一个窗口 exce_() 1、PyQt介绍 PyQt 是一个用于创建图形用户界面&#xff08;GUI&#xff09;应用程序的 Python 库&#xff0c;它是 Qt 框架的 Python 绑定。 ①特点 跨平台&#xff1a;支持多种操作系统&#xff0c;包括…