PCF8591(ADDA转换芯片)

news2024/10/6 16:30:29

工具

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();    //5us
	SCL=1;
	delay();    //5us
	ACK=SDA;
	delay();    //5us
	SCL=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.coloradmin.cn/o/1574145.html

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

相关文章

序列超图的下一项推荐 笔记

1 Title Next-item Recommendation with Sequential Hypergraphs&#xff08;Jianling Wang、Kaize Ding、Liangjie Hong、Huan Liu、James Caverlee&#xff09;【SIGIR 2020】 2 Conclusion This study explores the dynamic meaning of items in realworld scenarios and p…

回合制游戏战斗模块的制作

回合制游戏战斗模块的制作 回合制游戏相信大家没玩过也见过&#xff0c;了解它的玩法。回合制&#xff0c;那就是你来我回的&#xff0c;你一回合我一回合&#xff0c;直到把对方打败。市面上的回合制游戏比较经典的有梦幻西游&#xff0c;问道&#xff0c;神武&#xff0c;完…

【机器学习入门】集成学习之梯度提升算法

系列文章目录 第1章 专家系统 第2章 决策树 第3章 神经元和感知机 识别手写数字——感知机 第4章 线性回归 第5章 逻辑斯蒂回归和分类 第5章 支持向量机 第6章 人工神经网络(一) 第6章 人工神经网络(二) 卷积和池化 第6章 使用pytorch进行手写数字识别 实操练习 使用Yolo模型进…

二分法题集2

目录 1 山脉数组的峰顶索引 分析&#xff1a; 代码展示&#xff1a; 2 寻找峰值 分析&#xff1a; 代码展示&#xff1a; 3 寻找旋转排序数组中的最小值 分析&#xff1a; 代码展示&#xff1a; 4 点名 分析&#xff1a; 代码展示&#xff1a; 1 山脉数组的峰顶…

【代码随想录】哈希表

文章目录 242.有效的字母异位词349. 两个数组的交集202. 快乐数1. 两数之和454. 四数相加 II383. 赎金信15. 三数之和18. 四数之和 242.有效的字母异位词 class Solution {public boolean isAnagram(String s, String t) {if(snull || tnull || s.length()!t.length()){return …

Linux信号机制:进程间高效传递事件与操控指令的桥梁

在Linux操作系统中&#xff0c;信号是一种进程间通信机制&#xff0c;用于通知进程某些事件的发生或请求进程执行特定的动作。信号分为两类&#xff1a;编号1至31的传统UNIX信号&#xff0c;被称为不可靠信号&#xff0c;以及编号32至63的扩展信号&#xff0c;即可靠信号&#…

CMU15/445 2023 Spring-project1 LRU-K 替换策略

在写个demo之前&#xff0c;专门学习了LRU:【LeetCode刷题】146. LRU 缓存-CSDN博客 使用哈希表 双向链表可以满足删除/增加的时间复杂度为O(1)。 在通读完15/445这块的说明之后&#xff0c;发现和LRU还是有些差别的。 官方文档中对LRU-K的解释是&#xff1a;LRU-K算法根据所…

LABVIEW--正弦+高斯噪声信号及滤波

前面板信号 后面板 LABVIEW源程序链接&#xff1a;https://pan.baidu.com/s/11B-75i4fHZwWQyjxn9yCyQ?pwd7tfj 提取码&#xff1a;7tfj

JavaWeb--JavaScript Part 01

1. JavaScript概述 JavaScript&#xff08;简称JS&#xff09;是一种轻量级的、解释执行的客户端脚本语言&#xff0c;主要用于增强网页的交互性和动态性。它起源于Netscape的LiveScript&#xff0c;并在1995年发布时更名为JavaScript。尽管名称中包含"Java"&#xf…

2024.4.3-day08-CSS 盒子模型(溢出显示、伪元素)

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 作业 2024.4.3-学习笔记css溢出显示单行文本溢出显示省略号多行文本溢出显示省…

时序预测 | Python实现BiGRU-RELM时间序列预测

时序预测 | Python实现BiGRU-RELM时间序列预测 目录 时序预测 | Python实现BiGRU-RELM时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 BiGRU-RELM时间序列预测分析 将BiGRU和RELM两种模型进行了融合&#xff0c;BiGRU进行预测&#xff0c;RELM对BiGRU模型的预…

LED点阵屏与LCD1602

目录 LED点阵屏 点阵屏的介绍 LED点阵屏分类 点阵屏的显示原理 点阵案例 静态案例 电路图 keil文件 动态案例 电路图 keil文件 LCD1602 LCD1602概述 LCD1602内部结构 存储器结构 LCD引脚及应用电路 时序结构 LCD1602指令集 LCD1602编程 初始化 显示字符 …

使用libibverbs构建RDMA应用

本文是对论文Dissecting a Small InfiniBand Application Using the Verbs API所做的中英文对照翻译 Dissecting a Small InfiniBand Application Using the Verbs API Gregory Kerr∗ College of Computer and Information ScienceNortheastern UniversityBoston, MAkerrgccs…

三防笔记本丨工业笔记本电脑丨助力测绘行业的数字化转型

测绘行业测绘行业一直是高度技术化的领域&#xff0c;其重要性在于为建设、规划和资源管理提供准确的地理数据。然而&#xff0c;随着技术的发展&#xff0c;传统的测绘方法已经难以满足对数据精度和实时性的要求。因此&#xff0c;测绘行业正逐渐向数字化转型&#xff0c;采用…

唯美首页纯静态html5引导页源码,格子化win8风格官方引导页面源码

唯美首页纯静态html5引导页源码&#xff0c;格子化win8风格官方引导页面源码&#xff0c;喜欢的朋友可以拿去使用 源码下载 唯美首页纯静态html5引导页源码

Rust 基础语法和数据类型

数据类型 Rust提供了一系列的基本数据类型&#xff0c;包括整型&#xff08;如i32、u32&#xff09;、浮点型&#xff08;如f32、f64&#xff09;、布尔类型&#xff08;bool&#xff09;和字符类型&#xff08;char&#xff09;。此外&#xff0c;Rust还提供了原生数组、元组…

记忆的方法 简单易行的记忆技巧:归纳整理,联想,重点标注压缩,改错,留痕记念(去个地方买个特别能长久保留的纪念品),差异

记忆的方法有很多&#xff0c;以下是一些简单易行的记忆技巧&#xff1a; 分类整理&#xff1a;将需要记忆的信息进行分类&#xff0c;这样可以帮助你更好地组织和记忆信息。例如&#xff0c;尝试记住一组词语时&#xff0c;可以将它们按照类别或相关性分组。归纳整理。间隔重…

mysql的安装和部署

##官网下载mysql 我下载的是一个mysql-5.7.38-linux-glibc2.12-x86_64.tar.gz 可以通过xshell 或者xftp传送 xshell则是先下载一个lrzsz 执行以下的命令 yum install lrzsz -y #安装好我下面有个一键安装的脚本 #!/bin/bash#解决软件的依赖关系 yum install cmake ncurses…

LangChain学习笔记—RAG(检索增强生成)

LangChain LangChain是一个软件开发框架&#xff0c;可以更轻松地使用大型语言模型&#xff08;LLM&#xff09;创建应用程序。它是一个具有 Python 和 JavaScript 代码库的开源工具。LangChain 允许开发人员将 GPT-4 等 LLM 与外部数据相结合&#xff0c;为聊天机器人、代码理…

代理IP在爬虫中的连接复用与开销减少

目录 一、引言 二、代理IP的基本概念 三、代理IP在爬虫中的使用 四、代理IP的连接复用 五、减少开销的策略 六、代码示例与注释 七、总结 一、引言 在爬虫开发中&#xff0c;代理IP的使用是常见的做法&#xff0c;尤其在目标网站设置了反爬虫机制时。代理IP能够帮助爬虫…