题目
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>© 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 */
}
效果演示
蓝桥杯嵌入式第十五届模拟三效果演示