蓝桥杯嵌入式第十五届模拟考试三

题目

CubeMX配置

引脚配置

ADC配置

查看产品手册可以知道要配置PB12和PB15这两个

定时器配置

使用TIM4作为按键定时器,TIM6和TIM8为计时定时器。

代码实现

中断回调函数

#include "interrupt.h"
#include "usart.h"

//按键key
struct keys key[4]={0,0,0,0};
int time1=0,time2=0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
    if(htim->Instance == TIM4){
        key[0].key_sta = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
        key[1].key_sta = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
        key[2].key_sta = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
        key[3].key_sta = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
        for(int i=0;i<4;i++){
            switch(key[i].judge_sta){
                case 0:{
                    if(key[i].key_sta==0){
                        key[i].judge_sta=1;
                    }
                }
                break;
                case 1:{
                    if(key[i].key_sta==0){
                        key[i].judge_sta=2;
                        key[i].single_flag=1;
                    }
                    else
                        key[i].judge_sta=0;
                }
                break;
                case 2:{
                    if(key[i].key_sta==1){
                        key[i].judge_sta=0;
                    }
                }
                break;
            }
        }
    }
    if(htim->Instance==TIM6)
    {
        time1++;
    }
    if(htim->Instance==TIM8)
    {
        time2++;
    }
}

//串口
char rxdata[20];
uint8_t rxda;
int rx_pointer=0;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    rxdata[rx_pointer++]=rxda;
    HAL_UART_Receive_IT(&huart1,&rxda,1);
}

主函数

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "interrupt.h"
#include "stdio.h"
#include "string.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
extern struct keys key[4];
double R37_V=0,R38_V=0,min1=1.2,max1=2.2,min2=1.4,max2=3.0,R37_rate=0,R38_rate=0;
extern int time1,time2;
extern char rxdata[10];
extern uint8_t rxda;
extern int rx_pointer;
char text[20];
int view=0,choose=0,R37_num=0,R38_num=0,R37_good=0,R38_good=0,change1_flag=0,change2_flag=0;
extern __IO uint32_t uwTick;
unsigned char led=0x00;
/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void led_disp(unsigned char dsled){
    HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOC,dsled<<8,GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}

double getADC(ADC_HandleTypeDef *pin){
    unsigned int adc;
    HAL_ADC_Start(pin);
    adc = HAL_ADC_GetValue(pin);
    return adc*3.3/4096;
}

void lcd_pro(void){
    R37_V=getADC(&hadc2);
    R38_V=getADC(&hadc1);
    //产品参数界面
    if(view==0){
        LCD_DisplayStringLine(Line1, (unsigned char *)"       GOODS");
        sprintf(text,"     R37:%.2fV",R37_V);
        LCD_DisplayStringLine(Line3, (unsigned char *)text);
        sprintf(text,"     R38:%.2fV",R38_V);
        LCD_DisplayStringLine(Line4, (unsigned char *)text);
        sprintf(text,"     good1:%d",R37_good);
        LCD_DisplayStringLine(Line6, (unsigned char *)text);
        sprintf(text,"     num1:%d",R37_num);
        LCD_DisplayStringLine(Line7, (unsigned char *)text);
        sprintf(text,"     good2:%d",R38_good);
        LCD_DisplayStringLine(Line8, (unsigned char *)text);
        sprintf(text,"     num2:%d",R38_num);
        LCD_DisplayStringLine(Line9, (unsigned char *)text);
    }
    //标准设置界面
    if(view==1){
        LCD_DisplayStringLine(Line1, (unsigned char *)"      STANDARD");
        sprintf(text,"    SR37:%.1f-%.1f",min1,max1);
        LCD_DisplayStringLine(Line3, (unsigned char *)text);
        sprintf(text,"    SR38:%.1f-%.1f",min2,max2);
        LCD_DisplayStringLine(Line4, (unsigned char *)text);
    }
    //合格率界面
    if(view==2){
        LCD_DisplayStringLine(Line1, (unsigned char *)"        PASS");
        sprintf(text,"     PR37:%.1f%%",R37_rate);
        LCD_DisplayStringLine(Line3, (unsigned char *)text);
        sprintf(text,"     PR38:%.1f%%",R38_rate);
        LCD_DisplayStringLine(Line4, (unsigned char *)text);
    }
}
void key_pro(void){
    R37_V=getADC(&hadc2);
    R38_V=getADC(&hadc1);
    if(key[0].single_flag==1){
        
        view+=1;
        LCD_Clear(Black);
        key[0].single_flag=0;
        if(view>2)
        {
            view=0;
        }
    }
    if(view==0)
    {
        //检测
        if(R37_V>=min1&&R37_V<=max1)
        {
            if(key[1].single_flag==1)
            {
                HAL_TIM_Base_Start_IT(&htim6);
                if(time1<100)
                    led |= 0x05;
                if(time1>100)
                {
                    led &= ~0x05;
                    R37_num+=1;
                    time1=0;
                    HAL_TIM_Base_Stop_IT(&htim6);
                    R37_good+=1;
                    key[1].single_flag=0;
                }
            }
        }
        if(R37_V<min1||R37_V>max1)
        {
            if(key[1].single_flag==1)
            {
                R37_num+=1;
                key[1].single_flag=0;
                time1=0;
                HAL_TIM_Base_Stop_IT(&htim6);
            }
        }
        if(R38_V>=min2&&R38_V<=max2)
        {
            if(key[2].single_flag==1)
            {
                HAL_TIM_Base_Start_IT(&htim8);
                if(time2<100)
                    led |= 0x06;
                if(time2>100)
                {
                    led &= ~0x06;
                    R38_num+=1;
                    time2=0;
                    HAL_TIM_Base_Stop_IT(&htim8);
                    R38_good+=1;
                    key[2].single_flag=0;
                }
            }
        }
        if(R38_V<min2||R38_V>max2)
        {            
            if(key[2].single_flag==1)
            {
                R38_num+=1;
                key[2].single_flag=0;
                time2=0;
                HAL_TIM_Base_Stop_IT(&htim8);
            }
        }
    }
    R37_rate=((double)R37_good/(double)R37_num)*100;
    R38_rate=((double)R38_good/(double)R38_num)*100;
    if(R37_num==0)
        R37_rate=0;
    if(R38_num==0)
        R38_rate=0;
    if(view==1)
    {
        //选择
        if(key[1].single_flag==1)
        {
            choose+=1;
            if(choose==4)
                choose=0;
            key[1].single_flag=0;
        }
        //加
        if(key[2].single_flag==1)
        {
            if(choose==0)
            {
                max1+=0.2;
                change1_flag=1;
            }
            if(choose==1)
            {
                min1+=0.2;
                change1_flag=1;
            }
            if(choose==2)
            {
                max2+=0.2;
                change2_flag=1;
            }
            if(choose==3)
            {
                min2+=0.2;
                change2_flag=1;
            }
            if(max1>3.01)
                max1=2.2;
            if(max2>3.01)
                max2=2.2;
            if(min1>2.01)
                min1=1.2;
            if(min2>2.01)
                min2=1.2;
        }
        //减
        if(key[3].single_flag==1)
        {
            if(choose==0)
            {
                max1-=0.2;
                change1_flag=1;
            }
            if(choose==1)
            {
                min1-=0.2;
                change1_flag=1;
            }
            if(choose==2)
            {
                max2-=0.2;
                change2_flag=1;
            }
            if(choose==3)
            {
                min2-=0.2;
                change2_flag=1;
            }
            if(max1<2.01)
                max1=3.0;
            if(max2<2.01)
                max2=3.0;
            if(min1<1.01)
                min1=2.0;
            if(min2<1.01)
                min2=2.0;
        }
        key[2].single_flag=0;
        key[3].single_flag=0;
    }
    if(view==2){
        if(key[3].single_flag==1)
        {   
            R37_num=0;
            R38_num=0;
            R37_good=0;
            R38_good=0;
            LCD_Clear(Black);
            key[3].single_flag=0;
        }
    }
    if(change1_flag==1)
    {
        R37_num=0;
        R37_good=0;
        change1_flag=0;
    }
    if(change2_flag==1)
    {
        R38_num=0;
        R38_good=0;
        change2_flag=0;
    }
}

void led_pro(void){
    if(view==0)
        led |= 0x04;
    else
        led &= ~0x04;
    if(view==1)
        led |= 0x08;
    else
        led &= ~0x08;
    if(view==2)
        led |= 0x10;
    else
        led &= ~0x10;
    led_disp(led);
}
void rx_pro(void){  
    if(rx_pointer>0){
        if(rx_pointer==3){
            if(rxdata[0]=='R'&&rxdata[1]=='3'&&rxdata[2]=='7')
            {
                sprintf(text,"R37:%d,%d,%.1f%%",R37_num,R37_good,R37_rate);
                HAL_UART_Transmit(&huart1,(uint8_t *)text,strlen(text),50);
            }
            if(rxdata[0]=='R'&&rxdata[1]=='3'&&rxdata[2]=='8')
            {
                sprintf(text,"R38:%d,%d,%.1f%%",R38_num,R38_good,R38_rate);
                HAL_UART_Transmit(&huart1,(uint8_t *)text,strlen(text),50);
            }
        }
    }
        rx_pointer=0;
        memset(rxdata,0,10);
}

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
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();

  /* 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();
  MX_TIM4_Init();
  MX_TIM6_Init();
  MX_ADC1_Init();
  MX_ADC2_Init();
  MX_TIM8_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

    LCD_Init();
    led_disp(led);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */

    LCD_Clear(Black);
    LCD_SetBackColor(Black);
    LCD_SetTextColor(White);
    HAL_UART_Receive_IT(&huart1,&rxda,1);
    HAL_TIM_Base_Start_IT(&htim4);
    HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);
    HAL_ADCEx_Calibration_Start(&hadc2,ADC_SINGLE_ENDED);
    
    while (1)
    {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
        rx_pro();
        key_pro();
        lcd_pro();
        led_pro();
    }
  /* USER CODE END 3 */
}

效果演示

蓝桥杯嵌入式第十五届模拟三效果演示

 

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值