蓝桥杯之单片机学习(二十八)——详解A/D、D/A、PCF8591、AD与DA的综合使用(附官方驱动的一个坑)

简介: 蓝桥杯之单片机学习(二十八)——详解A/D、D/A、PCF8591、AD与DA的综合使用(附官方驱动的一个坑)

一、放图



0a2653c851af460fa595bd959398a8f1.png2d65d23f6d4748949b924e4057485923.png2e9b90b2ca334476abebe75bafe6eeaa.png4cebaac233b3433da32a72337a77fc60.png


一、A/D模块


1--发送写设备地址,选择IIC总线上的PCF8591器件。//0X90
  2--发送控制字节,选择模拟量输入模式和通道。0X01/0X03
  3--发送读设备地址,选择IIC总线上的PCF8591器件。
  4--读取PCF8591中目标通道的数据。


PCF8591的设备的读操作地址为:0x91;而写操作地址则为:0x90。


光敏传感器接到AIN1,通道1;控制寄存器应写入:0x01。

电位器Rb2接到AIN3,通道3;控制寄存器应写入:0x03。

0X01和0X03的0表示是A/D模式,1和3分别表示将要读取的通道通道

读通道1–光敏电阻


void read_AIN1()
{
    IIC_Start();    //IIC总线起始信号
    IIC_SendByte(0x90);     //PCF8591的写设备地址
    IIC_WaitAck();  //等待从机应答
    IIC_SendByte(0x01);     //写入PCF8591的控制字
    IIC_WaitAck();  //等待从机应答
    IIC_Stop();     //IIC总线停止信号
    IIC_Start();    //IIC总线起始信号
    IIC_SendByte(0x91);     //PCF8591的读设备地址
    IIC_WaitAck();  //等待从机应答
    dat1 = IIC_RecByte();     //读取PCF8591通道1的数据
    IIC_Stop();     //IIC总线停止信号
}


读通道3–光敏电阻


void read_AIN1()
{
    IIC_Start();    //IIC总线起始信号
    IIC_SendByte(0x90);     //PCF8591的写设备地址
    IIC_WaitAck();  //等待从机应答
    IIC_SendByte(0x03);     //写入PCF8591的控制字
    IIC_WaitAck();  //等待从机应答
    IIC_Stop();     //IIC总线停止信号
    IIC_Start();    //IIC总线起始信号
    IIC_SendByte(0x91);     //PCF8591的读设备地址
    IIC_WaitAck();  //等待从机应答
    dat1 = IIC_RecByte();     //读取PCF8591通道1的数据
    IIC_Stop();     //IIC总线停止信号
}


二、D/A模块


数字量和模拟两者之间有一个对应关系,即模拟量05V对应数字量0255。所以要想采用D/A功能实现固定电压的输出,只需要先计算好要输出电压对应的数字量大小。


如下是D/A转换程序,dat就是要输出电压对应的数字量。在蓝桥杯比赛开发平台上,可以使用万用表测量D/A输出端的电压大小。

通道0不齐作用,可以这么理解


void read_DAC(uint dat)
{
    IIC_Start();
    IIC_SendByte(0x90); //写设备地址
    IIC_WaitAck();
    IIC_SendByte(0x40); //写控制字
    IIC_WaitAck();
    IIC_SendByte(dat);  //dat为要转换的数字量
    IIC_WaitAck();
    IIC_Stop();
}


三、二者逻辑区别


A/D的逻辑:

告诉单片机我要开始写了(0X90)–> 告诉单片机我是A/D模式并且我要读取通道1-光敏电阻(0X01)、读取通道3-Rb2电压(0X03)

2步

告诉单片机我要开始读了(0X91) --> dat接受数据


D/A的逻辑

告诉单片机我要开始写了(0X90)–> 告诉单片机我是D/A模式,我要准备控制电压输出了(0X) --> 告诉单片机要写的数据(dat)

3步


综合ADC

注意:AD和DA要想同时使用,在AD初始化时必须要将DA使能,如果不这样做就会出现DA输出不正常的现象。


//--------------------------------电压测量---------------------------------//
uchar ADC_read_AIN3()
{
    IIC_Start();
    IIC_SendByte(0x90); //写设备地址
    IIC_WaitAck();
    IIC_SendByte(0x43); //写控制字,4为打开DAC
    IIC_WaitAck();
    IIC_Stop();
    IIC_Start();
    IIC_SendByte(0x91); //读设备地址
    IIC_WaitAck();
    voltage_t = IIC_RecByte();  //获取电压
    IIC_Stop();
    return voltage_t;
}
void voltage_3()
{
    voltage_t_3 = ADC_read_AIN3();
    voltage_t_3 = voltage_t_3 * 0.0196078;
    voltage = voltage_t_3 * 100;
}
//--------------------------------DAC输出------------------------------//
void DAC_AIN3(uint dat)
{
    IIC_Start();
    IIC_SendByte(0x90); //写设备地址
    IIC_WaitAck();
    IIC_SendByte(0x40); //写控制字
    IIC_WaitAck();
    IIC_SendByte(dat);
    IIC_WaitAck();
    IIC_Stop();
}
void main()
{
    system_init();
    while(1)
    {
        //AD
        ADC_read_AIN3();   //0X43
        voltage_3();
        voltage_show();
        //DA
        DAC_AIN3(ADC_read_AIN3());
    }
}


参考文章:

PCF8591的基本原理与A/D转换应用

ADC/DAC同时使用

PCF8591原理与A/D、D/A转换



在官方驱动时


#ifndef _IIC_H_
#define _IIC_H_


可能出现这样

错误原因在于,.h文件前和后都有两个_

注意查看个数,是否一致


相关文章
|
4月前
蓝桥杯之单片机学习(终)——关于之前文章的错误及更正(附:第十四届蓝桥杯单片机赛题)
蓝桥杯之单片机学习(终)——关于之前文章的错误及更正(附:第十四届蓝桥杯单片机赛题)
|
5月前
|
物联网 Linux 芯片
学习嵌入式是选择单片机还是Linux?
单片机通常指的是一种集成了处理器、存储器和各种外设接口的微控制器芯片,常见的有STC、51系列、AVR、ARM Cortex-M等。单片机具有低成本、低功耗、实时性强等特点,适用于对资源要求较低、功耗要求较低、实时性要求较高的嵌入式系统。学习单片机开发可以让您深入了解嵌入式系统的底层原理和硬件编程,对于对嵌入式系统底层开发感兴趣的人来说,是一个很好的选择。
126 4
|
6月前
|
存储 搜索推荐 IDE
新手如何快速上手学习单片机?
新手如何快速上手学习单片机?
117 0
|
6月前
|
存储 编译器 C语言
单片机学习之路一些常见的疑问也是我的个人学习总结
单片机学习之路一些常见的疑问也是我的个人学习总结
126 0
|
6月前
|
C语言
###51单片机学习-----如何通过C语言运用延时函数设计LED流水灯
###51单片机学习-----如何通过C语言运用延时函数设计LED流水灯
226 0
|
6月前
|
人工智能 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-992 士兵杀敌(二)
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-992 士兵杀敌(二)
69 1
|
6月前
|
人工智能 算法 Java
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1005 数字游戏
104 0
|
6月前
|
Java C语言 C++
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1000 kAc给糖果你吃
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1000 kAc给糖果你吃
79 0
|
6月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-999 数的潜能
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-999 数的潜能
82 0
|
6月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-997 粘木棍
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-997 粘木棍
86 0