的智能門禁系統(tǒng)設(shè)計(jì):從硬件選型到調(diào)試全解析)
簡(jiǎn)介面向51單片機(jī)學(xué)習(xí)者和電子設(shè)計(jì)人員這套基于AT89C52的智能門禁系統(tǒng)完整設(shè)計(jì)方案實(shí)現(xiàn)了RFID射頻識(shí)別刷卡開門、密碼鍵盤解鎖、LCD12864實(shí)時(shí)顯示卡號(hào)、管理員權(quán)限管理及一鍵恢復(fù)出廠設(shè)置等功能適合課程設(shè)計(jì)、畢業(yè)設(shè)計(jì)及項(xiàng)目原型開發(fā)。壓縮包共61個(gè)文件大小約502KB內(nèi)含Proteus8.11仿真原理圖、C語(yǔ)言源程序、Keil工程文件、Visio流程圖及PDF設(shè)計(jì)文檔其中.c/.h源碼便于閱讀修改.hex可燒錄驗(yàn)證.uvproj工程文件可直接打開編譯.pdsprj仿真文件方便觀察運(yùn)行效果。目前已有2567人學(xué)習(xí)下載。這套資料覆蓋從硬件設(shè)計(jì)到軟件調(diào)試的完整鏈路模塊資料齊全能幫助初學(xué)者在較短時(shí)間內(nèi)掌握51單片機(jī)與RFID、LCD12864等外設(shè)的綜合應(yīng)用方法。1. 項(xiàng)目梳理這套智能門禁到底在做什么1.1 為什么拿51單片機(jī)做門禁系統(tǒng)先聊一個(gè)很多人糾結(jié)的問題現(xiàn)在ARM、ESP32滿地都是為什么還要用51單片機(jī)做門禁我的答案很直接因?yàn)檫@套系統(tǒng)的真實(shí)需求51完全扛得住而且扛得相當(dāng)舒服。門禁系統(tǒng)的核心邏輯說(shuō)白了就是“驗(yàn)證身份、控制開鎖、記錄狀態(tài)”。這三種操作對(duì)主頻和算力的要求非常低刷卡后比對(duì)卡號(hào)、密碼后翻轉(zhuǎn)一個(gè)IO口整個(gè)過程耗時(shí)也就是毫秒級(jí)。51單片機(jī)雖然主頻只有12MHz左右但處理這種任務(wù)綽綽有余。更重要的是51單片機(jī)的引腳功能直觀、中斷系統(tǒng)簡(jiǎn)單、資料鋪天蓋地特別適合把這套系統(tǒng)作為“把學(xué)過的知識(shí)點(diǎn)串起來(lái)”的綜合練手項(xiàng)目。單片機(jī)的最小系統(tǒng)、按鍵掃描、數(shù)碼管/LCD顯示、串口通信、定時(shí)器中斷、PWM輸出這些課程里學(xué)過的零散點(diǎn)在這個(gè)項(xiàng)目里全都用得上了。所以我的判斷是智能門禁是51單片機(jī)項(xiàng)目里性價(jià)比最高的題目之一。它不像智能小車那樣涉及復(fù)雜的電機(jī)控制和傳感器融合也不像倒車?yán)走_(dá)那樣需要處理超聲波回波時(shí)序但它能讓學(xué)生接觸到一個(gè)完整的嵌入式產(chǎn)品形態(tài)輸入設(shè)備讀卡器、鍵盤、輸出設(shè)備LCD、舵機(jī)、蜂鳴器、存儲(chǔ)設(shè)備EEPROM以及核心的控制邏輯。做完這個(gè)項(xiàng)目再去看基于STM32的門禁方案你會(huì)發(fā)現(xiàn)思路完全相通只是換了性能更強(qiáng)的平臺(tái)。1.2 功能模塊拆解與需求分析這套門禁系統(tǒng)的功能要定得清晰不然做的時(shí)候會(huì)越做越散。我按實(shí)際需求把功能拆成了這樣幾塊身份驗(yàn)證支持RFID IC卡刷卡驗(yàn)證也支持4x4矩陣鍵盤輸入密碼驗(yàn)證兩種方式二選一即可通過開鎖控制驗(yàn)證通過后通過PWM信號(hào)驅(qū)動(dòng)舵機(jī)轉(zhuǎn)動(dòng)模擬電鎖開鎖保持幾秒后自動(dòng)復(fù)位信息顯示LCD1602實(shí)時(shí)顯示系統(tǒng)狀態(tài)比如待機(jī)提示、刷卡卡號(hào)、密碼輸入位數(shù)、開鎖成功/失敗提示聲光提示蜂鳴器不同頻率的響聲代表不同事件綠色LED亮表示驗(yàn)證通過紅色LED亮表示驗(yàn)證失敗掉電存儲(chǔ)管理員密碼和已授權(quán)的卡號(hào)存儲(chǔ)在AT24C02芯片中斷電不丟失重新上電后依然有效擴(kuò)展預(yù)留預(yù)留串口調(diào)試接口方便通過串口往PC端打印日志便于排查問題這個(gè)功能清單看起來(lái)不復(fù)雜但每一塊都能對(duì)應(yīng)到具體的單片機(jī)外設(shè)知識(shí)點(diǎn)。RFID涉及SPI通信舵機(jī)涉及定時(shí)器PWMLCD1602涉及并行數(shù)據(jù)傳輸時(shí)序AT24C02涉及I2C通信蜂鳴器涉及定時(shí)器產(chǎn)生不同頻率方波??梢哉f(shuō)這一套做下來(lái)51單片機(jī)的大部分核心外設(shè)都被你摸過一遍了。2. 硬件選型與原理圖設(shè)計(jì)要點(diǎn)2.1 主控、讀卡模塊和開鎖部件的選型邏輯硬件選型是整個(gè)項(xiàng)目的地基選錯(cuò)了后面全是眼淚。我當(dāng)初踩了不少坑這里直接分享最終驗(yàn)證過的最優(yōu)組合。第一塊是主控。我用的是STC89C52RC這是最經(jīng)典的51增強(qiáng)型芯片F(xiàn)lash容量8KB片上RAM 512字節(jié)支持ISP下載不需要額外的燒錄器一根USB轉(zhuǎn)TTL線就能下載程序。注意STC89C52有兩個(gè)串口但第二個(gè)串口只能通過寄存器配置映射到特定引腳初學(xué)階段用默認(rèn)的P3.0和P3.1即可。它的引腳功能分布也清晰P0口要接上拉電阻才能驅(qū)動(dòng)LCD這類并行設(shè)備這個(gè)細(xì)節(jié)設(shè)計(jì)原理圖的時(shí)候就要提前考慮。第二塊是讀卡模塊。我建議直接用MFRC522模塊。市面上有現(xiàn)成的RC522射頻模塊工作頻率13.56MHz支持Mifare S50和S70兩種卡SPI接口通信模塊上還集成天線匹配電路直接接上就能用。為什么不用125kHz的ID卡模塊因?yàn)镮D卡只能讀取卡號(hào)不能寫入數(shù)據(jù)安全性和擴(kuò)展性都比較差而IC卡除了卡號(hào)還能讀寫扇區(qū)數(shù)據(jù)后期如果想加“卡片有效期”“按次計(jì)費(fèi)”這些功能IC卡都能支持。RC522模塊的3.3V供電問題也要提前處理好它不能直接吃5V需要經(jīng)過穩(wěn)壓電路降壓。第三塊是開鎖部件。兩種方案各有適用場(chǎng)景一種是用SG90舵機(jī)另一種是用繼電器控制電磁鎖。SG90舵機(jī)的好處是電流小、控制直觀、不需要額外驅(qū)動(dòng)電路適合桌面演示和學(xué)生實(shí)驗(yàn)電磁鎖更適合真實(shí)現(xiàn)場(chǎng)環(huán)境但需要12V電源和繼電器驅(qū)動(dòng)對(duì)初學(xué)者來(lái)說(shuō)多了一道功率電路的坎。我建議動(dòng)手階段先用舵機(jī)把自己的邏輯跑通后續(xù)想落地再換繼電器方案。2.2 LCD、按鍵和提示部件的搭配細(xì)節(jié)LCD1602是這套系統(tǒng)的“臉面”。它一共有16個(gè)引腳其中數(shù)據(jù)線D0到D7接P0口的8個(gè)引腳RS、RW、E三個(gè)控制腳分別接P2.0、P2.1、P2.2。這里有個(gè)非常重要的細(xì)節(jié)P0口是開漏輸出內(nèi)部沒有上拉電阻接LCD數(shù)據(jù)線時(shí)必須外接4.7kΩ或10kΩ的上拉排阻否則LCD顯示會(huì)出現(xiàn)亂碼或完全不顯示。我自己第一次裝機(jī)時(shí)忽略了這個(gè)細(xì)節(jié)折騰了兩天才發(fā)現(xiàn)是上拉電阻沒焊這屬于51單片機(jī)硬件設(shè)計(jì)里最經(jīng)典的坑之一。矩陣鍵盤我用的是4x4布局一共16個(gè)按鍵占用P1口的8個(gè)引腳。其中P1.0到P1.3作為行掃描線P1.4到P1.7作為列檢測(cè)線。按鍵掃描的邏輯大家應(yīng)該都不陌生逐行拉低檢測(cè)列電平變化結(jié)合行列編號(hào)合成鍵值。這個(gè)方案能省不少IO口代價(jià)是掃描代碼稍微復(fù)雜一點(diǎn)但51的IO口本身就緊張這個(gè)代價(jià)值得。蜂鳴器接在P2.3口通過8550三極管驅(qū)動(dòng)單片機(jī)引腳輸出高電平給基極時(shí)蜂鳴器不響輸出低電平時(shí)才響這里注意是低電平驅(qū)動(dòng)。雙色LED模塊紅綠接在P2.4和P2.5口分別控制紅色和綠色燈。2.3 電源分配與電平匹配心得電源設(shè)計(jì)是整個(gè)系統(tǒng)最容易出問題、也最容易被忽視的環(huán)節(jié)。整套系統(tǒng)的供電方案我是這樣設(shè)計(jì)的外部輸入5V直流電源經(jīng)過一個(gè)自恢復(fù)保險(xiǎn)絲后分成三路。第一路直接給STC89C52、LCD1602、蜂鳴器、矩陣鍵盤供電第二路經(jīng)過AMS1117-3.3穩(wěn)壓芯片降壓到3.3V后給MFRC522供電第三路經(jīng)過一個(gè)470μF電解電容濾波后單獨(dú)給舵機(jī)供電。為什么舵機(jī)的電源要單獨(dú)分一路因?yàn)镾G90舵機(jī)啟動(dòng)瞬間的電流可能達(dá)到500mA到700mA如果不加濾波電容、不單獨(dú)走線這股電流會(huì)把系統(tǒng)電壓拉低導(dǎo)致單片機(jī)復(fù)位重啟。我實(shí)測(cè)過舵機(jī)直接和單片機(jī)共用一根杜邦線供電時(shí)每次轉(zhuǎn)動(dòng)都會(huì)導(dǎo)致LCD閃一下嚴(yán)重時(shí)程序直接跑飛。加了獨(dú)立濾波電容和大電容儲(chǔ)能后才穩(wěn)定下來(lái)。這一點(diǎn)在實(shí)際項(xiàng)目中比任何代碼優(yōu)化都重要。3. 軟件架構(gòu)與核心代碼實(shí)現(xiàn)3.1 主循環(huán)狀態(tài)機(jī)設(shè)計(jì)思路軟件部分是整個(gè)項(xiàng)目的靈魂。我采用了一種非常經(jīng)典的“狀態(tài)機(jī)消息隊(duì)列”的寫法把整個(gè)系統(tǒng)劃分成幾個(gè)明確的狀態(tài)每個(gè)狀態(tài)下只處理屬于這個(gè)狀態(tài)的事件。這樣做的好處是邏輯清晰、不容易亂出問題時(shí)也能快速定位是哪個(gè)狀態(tài)下出的問題。系統(tǒng)的狀態(tài)定義如下待機(jī)狀態(tài)IDLE默認(rèn)狀態(tài)LCD顯示“Welcome”等待刷卡或輸入密碼讀卡驗(yàn)證狀態(tài)CHECK_CARD檢測(cè)到卡片后讀取卡號(hào)與白名單卡號(hào)逐一比對(duì)密碼輸入狀態(tài)INPUT_PWD用戶輸入四位密碼按確認(rèn)鍵后校驗(yàn)開鎖狀態(tài)UNLOCK驗(yàn)證通過開鎖并計(jì)時(shí)保持5秒后回到待機(jī)報(bào)警狀態(tài)ALARM驗(yàn)證失敗三次蜂鳴器長(zhǎng)鳴紅燈閃爍30秒內(nèi)鎖定鍵盤和讀卡器主循環(huán)的偽代碼邏輯大致如下void main() { System_Init(); // 初始化定時(shí)器、串口、LCD、RC522、EEPROM等外設(shè) while(1) { // 事件采集 KeyEvent MatrixKey_Scan(); // 周期性掃描鍵盤 CardEvent RC522_PollCard(); // 非阻塞輪詢讀卡器 // 狀態(tài)機(jī)處理 switch(System_State) { case STATE_IDLE: if(CardEvent CARD_DETECTED) System_State STATE_CHECK_CARD; else if(KeyEvent KEY_STAR) System_State STATE_INPUT_PWD; break; case STATE_CHECK_CARD: // 讀取UID并比對(duì) ... break; // 其他狀態(tài)類似 } } }這種寫法的好處是每個(gè)狀態(tài)只用關(guān)注自己需要的事件邏輯不會(huì)互相干擾。比如在報(bào)警狀態(tài)時(shí)即使檢測(cè)到了卡片也不會(huì)進(jìn)入讀卡狀態(tài)因?yàn)闋顟B(tài)機(jī)的流轉(zhuǎn)條件被鎖住了。3.2 RC522讀卡流程與SPI通信注意事項(xiàng)MFRC522這個(gè)模塊的讀卡流程可以拆成四步尋卡、防碰撞、選卡、讀卡號(hào)。每一步都對(duì)應(yīng)RC522寄存器的一組操作。通過SPI向RC522的寄存器寫入命令字來(lái)實(shí)現(xiàn)。這套流程是NXP定義的標(biāo)準(zhǔn)流程任何讀卡器芯片都大同小異。這里我貼一段最核心的讀取卡號(hào)代碼// 尋卡命令字0x52表示尋所有卡 u8 RC522_Request(u8 req_mode, u8 *tag_type) { u8 status; u8 buf[2]; status PcdRequest(req_mode, buf); // 發(fā)送尋卡命令 if(status MI_OK) { tag_type[0] buf[0]; tag_type[1] buf[1]; } return status; } // 防碰撞返回卡號(hào) u8 RC522_Anticoll(u8 *serial) { u8 status; u8 i; u8 buf[5]; status PcdAnticoll(buf); // 防碰撞操作 if(status MI_OK) { for(i 0; i 4; i) serial[i] buf[i]; // 前4字節(jié)是卡號(hào) } return status; }RC522模塊和單片機(jī)之間用SPI通信涉及SCK、MOSI、MISO、SDA其實(shí)對(duì)應(yīng)SPI的CS片選、RST這幾個(gè)信號(hào)線。有一點(diǎn)需要注意RC522模塊的SPI接口是3.3V電平邏輯而51單片機(jī)是5V電平所以需要在MISO線上串聯(lián)一個(gè)1kΩ電阻做電平適配防止模塊被5V電平打壞。很多人一開始沒注意這個(gè)問題讀卡模塊用幾天就燒了就是這個(gè)原因。3.3 舵機(jī)PWM控制的實(shí)現(xiàn)要點(diǎn)SG90舵機(jī)是一個(gè)典型的PWM控制設(shè)備。它的控制信號(hào)是周期為20ms的方波其中高電平脈寬決定了舵機(jī)的轉(zhuǎn)角0.5ms脈寬對(duì)應(yīng)0度1.5ms脈寬對(duì)應(yīng)90度中間位置2.5ms脈寬對(duì)應(yīng)180度門禁場(chǎng)景下我設(shè)定舵機(jī)初始角度為0度鎖舌按下驗(yàn)證通過后轉(zhuǎn)到90度開鎖保持5秒后回到0度。這個(gè)角度變化通過修改定時(shí)器比較值來(lái)實(shí)現(xiàn)。我用定時(shí)器0產(chǎn)生一個(gè)2ms的基礎(chǔ)中斷每10次中斷20ms為一個(gè)完整的PWM周期。在中斷服務(wù)函數(shù)里通過一個(gè)計(jì)數(shù)器變量控制高電平持續(xù)時(shí)間void Timer0_ISR() interrupt 1 { static u16 t 0; TH0 0xA0; // 2ms重載值對(duì)應(yīng)11.0592MHz晶振 TL0 0x00; t; if(t 1) SERVO_PIN 1; // 每周期開始時(shí)拉高 if(t SERVO_PWM_VAL) SERVO_PIN 0; // 到達(dá)高電平時(shí)間后拉低 if(t 10) t 0; // 10個(gè)2ms 20ms周期 }SERVO_PWM_VAL這個(gè)變量就是控制舵機(jī)角度的關(guān)鍵。對(duì)于2ms基礎(chǔ)中斷0度對(duì)應(yīng)的值是10.5ms/2ms取整約等于0.25實(shí)際通過微調(diào)大約在1附近90度對(duì)應(yīng)的是7或81.5ms/2ms 7.5。實(shí)際項(xiàng)目中不要死記這些理論值因?yàn)槎鏅C(jī)個(gè)體差異很大最好寫一個(gè)按鍵微調(diào)程序?qū)嶋H測(cè)試每個(gè)角度對(duì)應(yīng)的最合適的比較值。3.4 密碼校驗(yàn)與EEPROM掉電存儲(chǔ)的實(shí)現(xiàn)密碼校驗(yàn)邏輯比較直接用戶通過矩陣鍵盤輸入四位數(shù)字每輸入一位LCD上顯示一個(gè)星號(hào)屏蔽實(shí)際數(shù)字輸入完成后按“#”鍵確認(rèn)按“*”鍵清除重輸。但有一個(gè)容易被忽略的設(shè)計(jì)管理員密碼需要支持修改而且修改后要能掉電保存。這就用到了AT24C02芯片。AT24C02是一個(gè)2Kbit的EEPROMI2C接口正好可以用51的IO口軟件模擬I2C協(xié)議實(shí)現(xiàn)讀寫。我的存儲(chǔ)結(jié)構(gòu)是這樣的// EEPROM存儲(chǔ)結(jié)構(gòu) // 地址0密碼標(biāo)志位0xFF表示已設(shè)置密碼 // 地址1-4四位密碼的ASCII碼 // 地址5授權(quán)卡號(hào)數(shù)量 // 地址6開始卡號(hào)列表每個(gè)卡號(hào)占4字節(jié)這樣的設(shè)計(jì)讓系統(tǒng)重啟后能自動(dòng)加載白名單卡號(hào)和密碼不需要重新配置。做產(chǎn)品化迭代時(shí)這個(gè)設(shè)計(jì)是必須的基礎(chǔ)能力。4. 電路設(shè)計(jì)與Proteus仿真驗(yàn)證4.1 在Proteus里搭建最小系統(tǒng)的注意點(diǎn)很多人在開始焊板子之前會(huì)先用Proteus做仿真驗(yàn)證這個(gè)習(xí)慣非常好。Proteus 8以上版本內(nèi)置了AT89C51和STC系列的仿真模型搭建一個(gè)最小系統(tǒng)只需拖出單片機(jī)芯片、晶振、復(fù)位電路、上拉排阻、LCD1602模型即可。不過Proteus仿真有個(gè)天然的局限它沒有MFRC522的仿真模型。我的做法是用一個(gè)按鍵矩陣來(lái)模擬“刷卡”這個(gè)動(dòng)作——按下一個(gè)按鍵就相當(dāng)于把一個(gè)固定的卡號(hào)“插入”讀卡器。這樣雖然不能驗(yàn)證真實(shí)的RFID通信流程但能把主控邏輯、狀態(tài)機(jī)、LCD顯示、舵機(jī)控制這些功能全部跑通。在Proteus中還有一個(gè)常見的坑LCD1602模型對(duì)時(shí)序非常挑剔如果你的初始化代碼里時(shí)序不夠標(biāo)準(zhǔn)比如寫命令之間沒有加足夠延時(shí)實(shí)物可能勉強(qiáng)能跑但仿真里就直接不顯示。反過來(lái)仿真正常但實(shí)物不正常的情況也常見。所以仿真過的主要價(jià)值是驗(yàn)證軟件邏輯硬件問題還是得靠實(shí)物調(diào)。4.2 從仿真到實(shí)物的關(guān)鍵差異與應(yīng)對(duì)從Proteus仿真轉(zhuǎn)到實(shí)物焊接有幾個(gè)差異是必須心里有數(shù)的第一仿真里舵機(jī)不會(huì)真的轉(zhuǎn)。Proteus里SG90模型只是一個(gè)PWM波形顯示器你不能看到真實(shí)的機(jī)械轉(zhuǎn)動(dòng)。所以舵機(jī)角度是否正確、力矩是否足夠只能在實(shí)機(jī)上驗(yàn)證。第二仿真的電源是理想電源不會(huì)出現(xiàn)壓降問題。但實(shí)物上如果USB口供電能力不足舵機(jī)一轉(zhuǎn)單片機(jī)就復(fù)位是家常便飯。建議準(zhǔn)備一個(gè)開關(guān)電源適配器供電電流在1A以上比較穩(wěn)妥。第三仿真里RC522的通信邏輯無(wú)法驗(yàn)證。我自己第一次做實(shí)物時(shí)SPI時(shí)序代碼就是靠邏輯分析儀一點(diǎn)一點(diǎn)對(duì)的。如果沒有邏輯分析儀可以先用示波器看SCK和MISO波形確保通信正常后再寫業(yè)務(wù)邏輯。5. 調(diào)試過程中踩過的坑與排查實(shí)錄5.1 常見問題速查表做這個(gè)項(xiàng)目前后我整理了這么一份排查表基本覆蓋了初學(xué)者最容易遇到的幾類問題現(xiàn)象可能原因排查方法上電后LCD無(wú)反應(yīng)P0口沒加上拉電阻檢查是否有10kΩ排阻用萬(wàn)用表量P0口電壓刷IC卡無(wú)反應(yīng)模塊供電電壓不對(duì)或接線錯(cuò)誤測(cè)模塊VCC是否為3.3V檢查SPI四根線是否接對(duì)舵機(jī)不停抖動(dòng)PWM占空比不穩(wěn)定或電流不足檢查定時(shí)器初始化和舵機(jī)供電電容密碼正確但不開鎖舵機(jī)角度比較值不對(duì)單獨(dú)寫一個(gè)舵機(jī)測(cè)試程序微調(diào)角度值蜂鳴器一直滴滴響IO口驅(qū)動(dòng)方式理解錯(cuò)誤確認(rèn)蜂鳴器是高電平驅(qū)動(dòng)還是低電平驅(qū)動(dòng)掉電后密碼丟失AT24C02的I2C時(shí)序不對(duì)用示波器看SDA/SCL波形比對(duì)時(shí)序圖程序下載失敗下載時(shí)沒有斷電重啟串口下載時(shí)先點(diǎn)下載按鈕再給板上電LCD顯示亂碼數(shù)據(jù)線和控制線接錯(cuò)對(duì)照原理圖一根一根量通斷5.2 幾條花了不少時(shí)間總結(jié)的避坑心得先說(shuō)舵機(jī)抖動(dòng)。這個(gè)問題表面上是“PWM不穩(wěn)”實(shí)際上是供電和信號(hào)地電位漂移疊加的結(jié)果。舵機(jī)大電流從電源線流過時(shí)會(huì)在線阻上產(chǎn)生壓降導(dǎo)致單片機(jī)參考地電位被抬高PWM波形出現(xiàn)微小的抖動(dòng)舵機(jī)內(nèi)部電路把這個(gè)抖動(dòng)當(dāng)成誤動(dòng)作信號(hào)就開始原地哆嗦。解決辦法是把舵機(jī)的電源負(fù)極和單片機(jī)的地在電源入口處單點(diǎn)匯接不要順著杜邦線串接。再說(shuō)RC522模塊距離的問題。MFRC522模塊引線如果超過20cm讀卡靈敏度會(huì)明顯下降表現(xiàn)就是卡要貼得很近才能讀到或者干脆讀不到。如果布局上必須拉長(zhǎng)線要用雙絞線或者屏蔽線并適當(dāng)降低通信速率調(diào)大SPI分頻系數(shù)。還有一個(gè)是AT24C02的I2C死鎖問題。I2C總線上如果某一方中止通信時(shí)恰好把SDA拉低總線就鎖死了后面所有讀寫都無(wú)法進(jìn)行。我的應(yīng)對(duì)策略是每次通信開始前先軟件復(fù)位一遍I2C總線——把SCL時(shí)鐘線連續(xù)翻轉(zhuǎn)9次以上將總線上可能殘留的非法狀態(tài)清掉。這個(gè)技巧雖然簡(jiǎn)單但在項(xiàng)目里幫了我大忙。5.3 我是如何快速定位問題的最后分享一個(gè)排查問題的順序習(xí)慣。很多朋友遇到問題喜歡先改代碼一遍一遍燒錄測(cè)試結(jié)果改來(lái)改去問題還在那里。我現(xiàn)在的習(xí)慣是“先硬件后軟件先電源后邏輯”拿到一塊不工作的板子先用萬(wàn)用表量電源電壓對(duì)不對(duì)然后量晶振有沒有起振示波器測(cè)XTAL引腳有沒有正弦波再量復(fù)位電路的電壓是否符合要求最后才輪到下載程序看現(xiàn)象。這套流程下來(lái)至少能排除掉七成以上的硬件問題。剩余的邏輯問題就用單片機(jī)串口往PC端打印調(diào)試信息每一步的狀態(tài)變化都打印出來(lái)很快就能定位到狀態(tài)機(jī)卡在哪個(gè)環(huán)節(jié)。這個(gè)方法從51到ARM通用越早養(yǎng)成這個(gè)習(xí)慣后面做復(fù)雜項(xiàng)目越受益。我個(gè)人在實(shí)際操作中的體會(huì)是這套基于51單片機(jī)的智能門禁項(xiàng)目真正值錢的地方不是那幾行控制代碼而是它逼迫你打通了從硬件選型、電路設(shè)計(jì)、軟件架構(gòu)到系統(tǒng)調(diào)試的完整閉環(huán)。你會(huì)在調(diào)舵機(jī)角度時(shí)理解PWM的本質(zhì)會(huì)在讀不到卡號(hào)時(shí)被迫搞懂SPI時(shí)序會(huì)在掉電丟失密碼時(shí)才發(fā)現(xiàn)自己根本沒有理解I2C協(xié)議。這些經(jīng)歷都是在課本上學(xué)不到但又恰恰是工程現(xiàn)場(chǎng)最需要的。所以如果你正卡在這個(gè)項(xiàng)目的某個(gè)環(huán)節(jié)上別急著懷疑自己對(duì)照上面的排查表一步步查你一定能把問題揪出來(lái)。本文還有配套的精品資源點(diǎn)擊獲取