1.PCF8591数据手册使用
a.PCF8591 features:
工作电压:2.5V-6V
通信协议:I2C
模拟通道:4个模拟输入,单端或差分
模拟电压范围:VSS-VDD
精度:8位逐次逼近型A/D
DAC: 1个DAC输出(8位)
地址线:A0,A1,A2
转换速度:I2C总线最大速度
b.原理图接线说明:
结构 框图
引脚说明:
板子实际接线图:
注意:A0-A2三根地址线都接地了;
注意:A0-A2三根地址线都接地了;
四个输入分别是:
AIN0 ---- (引出引脚)
AIN1 ---- RD1(光敏电阻 )
AIN2 ---- LM324 (输出)
AIN3 ---- (Rb2) (滑动变阻器)
SCL ---P20 SDA ---P21
(1)ADC输入:
设备地址:0X90(W) 0X91(R)
controlbyte:
bit7: 固定为0
bit6:模拟输出使能位 ,1开启。通常开启
bit5-4: 0 0 单端输入
01 ch0 (AIN0-AIN3) ch1(AIN1-AIN3) ch2(AIN2-AIN3)
10 AIN0-ch0 AIN1-ch1 ch3(AIN2-AIN3)
11 ch0(AIN0-AIN1) ch1(AIN2-AIN3)
bit3:固定为 0
bit2:自动增量模式 1开启 0关闭
bit1-0: 00 ch0
01 ch1
10 ch2
11 ch3
由此我们控制字节为:
0X40 --ch0
0X41 --ch1
0X42 --ch2
0X43 --ch3
读取ADValue代码:'
cpp
u8 get_adcvalue(u8 ctrl_byte)
{
u8 ad_value=0;
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitACK();
IIC_SendByte(ctrl_byte);
IIC_WaitACK();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitACK();
ad_value=IIC_RecByte();
IIC_SendACK(1);
IIC_Stop();
return ad_value;
}
读取 通道1数据代码:
cpp
void ADC_Process(void)
{
if(adc_cnt>=100)
{
adc_cnt=0;//不要忘了置0
ch1=get_adcvalue(0x41);
}
}
连续 读取多个通道AD的值:
cpp
void ADC_Process(void)
{
if(adc_cnt>=100)
{
adc_cnt=0;
get_adcvalue(0x41);
ch1=get_adcvalue(0x41);
get_adcvalue(0x42);
ch2=get_adcvalue(0x42);
get_adcvalue(0x43);
ch3=get_adcvalue(0x43);
}
//读取的值范围为(0-255),
// 电压转换:ch3*100/51,(0-255 ->0-500)
// 显示的时候加上小数点(|0X80)即可,精度很高
}
意:连续读取多个通道的值,会导致两个通道读取的值相反的问题,可以读两次值,取第二次读取的值。
修改读取通道值的时候,不光要修改变量,还要修改 ctrl_byte~!
(2) DAC输出:
说明:发送到PCF8591的第三个字节储存到DAC寄存器里面,
那么前两个字节分别是,设备地址和控制指令。
设备地址为:0X90 (这里是写数据)
控制指令:0X40(与读取通道0的数据指令一样,但区别在于,发完这个指令还有第三个指令,而并没有进行读取,第三个指令储存在DAC寄存器里面)
DAC输出代码:
cpp
void Write_DAC(u8 dat)
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x40);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitACK();
IIC_Stop();
}
注意:DAC数据的范围位:0-255
相关博客:
2025蓝桥杯(单片机)备赛--基本外设控制之三行按键法(五)_蓝桥杯单片机按键扫描-CSDN博客
2025蓝桥杯(单片机)备赛--扩展外设控制之DS18B20(六)-CSDN博客
2025蓝桥杯(单片机)备赛--基本外设控制之共阳数码管(四)-CSDN博客
2025蓝桥杯(单片机)备赛--基本外设控制之继电器和蜂鸣器(三)-CSDN博客