当前位置:   article > 正文

蓝桥杯嵌入式14届4T模拟题1_4t蓝桥杯

4t蓝桥杯

 思路分析:

题目总的来说很基础,话不多说,直接看题!

一、基本要求


使用大赛组委会提供的新版本嵌入式竞赛实训平台(基于STM32G431RBT6微控制器设计),完成本试题的程序设计与调试。程序编写、调试完成后,选手需通过考试系统提交以准考证号命名的hex文件。

hex文件是唯一成绩评测依据,不符合以上文件提交要求的作品将被评为零分或者被酌情扣分。

二、硬件框图


图1 系统硬件框图

三、功能描述


3.1 基本功能

1)测量电位器R37输出的模拟电压信号VR37。

2)通过PA7引脚输出脉冲信号,通过串口控制脉冲信号占空比,输出频率可以通过按键调节。

3)通过按键实现界面的切换、电压参数和频率参数的调节。

4)通过LED和LCD完成数据显示和指示功能。

3.2 显示功能

1)数据界面包含三个显示要素:界面名称(DATA)、采集的实时电压数据(VR37)、脉冲信号频率(PA7)。

     图2 数据界面图示

采集电压数据保留小数点后2位有效数字,单位为V。

频率数据单位为Hz。

2)参数界面包含两个显示要素:界面名称(PARA)、电压参数(VP1)。

  图3 参数界面图示

电压参数保留小数点后1位有效数字,单位为V。

显示说明

(1)显示背景颜色(BackColor):黑色。

(2)显示字体颜色(TextColor):白色。

(3)请严格按照图示要求设计各个信息项的名称(区分字母大小写)和相对行列位置。

3.3 按键功能

1)B1:定义为“切换”按键,按下此按键,切换数据界面与参数界面。调整顺序如下图所示。

图4 B1“切换”顺序

2)B2:定义为“电压参数调整”按键,在参数界面下,每次按下此按键,电压参数增加0.3。调整顺序如下图所示。

注意:在数据界面下,按下按键B2无任何功能。

图4 B5“电压参数调整”顺序

3)B3:在数据界面下,定义为“频率调整”按键,每次按下此按键,频率增加1KHz。调整顺序如下图所示。

图5 B3“频率调整”顺序

备注:频率可调节范围1KHz - 10KHz。

注意:判断按键是否按下时,需进行消抖操作,避免单次按键操作,触发多次结果。

3.4 串口通信功能

使用入式新版本竞赛平台USART1完成串口通信功能。

通信波特率设置:9600 bps。

串口通信功能设计要求:

(1)串口收到字符‘1’,PA7引脚输出的脉冲信号占空比为10%;

(2)串口收到字符‘2’,PA7引脚输出的脉冲信号的占空比为20%;

(3)以此类推到串口收到字符‘9’,将PA7引脚输出的脉冲信号的占空比调节为90%;

(4)串口收到其他非法字符时(除字符‘1’到字符‘9’外的其他字符均为非法字符),返回固定字符串‘error’,串口未收到字符,不返回任何内容。

3.5 LED指示灯功能

1)数据界面时,指示灯LD1点亮,否则LD1熄灭。

2)参数界面时,指示灯LD2点亮,否则LD2熄灭。

3)当VR37>VP1时,指示灯LD3以0.1s秒为间隔切换亮灭状态,闪烁报警

4)LD3-LD8均处于熄灭状态。

3.6 初始状态说明

1)上电后处于数据显示界面。

2)上电时,频率为1kHz,占空比为10%。默认电压参数为0.3V。

备注:请严格按照此初始状态设计功能。

1.首先是AD采样的实现  看原理图如下,

去cubemx 里面配置,

把IN11选到Sing_ended,另一个配置同样即可。

LCD模块比赛的时候直接复制官方给的例程即可,如果要自己配置的话,对着原理图把对应的引脚设置为GPIO_Output即可,

关于led的在设置PD2为GPIO_Output即可,然后GPIO配置右边记得把led对应的引脚电平拉高。

key的话把对应的引脚设置为GPIO_input,在把电阻设置为上拉即可。以下配置都查看原理图得到更进一步得理解。

 

 

 

打开中断

 

 定时器4用来当作按键消抖

 

 思路看题目来做即可

 

 

 

void led_proc(void)
{  if(uwTick-led_tick<100) return;
     led_tick=uwTick;
 if(page==0) uled|=0x01;
 else   uled&=~(0x01);    
 if(page==1) uled|=0x02;    
 else   uled&=~(0x02);    
 if(get_ADC(&hadc2)>VP1)
 {
    uled^=0x04;
 }
 else  uled&=~(0x04);
 led(uled);
}
void key_proc(void)
{
   if(key[0].key_flag==1)
     {
         page=!page;
             LCD_Clear(Black);
         key[0].key_flag=0;
     }
     if(key[1].key_flag==1)
     {
         if(page==1)
             {
                VP1+=0.3;
                  if(VP1>3.3)  VP1=0;
             }
         key[1].key_flag=0;
     }
     if(key[2].key_flag==1)
     {   
           if(page==0)
             {
               pa7_hz+=1000;
                 if(pa7_hz>10000) pa7_hz=1000;
             }
         TIM3->ARR=1000000/pa7_hz-1;
//             LCD_Clear(Black);
             
         key[2].key_flag=0;
     }
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
     if(rx_buff[0]=='1')  duty=10;
     if(rx_buff[0]=='2')  duty=20;
     if(rx_buff[0]=='3')  duty=30;
     if(rx_buff[0]=='4')  duty=40;
     if(rx_buff[0]=='5')  duty=50;
   if(rx_buff[0]=='6')  duty=60;
     if(rx_buff[0]=='7')  duty=70;
     if(rx_buff[0]=='8')  duty=80;
     if(rx_buff[0]=='9')  duty=90;
     if(rx_buff[0]>'9'||rx_buff[0]<'1')
    {
       
          sprintf(tx_buff,"error\r\n");
          HAL_UART_Transmit(&huart1,(uint8_t *)tx_buff,sizeof(tx_buff),50);
    }
    
    __HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_2,duty);
  
  HAL_UART_Receive_IT(&huart1,(uint8_t *)rx_buff,1);
}
void lcd_proc(void)
{
   if(page==0)
     {  
          sprintf(string,"        DATA        ");
        LCD_DisplayStringLine(Line2, (unsigned char *)string);
          sprintf(string,"      VR37:%.2fV        ",get_ADC(&hadc2));
        LCD_DisplayStringLine(Line4, (unsigned char *)string);
          sprintf(string,"      PA7:%dHZ        ",pa7_hz);
        LCD_DisplayStringLine(Line6, (unsigned char *)string);
          
          sprintf(string,"      Duty:%d%%        ",duty);
        LCD_DisplayStringLine(Line8, (unsigned char *)string);
     }
     if(page==1)
     {  
          sprintf(string,"        PARA        ");
        LCD_DisplayStringLine(Line4, (unsigned char *)string);
          sprintf(string,"      VP1:%.1fV        ",VP1);
        LCD_DisplayStringLine(Line6, (unsigned char *)string);
          
          sprintf(string,"      Duty:%d%%        ",duty);
        LCD_DisplayStringLine(Line8, (unsigned char *)string);
          
     }
}
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].key_flag=1; 
                             }
                             else  key[i].judge_sta=0;
                       break;
                    case 2:
                           if(key[i].key_sta==1) key[i].judge_sta=0;
                       break;
                }
     }

}

 

 

 

 

 

 

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

闽ICP备14008679号