蓝桥杯嵌入式(G431)备赛笔记——MCP4017

本文介绍了如何在嵌入式项目中移植I2C通信,并提供了MCP4017数字电位器的驱动函数示例。通过ADC采集R38和MCP4017的电压值,展示了主函数中的关键部分,包括初始化、系统配置和LCD/LED控制。
摘要由CSDN通过智能技术生成

目录

首先需要移植官方提供的I2C,参考这篇文章:

MCP驱动函数:

MCU4017的检测代码:

主函数:


首先需要移植官方提供的I2C,参考这篇文章:

蓝桥杯嵌入式(G431)备赛笔记——I2C

MCP驱动函数:


// MCP_write 函数用于向 MCP4017 数字电位器写入数据

void MCP_write(u8 dat)
{
    I2CStart(); // 发送起始信号
    I2CSendByte(0x5E); // 发送设备地址(写模式)
    I2CWaitAck(); // 等待应答信号

    I2CSendByte(dat); // 发送要写入的数据
    I2CWaitAck(); // 等待应答信号
    I2CStop(); // 发送停止信号
}

// MCP_read 函数用于从 MCP4017 数字电位器读取数据

u8 MCP_read()
{
    u8 dat;
    
    I2CStart(); // 发送起始信号
    I2CSendByte(0x5F); // 发送设备地址(读模式)
    I2CWaitAck(); // 等待应答信号
    dat = I2CReceiveByte(); // 读取从设备返回的数据
    I2CSendNotAck(); // 发送非应答信号
    I2CStop(); // 发送停止信号
    
    return(dat); // 返回读取的数据
}

打开ADC1的对应通道 chanl11对应滑变的ADC,chanle5对应MCP4017的adc通道

将转换通道数Number Of Conversion 从1变为2,产生2个ADC通道,并配置不同通道的检测周期(设为最大),和检测顺序,rank1先与rank2

MCU4017的检测代码:

// ADC_proc 函数用于执行ADC(模数转换器)的数据采集操作

void ADC_proc()
{
    //rank1: 开始ADC转换,采集R38的电压值
    HAL_ADC_Start(&hadc1); // 启动ADC1通道的转换
    volt_r38 = HAL_ADC_GetValue(&hadc1) / 4096.0f * 3.3f; // 获取ADC1转换结果并将其转换为电压值

    //rank2: 开始ADC转换,采集MCP的电压值
    HAL_ADC_Start(&hadc1); // 再次启动ADC1通道的转换,这里可能是因为需要对两个通道进行连续的数据采集
    volt_mcp = HAL_ADC_GetValue(&hadc1) / 4096.0f * 3.3f; // 获取ADC1转换结果并将其转换为电压值
}

主函数:

int main(void)
{
    /* USER CODE BEGIN 1 */
    
    /* USER CODE END 1 */
    
    /* MCU Configuration--------------------------------------------------------*/
    
    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    HAL_Init(); // 初始化HAL库
    
    /* USER CODE BEGIN Init */
    
    /* USER CODE END Init */
    
    /* Configure the system clock */
    SystemClock_Config(); // 配置系统时钟
    
    /* USER CODE BEGIN SysInit */
    
    /* USER CODE END SysInit */
    
    /* Initialize all configured peripherals */
    MX_GPIO_Init(); // 初始化GPIO外设
    MX_ADC1_Init(); // 初始化ADC1外设
//  MX_ADC2_Init(); // 初始化ADC2外设,该行被注释掉了
    
    /* USER CODE BEGIN 2 */
    
    LCD_Init(); // LCD初始化
    
    I2CInit(); // I2C总线初始化
    
    start_value = EEP_read(0x30); // 从EEPROM读取数据
    EEP_write(0x30, ++start_value); // 向EEPROM写入数据
    
    //MCP4917
    MCP_write(0x00); // 向MCP4917写入数据
    mcp_value = MCP_read(); // 从MCP4917读取数据
    
    /* USER CODE END 2 */
    
    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    
    LED_Control(0x00); // 控制LED,初始化状态为关闭
    
    LCD_Clear(Blue); // 清屏,设置背景颜色为蓝色
    LCD_SetBackColor(Blue); // 设置文本背景颜色为蓝色
    LCD_SetTextColor(White); // 设置文本颜色为白色
    
    LCD_proc(); // LCD处理函数
    
    while (1)
    {
        /* USER CODE END WHILE */
        
        /* USER CODE BEGIN 3 */
//    LED_proc(); // LED处理函数,该行被注释掉了
//    if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == 0)
//    {
//      LED_Control(0x01);
//    }
//    if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) == 0)
//    {
//      LED_Control(0x02);
//    }
//    KEY_proc(); // 按键处理函数,该行被注释掉了
//    HAL_ADC_Start(&hadc2); // 启动ADC2转换,该行被注释掉了
//    adc2_value = HAL_ADC_GetValue(&hadc2); // 从ADC2读取转换值,该行被注释掉了
//    volt_r37 = adc2_value /4096.0f*3.3; // 计算R37电压值,该行被注释掉了
        ADC_proc(); // ADC处理函数,获取ADC转换值并计算电压
        LCD_proc(); // LCD处理函数,更新LCD显示
    }
    
    /* USER CODE END 3 */
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玄奕子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值