当前位置:   article > 正文

蓝桥杯嵌入式第十五届省赛模拟赛第三场——程序设计部分_蓝桥杯嵌入式15届模拟题

蓝桥杯嵌入式15届模拟题

源码:

链接:https://pan.baidu.com/s/1O7LO84ecTPMKxE4SRUjJPg?pwd=d1qg 
提取码:d1qg

由于木有会员,只能一个一个文件上传,就上传了关键的。

成绩已经可查,本Blog代码可拿程序题满分:

原题:

代码:

变量定义:

  1. extern struct key keys[4];//四个按键
  2. extern char rxdata[30];//串口数据
  3. extern uint p;
  4. extern uint8_t data;
  5. int view=0;//界面切换
  6. double tR37=1.25,tR38=2.36;//ADC的值
  7. double SR37_l=1.2,SR37_r=2.2;//R37的上下限
  8. double SR38_l=1.4,SR38_r=3.0;//R38的上下限
  9. int PR37=0,PR38=0;//合格数
  10. int sumR37=0,sumR38=0;//总数
  11. int swic=0;//选择配置
  12. int R37_flag=0,R38_flag=0;//是否通过
  13. double res37,res38;//合格率
  14. __IO uint32_t LD1Tick=0;//计时1s 下同
  15. __IO uint32_t LD2Tick=0;

main: 

  1. int main(void)
  2. {
  3. /* USER CODE BEGIN 1 */
  4. /* USER CODE END 1 */
  5. /* MCU Configuration--------------------------------------------------------*/
  6. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  7. HAL_Init();
  8. /* USER CODE BEGIN Init */
  9. /* USER CODE END Init */
  10. /* Configure the system clock */
  11. SystemClock_Config();
  12. /* USER CODE BEGIN SysInit */
  13. /* USER CODE END SysInit */
  14. /* Initialize all configured peripherals */
  15. MX_GPIO_Init();
  16. MX_TIM3_Init();
  17. MX_USART1_UART_Init();
  18. MX_ADC1_Init();
  19. MX_ADC2_Init();
  20. /* USER CODE BEGIN 2 */
  21. //LCD的初始化
  22. LCD_Init();
  23. LCD_SetBackColor(Black);
  24. LCD_SetTextColor(White);
  25. LCD_Clear(Black);
  26. //按键定时器开启
  27. HAL_TIM_Base_Start_IT(&htim3);
  28. //LED初始化
  29. HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);
  30. HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
  31. HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
  32. //串口初始化
  33. HAL_UART_Receive_IT(&huart1,&data,1);
  34. /* USER CODE END 2 */
  35. /* Infinite loop */
  36. /* USER CODE BEGIN WHILE */
  37. while (1)
  38. {
  39. led_proc();
  40. lcd_proc();
  41. key_proc();
  42. //判断接收数据是否结束
  43. while(p!=0)
  44. {
  45. int t=p;
  46. HAL_Delay(1);
  47. if(t==p) usart_rx();
  48. }
  49. /* USER CODE END WHILE */
  50. /* USER CODE BEGIN 3 */
  51. }
  52. /* USER CODE END 3 */
  53. }

lcd:

  1. void lcd_proc(void)
  2. {
  3. char text[20];
  4. if(sumR37==0) res37=0.0;
  5. else res37=(PR37*1.0/sumR37);
  6. if(sumR38==0) res38=0.0;
  7. else res38=(PR38*1.0/sumR38);
  8. //获取ADC
  9. tR38=getADC(&hadc1);
  10. tR37=getADC(&hadc2);
  11. if(view==0)//产品参数界面
  12. {
  13. sprintf(text," GOODS ");
  14. LCD_DisplayStringLine(Line1,(u8*)text);
  15. sprintf(text," R37:%.2lfV ",tR37);
  16. LCD_DisplayStringLine(Line3,(u8*)text);
  17. sprintf(text," R38:%.2lfV ",tR38);
  18. LCD_DisplayStringLine(Line4,(u8*)text);
  19. }else if(view==1)//标准设置界面
  20. {
  21. sprintf(text," STANDARD ");
  22. LCD_DisplayStringLine(Line1,(u8*)text);
  23. sprintf(text," SR37:%.1lf-%.1lf ",SR37_l,SR37_r);
  24. LCD_DisplayStringLine(Line3,(u8*)text);
  25. sprintf(text," SR38:%.1lf-%.1lf ",SR38_l,SR38_r);
  26. LCD_DisplayStringLine(Line4,(u8*)text);
  27. }else if(view==2)//合格率界面
  28. {
  29. sprintf(text," PASS ");
  30. LCD_DisplayStringLine(Line1,(u8*)text);
  31. sprintf(text," PR37:%.1lf%% ",res37*100);
  32. LCD_DisplayStringLine(Line3,(u8*)text);
  33. sprintf(text," PR38:%.1lf%% ",res38*100);
  34. LCD_DisplayStringLine(Line4,(u8*)text);
  35. }
  36. }

key:

  1. void key_proc(void)
  2. {
  3. if(keys[0].single_flag==1)
  4. {
  5. view=(view+1)%3;
  6. if(view==1) swic=0;
  7. LCD_Clear(Black);
  8. keys[0].single_flag=0;
  9. }else if(keys[1].single_flag==1)
  10. {
  11. if(view==0)//检测R37
  12. {
  13. sumR37++;
  14. if(tR37>=SR37_l&&tR37<=SR37_r)//通过
  15. {
  16. R37_flag=1;
  17. PR37++;
  18. }else R37_flag=0;
  19. }
  20. else if(view==1)//调整设置
  21. {
  22. swic=(swic+1)%4;
  23. }
  24. keys[1].single_flag=0;
  25. }else if(keys[2].single_flag==1)
  26. {
  27. if(view==0)//检测R38
  28. {
  29. sumR38++;
  30. if(tR38>=SR38_l&&tR38<=SR38_r)//通过
  31. {
  32. R38_flag=1;
  33. PR38++;
  34. }else R38_flag=0;
  35. }
  36. else if(view==1)//加
  37. {
  38. switch(swic)
  39. {
  40. case 0:
  41. {
  42. //R37上限
  43. SR37_r+=0.2;
  44. if(SR37_r>=3.2) SR37_r=2.2;
  45. sumR37=0;
  46. PR37=0;
  47. }
  48. break;
  49. case 1:
  50. {
  51. //R37下限
  52. SR37_l+=0.2;
  53. if(SR37_l>=2.2) SR37_l=1.2;
  54. sumR37=0;
  55. PR37=0;
  56. }
  57. break;
  58. case 2:
  59. {
  60. //R38上限
  61. SR38_r+=0.2;
  62. if(SR38_r>=3.2) SR38_r=2.2;
  63. sumR38=0;
  64. PR38=0;
  65. }
  66. break;
  67. case 3:
  68. {
  69. //R38下限
  70. SR38_l+=0.2;
  71. if(SR38_l>=2.2) SR38_l=1.2;
  72. sumR38=0;
  73. PR38=0;
  74. }
  75. break;
  76. }
  77. }
  78. keys[2].single_flag=0;
  79. }else if(keys[3].single_flag==1)
  80. {
  81. if(view==2)
  82. {
  83. sumR37=sumR38=0;
  84. PR37=PR38=0;
  85. }
  86. else if(view==1)//减
  87. {
  88. switch(swic)
  89. {
  90. case 0:
  91. {
  92. //R37上限
  93. SR37_r-=0.2;
  94. if(SR37_r<=2.0) SR37_r=3.0;
  95. sumR37=0;
  96. PR37=0;
  97. }
  98. break;
  99. case 1:
  100. {
  101. //R37下限
  102. SR37_l-=0.2;
  103. if(SR37_l<=1.0) SR37_l=2.0;
  104. sumR37=0;
  105. PR37=0;
  106. }
  107. break;
  108. case 2:
  109. {
  110. //R38上限
  111. SR38_r-=0.2;
  112. if(SR38_r<=2.0) SR38_r=3.0;
  113. sumR38=0;
  114. PR38=0;
  115. }
  116. break;
  117. case 3:
  118. {
  119. //R38下限
  120. SR38_l-=0.2;
  121. if(SR38_l<=1.0) SR38_l=2.0;
  122. sumR38=0;
  123. PR38=0;
  124. }
  125. break;
  126. }
  127. }
  128. keys[3].single_flag=0;
  129. }
  130. }

led:

  1. void led_proc(void)
  2. {
  3. //定时1s 熄灭
  4. if(uwTick-LD1Tick>=1000)
  5. {
  6. HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);
  7. }
  8. if(uwTick-LD2Tick>=1000)
  9. {
  10. HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_SET);
  11. }
  12. //通过了 先点亮 再过1s进行熄灭
  13. if(R37_flag==1)
  14. {
  15. HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);
  16. LD1Tick=uwTick;
  17. R37_flag=0;
  18. }
  19. if(R38_flag==1)
  20. {
  21. HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_RESET);
  22. LD2Tick=uwTick;
  23. R38_flag=0;
  24. }
  25. //检测当时是哪个界面 点亮对应的灯 否则熄灭
  26. if(view==0)
  27. HAL_GPIO_WritePin(GPIOC,GPIO_PIN_10,GPIO_PIN_RESET);
  28. else
  29. HAL_GPIO_WritePin(GPIOC,GPIO_PIN_10,GPIO_PIN_SET);
  30. if(view==1)
  31. HAL_GPIO_WritePin(GPIOC,GPIO_PIN_11,GPIO_PIN_RESET);
  32. else
  33. HAL_GPIO_WritePin(GPIOC,GPIO_PIN_11,GPIO_PIN_SET);
  34. if(view==2)
  35. HAL_GPIO_WritePin(GPIOC,GPIO_PIN_12,GPIO_PIN_RESET);
  36. else
  37. HAL_GPIO_WritePin(GPIOC,GPIO_PIN_12,GPIO_PIN_SET);
  38. //很重要
  39. HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
  40. HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
  41. }

usart: 

  1. void usart_rx(void)
  2. {
  3. char text[50];
  4. if(p>0)//有接受到数据
  5. {
  6. if(p==3)//是否符合题目要求的位数
  7. {
  8. if(strcmp(rxdata,"R37")==0)
  9. {
  10. //发送数据
  11. sprintf(text,"R37:%d,%d,%.1lf%%\r\n",sumR37,PR37,res37*100);
  12. HAL_UART_Transmit(&huart1,(uint8_t*)text,strlen(text),50);
  13. }else if(strcmp(rxdata,"R38")==0)
  14. {
  15. sprintf(text,"R38:%d,%d,%.1lf%%\r\n",sumR38,PR38,res38*100);
  16. HAL_UART_Transmit(&huart1,(uint8_t*)text,strlen(text),50);
  17. }
  18. }
  19. }
  20. //要清零 很重要
  21. p=0;
  22. memset(rxdata,0,sizeof(rxdata));
  23. }

interrupt.c:

  1. #include "interrupt.h"
  2. #include "usart.h"
  3. struct key keys[4];
  4. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  5. {
  6. if(htim->Instance==TIM3)
  7. {
  8. keys[0].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
  9. keys[1].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
  10. keys[2].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
  11. keys[3].key_sta=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
  12. //状态机消抖
  13. for(int i=0;i<4;i++)
  14. {
  15. switch(keys[i].judge_sta)
  16. {
  17. case 0:
  18. {
  19. if(keys[i].key_sta==0)
  20. {
  21. keys[i].judge_sta=1;
  22. }
  23. break;
  24. }
  25. case 1:
  26. {
  27. if(keys[i].key_sta==0)
  28. {
  29. keys[i].judge_sta=2;
  30. keys[i].single_flag=1;
  31. }else
  32. {
  33. keys[i].judge_sta=0;
  34. }
  35. break;
  36. }
  37. case 2:
  38. {
  39. if(keys[i].key_sta==1)
  40. {
  41. keys[i].judge_sta=0;
  42. keys[i].single_flag=0;
  43. }
  44. break;
  45. }
  46. }
  47. }
  48. }
  49. }
  50. char rxdata[30];
  51. uint p=0;
  52. uint8_t data;
  53. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  54. {
  55. rxdata[p++]=data;
  56. HAL_UART_Receive_IT(&huart1,&data,1);
  57. }

myadc.c:

  1. #include "myadc.h"
  2. double getADC(ADC_HandleTypeDef *hadc)
  3. {
  4. uint adc;
  5. HAL_ADC_Start(hadc);
  6. adc=HAL_ADC_GetValue(hadc);
  7. return adc*3.3/4096;
  8. }

  ----THE END-----

有关蓝桥杯嵌入式的模块知识请参考如下:

蓝桥杯嵌入式模块学习系列

【蓝桥杯嵌入式学习G431】模块一:LED-CSDN博客

【蓝桥杯嵌入式学习G431】模块二:LCD-CSDN博客

【蓝桥杯嵌入式学习G431】模块三:KEY-CSDN博客

【蓝桥杯嵌入式学习G431】模块四:PWM-CSDN博客

【蓝桥杯嵌入式学习G431】模块五:USART-CSDN博客

【蓝桥杯嵌入式学习G431】模块六:ADC-CSDN博客

(还有几个模块没更新~)


有关蓝桥杯嵌入式历届真题请参考如下:

蓝桥杯嵌入式历届真题系列

蓝桥杯嵌入式第十二届省赛--程序设计部分-CSDN博客

蓝桥杯嵌入式第十三届省赛第一场--程序设计部分-CSDN博客

蓝桥杯嵌入式第十五届模拟赛--程序设计部分-CSDN博客

蓝桥杯嵌入式第十四届模拟赛第一期--程序设计部分-CSDN博客

蓝桥杯嵌入式第十三届省赛第二场——程序设计部分-CSDN博客  

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/424744
推荐阅读
相关标签
  

闽ICP备14008679号