第十三届蓝桥杯嵌入式国赛真题 满分代码
由于在网上国赛的资源少之又少导致我在备战国赛的时候走了不少的弯路。现在国赛已经打完了想着帮助后续的学习者少走弯路所以就先把13届的国赛真题代码分享出来啦~由于主包的编程能力也不算很强所以我的代码里面几乎没用到指针结构体之类的知识点哈哈哈哈哈哈哈有写的不好的地方大家可以给给建议呀有不懂的也可以发在评论区问问主包呀也可以偷偷加主包的v哦~v1v2v1L15889主包后续也会分享一些4t的真题模拟题出来的都是在4t测评过满分的v2258519以下是配置按键为上拉输入input modeLED为 HightTIM2要使能TIM3TIM6用于按键长按TIM7用于串口接收不定长数据串口PA9PA10 开使能ADC2时钟配置以下是13届国赛真题代码~//这里是user.c文件中的代码 #include headerfile.h char H[20]; double RECPA4[100]; double RECPA5[100]; double data[2]; uint8_t B0_s1,B0_e1; uint8_t B1_s1,B1_e1; uint8_t B2_s1,B2_e1; uint8_t A0_s1,A0_e1; uint8_t mode1,mode_clean1,mode_rec1,mode_pwm1,mode_lcd1,mode_lcd_clean1; uint8_t X1,Y1; uint8_t adc_start0; uint8_t Num_PA40,Num_PA50; uint32_t campare,fre; double VPA40,VPA50; double max_PA40,min_PA40,mean_PA40; double max_PA50,min_PA50,mean_PA50; __IO uint32_t ledtick0; //串口所需参数 char uart_buf[20]; char uart_data0; uint8_t uart_start0; uint8_t uart_count0; //用户初始化 void user_Init(void) { //LCD初始化 LCD_Init(); LCD_Clear(Black); LCD_SetBackColor(Black); LCD_SetTextColor(White); //LED初始化 HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET); //定时器初始化 HAL_TIM_Base_Start(htim6);//按键 HAL_TIM_Base_Start(htim7);//串口不定长 HAL_TIM_PWM_Start(htim3,TIM_CHANNEL_2);//PWM输出 TIM3-CCR250; HAL_TIM_IC_Start_IT(htim2,TIM_CHANNEL_2);//输入捕获 //串口初始化 HAL_UART_Receive_IT(huart1,(unsigned char *)uart_data,1); //Eeprom初始化 I2CInit();RW(); } //掉电保存 void RW(void) { uint8_t dateeprom_read(10); if(dat255) { X1;Y1; eeprom_write(0,Y); eeprom_write(1,X); eeprom_write(10,1); } else if(dat1) { Xeeprom_read(1); Yeeprom_read(0); } } //用户界面控制 void user_UI(void) { get_v(hadc2); if(mode!mode_clean||mode_lcd!mode_lcd_clean) { LCD_Clear(Black); if(mode!mode_clean) mode_rec1; } mode_cleanmode; mode_lcd_cleanmode_lcd; user_LCD(); switch(mode) { case 1:DATA();break; case 2:PARA();break; case 3: if(mode_rec1) REC_PA4(); if(mode_rec2) REC_PA5(); break; } LED();PWM(); CAMPARE(); } //屏幕翻转 void user_LCD(void) { switch(mode_lcd) { case 1:LCD_WriteReg(R1,0x0000);LCD_WriteReg(R96,0x2700);break; case 2:LCD_WriteReg(R1,0x0100);LCD_WriteReg(R96,0xA700);break; } HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET); } void user_uart(void) { if(uart_start1TIM7-CNT15) { uart_buf[uart_count]\0; if(uart_buf[0]X||uart_buf[0]Y) { switch(uart_buf[0]) { case X:printf(X:%d,X);break; case Y:printf(Y:%d,Y);break; } } if(uart_buf[0]Puart_buf[1]A) { switch(uart_buf[2]) { case 1:printf(PA1:%d,fre);break; case 4:printf(PA4:%.2f,VPA4);break; case 5:printf(PA5:%.2f,VPA5);break; } } if(uart_buf[0]#) { if(mode_lcd2) mode_lcd1; } uart_start0; memset(uart_buf,0,sizeof(uart_buf)); uart_count0; // HAL_NVIC_DisableIRQ(USART1_IRQn); // memset(uart_buf, 0, sizeof(uart_buf)); // uart_count 0; // HAL_NVIC_EnableIRQ(USART1_IRQn); } } //重定向 int fputc(int ch,FILE*p) { char cch; HAL_UART_Transmit(huart1,(unsigned char *)c,1,50); return ch; } //界面1 void DATA(void) { if(adc_start1) { VPA4data[0]; VPA5data[1]; } sprintf(H, DATA ); LCD_DisplayStringLine(Line1,(uint8_t *)H); sprintf(H, PA4%.2f ,VPA4); LCD_DisplayStringLine(Line3,(uint8_t *)H); sprintf(H, PA5%.2f ,VPA5); LCD_DisplayStringLine(Line4,(uint8_t *)H); sprintf(H, PA1%d ,fre); LCD_DisplayStringLine(Line5,(uint8_t *)H); sprintf(H,uart%c%c%c%c ,uart_buf[0],uart_buf[1],uart_buf[2],uart_buf[3]); LCD_DisplayStringLine(Line7,(uint8_t *)H); sprintf(H,%d %d %d ,eeprom_read(1),eeprom_read(0),eeprom_read(10)); LCD_DisplayStringLine(Line8,(uint8_t *)H); } //界面2 void PARA(void) { sprintf(H, PARA ); LCD_DisplayStringLine(Line1,(uint8_t *)H); sprintf(H, X%d ,X); LCD_DisplayStringLine(Line3,(uint8_t *)H); sprintf(H, Y%d ,Y); LCD_DisplayStringLine(Line4,(uint8_t *)H); sprintf(H,%d %d %d ,eeprom_read(1),eeprom_read(0),eeprom_read(10)); LCD_DisplayStringLine(Line8,(uint8_t *)H); } //界面3_1 void REC_PA4(void) { sprintf(H, REC-PA4 ); LCD_DisplayStringLine(Line1,(uint8_t *)H); sprintf(H, N%d ,Num_PA4); LCD_DisplayStringLine(Line3,(uint8_t *)H); sprintf(H, A%.2f ,max_PA4); LCD_DisplayStringLine(Line4,(uint8_t *)H); sprintf(H, T%.2f ,min_PA4); LCD_DisplayStringLine(Line5,(uint8_t *)H); sprintf(H, H%.2f ,mean_PA4); LCD_DisplayStringLine(Line6,(uint8_t *)H); } //界面3_2 void REC_PA5(void) { sprintf(H, REC-PA5 ); LCD_DisplayStringLine(Line1,(uint8_t *)H); sprintf(H, N%d ,Num_PA5); LCD_DisplayStringLine(Line3,(uint8_t *)H); sprintf(H, A%.2f ,max_PA5); LCD_DisplayStringLine(Line4,(uint8_t *)H); sprintf(H, T%.2f ,min_PA5); LCD_DisplayStringLine(Line5,(uint8_t *)H); sprintf(H, H%.2f ,mean_PA5); LCD_DisplayStringLine(Line6,(uint8_t *)H); } //按键控制 void KEY(void) { B0_sHAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0); B1_sHAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1); B2_sHAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2); A0_sHAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0); if(B0_s1B0_e0) { if(mode3) mode1; } if(B1_s1B1_e0) { if(mode2) { if(X4) X1; eeprom_write(1,X); } } if(B2_s1B2_e0) { if(mode2) { if(Y4) Y1; eeprom_write(0,Y); } } if(A0_s1A0_e0) { if(TIM6-CNT10000) { if(mode1) { adc_start1; } if(mode2) if(mode_pwm2) mode_pwm1; if(mode3) if(mode_rec2) mode_rec1; } } if(A0_s0A0_e0) { if(TIM6-CNT10000mode3) { TIM6-CNT10000; // if(mode_rec1) // { Num_PA40;max_PA40;min_PA40;mean_PA40; for(int i0;iNum_PA4;i) RECPA4[i]0; // } // else if(mode_rec2) // { Num_PA50;max_PA50;min_PA50;mean_PA50; for(int i0;iNum_PA5;i) RECPA5[i]0; // } } } else if(A0_s1A0_e1) { TIM6-CNT0; } B0_eB0_s; B1_eB1_s; B2_eB2_s; A0_eA0_s; } //LED控制 void LED(void) { HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET); if(mode_pwm1) HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET); else HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET); if(mode_pwm2) HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_RESET); else HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_SET); if(mode_lcd1) HAL_GPIO_WritePin(GPIOC,GPIO_PIN_11,GPIO_PIN_RESET); else HAL_GPIO_WritePin(GPIOC,GPIO_PIN_11,GPIO_PIN_SET); if(VPA4VPA5) { if(uwTick-ledtick100) { ledtickuwTick; HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_10); } } else if(VPA4VPA5)HAL_GPIO_WritePin(GPIOC,GPIO_PIN_10,GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET); } //PWM处理 void PWM(void) { if(mode_pwm1) { __HAL_TIM_SET_PRESCALER(htim3,80000000/100/(fre*X)); __HAL_TIM_SET_COMPARE(htim3,TIM_CHANNEL_2,50); } else if(mode_pwm2) { __HAL_TIM_SET_PRESCALER(htim3,80000000/100/(fre/X)); __HAL_TIM_SET_COMPARE(htim3,TIM_CHANNEL_2,50); } } void CAMPARE(void) { if(adc_start1) { double sumPA40; double sumPA50; RECPA4[Num_PA4]VPA4; RECPA5[Num_PA5]VPA5; if(Num_PA41) { max_PA4VPA4; min_PA4VPA4; } if(Num_PA51) { max_PA5VPA5; min_PA5VPA5; } if(max_PA4VPA4) max_PA4VPA4; else if(min_PA4VPA4) min_PA4VPA4; if(max_PA5VPA5) max_PA5VPA5; else if(min_PA5VPA5) min_PA5VPA5; for(int i1;iNum_PA4;i) { sumPA4RECPA4[i]; sumPA5RECPA5[i]; } mean_PA4sumPA4/(Num_PA4); mean_PA5sumPA5/(Num_PA5); adc_start0; } } //电压读取 void get_v(ADC_HandleTypeDef *hadc) { for(int i0;i2;i) { HAL_ADC_Start(hadc); uint32_t value HAL_ADC_GetValue(hadc); data[i]3.3*value/4096; } } //定时器中断 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { } //输入捕获中断 void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if(htim-InstanceTIM2) { campareHAL_TIM_ReadCapturedValue(htim2,TIM_CHANNEL_2); TIM2-CNT0; fre80000000/80/campare; } } //串口回调函数 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart-InstanceUSART1) { TIM7-CNT0; uart_start1; uart_buf[uart_count]uart_data; HAL_UART_Receive_IT(huart,(unsigned char *)uart_data,1); } }//这里是user.h 的代码 #ifndef __user_h__ #define __user_h__ #include stm32g4xx.h // Device header void user_Init(void); void user_UI(void); void user_LCD(void); void user_uart(void); void DATA(void); void PARA(void); void REC_PA4(void); void REC_PA5(void); void KEY(void); void LED(void); void PWM(void); void RW(void); void CAMPARE(void); void get_v(ADC_HandleTypeDef *hadc); #endif//这里是headerfile.h的代码,放头文件用的 #ifndef __headerfile_h__ #define __headerfile_h__ #include main.h #include gpio.h #include adc.h #include tim.h #include usart.h #include stdio.h #include stdlib.h #include string.h #include lcd.h #include user.h #include i2c_hal.h #endif在main.c文件中我只写了这些