2025蓝桥杯(单片机)备赛--扩展外设之I2C的重要应用--PCF8591(八)

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博客

2025蓝桥杯(单片机)备赛--基本外设控制之LED(二)_2024蓝桥杯单片机资料-CSDN博客

2025蓝桥杯(单片机)备赛--基本框架搭建(一)_蓝桥杯单片机大赛-CSDN博客

相关推荐
Hello_Embed33 分钟前
libmodbus 移植 STM32(基础篇)
笔记·stm32·单片机·学习·modbus
想放学的刺客4 小时前
单片机嵌入式试题(第27期)设计可移植、可配置的外设驱动框架的关键要点
c语言·stm32·单片机·嵌入式硬件·物联网
天昊吖5 小时前
stc8H启用DMA发送后 卡住【踩坑日志】
单片机
李永奉5 小时前
杰理芯片SDK开发-ENC双麦降噪配置/调试教程
人工智能·单片机·嵌入式硬件·物联网·语音识别
BackCatK Chen5 小时前
第 1 篇:软件视角扫盲|TMC2240 软件核心特性 + 学习路径(附工具清单)
c语言·stm32·单片机·学习·电机驱动·保姆级教程·tmc2240
兆龙电子单片机设计5 小时前
【STM32项目开源】STM32单片机多功能电子秤
stm32·单片机·开源·毕业设计·智能家居
测试者家园5 小时前
测试用例智能生成:是效率革命,还是“垃圾进,垃圾出”的新挑战?
人工智能·职场和发展·测试用例·测试策略·质量效能·智能化测试·用例设计
切糕师学AI5 小时前
ARM 架构中的复位(Reset)与复位流程
arm开发·单片机·嵌入式·复位
llilian_165 小时前
信号发生器 多通道多功能脉冲信号发生器应用解决方案 多功能脉冲发生器
功能测试·单片机·嵌入式硬件·测试工具
yuanmenghao6 小时前
Classic AUTOSAR深入浅出系列 - 【第十六篇】MCAL:为什么 MCU 换了,上层几乎不用动
单片机·嵌入式硬件·autosar