一、放图
一、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文件前和后都有两个_
注意查看个数,是否一致