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();    //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.hqwc.cn/news/599605.html

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

相关文章

RabbitMQ Docker 安装与应用

1.官方镜像 该镜像包含用户操作界面 2.Docker运行&#xff0c;并设置开机自启动 docker run -d --restartalways --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.10-management 默认登录账户和密码 guest 3、使用 队列和交换机绑定

2024/4/1—力扣—栈的最小值

代码实现&#xff1a; typedef struct node {int val;struct node *next; } Node;typedef struct {struct node *top;int min; } MinStack;/** initialize your data structure here. */MinStack* minStackCreate() {MinStack *obj malloc(sizeof(*obj));obj->top NULL;ob…

手机软件何时统一--桥接模式

1.1 凭什么你的游戏我不能玩 2007年苹果手机尚未出世&#xff0c;机操作系统多种多样&#xff08;黑莓、塞班、Tizen等&#xff09;&#xff0c;互相封闭。而如今&#xff0c;存世的手机操作系统只剩下苹果OS和安卓&#xff0c;鸿蒙正在稳步进场。 1.2 紧耦合的程序演化 手机…

【c语言】strncpy函数模拟实现

strncpy函数模拟实现 strncpy函数在cplusplus网站中的定义 模拟实现源码 //模拟实现 #include <stdio.h> #include <string.h> #include <assert.h>char* my_strncpy(char* destination, const char* source, size_t num) {assert(destination && so…

AI大模型下的策略模式与模板方法模式对比解析

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》《MYSQL应用》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 &#x1f680; 转载自热榜文章&#xff1a;设计模式深度解析&#xff1a;AI大模型下…

TypeScript学习笔记2-联合类型、类型断言

联合类型 联合类型&#xff1a;顾名思义&#xff0c;简单的说就是多种类型联合起来 栗子1&#xff1a;运用在函数中 栗子2&#xff1a;运用在dom上&#xff08;取不到值时可能为null类型&#xff09; 栗子3&#xff1a;定时器是个常用例子 在TypeScript中&#xff0c;联合类型…

一切皆是为了交流-DDD通用语言

通用语言是什么&#xff1f; 通用语言是一种在特定领域内的沟通方式&#xff0c;可以由文字、语言、手势、图像等一切与达到沟通目的的元素组成。 比如&#xff0c;在中国内&#xff0c;方言是闽南的小王与方言是粤语的小张进行交流&#xff0c;那么&#xff0c;普通话是他们…

2024年MathorCup妈妈杯数学建模思路D题思路解析+参考成品

1 赛题思路 (赛题出来以后第一时间在群内分享&#xff0c;点击下方群名片即可加群) 2 比赛日期和时间 报名截止时间&#xff1a;2024年4月11日&#xff08;周四&#xff09;12:00 比赛开始时间&#xff1a;2024年4月12日&#xff08;周五&#xff09;8:00 比赛结束时间&…

室友打团太吵?一条命令让它卡死

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;更多干货&#xff0c;请关注专栏《网络安全自学教程》 SYN Flood 1、hping3实现SYN Flood1.1、主机探测1.2、扫描端…

Web后端搭建

目录 一 搭建服务器端 1.1安装服务器软件 1.2检查环境是否配置 1.3安装Tomcat 二 创建并发Web项目 2.1创建一个java项目 三 创建Servlet 前端程序如何才能访问到后端程序呢&#xff0c;这时候我们就需要web服务器来解决&#xff1a;将后端程序部署到服务器中&#xff0c…

SpringCloud Alibaba Sentinel 简介和安装

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第十三篇&#xff0c;即介绍 SpringCloud Alibaba Sentinel 简介和安装。 二、Sentinel 简介 2.1 Sent…

Docker容器(五)Docker Compose

一、概述 1.1介绍 Docker Compose是Docker官方的开源项目&#xff0c;负责实现对Docker容器集群的快速编排。Compose 是 Docker 公司推出的一个工具软件&#xff0c;可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml&#xff0c;…