藍橋杯嵌入式比賽經驗分享


比了兩屆藍橋杯,最后以國二收場,也算心滿意足!

 

一.我的藍橋杯

我復習藍橋杯,是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]);

    }

}

 

希望諸位在藍橋杯比賽中取得好成績!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM