PCF8591(ADDA转换芯片)

工具

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  本欧也很喜欢交朋友的哦! 

 

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

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

相关文章

软件测试下的AI之路(4)

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

数控机床采集网关助力企业实现智能化生产-天拓四方

随着工业4.0时代的到来&#xff0c;智能制造成为制造业转型升级的重要方向。数控机床作为制造业的核心设备&#xff0c;其数据采集与监控对于提升生产效率、优化生产流程具有重要意义。本案例将介绍数控机床采集网关的应用&#xff0c;通过该网关实现数控机床数据的实时采集、传…

IP地址证书怎么申请?

在数字化时代&#xff0c;网络空间的安全与稳定至关重要。其中&#xff0c;IP地址作为互联网通信的基础标识&#xff0c;其安全认证则依赖于一项重要工具——IP地址证书。本文将深入探讨IP地址证书的概念、作用以及其在网络安全防护中的重要意义。 一、IP地址证书的作用 身份验…

Java设计模式—策略模式(商场打折)

策略这个词应该怎么理解&#xff0c;打个比方说&#xff0c;我们出门的时候会选择不同的出行方式&#xff0c;比如骑自行车、坐公交、坐火车、坐飞机、坐火箭等等&#xff0c;这些出行方式&#xff0c;每一种都是一个策略。 再比如我们去逛商场&#xff0c;商场现在正在搞活动&…

设计模式总结-桥接模式

桥接模式 模式动机模式定义模式结构模式分析桥接模式实例与解析实例一&#xff1a;模拟毛笔 模式优缺点 模式动机 设想如果要绘制矩形、圆形、椭圆、正方形&#xff0c;我们至少需要4个形状类&#xff0c;但是如果绘制的图形需要具有不同的颜色&#xff0c;如红色、绿色、蓝色…

MySQL-基本SQL语句编写:运算符练习

运算符练习 1.选择工资不在5000到12000的员工的姓名和工资 SELECT last_name,salary FROM employees #where salary not between 5000 and 12000; WHERE salary < 5000 OR salary > 12000;2.选择在20或50号部门工作的员工姓名和部门号 SELECT last_name,department_id…

蓝桥杯算法题:卡片换位

问题描述 你玩过华容道的游戏吗&#xff1f;这是个类似的&#xff0c;但更简单的游戏。 看下面 2 x 3 的格子 --------- | A | * | * | --------- | B | | * | --------- 1 2 3 4 5 在其中放 5 张牌&#xff0c;其中 A 代表关羽&#xff0c;B 代表张飞&#xff0c;* 代表士兵…

【Erlang】【RabbitMQ】Linux(CentOS7)安装Erlang和RabbitMQ

一、系统环境 查版本对应&#xff0c;CentOS-7&#xff0c;选择Erlang 23.3.4&#xff0c;RabbitMQ 3.9.16 二、操作步骤 安装 Erlang repository curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash安装 Erlang package s…

CMake学习笔记(三)区分macro与function

目录 共同点--形式类似 macro的形式 function的形式 不同点 1 输入参数的替换阶段不同 macro function 2 输入参数作用域不同 macro function 共同点--形式类似 macro的形式 macro(宏名 输入参数名).... endmacro() function的形式 function(函数名 输入参数名).…

如何确认ip地址?一步步教会你

在数字化和网络化的时代&#xff0c;IP地址作为设备的网络标识&#xff0c;扮演着至关重要的角色。无论是个人用户还是企业网络管理员&#xff0c;掌握如何确认IP地址的方法都显得尤为重要。虎观代理将全面介绍如何确认IP地址&#xff0c;并深入探讨其背后的原理和意义。 首先&…

RabbitMQ3.13.0起支持MQTT5.0协议及MQTT5.0特性功能列表

RabbitMQ3.13.0起支持MQTT5.0协议及MQTT5.0特性功能列表 文章目录 RabbitMQ3.13.0起支持MQTT5.0协议及MQTT5.0特性功能列表1. MQTT概览2. MQTT 5.0 特性1. 特性概要2. Docker中安装RabbitMQ及启用MQTT5.0协议 3. MQTT 5.0 功能列表1. 消息过期1. 描述2. 举例3. 实现 2. 订阅标识…

Linux网卡与IP地址:通往网络世界的通行证

在探索Linux网卡和IP地址的关系之前&#xff0c;我们得先理解Linux网卡是怎么工作的。想象一下&#xff0c;每台计算机都是一个世界&#x1f30e;&#xff0c;而网卡就是连接这些世界的门户&#x1f6aa;。网卡的工作就是接收和发送数据包&#xff0c;就像邮差&#x1f4ec;递送…

还在担心报表不好做?不用怕,试试这个方法(三)

系列文章&#xff1a; 《还在担心报表不好做&#xff1f;不用怕&#xff0c;试试这个方法》&#xff08;一&#xff09; 《还在担心报表不好做&#xff1f;不用怕&#xff0c;试试这个方法》&#xff08;二&#xff09; 概要 在上一篇文章《还在担心报表不好做&#xff1f;…

C++数据结构与算法——回溯算法排列问题

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…

SV学习笔记(六)

文章目录 覆盖率类型写在前面代码覆盖率断言覆盖率功能覆盖率漏洞率曲线 功能覆盖策略收集信息而非数据只测量需要的内容验证的完备性 覆盖组写在前面在类里定义covergroup 数据采样写在前面coverpoint和binbin的创建和应用命名coverpoint和bin条件覆盖率翻转覆盖率wildcard覆盖…

k8s svc流量转发

https://blog.csdn.net/qq_44930876/article/details/134813129 https://blog.csdn.net/weixin_43845924/article/details/136232099 默认使用iptables [rootlocalhost ~]# k logs kube-proxy-jcbcq I0405 10:37:28.610683 1 node.go:136] Successfully retrieved no…

NzN的数据结构--实现双向链表

上一章中&#xff0c;我们学习了链表中的单链表&#xff0c;那今天我们来学习另一种比较常见的链表--双向链表&#xff01;&#xff01; 目录 一、双向链表的结构 二、 双向链表的实现 1. 双向链表的初始化和销毁 2. 双向链表的打印 3. 双向链表的头插/尾插 4. 双向链表的…

[蓝桥杯 2019 国 C] 数正方形

[蓝桥杯 2019 国 C] 数正方形 题目描述 在一个 N N N \times N NN 的点阵上&#xff0c;取其中 4 4 4 个点恰好组成一个正方形的 4 4 4 个顶点&#xff0c;一共有多少种不同的取法&#xff1f; 由于结果可能非常大&#xff0c;你只需要输出模 1 0 9 7 10^9 7 1097 的…

八股面试速成—计算机网络部分

暑期实习面试在即&#xff0c;这几天八股和算法轮扁我>_ 八股部分打算先找学习视屏跟着画下思维导图&#xff0c;然后看详细的面试知识点&#xff0c;最后刷题 其中导图包含的是常考的题&#xff0c;按照思维导图形式整理&#xff0c;会在复盘后更新 细节研究侧重补全&a…

基于单片机钢琴电子节拍器系统设计

**单片机设计介绍&#xff0c;基于单片机钢琴电子节拍器系统设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机钢琴电子节拍器系统设计是一个综合性的项目&#xff0c;它结合了单片机编程、音频处理、用户界面设计等多个领域的…