PCF8591(ADDA转换芯片)

news/2024/4/29 16:46:24/文章来源:https://blog.csdn.net/werluo/article/details/136737590

工具

1.Proteus 8 仿真器

2.keil 5 编辑器

原理图

讲解

PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。PCF8591具有4个模拟输入、1个模拟输出和1个串行I²C总线接口。PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I2C总线以串行的方式进行传输。

作用

AD (模数转换)

        将模拟信号(电流或电压信号)装换成数字信号(电平信号)

DA (数模转换)

        将数字信号(电平信号)装换成模拟信号(电流或电压信号)

特性

  1. 单独供电
  2. PCF8591的操作电压范围2.5V-6V
  3. 低待机电流
  4. 通过I2C总线串行输入/输出
  5. PCF8591通过3个硬件地址引脚寻址
  6. PCF8591的采样率由I2C总线速率决定
  7. 4个模拟输入可编程为单端型或差分输入
  8. 自动增量频道选择
  9. PCF8591的模拟电压范围从VSS到VDD
  10. PCF8591内置跟踪保持电路
  11. 8-bit逐次逼近A/D转换器
  12. 通过1路模拟输出实现DAC增益

引脚信息

引脚说明
ANI0~AIN3模拟信号输入端
A0~A2引脚地址端
VDD电源正
VSS电源负
SDAI2C数据线
SCLI2C时钟线
OSC

外部时钟输入端,内部时钟输出端

EXT

内部、外部时钟选择线,使用内部时钟时 EXT 接地

AGND模拟信号地
AOUTD/A转换输出端
VREF

基准电源端(注意:不可超过芯片的最大电压值,同时基准电压参与采样输出值的计算)

数字值 = (模拟电压 / VREF) * 256

内部结构

功能描述

寻址

D7D6D5D4D3D2D1D0
1001A2A1A0R/W

地址总是必须作为12c总线协议中的开始条件之后的第一个字节被发送。I2C总线系统中的每一片PCF8591都通过发送有效地址到该器件来激活。高四位为固定部分,低四位为可编程部分,A2,A1,A0是引脚地址,最低位是读写功能位:0是写,1是读。

控制

D7D6D5D4D3D2D1D0
未用(写0)

D/A输出允许位

0禁止 1允许

A/D输入方式选择位

00:4路单端输入

01:3路差分输入

10:单端与差分输入

11:2路差分输入

未用(写0)

自动益增选择位

0禁止 1允许

AD通道选择位

00:选择通道0

01:选择通道1

10:选择通道2

11:选择通道3

发送到PCF8591设备的第二个字节将存储在其控制寄存器中,并需要控制设备的功能。
控制寄存器的高4位用于使能模拟输出,并将模拟输入编程为单端或差分输入。
低4位选择由高4位所定义的模拟输入通道之一。
如果设置了自动增量标志,在每次A/D转换后,通道号会自动增加。
如果在使用内部振荡器的应用中需要自动增量模式,则应该设置控制字节(第6位)中的模拟输出使能标志。
这允许内部振荡器连续运行,从而防止由振荡器启动延迟导致的转换错误。上电复位后,控制寄存器的所有位都复位为逻辑0。为了省电,D/A转换器和振荡器被禁用。模拟输出被切换到高阻抗状态。

D5 D4 模拟输入配置方式 

注意

读取数据时从第二字节开始才是所需要的数据

代码

采集通道1模拟电压值并在液晶显示

#include <reg52.h>
#include "Delay.H"
#include "LCD1602.H"
#include <intrins.H>
sbit SDA = P2^7;   //数据
sbit SCL = P2^6;	 //时钟
sbit button =P1^7; //按钮
unsigned int num=0; //电压值#define delay();{_nop_();_nop_();_nop_();_nop_();_nop_();} //五个机器周期 5微妙 一周期多长时间与晶振有关/*** @brief  开始信号* @param  * @param * @param * @retval */
void start()
{SDA=1;SCL=1;	delay();SDA=0; delay();SCL=0;
}
/*** @brief  结束信号* @param  * @param * @param * @retval */
void end()
{SDA=0;	SCL=1;delay();SDA=1;delay_ms(10);
}// 发送
void send_data(unsigned char byte)
{unsigned char i;for(i=0;i<8;i++) //字节拆分按位传递{	//SCL为高电平 读取SDA稳定数据 所以SDA变化在前SDA=byte&(0x80>>i); //从最高位依次传递给SDA delay();SCL=1;delay();SCL=0;}
}// 接收
unsigned char read()
{unsigned char i,byte=0x00;SDA=1; for(i=0;i<8;i++) //字节拆分按位接收{	SCL=1;delay();if(SDA){byte|=(0x80>>i);}delay();SCL=0;}return byte;
}// 假设SCL和SDA是控制I2C时钟线和数据线的宏或变量  
// delay函数用于提供必要的延迟,确保时序正确  void send_sck(bit ACK) { // 根据ACK的值设置数据线SDA  SDA = ACK; // 注意:通常ACK是低电平,NACK是高电平delay();   // 保持SDA状态,等待从机读取 SCL = 1;   // 将时钟线SCL拉高 delay();   // 等待时钟线稳定 SCL = 0;   // 将时钟线SCL拉低,结束应答  delay();   // 等待时钟线稳定  SDA = 1;   //释放数据线 线权交给从机
}
//接收应答
bit read_sck()
{bit ACK;SDA=1;delay();    //5usSCL=1;delay();    //5usACK=SDA;delay();    //5usSCL=0;return ACK;
}/**
* @brief  I2C发送* @param  address 器件地址  byte PCF8591芯片 第二字节紧跟着 控制地址* @param * @param * @retval */
void I2C_send(unsigned char address,unsigned char byte)
{start();send_data(address); read_sck();send_data(byte);read_sck();end();delay_ms(5);
}/**
* @brief  I2C读取* @param  address 器件地址  * @param * @param * @retval */
unsigned char I2C_read(unsigned char address)
{unsigned char read_data;start();send_data(0x91); //器件read_sck();read(); //读取到的第一字节非所需数据send_sck(0);   //应答read_data=read();send_sck(1);   //非应答停止接收end();return read_data;
}main(void) 
{ LCD_Init(); //初始化液晶LCD_ShowString(1,1,"Old_man");LCD_ShowString(2,1,"0.00V");while(1){//按钮按下if(!button){while(!button);//按钮抬起后//I2C 读取PCF8591的值I2C_send(0x90,0x01);num=I2C_read(0x91); 	//读取的值		LCD_ShowNum(2,1,num*(5*1000/255)/1000,1);							//整数部分LCD_ShowString(2,2,".");								//小数点LCD_ShowNum(2,3,num*(5*1000/255)/10%100,2);		//小数部分LCD_ShowString(2,5,"V");}}} 

实现

🚀本欧也处于学习阶段,所学所识将以笔记发布。

笔记会根据相关知识的接触而随时更新! 

 如果文章对你有帮助,请留下你宝贵的点赞吧👍

V:Werluo  本欧也很喜欢交朋友的哦! 

 

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

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

相关文章

【实战解析】YOLOv9全流程训练至优化终极指南

【实战解析】YOLOv9全流程训练至优化终极指南 0.引言1.环境准备2.数据预处理&#xff08;1&#xff09;数据准备&#xff08;2&#xff09;按比例划分数据集&#xff08;3&#xff09;xml转txt脚本&#xff08;4&#xff09;配置文件 3.模型训练&#xff08;1&#xff09;单GPU…

【UE5 C++】各个头文件的含义

#pragma once 预处理程序指令 作用&#xff1a;保护同一个文件不会被多次包含&#xff0c;使得头文件只会被编译一次&#xff0c; #include “CoreMinimal.h” 包含了一套来自UE4的核心编程环境的普遍存在类型 #include “GameFramework/GameModeBase.h” 基于GameModeBas…

如何训练自己的ChatGPT?需要多少训练数据?

近年&#xff0c;聊天机器人已经是很常见的AI技术。小度、siri、以及越来越广泛的机器人客服&#xff0c;都是聊天机器人的重要适用领域。然而今年&#xff0c;ChatGPT的面世让这一切都进行到一个全新的高度&#xff0c;也掀起了大语言模型&#xff08;LLM&#xff09;的热潮。…

SpringBoot和Vue2项目配置https协议

1、SpringBoot项目 ① 去你自己的云申请并下载好相关文件&#xff0c;SpringBoot下载的是Tomcat&#xff08;默认&#xff09;&#xff0c;Vue2下载的是Nginx ② 将下载的压缩包里面的.pfx后缀文件拷贝到项目的resources目录下 ③ 编辑配置文件 &#xff08;主要是框里面的内…

Java项目:基于SSM+vue框架实现的人力资源管理系统设计与实现(源码+数据库+毕业论文+任务书)

一、项目简介 本项目是一套基于SSM框架实现的人力资源管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功能…

线程池的方式爬虫

<!--爬虫仅支持1.8版本的jdk--> <!-- 爬虫需要的依赖--> <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.2</version> </dependency><!-- 爬虫需…

Spring学习(四)反射、AOP、JUnit

文章目录 Java反射回顾 AOP代理模式AOP概念及术语概述术语作用 基于注解的AOP步骤依赖配置文件切入点表达式语法切面类重用切入点表达式切面的优先级 基于XML的AOP 单元测试JUnit引入依赖JUnit5 Java反射 Spring框架的IoC基于java反射机制实现&#xff0c;反射是指在运行状态中…

antd+Vue 3实现table行内upload文件图片上传【超详细图解】

目录 一、背景 二、效果图 三、代码 一、背景 一名被组长逼着干前端的苦逼后端&#xff0c;在一个晴天霹雳的日子&#xff0c;被要求前端订单产品实现上传产品图片并立刻回显图片。 二、效果图 三、代码 <template><a-table :dataSource"dataSource" :c…

CTF之矛盾

这一题就是php的弱比较“” 这里要求输入的不是数字&#xff0c;并且输入要为1才打印flag 那我们就输入一个1后面接随便什么字符&#xff0c;因为php的弱比较将字符与数字进行比较的时候&#xff0c;会把字符转换成数字再比较&#xff0c;当转换到字符时后面便都为空了 flag{…

Android如何实现一个应用位于前台时全局页面每隔三分钟弹出一次一天最多弹出5次的GroMore半插屏广告,处于付费页和后台时停止

首先我们需要添加一个全局的Application public class MyApp extends LitePalApplication {private static final String TAG "MyApp";private static Context mContext;private boolean isManageMent;public static String oaid;Overridepublic void onCreate() {…

【opencv】示例-epipolar_lines.cpp 对极线

这段代码总的功能是使用OpenCV库进行立体视觉的估计。它从命令行读取两个图像文件名&#xff0c;使用SIFT算法检测关键点并计算这些点的描述子&#xff0c;接着通过FLANN库进行快速近似最近邻搜索来找到匹配的关键点。然后使用RANSAC方法计算基础矩阵&#xff0c;找到内点&…

Python中大的一把锁

今天可以来讲解下GIL是个什么了。 GIL为什么是Python中大的一把锁&#xff1f; GIL是Global Interpreter Lock的缩写&#xff0c;翻译过来就是全局解释器锁。 从字面上去理解&#xff0c;它就是锁在解释器头上的一把锁&#xff0c;它使Python代码运行变得有序。 假如有一段…

基于FPGA轻松玩转AI

启动人工智能应用从来没有像现在这样容易&#xff01;受益于像Xilinx Zynq UltraScale MPSoC 这样的FPGA&#xff0c;AI现在也可以离线使用或在边缘部署、使用.可用于开发和部署用于实时推理的机器学习应用&#xff0c;因此将AI集成到应用中变得轻而易举。图像检测或分类、模式…

关于hive启动的相关问题记录

问题&#xff1a;初始化hive元数据报错 [atguiguhadoop102 software]$ schematool -initSchema -dbType mysql -verboseError: Table CTLGS already exists (state42S01,code1050) Closing: 0: jdbc:mysql://hadoop102:3306/metastore?useSSLfalse org.apache.hadoop.hive.me…

基于GAN的多变量时间序列污染训练集异常检测

论文地址&#xff1a;https://ieeexplore.ieee.org/document/9618824 论文源码&#xff1a;https://github.com/sxxmason/FGANomaly 期刊&#xff1a;IEEE Transactions on Knowledge and Data Engineering 多元时间序列异常检测在结构健康监测、智能运维、量化交易等诸多实际…

【Locust分布式压力测试】

Locust分布式压力测试 https://docs.locust.io/en/stable/running-distributed.html Distributed load generation A single process running Locust can simulate a reasonably high throughput. For a simple test plan and small payloads it can make more than a thousan…

推荐学习什么编程语言?

选择编程语言学习时&#xff0c;除了就业因素外&#xff0c;还可以考虑以下几个方面来决定学习哪些编程语言&#xff1a; 个人兴趣与目标&#xff1a;如果你对某个特定领域感兴趣&#xff0c;比如游戏开发、数据分析、人工智能等&#xff0c;可以选择与该领域紧密相关的编程语言…

MySql数据库从0-1学习-第三天多表设计学习

项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种: 一对多(多对一)多对多一对一 一对多 需求:根据需求,完成部门和员工表的设计 一对多,很多人会使用外键,…

记录我第一场面了40min+的面试

中冶赛迪信息技术(重庆)有限公司 国企 首先3/24投递的&#xff0c;4/10打了电话问是否接受劳务派遣&#xff0c;我当时不知道劳务派遣什么意思&#xff0c;问了和售前售后是不是类似&#xff0c;得到了不大一样的回答&#xff0c;后面加了微信&#xff0c;定了11开始面试。 这…

【Ubuntu】 Github Readme导入GIF

1.工具安装 我们使用 ffmpeg 软件来完成转换工作1.1 安装命令 sudo add-apt-repository ppa:jonathonf/ffmpeg-3sudo apt-get updatesudo apt-get install ffmpeg1.2 转换命令 &#xff08;1&#xff09;直接转换命令&#xff1a; ffmpeg -i out.mp4 out.gif(2) 带参数命令&…