單片機(jī)
今天我用我的經(jīng)歷來告訴大家一個(gè)我認(rèn)為比較有效的單片機(jī)學(xué)習(xí)方法。
上大學(xué)時(shí),因?yàn)榘V迷機(jī)器人制作,我開始自學(xué)單片機(jī)。隨著深入了解,我開始對單片機(jī)產(chǎn)生濃厚的興趣。室友們在開黑玩dota,我在搭電路敲代碼;室友們在看天下霸唱的小說《鬼吹燈》無法自拔,我在讀郭天祥的自述《我的大學(xué)六年》斗志昂揚(yáng)。就這樣,學(xué)習(xí)了一段時(shí)間C語言和單片機(jī),我就開始著手制作機(jī)器人。經(jīng)過一年多時(shí)間,我制作的機(jī)器人數(shù)量不斷的增多,對單片機(jī)的理解和使用也有了很大的提升。后來我的好友也開始學(xué)習(xí)單片機(jī),可沒多久他就跑來和我抱怨單片機(jī)太難學(xué),我就讓他去網(wǎng)上買了一套單片機(jī)開發(fā)板,或許這樣學(xué)習(xí)會更容易一點(diǎn)。別說,開發(fā)板上的資源還挺豐富,流水燈、數(shù)碼管、矩陣鍵盤、LED點(diǎn)陣、紅外遙控器、直流電機(jī)、步進(jìn)電機(jī)、LCD屏......應(yīng)有盡有,還配有視頻教程。這可比我當(dāng)初自己搭建的最小系統(tǒng)板強(qiáng)多了,這下應(yīng)該沒問題了。
單片機(jī)開發(fā)板
果然,沒過多久好友就告訴我:“單片機(jī)其實(shí)還是挺簡單的嘛。“我給他設(shè)計(jì)了幾個(gè)小項(xiàng)目,他瞄了一眼,說這個(gè)太簡單,涉及到的知識點(diǎn)開發(fā)板上的教程都有講過,不用再做了,自己回去找點(diǎn)別的項(xiàng)目做。過了一段時(shí)間,我的機(jī)器人小組要招新人,考題是根據(jù)提供的材料現(xiàn)場制作一輛循跡避障智能車。我的好友也來了,看著他自信滿滿的樣子,我也就放心了??墒亲詈蟮慕Y(jié)果出乎我的意料,他什么都沒做出來,他自己也很詫異,明明想法是有的,可是卻無從下手。后來,又有幾個(gè)學(xué)弟在學(xué)單片機(jī)的時(shí)候也存在這種問題。我開始認(rèn)真的思考他們的問題所在:
初學(xué)階段過度依賴單片機(jī)開發(fā)板,完全跟著開發(fā)板的教程學(xué)習(xí),缺乏主動性。
對單片機(jī)的認(rèn)知不足,急于求成,恨不得一天就把單片機(jī)學(xué)會,導(dǎo)致基礎(chǔ)不扎實(shí)。
盲目自信,跟著教程學(xué)習(xí)了板上所有資源就覺得自己已經(jīng)學(xué)會了單片機(jī),不屑于從簡單的項(xiàng)目開始做起。
遇到疑難問題總是逃避,不積極處理,總想留在以后解決。
誤認(rèn)為單片機(jī)主要學(xué)習(xí)內(nèi)容就是寫代碼,不重視底層硬件知識和接口電路知識。
總而言之,沒有找到正確的學(xué)習(xí)方法。
那為什么我在學(xué)習(xí)單片機(jī)過程中沒有出現(xiàn)他們的這些現(xiàn)象呢?
第一點(diǎn),我沒有使用開發(fā)板進(jìn)行學(xué)習(xí),我不是說開發(fā)板不好,其實(shí)開發(fā)板是很好的單片機(jī)學(xué)習(xí)入門工具,但僅限于入門,它的延展性太差,無法引導(dǎo)大家更深入的學(xué)習(xí)。
第二點(diǎn),我學(xué)習(xí)單片機(jī)主要是為了制作機(jī)器人,而機(jī)器人制作則恰好為我深入學(xué)習(xí)單片機(jī)開辟了一條正確的道路:當(dāng)我制作紅外循跡智能車時(shí),我認(rèn)識了紅外反射傳感器,設(shè)計(jì)了紅外傳感器接口電路和H橋電機(jī)驅(qū)動電路,編寫了多路紅外傳感器掃描和PWM調(diào)速代碼;當(dāng)我制作CCD循跡智能車時(shí),我認(rèn)識了圖像傳感器,設(shè)計(jì)了圖像傳感器接口電路,編寫了圖像傳感器的驅(qū)動程序和簡單的圖像處理算法,認(rèn)識了opencv開源庫,學(xué)習(xí)了PID控制算法;當(dāng)我制作六足機(jī)器人的時(shí)候,我認(rèn)識了舵機(jī),開發(fā)了多路舵機(jī)控制器,開始學(xué)習(xí)Labview編寫上位機(jī);當(dāng)我制作自平衡車的時(shí)候,我認(rèn)識了加速度傳感器和陀螺儀,了解了卡爾曼濾波,加深了對PID的認(rèn)識;當(dāng)我......
在這些機(jī)器人的制作過程中,我熟練掌握了各種調(diào)試技巧,注重代碼編寫的質(zhì)量,面向接口編程,接觸了設(shè)計(jì)模式,歸納了編程中常見錯(cuò)誤......就這樣,沿著機(jī)器人制作這條路去學(xué)習(xí)單片機(jī),不會因?yàn)槟骋粋€(gè)模塊代碼簡單就不寫,不會因?yàn)槟骋粋€(gè)模塊電路簡單就不畫,更不會因?yàn)檠矍暗睦щy而放棄,因?yàn)槲业哪繕?biāo)就是完成我的機(jī)器人制作。
說了這么多,只是想讓大家知道我的方法并不是空穴來風(fēng),而是我這么年來的經(jīng)驗(yàn)之談,即使現(xiàn)在已經(jīng)工作好幾年,我依然通過這種方式在進(jìn)步。當(dāng)然,這也只是我的一家之談,希望對你有所幫助。
再次鄭重提醒,初學(xué)單片機(jī)時(shí),再簡單的代碼也要敲,不要眼高手低,bug往往藏在最簡單的語句中,多寫多練,歸納易錯(cuò)點(diǎn)是非常必要的。考考你:
if (1 == ir_num) { } //注釋:這是我當(dāng)時(shí)自己歸納總結(jié)的,后來在《C++ Primer》中也看到這種寫法。
(審核編輯: 林靜)
分享