51單片機(jī)學(xué)習(xí)單片機(jī)之路總結(jié)
學(xué)習(xí)單片機(jī)有一學(xué)期了,現(xiàn)在也由51轉(zhuǎn)到STM32了。一直想對51的學(xué)習(xí)做一個總結(jié)。也希望對別人有一些啟發(fā)。也給后學(xué)者提供一些建議。當(dāng)然本文是我對自己學(xué)習(xí)過程的總結(jié),若有不對的地方,還請高手指出。
我想,再看本文之前,最好對單片機(jī)有了最基礎(chǔ)的了解,最好能用單片機(jī)驅(qū)動起一個LED燈,否則,可能會不知所云。
首先我想問一個問題,你認(rèn)為單片機(jī)有哪些內(nèi)容呢?也許你現(xiàn)在手里有一塊開發(fā)板,你已經(jīng)開始從流水燈開始,一個一個外設(shè)在跑了。也許你已經(jīng)看過一些單片機(jī)入門的書了。如果是這樣,我估計(jì)你會回答,單片機(jī)包括了流水燈,鍵盤,數(shù)碼管,定時(shí)器,中斷,串口,AD,DA,液晶,DS18B20……其實(shí)這樣的回答其實(shí)符合了大多數(shù)初學(xué)者的心態(tài)。因?yàn)樘煜槔蠋煹囊曨l也是這么教的。但是當(dāng)你會操作流水燈,鍵盤,數(shù)碼管,液晶,你有沒有發(fā)現(xiàn)他們有一個共同點(diǎn),就是都是通過I/O口輸出或檢測高低電平來驅(qū)動這些外設(shè),那我們可不可以把這些模塊歸為一類,就叫I/O口操作呢,那么這樣,要學(xué)的內(nèi)容就又被濃縮了一下,可分為四個模塊了,I/O口,定時(shí)器,中斷,串口。對于AD,有的單片機(jī),例如**公司的加強(qiáng)型單片機(jī)就自帶了AD,若使用AD芯片,則也屬于I/O部分,AD部分我放到后面再提。
這樣,學(xué)起來?xiàng)l理就清楚了,其實(shí)當(dāng)你驅(qū)動了流水燈和按鍵模塊??梢哉f,你就完成第一部分,I/O口的學(xué)習(xí)了。I/O的輸入和輸出你都學(xué)會了。至于數(shù)碼管,液晶,那是為了加強(qiáng)你I/O口編程的能力,說來說去,就是在什么時(shí)間輸出高電平,什么時(shí)間輸出低電平以符合他們的通信協(xié)議而已。如果你能理解他們都是I/O操作,學(xué)起來這些是很簡單的。
接下來,繼續(xù)定時(shí)器,中斷的學(xué)習(xí),無所質(zhì)疑,定時(shí)器與中斷是分不開的,沒有中斷,定時(shí)器也很難實(shí)現(xiàn)功能。在這里,建議先學(xué)習(xí)外部中斷,如果你認(rèn)真的學(xué)完外部中斷,我想你應(yīng)該能深刻了解中斷的含義(這里插一句,一定要理解中斷,為后來更高級處理器的中斷系統(tǒng)打基礎(chǔ)),在學(xué)定時(shí)器與定時(shí)器中斷。如果你能深入學(xué)習(xí)定時(shí)器與定時(shí)器中斷,我想這是,你應(yīng)該能用數(shù)碼管做一個電子鐘了,具體實(shí)現(xiàn)就看你的編程水平了,可以試一試哦。
然后,花一把功夫?qū)W完串口通信,我可以對你說,你把單片機(jī)的內(nèi)容學(xué)完了。現(xiàn)在,你可以試著把這些分立的模塊組合做成一個實(shí)際的東西鞏固一下。這時(shí),但是,你要知道,還有更多的事等著你?,F(xiàn)在只是基礎(chǔ),你前面學(xué)的是單片機(jī)自身的內(nèi)容,這時(shí),你需要去了解單片機(jī)的外圍設(shè)備了,例如AD,DA,I2C,SPI等等內(nèi)容了。但是,有些單片機(jī)自帶了AD的功能,但我仍然不把他列入單片機(jī)自身的內(nèi)容,包括PWM,也不屬于單片機(jī)的內(nèi)容,盡管有些單片機(jī)帶這個功能。這些外設(shè)還是需要花大氣力研究的,學(xué)到這里,你應(yīng)該很容易讀懂芯片的時(shí)序圖了,也就是協(xié)議。這時(shí)對于DS18B20,紅外,315M無線通信等等,應(yīng)該都不在話下了。
你原先的程序都是在開發(fā)板上跑的,你現(xiàn)在可以學(xué)習(xí)如何自制電路板了,也就是學(xué)會畫板,推薦使用Altium Designer軟件?,F(xiàn)在可以自己畫一塊系統(tǒng)板,做出來,看看能不能工作。如果不能,找找原因,可以跟你說,這個是必須要會的。至此,單片機(jī)學(xué)的差不多了。
但是,更高的目標(biāo)還在等著你,因?yàn)?,一開始就是用C語言在編程,對底層的認(rèn)識比較淺薄的,你可以看一看單片機(jī)的匯編語言,不要求你會寫匯編,但至少你要能看懂別人的匯編代碼,你可以接觸一下底層寄存器到底是怎么工作的,怎么尋址的。在這里插一句,以前你寫代碼時(shí)第一句總是#include,我想如果把這一句去掉,你還能讓編譯通過嗎?你理解這個文件里有哪些內(nèi)容嗎,把這個文件里的定義弄明白了,51單片機(jī)的寄存器也就差不多了。這時(shí),你應(yīng)該熟悉了51單片機(jī)了。這時(shí)學(xué)習(xí)其他單片機(jī)也應(yīng)該很簡單了,只是換一種編譯器,寄存器改了而已,原理是不變的,反正都是用C語言編程,只要稍微改一下就完全可以適應(yīng)另一種芯片。這就是我的整個學(xué)習(xí)過程,僅供參考。
這時(shí),你需要的就是培養(yǎng)單片機(jī)的開發(fā)經(jīng)驗(yàn)。這時(shí),不能說你精通了單片機(jī),只能說會用單片機(jī)了。我想問一句,這時(shí),你可以開發(fā)一個倉庫多點(diǎn)溫度測控系統(tǒng),數(shù)據(jù)傳回電腦并處理嗎?不能,我也不能,但是如果你花大學(xué)四年時(shí)間就搞51的話,我確定是可以的。在這里就涉及到一個方向選擇問題,關(guān)于方向選擇,我的學(xué)長張永翔給了我比較好建議,這時(shí)你有兩個方向,一個往低層做,就是繼續(xù)學(xué)習(xí)51單片機(jī)開發(fā),你的目標(biāo)就是用最簡單的芯片,最低的成本實(shí)現(xiàn)最復(fù)雜的系統(tǒng),比的是成本,也就是說,實(shí)現(xiàn)同樣功能的系統(tǒng),你可以用比別人更低的成本,更簡單的硬件,更高效的算法去完成,這樣你才有市場。另一個當(dāng)然是往高層做,去學(xué)習(xí)更高級的單片機(jī),學(xué)習(xí)ARM嵌入式,操作系統(tǒng),不過這條路比前一條難很多,當(dāng)然就業(yè)的報(bào)酬也很多。只是,你要花更多的時(shí)間以及更高的投資,ARM開發(fā)板等等,這可不是一筆小數(shù)目,你要花的起,當(dāng)然,從文章的第一句就知道了,我選的是后者。其實(shí)我覺得,作為本科生,還是選擇后者比較好,回旋余地大,可以繼續(xù)考研的。我現(xiàn)在還記得我的電路分析老師說的一句話,“現(xiàn)在學(xué)電子的本科生,如果你畢業(yè)時(shí)只會一個單片機(jī),你就廢了”,我覺得還是挺有道理的,作為本科生,尤其是電子專業(yè)的本科生,往高層做是必須的,而且隨著技術(shù)的發(fā)展,高級單片機(jī)例如STM32的成本也一直在下降,高級單片機(jī)的普及已成為一種趨勢了。
當(dāng)然,這只是個人的理解,仁者見仁,智者見智。若有不同見解,歡迎討論。再次重申,本文系個人的總結(jié),若有不對的地方,請指正。