【蓝桥杯嵌入式——学习笔记一】2016年第七届省赛真题重难点解析记录,闭坑指南(文末附完整代码)

发布于:2025-04-05 ⋅ 阅读:(22) ⋅ 点赞:(0)

在读题过程中发现本次使用的是串口2,需要配置串口2。

 但在查看产品手册时发现PA14同时也是SWCLK。

所以在使用串口2时需要拔下跳线帽去连接CH340。

可能是用到串口2的缘故,在烧录时发现报了一个错误。这时我们要想烧录得按着复位键去点击烧录,点完后就松开复位键就可以烧录成功。

使用串口时记得打开串口中断,否则无法接收到字符。

LED部分运行代码:

 

void ledProc(void)
{
    if((uwTick - uwTick_led_set_point) < 200) return;
        uwTick_led_set_point = uwTick;
    
    
    if((uwTick - uwTick_led_time_point) >= 1000)
    {
        uwTick_led_time_point = uwTick;
        uc_led ^= 0x01;
    }
    
    if(change_state == 1)
    {
        if(resersal_count--)
        {
            uc_led ^= 0x02;
        }
        if(resersal_count == 0)
        {
            change_state = 0;
            resersal_count = 10;
            uc_led = 0;
        }
    }
    
    if(change_rx_state == 1)
    {
        if(resersal_rx_count--)
        {
            uc_led ^= 0x04;
        }
        if(resersal_rx_count == 0)
        {
            change_rx_state = 0;
            resersal_rx_count = 10;
            uc_led = 0;
        }
    }
    
    ledDisp(uc_led);
}

 LED2与LED3的状态变量,在等级发生改变和串口接收到字符时发生改变。

EEPROM部分代码:

    iic24c02Read(hold_eeprom_string, 0, 3);
    lecel_grade_hold_one = hold_eeprom_string[0];
    lecel_grade_hold_two = hold_eeprom_string[1];
    lecel_grade_hold_three = hold_eeprom_string[2];
            if(key_down == 1)
            {
                i2c24c02Write(&lecel_grade_hold_one, 0, 1);
                HAL_Delay(1);
                i2c24c02Write(&lecel_grade_hold_two, 1, 1);
                HAL_Delay(1);
                i2c24c02Write(&lecel_grade_hold_three, 2, 1);
                HAL_Delay(1);
                LCD_Clear(Black);
                interface = 0;
            }

LCD的高亮显示部分代码:

case 1:
            sprintf((char *)lcd_disp_string, "   ParameterSetup   ");
            LCD_DisplayStringLine(Line1, lcd_disp_string);
            
            sprintf((char *)lcd_disp_string, "   Threshold1:%dcm   ", lecel_grade_hold_one);
            if(select_bright_hold == 1)
                LCD_SetTextColor(Green);
            LCD_DisplayStringLine(Line3, lcd_disp_string);
            LCD_SetTextColor(White);
            
            sprintf((char *)lcd_disp_string, "   Threshold2:%dcm   ", lecel_grade_hold_two);
            if(select_bright_hold == 2)
                LCD_SetTextColor(Green);
            LCD_DisplayStringLine(Line4, lcd_disp_string);
            LCD_SetTextColor(White);
            
            sprintf((char *)lcd_disp_string, "   Threshold3:%dcm   ", lecel_grade_hold_three);
            if(select_bright_hold == 3)
                LCD_SetTextColor(Green);
            LCD_DisplayStringLine(Line5, lcd_disp_string);
            LCD_SetTextColor(White);
        break;

背景高亮与文字相同。

串口发送数据到PC部分代码:

 在下一次等级变化发生前,将现在的等级存入变量中,以便下次比较。

    lecel_grade_old = lecel_grade;
    
    if(h_int <= lecel_grade_hold_one)
        lecel_grade = 0;
    else if((h_int > lecel_grade_hold_one) && (h_int <= lecel_grade_hold_two))
        lecel_grade = 1;
    else if((h_int > lecel_grade_hold_two) && (h_int <= lecel_grade_hold_three))
        lecel_grade = 2;
    else
        lecel_grade = 3;
    if(lecel_grade > lecel_grade_old)
    {
        sprintf(str, "A:H%d+L%d+U\r\n", h_int, lecel_grade);
        HAL_UART_Transmit(&huart2,(unsigned char *)str, strlen(str), 50);
        change_state = 1;
    }
    else if(lecel_grade < lecel_grade_old)
    {
        sprintf(str, "A:H%d+L%d+D\r\n", h_int, lecel_grade);
        HAL_UART_Transmit(&huart2,(unsigned char *)str, strlen(str), 50);
        change_state = 1;
    }

完整代码:

嵌入式系统开发-STM32液位检测报警系统设计-蓝桥杯第七届省赛真题解析与参考代码资源-CSDN文库