蓝桥杯嵌入式比赛经验分享

比了两届蓝桥杯,最后以国二收场,也算心满意足!

 

一.我的蓝桥杯

我复习蓝桥杯,是1月份开始的,由于中间还要搞"毕业设计" "大学生创新创业作品展示""互联网+创新创业大赛""帮朋友做毕业设计 ""搞一些小项目赚钱""考掉计算机四级"……初赛复习时间40天左右,国赛复习时间7天主要原因感觉国一没戏)。没时间复习的同学,不要太紧张!

 

 

二.教程

一家叫做"大科工作室"的淘宝店的资料不错,为了获奖钱还是要花的!

一般网上的蓝桥杯的教程,都带有防录屏的能力,在使用的时候会有很多不便。比如复制代码

三.我的程序

我写的第7届决赛的程序:链接:https://pan.baidu.com/s/1WU3doeiucjEMnyLQ5wH2lw 提取码:cm4f

在初赛前一个星期写的,为了满足5小时完成程序的要求,程序写的不怎么样!还望见谅。

 

四.比赛的时候,你有可能会遇到几个问题:

1.是边写程序边测试,还是写完程序再测试(我选择后者)

2.是自己建立工程,还是使用官方提供的例程工程(我选择后者)

3.比赛开始才写代码,还是先偷偷的写(我选择后者)

4.遇到解决不了的问题怎么办(千差万别)

(一)iic出错(单片机赛项)

(二)开发板损坏(有的时候损坏的很诡异,你是相信自己,还是相信开发板。一次机会哦!)

(三)电脑电源出问题,没有保存文件(在我同一考场有人有过)

(四)遇到自己没有预案的题型(比如第九届考的长按与短按)

(五)选择题太多不会的

(六)外设改变(如第九届AD按键,资料与实际上使用的电阻不同)

……解决好了省一等奖,解决不好省三等奖

 

五:经验

蓝桥杯嵌入式比赛提供STM32固件库3.5,如果玩STM32使用比如STM32CUBEMX需要一段时间适应,毕竟STM32固件库3.5已经是7,8年前的东西了!

在…/project/STM32F10X_StdPeriph_Examples下是ST官方提供的例程库,比赛时可直接复制里面的程序。

ctrl + c & ctrl + v在比赛的程序量里占70%左右吧!

 

 

 

 

六.学习"大科"写下的学习笔记

PWM大项

两路PWM

样式

输出

检测

不同频率/占空比

不同占空比

不同频率/占空比

不同频率

使用文件

OCInactive

PWM_Output

InputCapture

InputCapture

修改

 

 

 

 

不足

 

 

 

 

 

管脚

定时器

通道

PA1

TIM2

CH2

PA2

TIM2

CH3

PA3

TIM2

CH4

PA4

ADC

IN4

PA5

ADC

IN5

PA6

TIM3

CH1

PA7

TIM3

CH2

 

AD大项

 

AD按键

AD变位器

两路AD

光敏电阻

使用文件

AnalogWatchdog

AnalogWatchdog

RegSimul_DualMode

AnalogWatchdog

修改

       

通道

5

8

4/5

4

通道数

1

1

2

4?

不足之处

       

注意点

--0

100--1

400--2

800--3

1200--4

1600--5

2000--6

2400--7

3000--?

 

接PA5

第9届的比例不是这个了

 

接PA4/PA5

接PA4

读取格式

u16 Get_ADCs(u8 channel)

{

    u16 ADC_Val = 0;

    ADC_RegularChannelConfig(ADC1, channel, 1, ADC_SampleTime_239Cycles5);

    ADC_SoftwareStartConvCmd(ADC1,ENABLE);

    while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);

    ADC_Val = ADC_GetConversionValue(ADC1);

    ADC_ClearFlag(ADC1, ADC_FLAG_EOC);

    ADC_SoftwareStartConvCmd(ADC1, DISABLE);

    return ADC_Val;

}

 

IIC大项

样式

AT24C02

三轴传感器

位置

0xA0/0xA1

0x38/0x39

不足

 

在于初始化写数据

LIS302DL_Write(CTRL_REG1,0x47);

//DR=0,加速度的采集频率为 200Hz;

//PD=1,LIS302DL工作在普通功耗模式;

//FS=0,最大测量范围为 2g(2.3g),灵敏度为 18mg/LSB(16.2),受温度影响为 0.01%, 在0加速度时.飘移为 40mg;

//STP=0,STM=0,表示 LIS302DL 工作在普通模式,即非自检模式;

//Zen=1,表示使能 Z 轴方向加速度采集;

//Yen=1,表示使能 Y 轴方向加速度采集;

//Xen=1,表示使能 X 轴方向加速度采集;

LIS302DL_Write(CTRL_REG2,0x00);

//SIM=0,表示 SPI 口为 4 总线;(这个要先看cs决定)

//BOOT=0,表示不要刷新存储器的内容,为普通模式;

//FDS=0,表示禁用高通滤器;

//HP_FF_W_U2=0, 禁用自由落体/唤醒高通滤波器 2;

//HP_FF_W_U1=0, 禁用自由落体/唤醒高通滤波器 1;

//HP_coeff2=0,HP_coeff1=0,DR=0, 表示自由落体/唤醒高通滤波器的输出截止频率为 2Hz;

LIS302DL_Write(CTRL_REG3,0xC1);

//IHL=1,表示在中断发生时,中断脚(INT1 和 INT2)输出低电平;

//PP_OD=1,表示中断脚开漏输出;

//I2CFG2=0,I2CFG1=0,I2CFG0=0,表示 INT2 脚输出低电平;

//I1CFG2=0,I1CFG1=0,I1CFG0=1,表示 INT1 脚是根据自由落体/唤醒 1 寄存器的输出而发生变化;

LIS302DL_Write(FF_WU_THS_1,0x28);    

//DCRM=0,表示在不再有中断发生时,持续时间计数器会被复位到初值;

//THS0~THS6,用来设置自由落体/唤醒的下限值--720mg;        

LIS302DL_Write(FF_WU_DURATION_1,40);    

//当 DR=1 时,加速度的采集频率为 ;    

LIS302DL_Write(FF_WU_CFG_1,0x10);    

//AOI=1,表示所有中断事件相或后输出;

//LIR=0,表示将中断请求不锁存;

//ZHIE=0,表示在 Z 输出寄存器的值大于 Z 轴的设置值时,将不会使能 Z 轴中断;

//ZLIE=1,表示在 Z 输出寄存器的值小于 Z 轴的设置值时,将不使能中断请求;

//YHIE=0,表示在 Y 输出寄存器的值大于 Y 轴的设置值时,将不会使能 Y 轴中断;

//YLIE=1,表示在 Y 输出寄存器的值小于 Y 轴的设置值时,将不会使能 Y 轴中断;

//XHIE=1,表示在 X 输出寄存器的值大于 X 轴的设置值时,将不会使能 X 轴中断;

//XLIE=0,表示在 X 输出寄存器的值小于 X 轴的设置值时,将不会使能 X 轴中断;

    

 

其他

温度传感器

调用文件

官方文件ds18b20

注意点

ds18b20_read()后8位小数只要前3位

z = (ds18b20_read()& 0x07FF);

x = z/16.;

数码管

调用文件

 

注意点

 

温湿度传感器

调用文件

官方文件dht11

注意点

dht11_read();32位数据只要每个16位前8位

前8位湿度, 后8位温度

LED

调用文件

IOToggle

注意点

 

串口

调用文件

Interrupt/IrDA

注意点

 

按键

调用文件

 

注意点

 

RTC

调用文件

初始化:LSI_Calib

其他: Calendar

注意点

 

蜂鸣器

调用文件

JTAG_Remap

注意点

 
   

 

滤波算法

u16 Get_Filter(u8 channel)

{

    u16 tmp;

    u8 i = 0,j = 0;

    for(i=0; i<ADC_BUFF_LEN; i++){

        adc_buff[i] = Get_ADCs(channel);

    }

    for(i=0; i<=ADC_BUFF_LEN/2; i++){

        for(j=0; j<    ADC_BUFF_LEN-i-1; j++){

            if(adc_buff[j+1] < adc_buff[j]){

                tmp = adc_buff[j+1];

                adc_buff[j+1] = adc_buff[j];

                adc_buff[j] = tmp;

            }

        }

    }

    if(ADC_BUFF_LEN % 2 == 0){

    return(adc_buff[ADC_BUFF_LEN/2-1] + adc_buff[ADC_BUFF_LEN/2])/2;

    }else{

    return(adc_buff[ADC_BUFF_LEN/2]);

    }

}

 

希望诸位在蓝桥杯比赛中取得好成绩!

posted @ 2018-12-03 16:37  一直走向深渊的迷途羔羊  阅读(8323)  评论(2编辑  收藏  举报