藍橋杯嵌入式比賽經驗分享
比了兩屆藍橋杯,最後以國二收場,也算心滿意足!
不說名次了,國賽的名次說出來丟人(國二4個大專的我排最後)
一.我的藍橋杯
我複習藍橋杯,是1月份開始的,由於中間還要搞"畢業設計" "大學生創新創業作品展示""網際網路+創新創業大賽""幫朋友做畢業設計 ""搞一些小專案賺錢""考掉計算機四級"……初賽複習時間40天左右,國賽複習時間7天(主要原因感覺國一沒戲)。沒時間複習的同學,不要太緊張!
二.教程
一家叫做"大科"的淘寶店的資料不錯,為了獲獎錢還是要花的!
三.我的程式
我寫的第7屆決賽的程式:連結:https://pan.baidu.com/s/1WU3doeiucjEMnyLQ5wH2lw
在初賽前一個星期寫的,為了滿足5小時完成程式的要求,程式寫的不怎麼樣!還望見諒。
四.比賽的時候,你有可能會遇到幾個問題:
1.是邊寫程式邊測試,還是寫完程式再測試(我選擇後者)
2.是自己建立工程,還是使用官方提供的例程工程(我選擇後者)
3.比賽開始才寫程式碼,還是先偷偷的寫(我選擇後者)
4.遇到解決不了的問題怎麼辦(千差萬別)
(一)iic出錯(微控制器賽項)
(二)開發板損壞(有的時候損壞的很詭異,你是相信自己,還是相信開發板。一次機會哦!)
(三)電腦電源出問題,沒有儲存檔案(在我同一考場有人有過)
(四)遇到自己沒有預案的題型(比如第九屆考的長按與短按)
(五)選擇題太多不會的
(六)外設改變(如第九屆AD按鍵,資料與實際上使用的電阻不同)
……解決好了省一等獎,解決不好省三等獎
五.學習"大科"寫下的學習筆記
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]); } } |
希望諸位在藍橋杯比賽中取得好成績!