PCF8591芯片的AD/DA转换(适用于蓝桥杯单片机)

这篇具有很好参考价值的文章主要介绍了PCF8591芯片的AD/DA转换(适用于蓝桥杯单片机)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1、PCF8591的引脚介绍

 2、用IIC发送或接收字节

             发送的第一个字节

        发送的第二个字节

  发送第三个字节  

  3.发送和接收的字节转换

 4.全部代码

IIC部分

接收电压数据

发送电压数据


1、PCF8591的引脚介绍

        PCF8591芯片的AD/DA转换(适用于蓝桥杯单片机)

            在和单片机实际应用中它的接线图如下

PCF8591芯片的AD/DA转换(适用于蓝桥杯单片机)PCF8591芯片的AD/DA转换(适用于蓝桥杯单片机)

PCF8591芯片的AD/DA转换(适用于蓝桥杯单片机)PCF8591芯片的AD/DA转换(适用于蓝桥杯单片机)

        PCF8591有四个模拟信号输入端(模转数),一个输出端(数转模),因为我们一般使用芯片的内部时钟,所以EXT和OSC接地,而VSS和VCC手册里写是用来上电复位的,只需要照着原理图接就行。

 2、用IIC发送或接收字节

        发送的第一个字节

         只要用到IIC通信首先要发送的就是芯片的地址

        PCF8591芯片的AD/DA转换(适用于蓝桥杯单片机)

       高四位为PCF8591的专用地址,只要用这个芯片高四位就必须是1001,低四位中A0、A1、A2表示要选择那个PCF8591,比如前面的原理图A0、A1、A2全部接地所以它的地址是000,最后低位R/W表示下一步写入还是读出数据,0是写1是读 ,下一步还要写数据所以这一位置0,总结起来这一个字节就是0x90

     IIC_Start();//开始
     IIC_SendByte(0x90);
     IIC_WaitAck();//应答如果接收到的话这个函数会返回1

       

     发送的第二个字节

        这个字节用来控制芯片的功能

                 PCF8591芯片的AD/DA转换(适用于蓝桥杯单片机)

      第一位和第二位 :AD转换的输入通道选择位  00 >>AIN0,  01>>AIN1,  10>>AIN2,  11>>AIN3

      第三位 :自动递增标志位,激活时给1,在每次A/D转换后,读取的通道会自动跳到下一位。

      第四位:无效位

      第五、六位:选择差分输入还是单端输入(如果对精度没有太大要求时选择单端输入置00)

     第七位: 使能模拟输出,使能时置1 ,表示切换为DA(数字转模拟模式)

     第八位:无效位

    1.AD模式 :比赛时建议一个一个通道使用,所以不启动递增位,发送字节为0x01(0000 001)接收通道1的电压值,这个时候所以要发送的控制字节已经发送完了,接下来是接收部分。

  IIC_SendByte(0x01);
  IIC_WaitAck();//应答标志位

    2.DA模式:因为PCF8591只有一个DA输出口,只要给第七位置1,发送字节0x40 (0000 0100)

       

    IIC_SendByte(0x04);
     IIC_WaitAck();

    发送第三个字节  

       1. AD模式: 首先和发送字节时一样要发送对应地址,接收地址为0x90,而接收地址为0x91,然后接收代码

        IIC_Start();
        IIC_SendByte(0x91);
        IIC_WaitAck();
        Date=IIC_RecByte();//要接收的值
        IIC_SendAck(1);//如果接收到的话发送
        IIC_Stop();//结束

        2.DA模式: 发送最后一个控制输出值的代码。 

        IIC_WaitAck();				
		IIC_SendByte(DATA); //要发送的值
		IIC_WaitAck();				
	    IIC_Stop();	

  3.发送和接收的字节转换

       因为PCF8591检测的电压是以8位二进制发送给单片机的,所以单片机得到的值是0~255,把它转换为0~5V的电压公式如下

                        检测到的电压  =   单片机上电电压(5V)  (测量到的值255)

     发送时把电压数据转换为二进制对应值,与上面就是将0~5V转换为0~255,把公式换一下即可。

                       发送要输出电压  =   255  (测量到的电压 单片机上电电压(5V))

 4.全部代码

IIC部分(官方的IIC代码SDA和 SCL可能是反的)


#include <REGX52.H>
#include "intrins.h"
#define DELAY_TIME 5
sbit SDA = P2^1;
sbit SCL = P2^0;
   //IIC延时
void IIC_Delay(unsigned char i)
{
   
  

  while(i--);        

   
}

//开始发送
void IIC_Start(void)
{
    SDA = 1;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 0;
    IIC_Delay(DELAY_TIME);
    SCL = 0;	
}

//IIC结束发送
void IIC_Stop(void)
{
    SDA = 0;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 1;
    IIC_Delay(DELAY_TIME);
}

//接收应答
void IIC_SendAck(bit ackbit)
{
    SCL = 0;
    SDA = ackbit;  					
    IIC_Delay(DELAY_TIME);
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SCL = 0; 
    SDA = 1;
    IIC_Delay(DELAY_TIME);
}

//发送应答
bit IIC_WaitAck(void)
{
    bit ackbit;
	  SDA=1;
    SCL  = 1;
    IIC_Delay(DELAY_TIME);
    ackbit = SDA;
    SCL = 0;
    IIC_Delay(DELAY_TIME);
    return ackbit;
}

//发送一个字节
void IIC_SendByte(unsigned char byt)
{
    unsigned char i;

    for(i=0; i<8; i++)
    {
        SCL  = 0;
        IIC_Delay(DELAY_TIME);
        if(byt & 0x80) SDA  = 1;
        else SDA  = 0;
        IIC_Delay(DELAY_TIME);
        SCL = 1;
        byt <<= 1;
        IIC_Delay(DELAY_TIME);
    }
    SCL  = 0;  
}

//接收一个字节
unsigned char IIC_RecByte(void)
{
    unsigned char i, da;
    for(i=0; i<8; i++)
    {   
    	SCL = 1;
	IIC_Delay(DELAY_TIME);
	da <<= 1;
	if(SDA) da |= 1;
	SCL = 0;
	IIC_Delay(DELAY_TIME);
    }
    return da;    
}

接收电压数据

 float PCF8951_Read(unsigned char date)
    {
         float Date;
        IIC_Start();//开始
        IIC_SendByte(0x90);//发送地址PCF8591的地址,表示要对其发送数据
        IIC_WaitAck();    //芯片接收到要返回一个应答位
        IIC_SendByte(date);//发送要执行的命令
        IIC_WaitAck();
        
        IIC_Start();
        IIC_SendByte(0x91);//发送地址PCF8591的地址,表示要接收它的数据
        IIC_WaitAck();
        Date=IIC_RecByte();//接收一个字节
        IIC_SendAck(1);//接收完成之后要发送一个1
        IIC_Stop();
        
        return (Date/255)*5;//电平转换
       
    }

发送电压数据

void PCF8951_Out(float DATE)
    {
        
        IIC_Start();
        IIC_SendByte(0x90);
        IIC_WaitAck();

        IIC_SendByte(0x04);
        IIC_WaitAck();
        IIC_WaitAck(255*(DATE/5));//发送要输出的电压
        IIC_WaitAck();
        IIC_Stop();
       
    }

        为什么接收数据的代码那么长,而发送数据的代码那么少呢?因为在接收电压数据的时候 IIC_SendByte(0x90) 是向芯片写数据,所以加IIC_SendByte(0x91) 让芯片给我发数据。然而我们给芯片发送数据时一直都是单方向的,所以代码看起来很少。文章来源地址https://www.toymoban.com/news/detail-445952.html

到了这里,关于PCF8591芯片的AD/DA转换(适用于蓝桥杯单片机)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 蓝桥杯单片机—— PCF8591的基本原理及A/D转换应用(14)

    一、原理分析 1、基本概念 PCF8591是一个单片集成、单独供电、低功耗、 8-bit CMOS数据获取器件 。PCF8591具有 4个模拟输入、1个模拟输出和1个串行I²C总线接口 。PCF8591的3个地址引脚 A0, A1和A2可用于硬件地址编程 ,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。在

    2023年04月14日
    浏览(60)
  • 【蓝桥杯-单片机学习笔记(十六)】PCF8591原理与A/D、D/A转换

    一、PCF8591   PCF8591是单片、单电源低功耗8位CMOS数据采集器件,具有4个模拟输入、一个输出和一个串行I2C总线接口。3个地址引脚A0、A1和A2用于编程硬件地址,允许将最多8个器件连接至I2C总线上而不需要额外硬件。器件的地址、控制和数据通过两线双向I2C总线传输。 PCF8591功能

    2023年04月11日
    浏览(55)
  • 蓝桥杯单片机比赛学习:9、PCF8591的基本原理和使用方法

    前面一节我们说了PWM呼吸灯的基本原理和使用方法,下面我们来看第二个模块,也是蓝桥杯单片机比赛中常考的一个模块——PCF8591。 我主页有其他模块的使用方法和基本原理(2条消息) Do My Best的博客_CSDN博客-蓝桥杯单片机比赛学习领域博主 PCF8591实际上就是一个具有 I2C 总线

    2024年02月02日
    浏览(45)
  • 【单片机】15-AD和DA转换

    1.什么是AD转换? A(A,analog,模拟的,D,digital,数字的) 现实世界是模拟的,连续分布的,无法被分成有限份; 计算机世界是数字的,离散分布的,可以被分成有限份的 AD转换就是把一个物理量从模拟的转换成数字的。 2.AD转换的意义 想要计算机来实现现实世界 3.什么情

    2024年02月07日
    浏览(56)
  • 单片机学习笔记---AD模数转换&DA数模转换

    目录 AD模数转换 XPT2046.c XPT2046.h main.c DA数模转换 main.c 上一篇博客讲了AD/DA转换的工作原理,也介绍了运算放大器的工作原理,这节开始代码演示! 新创建一个工程:AD模数转换 第一个工程将用到LCD1602和Delay函数,所以首先将我们之前讲过的代码模块添加进来 然后创建主程序

    2024年02月19日
    浏览(51)
  • 【51单片机】AD模数转换&DA数模转换(江科大)

    · AD(Analog to Digital):模拟-数字转换,将模拟信号转换为计算机可操作的数字信号 · DA(Digital to Analog):数字-模拟转换,将计算机输出的数字信号转换为模拟信号 · AD/DA转换打开了计算机与模拟信号的大门,极大的提高了计算机系统的应用范围,也为模拟信号数字化处理提供了可能 ·

    2024年02月19日
    浏览(52)
  • MCU-51:单片机之AD模数转换与DA数模转换

    AD(Analog to Digital):模拟-数字转换,将模拟信号转换为计算机可操作的数字信号 DA(Digital to Analog):数字-模拟转换,将计算机输出的数字信号转换为模拟信号 AD/DA转换打开了计算机与模拟信号的大门,极大的提高了计算机系统的应用范围,也为模拟信号数字化处理提供了

    2023年04月24日
    浏览(51)
  • 单片机第一季:零基础13——AD和DA转换

    51 单片机系统内部运算时用的全部是数字量,即0 和1,因此对单片机系统而言,无法直接操作模拟量,必须将模拟量转换成数字量。所谓数字量,就是用一系列0 和1 组成的二进制代码表示某个信号大小的量。用数字量表示同一个模拟量时,数字位数可以多也可以少,位数越多

    2024年02月13日
    浏览(48)
  • 基于51单片机的数字电压表(PCF8591)(Proteus仿真+程序)

            本设计由51单片机最小系统+PCF8591模块+四路模拟量输入模块+一路DA输出+液晶1602显示模块 1、主控制器是89C82单片机。 2、PCF8591模数转换器进行A/D转换,读取四路电压数据,电压检测范围0-5V 精度(8位);实现一路数模转换(D/A)输出电压范围0-5V(8位)。 3、利用四个

    2024年02月05日
    浏览(49)
  • 单片机——C51实验含Proteus仿真(AD转换器(数字电压表),DA转换器(波形发生器))

    分为两部分:AD转换器实现数字电压表,DA转换器实现波形发生器(在仿真部分详细说明) 所用到的原理图:  AD转换器实现数字电压表部分         需要打开main函数中LCD_init(),ADC(),display()三个注释其中电压的输出显示用到了LCD1602关于这部分详情见(96条消息) 单片机——

    2024年02月08日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包