蓝桥杯嵌入式第十三届国赛

        笔者参加了今年的第十三届蓝桥杯国赛,取得了国二的成绩,虽然没能拿到国一但依然很开心了。在这里给大家分享我的代码和一些做题思路,希望能凭一己之力提高蓝桥杯嵌入式的水平哈哈哈哈。

一、cubemx配置

 ①整体配置

②UART

③双通道ADC(DMA)

转化后的结果用字也就是32bit

 

 

把连续转换和DMA打开

注意转换顺序也就是这里的排名rank

采样时间不能默认值,要设置为24.5 cycles,不然两个口会相互干扰

 ④输入捕获和输出比较

分频倍频我认为最好的做法

让预分频系数相等

倍频 比较输出的周期=输入捕获的计时器数/2/倍频数

分频 比较输出的周期=输入捕获的计时器数/2*倍频数

A、输入捕获为从模式的复位模式,复位来源是通道二

 

B、比较输出的模式是翻转模式

⑤NVIC中断级分组

⑥时钟配置

 

 

二、代码

 代码我几乎全部写在main.c里面

#include "stdio.h"
#include "string.h"
#include "lcd.h"
#include "i2c.h"
#include "main.h"
#include "adc.h"
#include "dma.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"

void SystemClock_Config(void);

//LED
uint8_t ucled=0x09,ld3_state;
__IO uint32_t LED_tick;
void LED_disp(uint8_t led);

//LCD
uint8_t lstring[25],LCD_state,PARA_cstate,IN_state;
void LCD_pro();

//KEY
uint8_t nkey,okey,ukey,dkey;
__IO uint32_t KEY_tick,KEY_longtick;
uint8_t KEY_scan();
void KEY_pro();

//ADC
uint32_t ADC_val[40],ADC[2];
float V[2];
uint8_t ADC_state;
void ADC_pro();

//UART
uint8_t RX_buf,RX_BUF[128],RX_CNT;
__IO uint32_t UART_tick;
void UART_pro();

//IC
uint32_t IC_circle;
//
uint32_t OC_circle;

//EEPROM
uint8_t eeprom[2];

//USER 
uint8_t PARA[2]={1,1},mode;
float PA4_data[100],PA5_data[100],A[2],T[2],H[2];
uint8_t N[2],loc[2];


int fputc(int c,FILE* stream)
{
    HAL_UART_Transmit(&huart1,(uint8_t*)&c,1,1000);
    return c;
}
int main(void)
{
  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();
  MX_DMA_Init();
  MX_ADC2_Init();
  MX_TIM2_Init();
  MX_TIM17_Init();
  MX_USART1_UART_Init();
    LCD_Init();
    I2CInit();
    LED_disp(ucled);
    
    HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);
    HAL_TIM_OC_Start_IT(&htim17,TIM_CHANNEL_1);
    
    HAL_ADC_Start_DMA(&hadc2,ADC_val,40);
    
    HAL_UART_Receive_IT(&huart1,&RX_buf,1);
    
    I2CRead(eeprom,0,2);
    if(eeprom[0]>=1&&eeprom[0]<=4&&eeprom[1]>=1&&eeprom[1]<=4)
    {
        PARA[1]=eeprom[0];
        PARA[0]=eeprom[1];
    }
//    if(eeprom[2]==0x65&&eeprom[3]==0x99&&eeprom[4]==0xfa)//第一次上电检测
//    {
//        memcpy(PARA,eeprom,2);
//    }
//    else
//    {
//        memcpy(eeprom,PARA,2);
//        eeprom[2]=0x65;eeprom[3]=0x99;eeprom[4]=0xfa;
//        I2CWrite(eeprom,0,5);
//    }
    LCD_Clear(Black);
    LCD_SetBackColor(Black);
    LCD_SetTextColor(White);
//    LCD_DisplayStringLine(Line1, (uint8_t *)"        DATA        ");//LCD的显示调试
//    LCD_DisplayStringLine(Line3, (uint8_t *)"     PA4=3.02       ");
//    LCD_DisplayStringLine(Line4, (uint8_t *)"     PA5=3.02       ");
//    LCD_DisplayStringLine(Line5, (uint8_t *)"     PA1:2046       ");
//    
//    LCD_DisplayStringLine(Line1, (uint8_t *)"        PARA        ");
//    LCD_DisplayStringLine(Line3, (uint8_t *)"     X=1            ");
//    LCD_DisplayStringLine(Line4, (uint8_t *)"     Y=1            ");
//    
//    LCD_DisplayStringLine(Line1, (uint8_t *)"        REC-PA4     ");
//    LCD_DisplayStringLine(Line3, (uint8_t *)"     N=23           ");
//    LCD_DisplayStringLine(Line4, (uint8_t *)"     A=3.02         ");
//    LCD_DisplayStringLine(Line5, (uint8_t *)"     T=3.02         ");
//    LCD_DisplayStringLine(Line6, (uint8_t *)"     H=1.52         ");

  while (1)
  {
        KEY_pro();
        LCD_pro();
        ADC_pro();
        UART_pro();
  }
}

void LED_disp(uint8_t led)
{
    GPIOC->ODR=~led<<8;
    HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}

uint8_t KEY_scan()
{
    if(!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)) return 1;
    if(!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)) return 2;
    if(!HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)) return 3;
    if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)) return 4;
    return 0;
}

void KEY_pro()
{
    if(uwTick-KEY_tick<5) return;
    KEY_tick=uwTick;
    nkey=KEY_scan();
    dkey=nkey&(nkey^okey);
    ukey=~nkey&(nkey^okey);
    
    if(dkey)
    {
        KEY_longtick=uwTick;
    }
    if(LCD_state==2)
    {
        if(uwTick-KEY_longtick<1000)
        {
                if(ukey==4)
                {
                    IN_state=!IN_state;
                }
        }
        else
        {
            if(ukey==4)
            {
                if(IN_state)
                {
                    memset(PA5_data,0,sizeof(PA5_data));
                    N[1]=0;
                    A[1]=0;
                    T[1]=0;
                    H[1]=0;
                    loc[1]=0;
                }
                else
                {
                    memset(PA4_data,0,sizeof(PA4_data));
                    N[0]=0;
                    A[0]=0;
                    T[0]=0;
                    H[0]=0;
                    loc[0]=0;
                }
            }
        }
    }
    if(okey!=nkey)
    {
        switch(nkey)
        {
            case 1:
            {
                LCD_Clear(Black);
                LCD_state=(LCD_state+1)%3;

                if(LCD_state==2){IN_state=0;}
                break;
            }
            case 2:
            {
                if(LCD_state==1)
                {
                    PARA[0]=(PARA[0])%4+1;
                    I2CWrite(PARA,1,1);
                }
                break;
            }
            case 3:
            {
                if(LCD_state==1)
                {
                    PARA[1]=PARA[1]%4+1;
                    I2CWrite(PARA+1,0,1);
                    if(V[0]>V[1]*PARA[1]&&ld3_state!=1)
                    {
                        ld3_state=1;
                        LED_tick=uwTick;
                    }
                    if(V[0]<=V[1]*PARA[1]&&ld3_state!=0)
                    {
                        ld3_state=0;
                        LED_disp(ucled&=~0x04);
                    }
                }
                break;
            }
            case 4:
            {
                if(LCD_state!=2)
                {
                    if(LCD_state==0)
                    {
                        ADC_state=1;
                    }
                    else
                    {
                        LED_disp(ucled^=0x03);
                        mode=!mode;
                    }
                }
                break;
            }
        }
    }
    okey=nkey;
}

void LCD_pro()
{
    switch(LCD_state)
    {
        case 0:
        {
            LCD_DisplayStringLine(Line1, (uint8_t *)"        DATA        ");
            sprintf((char*)lstring,"     PA4=%.2f       ",V[0]);
            LCD_DisplayStringLine(Line3,lstring);
            sprintf((char*)lstring,"     PA5=%.2f       ",V[1]);
            LCD_DisplayStringLine(Line4,lstring);
            sprintf((char*)lstring,"     PA1:%d       ",(uint32_t)(1000000.0/IC_circle+0.5));
            LCD_DisplayStringLine(Line5,lstring);
            break;
        }
        case 1:
        {
            LCD_DisplayStringLine(Line1, (uint8_t *)"        PARA        ");
            sprintf((char*)lstring,"     X=%d            ",PARA[0]);
            LCD_DisplayStringLine(Line3,lstring);
            sprintf((char*)lstring,"     Y=%d            ",PARA[1]);
            LCD_DisplayStringLine(Line4,lstring);
            break;
        }
        case 2:
        {
            sprintf((char*)lstring,"        REC-PA%d     ",IN_state+4);
            LCD_DisplayStringLine(Line1,lstring);
            sprintf((char*)lstring,"     N=%d           ",N[IN_state]);
            LCD_DisplayStringLine(Line3,lstring);
            sprintf((char*)lstring,"     A=%.2f           ",A[IN_state]);
            LCD_DisplayStringLine(Line4,lstring);
            sprintf((char*)lstring,"     T=%.2f           ",T[IN_state]);
            LCD_DisplayStringLine(Line5,lstring);
            sprintf((char*)lstring,"     H=%.2f           ",H[IN_state]);
                LCD_DisplayStringLine(Line6,lstring);
            break;
        }
    }
}

void ADC_pro()
{
    if(ADC_state)
    {
        ADC_state=0;
        ADC[0]=0;
        ADC[1]=0;
        for(int i=0;i<20;i++)
        {
            ADC[0]+=ADC_val[2*i];
            ADC[1]+=ADC_val[2*i+1];
        }
        ADC[0]=(uint32_t)(ADC[0]/20.0+0.5);
        ADC[1]=(uint32_t)(ADC[1]/20.0+0.5);
        
        V[0]=ADC[0]*3.3/4096;
        V[1]=ADC[1]*3.3/4096;
        
        
        PA4_data[loc[0]]=V[0];
        PA5_data[loc[1]]=V[1];
        
        loc[0]=(loc[0]+1)%100;
        loc[1]=(loc[1]+1)%100;
        
        if(V[0]>V[1]*PARA[1]&&ld3_state!=1)
        {
            ld3_state=1;
            LED_tick=uwTick;
        }
        if(V[0]<=V[1]*PARA[1]&&ld3_state!=0)
        {
            ld3_state=0;
            LED_disp(ucled&=~0x04);
        }
        
        
        if(N[0]!=100)
        {
            N[0]++;
        }
        if(N[1]!=100)
        {
            N[1]++;
        }
        
        A[0]=T[0]=PA4_data[0];
        A[1]=T[1]=PA5_data[0];
        H[0]=0;
        H[1]=0;
        for(int i=0;i<N[0];i++)
        {
            if(A[0]<PA4_data[i])
            {
                A[0]=PA4_data[i];
            }
            if(T[0]>PA4_data[i])
            {
                T[0]=PA4_data[i];
            }
            H[0]+=PA4_data[i];
        }
        for(int i=0;i<N[1];i++)
        {
            if(A[1]<PA5_data[i])
            {
                A[1]=PA5_data[i];
            }
            if(T[1]>PA5_data[i])
            {
                T[1]=PA5_data[i];
            }
            H[1]+=PA5_data[i];
        }
        H[0]=H[0]/N[0];
        H[1]=H[1]/N[1];
    }
}

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    IC_circle=HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_2);
}

void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
{
    uint16_t cnt;
    cnt=HAL_TIM_ReadCapturedValue(&htim17,TIM_CHANNEL_1);
    if(mode)
    {
        __HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,cnt+IC_circle/2*PARA[0]);
    }
    else
    {
        __HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,cnt+IC_circle/2/PARA[0]);
    }
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    RX_BUF[RX_CNT++]=RX_buf;
    if(RX_CNT>=127)
    {
        RX_CNT=0;
        HAL_UART_Transmit(&huart1,(uint8_t*)"error",5,1000);
    }
    else
    {
        UART_tick=uwTick;
    }
    HAL_UART_Receive_IT(&huart1,&RX_buf,1);
}
void UART_pro()
{
    if(RX_CNT&&uwTick-UART_tick>3)
    {
        if(memcmp(RX_BUF,"X",1)==0&&RX_CNT==1)
        {
            printf("X:%d\r\n",PARA[0]);
        }
        else if(memcmp(RX_BUF,"Y",1)==0&&RX_CNT==1)
        {
            printf("Y:%d\r\n",PARA[1]);
        }
        else if(memcmp(RX_BUF,"PA1",3)==0&&RX_CNT==3)
        {
            printf("PA1:%d\r\n",(uint32_t)(1000000.0/IC_circle+0.5));
        }
        else if(memcmp(RX_BUF,"PA4",3)==0&&RX_CNT==3)
        {
            printf("PA4:%.2f\r\n",V[0]);
        }
        else if(memcmp(RX_BUF,"PA5",3)==0&&RX_CNT==3)
        {
            printf("PA5:%.2f\r\n",V[1]);
        }
        else if(memcmp(RX_BUF,"#",1)==0&&RX_CNT==1)
        {
            LCD_mode=!LCD_mode;
            LCD_Clear(Black);
            LED_disp(ucled^=0x08);
        }
        else printf("error!\r\n");
        RX_CNT=0;
    }
}

/**
  * @brief This function handles System tick timer.
  */
void SysTick_Handler(void)
{

  HAL_IncTick();
    if(ld3_state)
    {
        if(uwTick-LED_tick==100)
        {
            LED_tick=uwTick;
            LED_disp(ucled^=0x04);
        }
    }
}

难点LCD翻转

 我采用的方法是改两个函数,使用了extern LCD_mode

但最好的方法应该是写寄存器使LCD的扫描方向改变

 最后把我的分数估一下,以后让你们有一个参考

 我是客观题错五个左右+eeprom存错位置+LD3一个小问题+每次切换到ADC数据页面时没有默认PA4+LCD切换翻转了但是字母左右是反的

最终估分85分左右

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 蓝桥杯嵌入式第十三届省赛题目pdf是指蓝桥杯嵌入式程序设计竞赛第十三届省级赛事的题目文档,采用PDF格式。蓝桥杯嵌入式程序设计竞赛是中国高校计算机类专业的一项大型赛事,旨在发掘和培养具有创新能力和实践能力的嵌入式程序设计人才。 这份题目文档是参赛选手参加赛事时必须仔细阅读和理解的重要材料。文档中包含了若干题目,每道题目给出了对应的要求和限制条件。这些题目旨在考察选手的嵌入式程序设计能力,要求选手能够使用某种特定的硬件平台和开发工具,通过编程实现给定的功能。 选手需要根据题目要求,进行代码设计和编写,并在规定的时间内完成。在比赛过程中,选手需要充分发挥自己的创造力和动手能力,灵活运用所学的嵌入式开发技术,对硬件进行编程和控制。 通过参加蓝桥杯嵌入式竞赛,选手能够不仅加深对嵌入式程序设计的理解和实践,还能锻炼自己的团队协作能力和解决问题的能力。同时,竞赛还为参赛选手提供了展示自己才华和技能的平台,有助于提升个人的竞争力和就业前景。 蓝桥杯嵌入式第十三届省赛题目pdf对于参赛选手来说,是一份重要的参考资料,提前熟悉并深入理解题目要求和限制条件,对于比赛的顺利进行和取得好成绩具有重要意义。因此,选手需要认真阅读文档内容,并在赛前做好充分的准备。 ### 回答2: 《蓝桥杯嵌入式第十三届省赛题目pdf》是指蓝桥杯嵌入式系统开发大赛第十三届省赛的题目所在的pdf文档。 嵌入式系统开发大赛是一个国内知名的比赛,旨在培养和选拔优秀的嵌入式系统开发人才。每届比赛都会发布一系列的题目,供参赛选手选择并完成。这些题目通常涉及到嵌入式系统的设计、开发、调试和优化,考察选手在硬件和软件层面的能力。 所以,《蓝桥杯嵌入式第十三届省赛题目pdf》所指的文档,应该是包含了该届比赛的题目内容,以供参赛选手进行参考和分析。这份pdf文档可能会包含多个题目,每个题目都会描述需求、规定技术要求和评分标准等内容。选手需要根据题目要求进行系统设计和编程,并在规定时间内提交作品。 参加该比赛的选手通过完成这份《蓝桥杯嵌入式第十三届省赛题目pdf》所包含的题目,可以展示他们在嵌入式系统开发方面的综合能力,包括硬件设计、嵌入式编程、系统优化和问题解决能力等。这对于他们今后在嵌入式系统领域的发展和就业都具有重要的意义。 总而言之,《蓝桥杯嵌入式第十三届省赛题目pdf》是一份比赛题目文档,对于参赛选手来说是进行准备和实践的重要资料。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值