【蓝桥杯_练习】

蓝桥杯

  • 1.创建工程
  • 2.LED灯点亮
    • led.c
  • 3.LCD液晶屏显示
    • lcd.c
  • 4.定时器按键单机
    • interrupt.h
    • interrupt.c
    • man.c
  • 5.定时器(长按键)
    • interrupt.h
    • interrupt.c
    • main.c
  • 6.PWM
    • main.c
  • 7.定时器-输入捕获(频率,占空比测量)
    • interrupt.c
    • main.c
  • 8.ADC模数转换
    • myadc.h
    • myadc.c
    • main.c
  • 9.IIC
    • i2c - hal.c
    • main.c
  • 10.uart串口通信
    • interrupter.c
    • mian.c

1.创建工程

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.LED灯点亮

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 高电平为默认不点亮
  • PD2电平为低不用设置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

led.c

#include "main.h"
#include "gpio.h"
#include "led.h"

void LED_Disp(uchar dsLED)
{
  HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);
/* 
*  GPIO_PIN_RESET: 1有效置0   0无效保持原来状态
*  GPIO_PIN_SET  : 1有效置1   0无效保持原来状态
*  GPIOC 1111 1111 1111 1111  
*/
	//LED的引脚GPIO的C组的前八位所以左移八位
  HAL_GPIO_WritePin(GPIOC,dsLED<<8,GPIO_PIN_RESET);
/*  
*   dsLED=0x00<<8 0000 0000 0000 0000  GPIOC 1111 1111 1111 1111
*   dsLED=0xff<<8 1111 1111 0000 0000  GPIOC 0000 0000 0000 0000 
*/
	//打开锁存器
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}

main()
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  LED_Disp(0x00);//全部熄灭
  while (1)
  {
	  LED_Disp(0x00);
	  HAL_Delay(500);
	  LED_Disp(0xff);//全点亮
  	  HAL_Delay(500);
  }
}

3.LCD液晶屏显示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
请添加图片描述

lcd.c

int main(void)
{
  char text[30];
  uint i=5;
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  
  LCD_Init();//LCD屏初始化	
  LCD_Clear(Black);
  LCD_SetBackColor(Black);
  LCD_SetTextColor(White);
  
  sprintf(text,"       SCH%d     ",i);
  LCD_DisplayStringLine(Line4, (uint8_t *)text);
  while (1)
  {
	  HAL_Delay(500);
  }
}

4.定时器按键单机

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

interrupt.h

#ifndef _INTERRUPT_H_
#define _INTERRUPT_H_

#include "main.h"
#include "stdbool.h"

struct keys 
{
	uchar judge_sta;  //进行到底几步
	bool key_sta;     //按键的状态
	bool single_flag; //当按键按下为1
};

#endif

interrupt.c

#include "interrupt.h"
struct keys key[4]={0,0,0};
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim->Instance==TIM3)
	{
		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;
					 else 
						 key[i].judge_sta=0;
				}
				   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;
			}
		}	
	}
}

man.c

#include "led.h"
#include "lcd.h"
#include "stdio.h"
#include "interrupt.h"

extern struct keys key[];

int main(void)
{
   HAL_Init();
   SystemClock_Config();
   MX_GPIO_Init();
   MX_TIM3_Init();
  
   LED_Disp(0x00);//LCD初始化
   LCD_Init();//LCD屏初始化
	
   LCD_Clear(Black);
   LCD_SetBackColor(Black);
   LCD_SetTextColor(White);
   HAL_TIM_Base_Start_IT(&htim3);//定时器中断
   char text[30];
   while (1)
   {
		if(key[0].single_flag==1)
		{
			key[0].single_flag=0;
		  sprintf(text,"       Key0     ");
		  LCD_DisplayStringLine(Line8, (uint8_t *)text);
		}
		if(key[1].single_flag==1)
		{
			key[1].single_flag=0;
		  sprintf(text,"       Key1     ");
		  LCD_DisplayStringLine(Line8, (uint8_t *)text);
		}
   }
}

5.定时器(长按键)

interrupt.h

#ifndef _INTERRUPT_H_
#define _INTERRUPT_H_

#include "main.h"
#include "stdbool.h"

struct keys 
{
	uchar judge_sta;  //进行到底几步
	bool key_sta;     //按键的状态
	bool single_flag; //当按键按下为1
	bool long_flag;   //长按键
	uint key_time;    //按下累计的时间
};

#endif

interrupt.c

#include "interrupt.h"
struct keys key[4]={0,0,0};
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim->Instance==TIM3)
	{
		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;
						 key[i].key_time=0;
					 }
					else 
						 key[i].judge_sta=0;
				}
				   break;
				case 1:
				{
					 if(key[i].key_sta==0)
					 {
					   key[i].judge_sta=2;
					 }		
					 else
						 key[i].judge_sta=0;
				
				}
				   break;
				case 2:
				{
				   if(key[i].key_sta==1)
					 {
					   key[i].judge_sta=0;
						 if(key[i].key_time<70)
							 key[i].single_flag=1;
					 }
					 else 
					 {
						 key[i].key_time++;
						 if(key[i].key_time>70)
							 key[i].long_flag=1;
					 }
				}
				   break;
			}
		}
	}
}

main.c

#include "led.h"
#include "lcd.h"
#include "stdio.h"
#include "interrupt.h"
extern struct keys key[];
uchar view;

void key_pro(void);
void disp_pro(void);

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_TIM3_Init();
  /* USER CODE BEGIN 2 */
  LED_Disp(0x00);//LCD初始化

  LCD_Init();//LCD屏初始化
	
  LCD_Clear(Black);
  LCD_SetBackColor(Black);
  LCD_SetTextColor(White);
   
  HAL_TIM_Base_Start_IT(&htim3);
		
  while (1)
  {		
    key_pro();
	disp_pro();
  }
}

void key_pro(void)
{
  if(key[0].single_flag==1)
	{
		 view=!view;
	   key[0].single_flag=0;
	}
}

void disp_pro(void)
{
  if(view==0)
	{
		char text[30];
		sprintf(text,"       Data     ");
		LCD_DisplayStringLine(Line1, (uint8_t *)text);
	}
  else
  {
	  	char text[30];
		sprintf(text,"   Para     ");
		LCD_DisplayStringLine(Line1, (uint8_t *)text);
  }		
}

6.PWM

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

main.c

#include "led.h"
#include "lcd.h"
#include "stdio.h"
#include "interrupt.h"

extern struct keys key[];
uchar view;

uchar pa6_duty=10;
uchar pa7_duty=10;

void key_pro(void);
void disp_pro(void);

void SystemClock_Config(void);

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_TIM3_Init();
  MX_TIM16_Init();
  MX_TIM17_Init();

  LED_Disp(0x00);//LCD初始化
  LCD_Init();//LCD屏初始化
  LCD_Clear(Black);
  LCD_SetBackColor(Black);
  LCD_SetTextColor(White);
  
  HAL_TIM_Base_Start_IT(&htim3);//开启定时器3的中断
  HAL_TIM_PWM_Start (&htim16, TIM_CHANNEL_1);//PWM开启
  HAL_TIM_PWM_Start(&htim17, TIM_CHANNEL_1);
		
  while (1)
  {
	 key_pro();
	 disp_pro();
  }
}

/* USER CODE BEGIN 4 */
void key_pro(void)
{
  if(key[0].single_flag==1)
	{
		 view=!view;
		 LCD_Clear(Black);
	   key[0].single_flag=0;
	}
  if(key[1].single_flag==1)
	{
		 pa6_duty=pa6_duty%90+10;
		 __HAL_TIM_SetCompare(&htim16, TIM_CHANNEL_1,pa6_duty);//控制占空比
	   key[1].single_flag=0;
	}
  if(key[2].single_flag==1)
	{
		 pa7_duty=pa7_duty%90+10;
		 __HAL_TIM_SetCompare(&htim17, TIM_CHANNEL_1,pa7_duty);//控制占空比
	   key[2].single_flag=0;
	}
}

void disp_pro(void)
{
  if(view==0)
	{
		  char text[30];
			sprintf(text,"       Data     ");
		  LCD_DisplayStringLine(Line1, (uint8_t *)text);
	}
  else
  {
	  	char text[30];
			sprintf(text,"       Para     ");
		  LCD_DisplayStringLine(Line1, (uint8_t *)text);
		  sprintf(text,"    PA6:%d     ",pa6_duty);
		  LCD_DisplayStringLine(Line2, (uint8_t *)text);
			sprintf(text,"    PA7:%d     ",pa7_duty);
		  LCD_DisplayStringLine(Line3, (uint8_t *)text);
  }		
}

7.定时器-输入捕获(频率,占空比测量)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

interrupt.c

#include"interrupt.h"
/测量频率+占空比///
double ccr1_val1a=0,ccr1_val2a=0;
double ccr1_val1b=0,ccr1_val2b=0;
uint frq1=0,frq2=0;//频率
float duty1=0,duty2=0;//占空比
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==TIM2)
	{
		if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1)//中断消息来源 选择直接输入的通道
		{
			ccr1_val1a=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);//直接
			ccr1_val1b=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2);//间接
			__HAL_TIM_SetCounter(htim,0);
			frq1=(80000000/80)/ccr1_val1a;
			duty1=(ccr1_val1b/ccr1_val1a)*100;
			HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);
			HAL_TIM_IC_Start(htim,TIM_CHANNEL_2);
		}
	}
	if(htim->Instance==TIM3)
	{
		if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1)//中断消息来源 选择直接输入的通道
		{
			ccr1_val2a=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1);
			ccr1_val2b=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2);
			__HAL_TIM_SetCounter(htim,0);
			frq2=(80000000/80)/ccr1_val2a;
			duty2=(ccr1_val2b/ccr1_val2a)*100;
			HAL_TIM_IC_Start(htim,TIM_CHANNEL_1);
			HAL_TIM_IC_Start(htim,TIM_CHANNEL_2);
		}
	}
}

main.c

#include "led.h"
#include "lcd.h"
#include "stdio.h"
#include "interrupt.h"

extern struct keys key[];
extern uint frq1,frq2;
extern float duty1,duty2;

uchar view;
uchar pa6_duty=10;
uchar pa7_duty=10;

void key_pro(void);
void disp_pro(void);

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_TIM3_Init();
  MX_TIM16_Init();
  MX_TIM17_Init();
  MX_TIM2_Init();
  MX_TIM4_Init();

  LED_Disp(0x00);//LCD初始化
  LCD_Init();//LCD屏初始化
	
  LCD_Clear(Black);
  LCD_SetBackColor(Black);
  LCD_SetTextColor(White);
  
  HAL_TIM_Base_Start_IT(&htim4);//开启定时器4的中断
	
  HAL_TIM_PWM_Start (&htim16, TIM_CHANNEL_1);//PWM开启
  HAL_TIM_PWM_Start(&htim17, TIM_CHANNEL_1);
	
  HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);//频率测量捕获定时器开启
  HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);
  HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);//频率测量捕获定时器开启 间接通道
  HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_2);
//	
  __HAL_TIM_SetCompare(&htim16,TIM_CHANNEL_1,pa6_duty);//设置初始pwm频率
  __HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,pa7_duty);

  while (1)
  {
	key_pro();
	disp_pro();
  }
}

void key_pro(void)
{
  if(key[0].single_flag==1)
	{
		 view=!view;
		 LCD_Clear(Black);
	   key[0].single_flag=0;
	}
  if(key[1].single_flag==1)
	{
		 pa6_duty=pa6_duty%90+10;
		 __HAL_TIM_SetCompare(&htim16, TIM_CHANNEL_1,pa6_duty);//控制占空比
	   key[1].single_flag=0;
	}
  if(key[2].single_flag==1)
	{
		 pa7_duty=pa7_duty%90+10;
		 __HAL_TIM_SetCompare(&htim17, TIM_CHANNEL_1,pa7_duty);//控制占空比
	   key[2].single_flag=0;
	}
}

void disp_pro(void)
{
  if(view==0)
	{
		char text[30];
		sprintf(text,"      Data      ");
		LCD_DisplayStringLine(Line1, (uint8_t *)text);
		sprintf(text,"     FRQ1=%d      ",frq1);
		LCD_DisplayStringLine(Line2, (uint8_t *)text);
		sprintf(text,"     duty1=%.3f      ",duty1);
		LCD_DisplayStringLine(Line3, (uint8_t *)text);	
		sprintf(text,"     FRQ2=%d      ",frq2);
		LCD_DisplayStringLine(Line4, (uint8_t *)text);
		sprintf(text,"     duty2=%.3f      ",duty2);
		LCD_DisplayStringLine(Line5, (uint8_t *)text);
	}
  else if(view==1)
  {
		char text[30]; 
		sprintf(text,"      Para      ");
		LCD_DisplayStringLine(Line1, (uint8_t *)text);
		sprintf(text,"    PA6:%d      ",pa6_duty);
		LCD_DisplayStringLine(Line2, (uint8_t *)text);
		sprintf(text,"    PA7:%d      ",pa7_duty);
		LCD_DisplayStringLine(Line4, (uint8_t *)text);
  }		
}

8.ADC模数转换

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

myadc.h

#ifndef _MYADC_H_
#define _MYADC_H_

#include "main.h"
double getADC(ADC_HandleTypeDef *pin);

#endif

myadc.c

#include "myadc.h"


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

main.c

#include "led.h"
#include "lcd.h"
#include "stdio.h"
#include "interrupt.h"
#include "myadc.h"

extern struct keys key[];
extern uint frq1,frq2;
extern float duty1,duty2;

uchar view;

uchar pa6_duty=10;
uchar pa7_duty=10;

void key_pro(void);
void disp_pro(void);

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_TIM3_Init();
    MX_TIM16_Init();
    MX_TIM17_Init();
    MX_TIM2_Init();
    MX_TIM4_Init();
    MX_ADC1_Init();
    MX_ADC2_Init();
    /* USER CODE BEGIN 2 */
    LED_Disp(0x00);//LCD初始化
	LCD_Init();//LCD屏初始化
	
	LCD_Clear(Black);
	LCD_SetBackColor(Black);
	LCD_SetTextColor(White);
  
	HAL_TIM_Base_Start_IT(&htim4);//开启定时器4的中断
	
	HAL_TIM_PWM_Start (&htim16, TIM_CHANNEL_1);//PWM开启
    HAL_TIM_PWM_Start(&htim17, TIM_CHANNEL_1);

	HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);//频率测量捕获定时器开启
	HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);
    HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);//频率测量捕获定时器开启 间接通道
	HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_2);

	__HAL_TIM_SetCompare(&htim16,TIM_CHANNEL_1,pa6_duty);//设置初始pwm频率
	__HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,pa7_duty);

  while (1)
  {
    key_pro();
	disp_pro();
  }
}

void disp_pro(void)
{
  if(view==0)
	{
		char text[30];
		sprintf(text,"     ADC1=%.2f      ",getADC(&hadc1));
		LCD_DisplayStringLine(Line6, (uint8_t *)text);
		sprintf(text,"     ADC2=%.2f      ",getADC(&hadc2));
		LCD_DisplayStringLine(Line7, (uint8_t *)text);
	}
  else if(view==1)
  {
  }		
}

9.IIC

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

i2c - hal.c

#include "i2c - hal.h"
uchar eeprom_read(uchar addr)
{
	uchar dat;
	I2CStart();
	I2CSendByte(0xa0);
	I2CWaitAck();
	I2CSendByte(addr);
	I2CWaitAck();
	//I2CStop();
	
	I2CStart();
	I2CSendByte(0xa1);
	I2CWaitAck();
	dat=I2CReceiveByte();
	//I2CWaitAck();
	I2CStop();
	return dat;
}

void eeprom_write (uchar addr,uchar dat)
{
	I2CStart();
	I2CSendByte(0xa0);
	I2CWaitAck();
	I2CSendByte(addr);
	I2CWaitAck();
	I2CSendByte(dat);
	I2CWaitAck();
	I2CStop();
}

main.c

#include "led.h"
#include "lcd.h"
#include "stdio.h"
#include "interrupt.h"
#include "myadc.h"
#include "i2c - hal.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
extern struct keys key[];
extern uint frq1,frq2;
extern float duty1,duty2;

uchar view=0;

uchar pa6_duty=10;
uchar pa7_duty=10;

void key_pro(void);
void disp_pro(void);
/* 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 */

/* 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_TIM3_Init();
  MX_TIM16_Init();
  MX_TIM17_Init();
  MX_TIM2_Init();
  MX_TIM4_Init();
  MX_ADC1_Init();
  MX_ADC2_Init();
  /* USER CODE BEGIN 2 */
  LED_Disp(0x00);//LCD初始化
  LCD_Init();//LCD屏初始化
	
  LCD_Clear(Black);
  LCD_SetBackColor(Black);
  LCD_SetTextColor(White);
  
  HAL_TIM_Base_Start_IT(&htim4);//开启定时器4的中断
	
  HAL_TIM_PWM_Start (&htim16, TIM_CHANNEL_1);//PWM开启
  HAL_TIM_PWM_Start(&htim17, TIM_CHANNEL_1);
	
  HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);//频率测量捕获定时器开启
  HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_1);
  HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);//频率测量捕获定时器开启 间接通道
  HAL_TIM_IC_Start_IT(&htim3,TIM_CHANNEL_2);
  
  __HAL_TIM_SetCompare(&htim16,TIM_CHANNEL_1,pa6_duty);//设置初始pwm频率
  __HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,pa7_duty);
  while (1)
  {
	   if(key[3].single_flag==1)
	   {
		   uchar frq_h=frq1>>8;
		   uchar frq_l=frq1&0xff;
		   eeprom_write(1,frq_h);
		   HAL_Delay(10);
		   eeprom_write(2,frq_l);
		   key[3].single_flag=0;
	   }
		uint eeprom_val=(eeprom_read(1)<<8)+eeprom_read(2);
		sprintf(text,"     FRQ_eep=%d   ",eeprom_val);
		LCD_DisplayStringLine(Line8, (uint8_t *)text);	
  }
}

10.uart串口通信

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

interrupter.c

char rxdata[30];
uint8_t rxdat;
uchar rx_pointer;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *hurat)
{
	rxdata[rx_pointer++]=rxdat;
	HAL_UART_Receive_IT(&huart1,&rxdat,1);
}

mian.c

#include "led.h"
#include "lcd.h"
#include "stdio.h"
#include "interrupt.h"
#include "myadc.h"
#include "i2c - hal.h"
#include "string.h"


extern struct keys key[];
extern char rxdata[30];
extern uint8_t rxdat;
extern uchar rx_pointer;

uchar view=0;

char car_type[5];
char car_data[5];
char car_time[13];

void key_pro(void);
void disp_pro(void);
void uart_rx_proc(void);
int main(void)
{
  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();
  MX_TIM3_Init();
  MX_TIM16_Init();
  MX_TIM17_Init();
  MX_TIM2_Init();
  MX_TIM4_Init();
  MX_ADC1_Init();
  MX_ADC2_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  LED_Disp(0x00);//LCD初始化
  LCD_Init();//LCD屏初始化
	
  HAL_UART_Receive_IT(&huart1,&rxdat,1);//打开串口中断
	
  LCD_Clear(Black);
  LCD_SetBackColor(Black);
  LCD_SetTextColor(White);
  
  while (1)
  {
		key_pro();
		disp_pro();
		
		if(rx_pointer!=0)
		{
			int temp=rx_pointer;
			HAL_Delay(1);
			if (temp==rx_pointer)uart_rx_proc();//完成接收
		}
  }
}

void key_pro(void)
{
  if(key[0].single_flag==1)
	{
		 view=0;
		 LCD_Clear(Black);
	   key[0].single_flag=0;
	}
}

void disp_pro(void)
{
	if(view==0)
	{
		char text[30]; 
		sprintf(text,"      Car_msg      ");
		LCD_DisplayStringLine(Line1, (uint8_t *)text);
		sprintf(text,"car_type=%s      ",car_type);
		LCD_DisplayStringLine(Line2, (uint8_t *)text);
		sprintf(text,"car_data=%s      ",car_data);
		LCD_DisplayStringLine(Line3, (uint8_t *)text);
		sprintf(text,"cat_time=%s      ",car_time);
		LCD_DisplayStringLine(Line4, (uint8_t *)text);		
	}
}

void uart_rx_proc()
{
	if(rx_pointer>0)
	{
		if(rx_pointer==22)
		{
			sscanf(rxdata,"%4s:%4s:%12s",car_type,car_data,car_time);
		}
		else 
		{
				char temp[20];
				sprintf(temp,"Error");
				HAL_UART_Transmit(&huart1,(uint8_t *)temp,strlen(temp),50);
		}
		rx_pointer=0;memset(rxdata,0,30);
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/3469.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

中科亿海微FPGA应用(一、点灯)

1.软件&#xff1a; https://download.csdn.net/download/weixin_41784968/87564071 需要申请license才能使用&#xff1a;软件试用申请_软件试用申请_中科亿海微电子科技&#xff08;苏州&#xff09;有限公司 2.开发板&#xff1a; 芯片EQ6HL45&#xff0c;42.5k LUT。 3…

移植RK3568的串口

文章目录 前言一、代码位置二、硬件原理图三、修改设备树四、关闭串口调试功能总结前言 本文主要讲解如何移植RK3568的串口 提示:以下是本篇文章正文内容,下面案例可供参考 一、代码位置 drivers/tty/serial/8250/8250_core.c drivers/tty/serial/8250/8250_dma.c dma实现…

TCP协议详解

1.TCP的准备条件在古代的时候&#xff0c;古人们经常写书信进行交流&#xff0c;写书信的前提是你要知道这份信是要寄给谁在网络中&#xff0c;我们通过ip端口号找对目标对象&#xff0c;但是现在网站一般会对ip端口注册一个域名&#xff0c;所以我们一般就是对域名进行查找&am…

mysql的limit查询竟然有坑?

背景 最近项目联调的时候发现了分页查询的一个bug&#xff0c;分页查询总有数据查不出来或者重复查出。 数据库一共14条记录。 如果按照一页10条。那么第一页和第二页的查询SQL和和结果如下。 .png) 那么问题来了&#xff0c;查询第一页和第二页的时候都出现了11,12,13的记录…

又一款全新的基于 GPT4 的 Python 神器Cursor,关键还免费

chartgpt大火之后&#xff0c;随之而来的就是一大类衍生物了。 然后&#xff0c;今天要给大家介绍的是一款基于GPT4的新一代辅助编程神器——Cursor。 它最值得介绍的地方在于它免费&#xff0c;我们可以直接利用它来辅助我们编程&#xff0c;真正做到事半功倍。 注意&#…

大数据项目之数仓相关知识

第1章 数据仓库概念 数据仓库&#xff08;DW&#xff09;: 为企业指定决策&#xff0c;提供数据支持的&#xff0c;帮助企业&#xff0c;改进业务流程&#xff0c;提高产品质量等。 DW的输入数据通常包括&#xff1a;业务数据&#xff0c;用户行为数据和爬虫数据等 ODS: 数据…

十二届蓝桥杯省赛c++(下)

1、 拿到题目一定要读懂题意&#xff0c;不要看到这题目就上来模拟什么闰年&#xff0c;一月的天数啥的。这个题目问你当天的时间&#xff0c;就说明年月日跟你都没关系&#xff0c;直接无视就好了。 #include <iostream> #include <cstring> #include <algori…

Nginx 教程-动静分离

一、Nginx 动静分离理论1、概念今天学习和梳理Nginx动静分离&#xff0c;动静分离是将网站静态资源&#xff08;HTML&#xff0c;JavaScript&#xff0c;CSS&#xff0c;img等文件&#xff09;与后台应用分开部署&#xff0c;之所以要进行动静分离&#xff0c;其一为了提高前端…

Qt示例3:用Qt画一个温度计

示例1 以下是用Qt绘制一个简单的温度计的示例代码&#xff1a; #include <QPainter> #include <QWidget> #include <QApplication> class Thermometer : public QWidget { public:Thermometer(QWidget *parent 0); protected:void paintEvent(QPaintEvent …

戴眼镜检测和识别1:戴眼镜检测数据集(含下载链接)

戴眼镜检测和识别1&#xff1a;戴眼镜检测数据集(含下载链接) 目录 戴眼镜检测和识别1&#xff1a;戴眼镜检测数据集(含下载链接) 1. 前言 2.Eyeglasses-Dataset数据集说明 3.Eyeglasses-Dataset数据集下载 4.戴眼镜检测和识别&#xff08;Python版本&#xff09; 5.戴眼…

JavaWeb——线程安全问题的原因和解决方案

目录 一、线程不安全的原因 1、抢占式执行、随机调度 2、多线程同时修改同一个变量 3、修改操作不是原子的 4、内存可见性 5、指令重排序 二、解决方法 1、使用synchronized方法加锁 &#xff08;1&#xff09;、定义 &#xff08;2&#xff09;、使用 &#xff08;3…

Github ChatGPT-Web:了解最新AI技术的前沿应用!

近年来OpenAI的ChatGPT模型在自然语言处理领域取得了很大的进展&#xff0c;并且已经在全球范围内得到了广泛的应用和普及。ChatGPT不仅可以用于生成对话和文本摘要等任务&#xff0c;还可以用于机器翻译、问答系统、情感分析等多个领域。ChatGPT已经成为自然语言处理领域的一个…

基于51单片机的自动打铃打鸣作息报时系统AT89C51数码管三极管时钟电路

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;单片机打铃 获取完整无水印论文报告说明&#xff08;含源码程序、电路原理图和仿真图&#xff09; 本次设计中的LED数码管电子时钟电路采用24小时制记时方式,本次设计采用AT89C51单片机的扩展芯片和6个PNP三极管做驱动&…

【C语言蓝桥杯每日一题】——跑步锻炼

【C语言蓝桥杯每日一题】—— 跑步锻炼&#x1f60e;前言&#x1f64c;排序&#x1f64c;总结撒花&#x1f49e;&#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&#xff1a;全神贯注的上吧&#xff01;&#xff01;&#xff01; &#x1f60a;作者简介…

使用chatGPT实现数字自增动画

num-auto-add&#xff1a;数字自增动画 序言 我们经常在一些好的网站上遇到数字自增的动画效果&#xff0c;为用户提供了更加丰富的交互体验&#xff0c;看起来非常酷。 我之前也有写过&#xff0c;为了方便以后使用&#xff0c;打算将它优化&#xff0c;并上传到npm中。 首…

OpenCV入门(二十一)快速学会OpenCV 20 图像金字塔

OpenCV入门&#xff08;二十一&#xff09;快速学会OpenCV 20 图像金字塔1.基本概念2.高斯金字塔2.1 向下取样2.2 向上取样3.拉普拉斯金字塔作者&#xff1a;Xiou 1.基本概念 一般情况下&#xff0c;我们要处理的是一幅具有固定分辨率的图像。有些情况下&#xff0c;我们需要…

RabbitMQ 入门到应用 ( 六 ) 消息可靠性

7.RabbitMQ可靠性投递 为了保证信息不丢失, 可靠抵达,引入确认机制 消息从生产者传递到消费者的过程中, 不同的阶段使用不同的确认方式. 7.0.准备请求 一次性发送10 个消息 通过 new.exchange.direct交换机 接收消息, 使用 new.admin路由键 向 new.admin队列 发送消息. Aut…

【 构造 HTTP 请求 】

文章目录一、通过 form 表单构造 HTTP 请求1.1 form 发送 GET 请求1.2 form 发送 POST 请求二、通过 ajax 构造 HTTP 请求2.1 ajax 发送 GET 请求2.2 ajax 发送POST 请求2.3 关于 ajax三、通过 Java socket 构造 HTTP 请求(了解)一、通过 form 表单构造 HTTP 请求 form (表单)…

Element Plus 实例详解(六)___Progress 进度条

Element Plus 实例详解&#xff08;六&#xff09;___Progress 进度条 本文目录&#xff1a; 一、前言 二、搭建Element Plus试用环境 1、搭建Vue3项目&#xff08;基于Vite Vue&#xff09; 2、安装Element Plus 三、Element Plus Progress 进度条功能试用 1、直线进度条…

【数据结构】栈和队列

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a;初阶数据结构 &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对…