当前位置: 代码网 > 科技>人工智能>VR/AR虚拟现实 > 蓝桥杯嵌入式14届4T模拟题1

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

2024年08月01日 VR/AR虚拟现实 我要评论
(4)串口收到其他非法字符时(除字符‘1’到字符‘9’外的其他字符均为非法字符),返回固定字符串‘error’,串口未收到字符,不返回任何内容。1)数据界面包含三个显示要素:界面名称(DATA)、采集的实时电压数据(VR37)、脉冲信号频率(PA7)。2)B2:定义为“电压参数调整”按键,在参数界面下,每次按下此按键,电压参数增加0.3。调整顺序如下图所示。3)B3:在数据界面下,定义为“频率调整”按键,每次按下此按键,频率增加1KHz。1)B1:定义为“切换”按键,按下此按键,切换数据界面与参数界面。

 思路分析:

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

一、基本要求


使用大赛组委会提供的新版本嵌入式竞赛实训平台(基于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;
                }
     }

}

 

 

 

 

 

 

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com