当前位置:   article > 正文

第十一届蓝桥杯嵌入式研究生组赛题_蓝桥杯复查有用吗

蓝桥杯复查有用吗

成绩已经出来了,很难受没有得奖,本来预计能拿到二等,结果连三等都没混上,思前想后只有两种可能:

①我自己提交的axf文件出了问题  ②题目太简单,这届实力太强

复查结果出来了,确认是自己犯了低级错误,提交的axf文件无效,放在这里,希望自己和后来者引以为戒

虽然没得奖,但这也是一次难忘的经历,15天的强训,中午也在实验室敲代码,还有一个小伙伴和我一起学习,互相讨论,没得奖虽有遗憾,但也不后悔,希望自己总结经验教训,留足时间,细致检查。我的第十一届蓝桥杯正式落幕,明年再战。

记忆版本

研究生组的试题与大学组的区别

主观题(程序设计)部分在大学组的基础上:增加了数据显示界面按下B3交换PA6、PA7输出PWM波形频率

客观题(选择)部分在大学组的基础上:加了5个选择,共15个选择题

【主观题部分-编程】

目的:让PA6、PA7输出固定频率,不同占空比的PWM波形

初始输出状态为:

(1)PA6输出100Hz,占空比10%的PWM波形

(2)PA7输出200Hz,占空比10%的PWM波形

占空比调节方法:根据电压值自动控制占空比,或根据按键手动控制占空比

【LCD模块】

设计界面有数据显示界面、参数显示界面,背景为黑色、字体为白色

数据显示界面显示:电压值、工作模式

参数显示界面显示:PA6占空比、PA7占空比

【LED模块】

使用LED灯作为状态指示

自动模式下,LD2亮;手动模式下,LD2灭

数据显示界面下,LD1亮;参数显示界面下LD1灭

【Timer模块】

扫描按键时间不大于10ms

adc采样间隔不大于0.1s

【KEY模块】

按下B1,切换数据显示界面和参数显示界面

参数显示界面下,按下B2,增加PA6输出PWM波的占空比,步进值10%,调节范围10%~90%,当增加到90%后,下一次按下回到10%

参数显示界面下,按下B3,增加PA7输出PWM波的占空比,步进值10%,调节范围10%~90%,当增加到90%后,下一次按下回到10%

按下B4,切换自动模式和手动模式

数据显示界面下,按下B3,交换PA6和PA7输出PWM波形的频率

【ADC模块】

采集电位器R37(PB0)的电压值,作为自动控制PWM波形的调节参数

【PWM模块】

使用TIM3的通道1(PA6)、通道2(PA7)输出PWM波形,频率固定,占空比可调节

PWM控制策略

自动模式:占空比转换公式,VR37 = 3.3 * D,其中,VR37为电压值,D为占空比

(1)电压值为0V时,PA6、PA7持续输出低电平

(2)电压值为3.3V时,PA6、PA7持续输出高电平

(3)电压值在0~3.3V之间,输出电压值对应的占空比波形

手动模式:通过按键调节PA6、PA7输出波形的占空比

系统上电后默认为数据显示界面,工作模式为自动模式,默认参数为PA6频率100Hz,占空比10%,PA7频率200Hz,占空比10%

系统性能要求:

按键消抖处理,按键响应时间不大于10ms

adc刷新时间不大于0.1s

输出频率精度误差范围±5%

输出占空比精度误差范围±5%

.......

main.c

  1. /*
  2. 程序说明: 第十一届蓝桥杯大赛嵌入式-第二场
  3. 软件环境: Keil uVision 4.11
  4. 硬件环境: CT117E嵌入式竞赛板(代码兼容ILI932X系列、uc8230液晶控制器)
  5. 日 期: 2020年10月22日
  6. 作 者:乐观的lishan
  7. */
  8. #include "stm32f10x.h"
  9. #include "lcd.h"
  10. #include "stdio.h"
  11. #include "led.h"
  12. #include "timer.h"
  13. #include "key.h"
  14. #include "adc.h"
  15. #include "pwm.h"
  16. u32 TimingDelay = 0;
  17. u8 data_buf[20];
  18. u8 Mode = 0;
  19. u8 Figure = 0;
  20. u16 adc_value = 0;
  21. float volt_value = 3.02;
  22. u8 flag_manu_pwm = 0;
  23. u8 flag_auto_pwm = 0;
  24. u8 PA6_Duty_Para = 10;
  25. u8 PA7_Duty_Para = 10;
  26. u8 PA6_Freq_Para = 100;
  27. u8 PA7_Freq_Para = 200;
  28. void Delay_Ms(u32 nTime);
  29. void Show_Data(void);
  30. void Show_Para(void);
  31. void LCD_Show(void);
  32. void PWM_Control(void);
  33. //Main Body
  34. int main(void)
  35. {
  36. SysTick_Config(SystemCoreClock/1000);
  37. Delay_Ms(200);
  38. STM3210B_LCD_Init();
  39. LCD_Clear(Black);
  40. LCD_SetBackColor(Black);
  41. LCD_SetTextColor(White);
  42. LED_Init();
  43. TIM4_Init();
  44. ADC_Channel_8_Init();
  45. KEY_Init();
  46. LED_Control(LD1,1);
  47. LED_Control(LD2,1);
  48. //测试PWM波输出
  49. // TIM3_PWM_OCToggle();
  50. // TIM3_PWM_CH1(100,0.1);
  51. // TIM3_PWM_CH2(200,0.1);
  52. //测试持续输出高、低电平
  53. // TIM3_Normal();
  54. // GPIO_ResetBits(GPIOA, GPIO_Pin_6);
  55. // GPIO_SetBits(GPIOA, GPIO_Pin_7);
  56. while(1)
  57. {
  58. LCD_Show();
  59. PWM_Control();
  60. if(flag_10ms)
  61. {
  62. flag_10ms = 0;
  63. KEY_Read();
  64. KEY_Process();
  65. }
  66. if(flag_80ms)
  67. {
  68. flag_80ms = 0;
  69. adc_value = ADC_GetConversionValue(ADC1);
  70. volt_value = adc_value * 3.3 / 4095;
  71. }
  72. }
  73. }
  74. //
  75. void Delay_Ms(u32 nTime)
  76. {
  77. TimingDelay = nTime;
  78. while(TimingDelay != 0);
  79. }
  80. void LCD_Show(void)
  81. {
  82. if(Figure) //参数界面
  83. {
  84. Show_Para();
  85. }
  86. else //数据界面
  87. {
  88. Show_Data();
  89. }
  90. }
  91. void Show_Data(void)
  92. {
  93. LCD_DisplayStringLine(Line0, " Data");
  94. sprintf((char*)data_buf, " V:%.2fV", volt_value);
  95. LCD_DisplayStringLine(Line2, data_buf);
  96. if(Mode) //手动模式
  97. {
  98. LCD_DisplayStringLine(Line4, " Mode:MANU");
  99. }
  100. else
  101. {
  102. LCD_DisplayStringLine(Line4, " Mode:AUTO");
  103. }
  104. //验证AD采集数字量
  105. // sprintf((char*)data_buf, " AD:%4d", adc_value);
  106. // LCD_DisplayStringLine(Line6, data_buf);
  107. }
  108. void Show_Para(void)
  109. {
  110. LCD_DisplayStringLine(Line0, " Para");
  111. sprintf((char*)data_buf, " PA6:%2d%%", PA6_Duty_Para);
  112. LCD_DisplayStringLine(Line2, data_buf);
  113. sprintf((char*)data_buf, " PA7:%2d%%", PA7_Duty_Para);
  114. LCD_DisplayStringLine(Line4, data_buf);
  115. //验证频率变化情况
  116. // sprintf((char*)data_buf, " PA6:%3dHz", PA6_Freq_Para);
  117. // LCD_DisplayStringLine(Line6, data_buf);
  118. //
  119. // sprintf((char*)data_buf, " PA7:%3dHz", PA7_Freq_Para);
  120. // LCD_DisplayStringLine(Line7, data_buf);
  121. }
  122. void PWM_Control(void)
  123. {
  124. if(Mode) //手动模式
  125. {
  126. if(flag_manu_pwm == 0)
  127. {
  128. flag_manu_pwm = 1;
  129. flag_auto_pwm = 0;
  130. TIM3_PWM_OCToggle();
  131. }
  132. else
  133. {
  134. TIM3_PWM_CH1(PA6_Freq_Para, PA6_Duty_Para/100.f);
  135. TIM3_PWM_CH2(PA7_Freq_Para, PA7_Duty_Para/100.f);
  136. }
  137. }
  138. else
  139. {
  140. if(adc_value <= 6) //电压0V
  141. {
  142. flag_auto_pwm = 0;
  143. flag_manu_pwm = 0;
  144. TIM3_Normal();
  145. GPIO_ResetBits(GPIOA, GPIO_Pin_6);
  146. GPIO_ResetBits(GPIOA, GPIO_Pin_7);
  147. }
  148. else if(adc_value >= 4095-6 && adc_value <= 4095) //电压3.3V
  149. {
  150. flag_auto_pwm = 0;
  151. flag_manu_pwm = 0;
  152. TIM3_Normal();
  153. GPIO_SetBits(GPIOA, GPIO_Pin_6);
  154. GPIO_SetBits(GPIOA, GPIO_Pin_7);
  155. }
  156. else //电压0~3.3V
  157. {
  158. if(flag_auto_pwm == 0)
  159. {
  160. flag_auto_pwm = 1;
  161. flag_manu_pwm = 0;
  162. TIM3_PWM_OCToggle();
  163. }
  164. else
  165. {
  166. TIM3_PWM_CH1(PA6_Freq_Para, adc_value/4095.f);
  167. TIM3_PWM_CH2(PA7_Freq_Para, adc_value/4095.f);
  168. }
  169. }
  170. }
  171. }

 key.c

  1. /*
  2. 程序说明: CT117E嵌入式竞赛板KEY驱动程序
  3. 软件环境: Keil uVision 4.10
  4. 硬件环境: CT117E嵌入式竞赛板(代码兼容ILI932X系列、uc8230液晶控制器)
  5. 日 期: 2013-10-9
  6. */
  7. #include "key.h"
  8. #include "lcd.h"
  9. #include "led.h"
  10. u8 ReadData = 0;
  11. u8 key1_press = 0;
  12. u8 key2_press = 0;
  13. u8 key3_press = 0;
  14. u8 key4_press = 0;
  15. u8 key1_time = 0;
  16. u8 key2_time = 0;
  17. u8 key3_time = 0;
  18. u8 key4_time = 0;
  19. void KEY_Init(void)
  20. {
  21. GPIO_InitTypeDef GPIO_InitStructure;
  22. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
  23. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  24. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_8;
  25. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  26. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  27. GPIO_Init(GPIOA, &GPIO_InitStructure);
  28. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
  29. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  30. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  31. GPIO_Init(GPIOB, &GPIO_InitStructure);
  32. }
  33. void KEY_Read(void)
  34. {
  35. ReadData = ~(KEYPORT);
  36. if(ReadData == 0x01){++key1_time;}
  37. else if(ReadData == 0x02){++key2_time;}
  38. else if(ReadData == 0x04){++key3_time;}
  39. else if(ReadData == 0x08){++key4_time;}
  40. if(ReadData == 0)
  41. {
  42. if(key1_time > 0){key1_press = 1;}
  43. else if(key2_time > 0){key2_press = 1;}
  44. else if(key3_time > 0){key3_press = 1;}
  45. else if(key4_time > 0){key4_press = 1;}
  46. }
  47. }
  48. void KEY_Process(void)
  49. {
  50. if(key1_press)
  51. {
  52. if(Figure)
  53. {
  54. Figure = 0; //数据界面
  55. LED_Control(LD2,1);
  56. }
  57. else
  58. {
  59. Figure = 1; //参数界面
  60. LED_Control(LD2,0);
  61. }
  62. LCD_Clear(Black);
  63. }
  64. else if(Figure && key2_press)
  65. {
  66. PA6_Duty_Para += 10;
  67. if(PA6_Duty_Para > 90)
  68. {
  69. PA6_Duty_Para = 10;
  70. }
  71. }
  72. else if(Figure && key3_press)
  73. {
  74. PA7_Duty_Para += 10;
  75. if(PA7_Duty_Para > 90)
  76. {
  77. PA7_Duty_Para = 10;
  78. }
  79. }
  80. else if(Figure == 0 && key3_press)
  81. {
  82. u8 temp;
  83. temp = PA7_Freq_Para;
  84. PA7_Freq_Para = PA6_Freq_Para;
  85. PA6_Freq_Para = temp;
  86. }
  87. else if(key4_press)
  88. {
  89. if(Mode)
  90. {
  91. Mode = 0; //自动
  92. LED_Control(LD1,1);
  93. }
  94. else
  95. {
  96. Mode = 1; //手动
  97. LED_Control(LD1,0);
  98. }
  99. }
  100. if(ReadData == 0)
  101. {
  102. key1_time = 0; key2_time = 0; key3_time = 0; key4_time = 0;
  103. key1_press = 0; key2_press = 0; key3_press = 0; key4_press = 0;
  104. }
  105. }

使用Keil软件的逻辑分析仪

按下Ctrl+F5,进入调试模式

测试输出固定频率、占空比的PWM波形 

 

 测试持续输出高低电平

 示波器测试

图中测试结果:

频率:200Hz,占空比:40.00%

完整的测试视频:  第十一届蓝桥杯大赛省赛嵌入式第二场试题_哔哩哔哩_bilibili

              视频测试

【客观题部分-选择】

客观题部分共15个选择题

 (11)一般嵌入式系统设计时不追求的目标是()

             A.低功耗   B.低成本   C.实时性    D.高性能

(12)以下可作为高速数据缓存的器件是()

             A.Flash   B.DRAM   C.EEPROM    D.SRAM

(13)

(14)

(15)以下是典型的文件格式的有()

             A.NTFS   B.FAT32   C.DOS    D.EXT

仅供参考:

(1)B       (2)B      (3)A       (4)B    (5)C

(6)A       (7)AB   (8)BD    (9)B    (10)B

(11)D   (12)D  (13)        (14)     (13)ABD

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

闽ICP备14008679号