橋杯單片機(jī)國(guó)賽備賽指南:從模塊驅(qū)動(dòng)到系統(tǒng)集成的實(shí)戰(zhàn)解析)
1. 項(xiàng)目概述藍(lán)橋杯單片機(jī)組國(guó)賽的挑戰(zhàn)與機(jī)遇“藍(lán)橋杯單片機(jī)組第十一屆國(guó)賽”這個(gè)標(biāo)題對(duì)于所有嵌入式領(lǐng)域的學(xué)子和技術(shù)愛好者而言無疑是一個(gè)充滿分量和挑戰(zhàn)的詞匯。它不僅僅是一場(chǎng)競(jìng)賽更像是一個(gè)濃縮了單片機(jī)技術(shù)核心應(yīng)用、工程思維與臨場(chǎng)應(yīng)變能力的綜合試煉場(chǎng)。我參加過也指導(dǎo)過多次這類比賽深知其背后考驗(yàn)的遠(yuǎn)不止是代碼編寫能力更是對(duì)硬件原理的深刻理解、對(duì)系統(tǒng)設(shè)計(jì)的全局把控以及在高壓環(huán)境下快速定位并解決問題的實(shí)戰(zhàn)素養(yǎng)。對(duì)于準(zhǔn)備參賽或希望提升單片機(jī)實(shí)戰(zhàn)能力的朋友來說深入剖析一屆國(guó)賽的真題與備賽思路其價(jià)值遠(yuǎn)超啃讀幾本教科書。簡(jiǎn)單來說藍(lán)橋杯單片機(jī)組國(guó)賽通常會(huì)提供一個(gè)基于CT107D或類似平臺(tái)的競(jìng)賽板圍繞51單片機(jī)內(nèi)核常見如IAP15F2K61S2設(shè)計(jì)一個(gè)綜合性的電子系統(tǒng)題目。題目會(huì)涵蓋幾乎單片機(jī)開發(fā)的所有基礎(chǔ)與進(jìn)階模塊從最基礎(chǔ)的LED、數(shù)碼管、按鍵掃描到稍復(fù)雜的定時(shí)器中斷、ADC/DAC數(shù)據(jù)轉(zhuǎn)換、EEPROM存儲(chǔ)、溫度傳感器如DS18B20、時(shí)鐘芯片如DS1302驅(qū)動(dòng)再到綜合性的串口通信、PCF8591或DAC7578等I2C器件控制以及可能涉及到的頻率測(cè)量、PWM波形生成等。比賽要求在有限的時(shí)間內(nèi)獨(dú)立完成從硬件電路分析、軟件程序設(shè)計(jì)到系統(tǒng)調(diào)試的全過程。因此備賽的核心在于構(gòu)建一個(gè)清晰、健壯且可復(fù)用的代碼框架并熟練掌握各個(gè)模塊的底層驅(qū)動(dòng)與協(xié)同工作邏輯。2. 賽題核心考點(diǎn)與備賽策略深度解析2.1 國(guó)賽真題典型架構(gòu)與模塊拆解回顧歷屆國(guó)賽真題尤其是第十一屆左右的賽題其典型架構(gòu)可以歸納為“一個(gè)核心主循環(huán)多個(gè)中斷服務(wù)模塊化驅(qū)動(dòng)管理”。題目往往以一個(gè)具體的應(yīng)用場(chǎng)景包裝例如“智能交通燈控制系統(tǒng)”、“多功能測(cè)量?jī)x表”或“環(huán)境監(jiān)控終端”但其內(nèi)核是對(duì)以下技術(shù)點(diǎn)的排列組合與深度考察人機(jī)交互層這是最基礎(chǔ)也是必考的部分。按鍵掃描通常要求實(shí)現(xiàn)獨(dú)立按鍵與矩陣鍵盤的掃描支持單擊、長(zhǎng)按、連擊等復(fù)合功能。這里的關(guān)鍵是消抖算法的穩(wěn)定性和狀態(tài)機(jī)設(shè)計(jì)的清晰度。很多同學(xué)在這里丟分不是因?yàn)椴粫?huì)寫而是因?yàn)榘存I處理邏輯混亂影響了其他功能的實(shí)時(shí)性。數(shù)碼管/液晶顯示動(dòng)態(tài)掃描數(shù)碼管是必考項(xiàng)必須熟練掌握利用定時(shí)器中斷進(jìn)行掃描確保無閃爍。高級(jí)題目可能會(huì)結(jié)合菜單界面在LCD12864或OLED上顯示這就涉及到頁面管理、光標(biāo)移動(dòng)等邏輯。LED指示用于顯示系統(tǒng)狀態(tài)、報(bào)警等信息通常與按鍵、傳感器狀態(tài)聯(lián)動(dòng)。數(shù)據(jù)采集與處理層這部分考察對(duì)模擬世界和數(shù)字世界接口的理解。ADC采集通過PCF8591或單片機(jī)內(nèi)部ADC如果型號(hào)支持讀取電位器電壓、光敏電阻值等。重點(diǎn)在于采樣頻率的設(shè)定、數(shù)字濾波如均值濾波、中值濾波的實(shí)現(xiàn)以及將原始AD值轉(zhuǎn)換為有物理意義的工程值如電壓、溫度、光照強(qiáng)度。傳感器驅(qū)動(dòng)如DS18B20單總線溫度傳感器、DS1302SPI三線時(shí)鐘芯片。這些器件的時(shí)序要求嚴(yán)格代碼必須精確匹配微秒級(jí)延時(shí)。賽前必須將它們的讀寫函數(shù)封裝成可靠、獨(dú)立的驅(qū)動(dòng)模塊。DAC輸出可能通過PCF8591或?qū)S玫腄AC7578I2C接口輸出模擬電壓用于控制外部設(shè)備或生成特定波形。需要掌握如何將目標(biāo)電壓值轉(zhuǎn)換為芯片對(duì)應(yīng)的寫入數(shù)據(jù)??刂婆c通信層體現(xiàn)系統(tǒng)集成能力。定時(shí)器/計(jì)數(shù)器這是單片機(jī)的“心臟”。除了為數(shù)碼管掃描、按鍵掃描提供時(shí)基還可能用于精確延時(shí)、PWM生成、頻率測(cè)量、脈沖計(jì)數(shù)等。必須精通定時(shí)器四種工作模式的配置以及中斷服務(wù)程序ISR的編寫規(guī)范確保中斷內(nèi)代碼執(zhí)行時(shí)間盡可能短。串口通信UART用于與上位機(jī)電腦或其他設(shè)備通信。題目可能要求按照特定協(xié)議收發(fā)數(shù)據(jù)如Modbus簡(jiǎn)化幀、自定義文本協(xié)議。需要處理好數(shù)據(jù)接收中斷RI和發(fā)送注意數(shù)據(jù)緩沖區(qū)的設(shè)計(jì)防止數(shù)據(jù)覆蓋或丟失。I2C/SPI總線用于訪問擴(kuò)展的EEPROM如AT24C02、ADC/DAC芯片等??偩€的起始、停止、應(yīng)答、讀寫時(shí)序必須爛熟于心并編寫出通用的I2C_Start()I2C_WriteByte()等函數(shù)。2.2 備賽核心構(gòu)建屬于自己的“代碼武器庫”面對(duì)如此多的考點(diǎn)在緊張的比賽時(shí)間內(nèi)從零開始寫代碼是不現(xiàn)實(shí)的。成功的秘訣在于賽前準(zhǔn)備一個(gè)高度模塊化、可配置、經(jīng)過充分測(cè)試的“代碼武器庫”或“驅(qū)動(dòng)庫”。底層驅(qū)動(dòng)模塊為每一個(gè)外設(shè)編寫?yīng)毩⒌?c和.h文件。例如delay.c提供微秒、毫秒級(jí)精準(zhǔn)延時(shí)函數(shù)通?;诙〞r(shí)器或_nop_()循環(huán)校準(zhǔn)。key_scan.c實(shí)現(xiàn)基于狀態(tài)機(jī)或掃描法的按鍵驅(qū)動(dòng)返回鍵值。seg_led.c數(shù)碼管動(dòng)態(tài)掃描驅(qū)動(dòng)封裝顯示整數(shù)、浮點(diǎn)數(shù)、特定字符的函數(shù)。i2c.c通用的I2C總線底層讀寫函數(shù)。ds18b20.cds1302.cpcf8591.c各自傳感器的完整驅(qū)動(dòng)。uart.c串口初始化、發(fā)送一個(gè)字節(jié)/字符串、中斷接收處理函數(shù)。應(yīng)用層框架在main.c中采用“時(shí)間片輪詢”或“前后臺(tái)系統(tǒng)”架構(gòu)。初始化在main()函數(shù)開頭集中初始化所有硬件模塊定時(shí)器、串口、IO口、外設(shè)。主循環(huán)主循環(huán)中只進(jìn)行非實(shí)時(shí)性或?qū)崟r(shí)性要求不高的任務(wù)調(diào)度如界面更新、邏輯判斷。中斷服務(wù)將實(shí)時(shí)性要求高的任務(wù)放在中斷中如定時(shí)器中斷處理數(shù)碼管掃描和按鍵掃描定時(shí)串口中斷處理數(shù)據(jù)接收。確保中斷函數(shù)短小精悍。全局變量與標(biāo)志位合理使用volatile關(guān)鍵字定義在中斷和主循環(huán)間共享的變量使用標(biāo)志位如flag_1suart_rx_ready進(jìn)行任務(wù)觸發(fā)。注意在賽前準(zhǔn)備驅(qū)動(dòng)時(shí)務(wù)必在官方提供的競(jìng)賽板上進(jìn)行全覆蓋測(cè)試記錄下每個(gè)模塊穩(wěn)定工作的參數(shù)如DS18B20延時(shí)具體需要多少微秒I2C的時(shí)鐘速率多少最穩(wěn)定。不同批次的單片機(jī)或板載元器件可能有細(xì)微差異這些參數(shù)就是你的“獨(dú)門秘籍”。3. 從零開始實(shí)現(xiàn)一個(gè)國(guó)賽級(jí)項(xiàng)目的實(shí)操流程我們以一個(gè)假設(shè)的第十一屆國(guó)賽簡(jiǎn)化題目為例“設(shè)計(jì)一個(gè)多功能測(cè)量?jī)x可測(cè)量并顯示環(huán)境溫度、光照強(qiáng)度并通過電位器設(shè)定報(bào)警閾值超閾值時(shí)聲光報(bào)警且所有數(shù)據(jù)可通過串口上傳。”3.1 硬件原理分析與軟件規(guī)劃首先拿到題目和原理圖快速進(jìn)行硬件映射溫度測(cè)量原理圖顯示DS18B20數(shù)據(jù)線連接至P1^4。立即在代碼中#define DS18B20_DQ P1^4。光照測(cè)量原理圖顯示PCF8591的AIN1通道連接光敏電阻。PCF8591的I2C引腳連接至P2^0 (SCL)和P2^1 (SDA)。閾值設(shè)定電位器連接至PCF8591的AIN0通道。顯示8位數(shù)碼管段選接P0口位選通過74HC138譯碼器控制連接至P2^3, P2^4, P2^5。報(bào)警LEDP0^0和蜂鳴器P1^2。串口使用單片機(jī)內(nèi)置UARTTX(P3^1) RX(P3^0)。軟件規(guī)劃如下定時(shí)器0配置為1ms中斷用于數(shù)碼管動(dòng)態(tài)掃描和按鍵掃描計(jì)時(shí)。定時(shí)器1配置為波特率發(fā)生器用于串口通信如果單片機(jī)是STC15系列常用定時(shí)器2做波特率發(fā)生器。主循環(huán)每100ms讀取一次溫度和光照AD值進(jìn)行濾波處理判斷是否超閾值更新顯示緩沖區(qū)。串口中斷接收上位機(jī)指令如請(qǐng)求數(shù)據(jù)置位標(biāo)志位。顯示任務(wù)在定時(shí)器0中斷中每1ms刷新一位數(shù)碼管。顯示內(nèi)容規(guī)劃為前4位顯示溫度如“25.5C”后4位顯示光照強(qiáng)度如“0850”通過一個(gè)按鍵切換顯示電位器設(shè)定的閾值。3.2 核心模塊代碼實(shí)現(xiàn)與要點(diǎn)1. 定時(shí)器0初始化1ms中斷:void Timer0_Init(void) //11.0592MHz { AUXR 0x7F; //定時(shí)器時(shí)鐘12T模式 TMOD 0xF0; //設(shè)置定時(shí)器模式為16位自動(dòng)重裝 TMOD | 0x01; //設(shè)置定時(shí)器模式為16位自動(dòng)重裝實(shí)際上0x01是16位非自動(dòng)重裝STC15的自動(dòng)重裝是TMOD0x00然后AUXR|0x80。這里需根據(jù)具體型號(hào)調(diào)整 TL0 0x66; //設(shè)置定時(shí)初值 TH0 0xFC; //設(shè)置定時(shí)初值 TF0 0; //清除TF0標(biāo)志 TR0 1; //定時(shí)器0開始計(jì)時(shí) ET0 1; //使能定時(shí)器0中斷 EA 1; //打開總中斷 }這里的關(guān)鍵是計(jì)算初值。對(duì)于12T模式下的11.0592MHz晶振機(jī)器周期為12/11.0592μs ≈ 1.085μs。要產(chǎn)生1ms中斷需計(jì)數(shù)次數(shù)為1000/1.085 ≈ 921。16位定時(shí)器最大65536所以初值 65536 - 921 64615轉(zhuǎn)換為十六進(jìn)制是0xFC67。所以TH00xFC; TL00x67;。我經(jīng)常看到同學(xué)這里算錯(cuò)導(dǎo)致系統(tǒng)時(shí)間基準(zhǔn)全亂。2. DS18B20溫度讀取函數(shù)關(guān)鍵時(shí)序:DS18B20的驅(qū)動(dòng)最講究時(shí)序。以復(fù)位和存在脈沖檢測(cè)為例bit DS18B20_Init() { bit ack; DQ 1; Delay_us(2); DQ 0; Delay_us(500); // 拉低480-960us DQ 1; Delay_us(60); // 釋放總線等待15-60us后采樣 ack DQ; // 讀取存在脈沖0為存在 Delay_us(240); // 等待剩余時(shí)間完成整個(gè)復(fù)位周期 return ~ack; // 通常返回1表示初始化成功 }Delay_us(500)和Delay_us(60)這兩個(gè)參數(shù)是核心必須通過示波器或反復(fù)測(cè)試校準(zhǔn)確保在比賽板上的實(shí)際波形符合數(shù)據(jù)手冊(cè)要求。我建議將這幾個(gè)關(guān)鍵延時(shí)做成宏定義方便微調(diào)#define DS18B20_DQ_RESET_LOW_TIME 500#define DS18B20_DQ_WAIT_AFTER_RELEASE 603. 基于狀態(tài)機(jī)的按鍵掃描支持長(zhǎng)按:這是提升操作體驗(yàn)的關(guān)鍵。假設(shè)按鍵連接P3^2。typedef enum {KEY_IDLE, KEY_DEBOUNCE, KEY_PRESSED, KEY_REPEAT, KEY_RELEASE} KeyState; KeyState key_state KEY_IDLE; unsigned int key_press_duration 0; #define KEY_LONG_PRESS_THRESHOLD 1000 // 長(zhǎng)按判定為持續(xù)1秒假設(shè)定時(shí)器1ms中斷 void Key_Scan_Task(void) // 此函數(shù)在1ms定時(shí)器中斷中調(diào)用 { switch(key_state) { case KEY_IDLE: if(KEY_PIN 0) { // 檢測(cè)到按下 key_state KEY_DEBOUNCE; } break; case KEY_DEBOUNCE: if(KEY_PIN 0) { // 消抖后確認(rèn)按下 key_state KEY_PRESSED; key_press_duration 0; // 可以在這里觸發(fā)單擊按下事件如果需要 } else { key_state KEY_IDLE; } break; case KEY_PRESSED: key_press_duration; if(KEY_PIN 1) { // 按鍵釋放 key_state KEY_RELEASE; } else if(key_press_duration KEY_LONG_PRESS_THRESHOLD) { key_state KEY_REPEAT; // 觸發(fā)長(zhǎng)按事件 Trigger_LongPress_Event(); } break; case KEY_REPEAT: // 長(zhǎng)按持續(xù)中可以在這里處理連發(fā)功能 if(KEY_PIN 1) { key_state KEY_IDLE; } break; case KEY_RELEASE: // 觸發(fā)單擊釋放事件 Trigger_SingleClick_Event(); key_state KEY_IDLE; break; } }這個(gè)狀態(tài)機(jī)模型非常實(shí)用可以清晰地區(qū)分單擊、長(zhǎng)按、連擊并且將按鍵檢測(cè)與事件處理解耦主循環(huán)只需要檢查事件標(biāo)志即可。4. 系統(tǒng)集成調(diào)試與性能優(yōu)化實(shí)戰(zhàn)當(dāng)所有模塊驅(qū)動(dòng)就緒后系統(tǒng)集成階段才是真正的挑戰(zhàn)開始。問題往往不是單個(gè)模塊失效而是模塊間相互干擾。4.1 常見的“坑”與解決方案數(shù)碼管閃爍或顯示亂碼原因動(dòng)態(tài)掃描的間隔時(shí)間不穩(wěn)定或被長(zhǎng)時(shí)間中斷阻塞。如果顯示函數(shù)Seg_Display()被放在主循環(huán)而主循環(huán)中某個(gè)任務(wù)如DS18B20讀取耗時(shí)幾十毫秒就會(huì)導(dǎo)致掃描間隔過長(zhǎng)肉眼可見閃爍。解決必須將數(shù)碼管掃描函數(shù)放在一個(gè)穩(wěn)定的定時(shí)器中斷中如1ms。中斷函數(shù)里只做位選切換和段碼送出的操作顯示數(shù)據(jù)應(yīng)預(yù)先存入一個(gè)全局的顯示緩沖區(qū)disp_buf[8]。主循環(huán)只負(fù)責(zé)更新disp_buf的內(nèi)容。串口接收數(shù)據(jù)丟失或錯(cuò)亂原因串口接收中斷服務(wù)程序ISR處理時(shí)間過長(zhǎng)導(dǎo)致新的數(shù)據(jù)覆蓋了還未處理的數(shù)據(jù)或者沒有使用緩沖區(qū)。解決在中斷中只做最必要的事——將接收到的字節(jié)SBUF存入一個(gè)環(huán)形緩沖區(qū)FIFO并置位一個(gè)“數(shù)據(jù)到達(dá)”標(biāo)志。數(shù)據(jù)解析等耗時(shí)操作放在主循環(huán)中檢查該標(biāo)志后進(jìn)行。#define UART_BUF_SIZE 64 unsigned char uart_rx_buf[UART_BUF_SIZE]; unsigned char uart_rx_head 0, uart_rx_tail 0; bit uart_rx_flag 0; void UART_Isr() interrupt 4 { if(RI) { RI 0; uart_rx_buf[uart_rx_head] SBUF; uart_rx_head (uart_rx_head 1) % UART_BUF_SIZE; if(uart_rx_head uart_rx_tail) { // 緩沖區(qū)溢出處理 uart_rx_tail (uart_rx_tail 1) % UART_BUF_SIZE; // 丟棄最舊數(shù)據(jù) } uart_rx_flag 1; // 設(shè)置標(biāo)志 } // ... 處理TI發(fā)送中斷 }ADC讀取值跳動(dòng)劇烈原因電源噪聲、信號(hào)干擾或未做軟件濾波。解決首先確保模擬部分的電源穩(wěn)定可以在Vref引腳加濾波電容。軟件上最簡(jiǎn)單的是一次采集多次取平均值。更穩(wěn)定的方法是使用一階滯后濾波低通濾波#define ALPHA 0.2 // 濾波系數(shù)0ALPHA1越小越平滑但響應(yīng)慢 unsigned int filtered_adc_value 0; unsigned int raw_adc_value Read_ADC_Channel(0); filtered_adc_value (unsigned int)(ALPHA * raw_adc_value (1 - ALPHA) * filtered_adc_value);將filtered_adc_value用于后續(xù)計(jì)算和顯示波形會(huì)平穩(wěn)很多。多個(gè)定時(shí)器中斷沖突原因如果使用了T0和T2兩個(gè)定時(shí)器中斷且中斷服務(wù)程序?qū)懙脧?fù)雜可能發(fā)生中斷嵌套或響應(yīng)不及時(shí)。解決規(guī)劃好中斷優(yōu)先級(jí)如果單片機(jī)支持。更重要的原則是中斷服務(wù)函數(shù)盡可能短。只做標(biāo)志位置位、計(jì)數(shù)器加減、數(shù)據(jù)搬運(yùn)等簡(jiǎn)單操作。復(fù)雜的計(jì)算、函數(shù)調(diào)用、循環(huán)等放到主循環(huán)基于標(biāo)志位去處理。4.2 調(diào)試技巧與賽場(chǎng)策略分模塊調(diào)試不要寫完所有代碼再下載測(cè)試。寫一個(gè)模塊測(cè)試一個(gè)模塊。例如先讓數(shù)碼管穩(wěn)定顯示“12345678”再測(cè)試按鍵能否正確控制某個(gè)LED亮滅然后測(cè)試ADC讀取電位器并顯示在數(shù)碼管上。步步為營(yíng)。利用蜂鳴器和LED這是最直接的調(diào)試工具。在可疑的代碼段前后讓蜂鳴器短響或LED翻轉(zhuǎn)可以判斷程序是否執(zhí)行到那里以及執(zhí)行時(shí)間。簡(jiǎn)化首批目標(biāo)比賽時(shí)先確保基本功能得分。例如題目要求測(cè)量溫度、光照、串口上傳。你應(yīng)該先實(shí)現(xiàn)最核心的測(cè)量和顯示確保這部分穩(wěn)定拿到大部分分?jǐn)?shù)再去完善報(bào)警閾值、菜單切換等高級(jí)功能。代碼版本管理在電腦上為每個(gè)主要功能節(jié)點(diǎn)保存一個(gè)代碼版本。當(dāng)添加新功能導(dǎo)致系統(tǒng)崩潰時(shí)可以快速回退到上一個(gè)穩(wěn)定版本而不是在混亂的代碼中掙扎。5. 備賽資源深度利用與臨場(chǎng)應(yīng)變5.1 官方資源與歷年真題藍(lán)橋杯官網(wǎng)會(huì)提供競(jìng)賽板原理圖、芯片數(shù)據(jù)手冊(cè)、基礎(chǔ)驅(qū)動(dòng)代碼示例。這些是第一手資料必須吃透。歷年真題特別是近三年的是最佳的模擬練習(xí)材料。練習(xí)時(shí)一定要模擬真實(shí)賽場(chǎng)環(huán)境限時(shí)、獨(dú)立完成、從零開始建工程。做完后對(duì)照評(píng)分標(biāo)準(zhǔn)分析失分點(diǎn)是在算法邏輯、驅(qū)動(dòng)穩(wěn)定性還是系統(tǒng)設(shè)計(jì)上。5.2 臨場(chǎng)遇到陌生器件怎么辦國(guó)賽有時(shí)會(huì)引入一兩個(gè)相對(duì)陌生的器件如DAC7578。這時(shí)不要慌查原理圖立刻找到該器件在板子上的連接引腳I2C還是SPI地址引腳如何接。找數(shù)據(jù)手冊(cè)競(jìng)賽資料包中通常會(huì)提供該器件的PDF。直接翻到關(guān)鍵部分器件地址查看I2C的7位地址是如何由硬件引腳決定的??刂谱?命令字格式找到向該器件寫入數(shù)據(jù)時(shí)需要發(fā)送的第一個(gè)字節(jié)通常包含地址和命令位。數(shù)據(jù)格式要輸出的電壓值如何轉(zhuǎn)換為兩個(gè)字節(jié)的數(shù)據(jù)是左對(duì)齊還是右對(duì)齊套用模板如果你已經(jīng)準(zhǔn)備好了通用的i2c.c驅(qū)動(dòng)那么驅(qū)動(dòng)新器件就只剩下“組裝”工作。根據(jù)數(shù)據(jù)手冊(cè)編寫一個(gè)DAC7578_WriteVoltage(unsigned int voltage_mV)函數(shù)內(nèi)部調(diào)用I2C_Start()I2C_SendByte(addr)I2C_SendByte(high_byte)I2C_SendByte(low_byte)I2C_Stop()。關(guān)鍵在于正確計(jì)算high_byte和low_byte。5.3 心態(tài)與時(shí)間管理比賽最后半小時(shí)如果系統(tǒng)還有不穩(wěn)定之處明智的選擇是放棄完美主義如果某個(gè)高級(jí)功能如復(fù)雜的菜單界面調(diào)試不通果斷注釋掉相關(guān)代碼確保基礎(chǔ)功能測(cè)量、顯示、核心控制100%穩(wěn)定運(yùn)行。基礎(chǔ)分占比很高。進(jìn)行防御性編程在主循環(huán)開始和結(jié)束、以及各主要功能函數(shù)入口增加一些“看門狗”性質(zhì)的代碼比如定時(shí)翻轉(zhuǎn)一個(gè)LED。如果程序跑飛LED會(huì)停止閃爍你能立刻發(fā)現(xiàn)。雖然比賽板可能沒有硬件看門狗但這是一個(gè)軟件上的補(bǔ)救習(xí)慣。檢查清單在提交前按照清單快速檢查電源是否接好下載線是否拔除避免影響IO口蜂鳴器是否靜音除非題目要求顯示內(nèi)容是否清晰無誤