怎樣學會單片機?

1.怎樣動手從頭開始? 2.怎樣理解晶振/中斷/存儲器等? 3.怎樣記住單片機彙編指令? 4.怎樣看懂單片機外圍電路? 5.為什麼都說用C比彙編好?

6.需要些什麼前置知識?


1.怎樣動手從頭開始?

Proteus可以模擬單片機,你可以先在那上面體驗一下,如何讓一個MCU使一個LED閃爍。對於單片機要幹什麼事有一個了解,如果你之前沒有這方面的基礎。

但是,我還是推薦你花點錢去買一個開發板,哪怕這個板子花掉你壹貳叄肆百塊錢也不要緊,因為你以後能掙回來。這就是投資。

單片機的概念中,有些方面很重要,例如但不限於此:時鐘、匯流排、中斷、寄存器、堆棧、取指令、定址等等。針對你所學的單片機會有書籍來講解。

單片機有很多種,互相之間甚至指令都不兼容,但是思想都是一樣的:
1)利用其特有的指令語句,
2)來分配存儲空間和控制外設資源,
3)以此來完成你想要的功能。

在你學會第一種單片機以後,再遇到新的單片機類型,你就只要去看這種單片機的指令系統(思想1)文檔、數據手冊(思想2),然後以思想3作為你組織思想1和思想2的宗旨原則。

基本上目前的單片機廠商都會在網上提供了演示程序的源代碼,你可以模仿這些源代碼寫你自己的程序,你可以開始的時候先在演示程序的源代碼基礎上修改(比如原來LED每秒閃1次,你就改為讓它每18秒閃8次),然後自己模仿這些源代碼寫一個全新的程序讓LED按照你想要的方式點亮或熄滅。先這樣開始,簡單,快樂。然後慢慢進入到高級應用,例如各種串列匯流排。用開發板來學習到的,只是這個單片機的指令系統,以及這個單片機有什惡魔資源可以被你所使用。任何的終極目標,都應該是你的應用需求,開發板只是個例子。如何把你要做的抽象的事情一步步地具體到單片機的電路和程序(例如電動機的旋轉速度的控制過程可以一步步具體到單片機外圍電路需求和單片機程序邏輯),才是你幹這一行真正應該學習的事情。

2.怎樣理解晶振/中斷/存儲器等?
看書。

3.怎樣記住單片機彙編指令?
這個東西確實是熟能生巧。但是「熟能生巧」是結果,不是起點。怎樣才能熟呢?——多寫程序,多注釋!

4.怎樣看懂單片機外圍電路?
外圍電路如果用到其他集成電路晶元,那麼就容易讀懂,因為你可以按照晶元上的型號規格在網上查到這個晶元是幹什麼的,還能下載到這個晶元的數據手冊,就能知道這個晶元與MCU之間大致應該怎麼連接的。如果MCU周圍沒有什麼晶元而只有大量的電阻和電容,那麼這時候就需要你具有一定的模擬電路和數字電路的基本功了。

5.為什麼都說用C比彙編好?
這個提問本身就是個誤解。沒有誰比誰好,而是市場要什麼你就得用什麼。

----
我說的這些,其實很TM空洞無聊,都不如你去買一塊開發板跟著教科書去改演示代碼來得直接和高潮。

----
我懷著極左的態度,建議你去看看周立功先生在新浪的博客,老周在那裡分享了很多學習的心得和經驗,可以讓你少走些彎路。


問問題請加公用號,專門搞了個方便回答問題,
公眾號:穩准快(微信號:love_auto_2013)

做了一年飛思卡爾智能車,現在在做第二年,並且是實驗室負責人。不知道為什麼漸漸的不想分享自己的經歷了,可能是覺得自己水平太低,怕別人笑話。
這個時候來答這一題,不知道題主有沒有已經學會了單片機或者放棄了。
————————————————————————————————
更新,寫到最後面吧
…………………………………………

我的學習歷程:
——C51單片機,做了一個計時器(做出來用了一天半,精益求精用了兩天)
——S12單片機(16位單片機,因為沒人帶,只有一堆不知道從何開始的資料,用了兩個多月大約,跑起來一輛車,很慢。學16位的好處是,它的寄存器配置還比較簡單,寄存器跟51共通點多,功能跟32位單片機又相似,有利於過度)
——KL25單片機(32位單片機,當天閃爍了小燈,這意味著基本入門,十天測試完成了所有要用的模塊,又用了十天跑起來了車,補充一條,我當時做的直立車,用到的感測器和模塊比較多)
——K60單片機(32位單片機,主頻比KL25高,晶元功能也更加強大,學它,好像已經沒了學習過程,直接拿著就開始用了,32位單片機用法都很相似了)
————————————————————————————————
回答題主的問題:
需要哪些背景知識?
有沒有都行,也就是一開始學還無關緊要。
怎樣動手從頭開始?
1.確定自己真的要學,不會中途而非。學習的過程中,會越來越感到乏味,80個人,能剩下20個堅持到底的就不錯了。
2.軟體先行,先學會拿著開發板寫程序,然後外跟上硬體。
3.去淘寶買一塊C51單片機開發板,買哪個都無所謂,跟著視頻教程一點一點學,不要定長遠計劃,也不用全部搞懂學完,如果你能全學完全搞懂當然更好。時限,兩天(女生都可以做到,做不到你就不要學了(這句話有歧視女生的意思,在此解釋一下,並無此意,只是表達了大部分女生不喜歡學這個,或者學這個比較吃力,所以我才這麼表達。對引起的誤解表示抱歉)),任務,一個計時器,且新的計時開始時,顯示上一次計時結果,用數碼管做。(到此為兩天的任務,以下為擴展任務,再加兩天)切換計時時有蜂鳴器提示音,數碼管換成液晶LCD1602或別的什麼液晶,加上串口通信,可由電腦控制計時並返回計時結果。
4.上面的任務如果能圓滿完成,可以直接學習K60單片機或者學習STM32,學哪個無所謂,一通百通。

2016.02.13
———————————————————————————————
有人看,那就接著更吧。
經過上面的學習,基本以後的軟體學習都可以用同樣的模式進行了。
單片機的學習,最重要的就是用,邊學邊用,一來能加強學習效果,二來能給自己帶來更多的正反饋。

補充兩點關注32位單片機的學習:
1.要學會使用庫,32位單片機一般都有成熟的庫可以使用,要學會使用這些庫。
2.相關硬體的學習,要學會看英文原版的datasheet,很多電子元件都只有英文原版的數據手冊,英文原版的效果也比中文好,因為有些東西翻譯過來味道就不一樣了。

下面大概說一下單片機硬體的學習:
1.跟著視頻做基本的軟體操作學習,可以去網上搜索相關教學視頻,看兩個就差不多了。或者直接找書對著邊學邊做,推薦後者,學起來不枯燥,可以自己把握節奏。軟體可以先使用Altium designer,封裝,元件庫可以從網上下載開源的板子生成。
如果是在校大學生,最好找個導師,跟著導師做他的項目,因為有人指導,效果肯定不一樣,況且可以做一個實際的東西,動力也不一樣。我當時就是跟著一個老師,畫他的項目的一塊板子,假期做的,從什麼都不會,硬著頭皮做,每天從6點畫到23點,中間不吃飯不睡覺,回寢室的時候整個人都是飄的。畫畫改改一個星期,老師才滿意了。
我這才剛剛學會從現成的原理圖畫PCB。後面才開始學怎麼畫原理圖。不過在畫PCB時,不知道原理圖的功能是不行的。
找不到老師,可以自己畫一個計時器的板子,不需要跟做51時的電路完全一樣,自己設計一個。畫完可以去網上找商家做出來印刷電路板。淘寶就有。
2.焊電路板。
焊電路板是門手藝。首先,去網上找視頻。大概分為,貼片電容電阻焊接,插針焊接,晶元焊接,學會之後多動手,慢慢就會焊很多東西了。
3.畫電路板不要給自己設定太長學習時間,根本沒有那麼難,一個星期,就必須學會從原理圖畫PCB,後面的會在實踐中漸漸豐腴。
單片機的學習,要先學會使用黑箱,先學好80%的東西,不必要記住,只需要達到效果就可以了。
還要學會自己解決毫無頭緒的問題,要有這樣的心態。
2016.02.19。

看到上面有人提到protues,我要稍微反對一下這個學習方法,不不不,是反對這個入門學習方法。
原因是這是一種自上而下提出的入門學習方法。它需要你對單片機已經有了解,至少要會用。然後還要有一點點硬體的基礎。
為什麼呢,因為它是模擬軟體,何為模擬,有真才能仿。它是給不方便設計實物時,測試用的,換句話說就是給已經會用的人用的。教學除外,我們有一門課叫智能儀錶,就是讓我們用這個軟體來做作業。有空上個圖你們就明白了。
所以我提倡去淘寶一百來塊錢買一個51的板子,又有教程。很適合入門。然後做做我上面說的小任務。鞏固學習。只做教程給的任務,會茫茫然不知所以然。
2016.03.09


有空接著更。


研究生階段開始用單片機的,從零開始自己學的。簡單回答下你的問題,順便說下我的學習過程,希望能幫到你。

1. 如果你沒有任何基礎的話,建議買一塊開發板,先在上面運行一些簡單的程序,比如說讓LED燈亮滅,用UART通訊之類的。當然,我覺得用開發板學單片機其實啥都學不到,最好還是找一個項目,哪怕是自己想要做的,從頭開始自己畫板子,這樣學習才最快最好。
2. 簡單來說,晶振就是提供時鐘的,單片機的任何一條指令都需要一個或幾個時鐘周期,沒有時鐘單片機就無法工作,任何串列執行的CPU都是同理。中斷就是你的程序需要臨時處理一些其他的功能的時候,CPU暫時停止手頭的工作,保護好現場,執行中斷程序,執行完了再回來干之前的事情。存儲器就是存儲程序和數據的地方。這些其實都是最基礎的東西,找一本書看看就好。
3. 彙編指令這東西得熟能生巧,用的多了就記住了,千萬不要死記硬背,因為每種單片機的指令集都不同,初學可以暫時不用考慮這些。
4. 外圍電路需要你有一定的硬體基礎,其實外圍電路主要也就是電源(給單片機供電)、複位電路、連接存儲器(有的單片機內置了FLASH,這些就不需要了),晶振電路,單片機手冊上都有介紹。學單片機的話,一定要多看晶元手冊,這個東西要比外面賣的書有用的多。一開始可能覺得很枯燥,因為全都是英文的,但是你想啊,晶元種類那麼多,每個晶元都得靠晶元手冊,少看國內出的那些什麼單片機教程的書,多看晶元手冊,這樣才能提高。
5. 沒有人說過C比彙編好,只是你開發起來會快一些,會好上手,真正調試的時候,往往還是得看看反彙編的。


作為一名大二大三都在玩電子設計競賽的大四學生,我想說幾句。
單片機想要入門,很簡單,一台電腦,一個人開發板,一本書,絕對足夠!
(假定樓主有C語言基礎,不用多麼精通,會一點就行)
這東西入門很簡單(大家都說點亮一個LED燈就已經入門了),把書看一看,跟著視頻敲一些程序,基本的東西你就學的差不多了。
但是——這些只是表面上的東西,跟著別人的學習,根本觸及不到真正深層次的東西。
要想真正的了解並掌握它,《微機原理》《C語言》這些都應當認真系統的學習,彙編語言也是需要的。這些都是比較深層次的東西,了解了它們,才算是真正的了解單片機。

既然是從零開始,那麼後面的就先不用考慮,一切跟著興趣走~~
學習單片機的過程是充滿誘惑與樂趣的,想當年真的有一次學習到忘記吃飯有木有!


我當時學單片機是自己焊的模塊,結合proteus模擬,強烈推薦這款軟體,單片機調試很有用,雖然有時模擬結果和現實不大一樣。
其實我本人是不大推薦初學時直接用開發板的,這樣一些硬體驅動自己就不大了解,自己焊的話更容易發現問題,解決問題。在後面做的項目中我發現我花在硬體調試的時間經常比軟體調試還長。
C語言屬於高級語言,比較好移植和理解,但效率低於彙編。事實上我很佩服能用彙編寫出複雜功能程序的人。


1. 要懂一點C語言,這些就足夠了
2. 看視頻,我推薦「力天電子」的51教程!我是照著他學的,很有啟發性,尤其概述部分入門很好。
3. 說別的都沒有用,自己多練,不懂搜索,多提問。


既然是入門的話建議找塊開發板,對著常式從簡單的開始敲。最好自己照著電路圖做一塊開發板,當年我是用萬用板焊的。。。。。。建議從C語言開始學,彙編那東西不好理解


個人覺得傳統的8bit/16bit單片機學習意義已經不大, 新一代cortex-M在能耗和性能方面都比8bit/16bit強很多, 更重要的是ARM和各大廠家提供豐富的資源和開放的論壇, 開發難度更低, 產品推出市場的速度更快. 個人偏向軟體實現各種功能, 請硬邦邦的各位輕拍.

1.怎樣動手從頭開始?
Freescale KL系列開發板從12刀左右就可以買到:
FRDM-KL25Z Product Summary Page
開發板帶massive storage bootloader, 刷機什麼的就不用UART或者特種奇怪的方法刷機. hello world, 閃燈之類的都非常簡單. 可以從Processor Expert學起, Processor Expert自動生成大部分代碼, 都不用擔心設置各種的. 當然只推薦初學的階段, 後期PE就會顯得累贅和繁瑣. 初學也會覺得PE累贅繁瑣, 只是不用PE會更加繁瑣.

2.怎樣理解晶振/中斷/存儲器等?
RTFM
簡單來講, 晶振就是時鐘, 每時每刻都在tick. 中斷就是鬧鐘, 到時候就tick. 寄存器就是寄存器啦, 中午12點和mm吃飯, 大腦記住時間地點人物, 就是r1 r2 r3.
各種reference manual datasheet是你的好朋友.

3.怎樣記住單片機彙編指令?
用C不用彙編.
到要用到彙編的時候自然會知道哪個是哪個.

4.怎樣看懂單片機外圍電路?
大概知道什麼連著什麼就可以了.

5.為什麼都說用C比彙編好?
舉個栗子, context switch, 彙編的話, 首先保留現在所有寄存器的數據和各種指針, 然後調用另外一個函數的堆, 然後怎樣再跳回來.. 如果是8bit/16bit的話context switch變得太高級幾乎不會用了 (太複雜, 過程太昂貴). 而用C的話掛個RTOS, 一個晶元跑幾個進程還是可以的.


1.怎樣動手從頭開始?

答:淘寶買個銷量高的51單片機開發板。

2.怎樣理解晶振/中斷/存儲器等?

答:晶振-模電;中斷-單片機原理;存儲器-數字電路或單片機原理。
(郭天祥、天狼星視頻教程看看就懂個大概了)

3.怎樣記住單片機彙編指令?

答:用開發板從最簡單的代碼開始寫。(開發板配套的教程或者網上搜)

4.怎樣看懂單片機外圍電路?

學點最基礎的模電/數電知識
(晶體管、門電路什麼的,郭天祥、天狼星視頻教程都講)

5.為什麼都說用C比彙編好?

個人覺得,C易寫、易讀。

6.需要些什麼前置知識?

C語言+最基礎的模電/數電知識。

總結:淘寶買塊銷量高的開發板,對著視頻教程和文字教程,結合百度/谷歌開始寫代碼吧!
------------------------------------------------分割線啊-----------------------------------------------
另,

1.強烈推薦此(彙編/C語言都有,此書無敵,此書無敵,此書無敵
8051微控制器和嵌入式系統 (豆瓣)深入理解8051單片機系統 (新版)
2.推薦網站:杜洋工作室 DoYoung Studio
3.百度、谷歌、各種論壇博客,如電子發燒友論壇。


從別的貼吧上轉的。。。。


我個人認為首先你要彙編和C語言,這門課程我們大一開的,有兩本書:微機原理與介面技術(清華大學出版)和C++程序設計(譚浩強編),這兩本書介紹基本的彙編和C語言程序。平時多琢磨多練習就行,如果你不是搞計算機軟體的,你只要會用C和彙編寫函數,了解if,or,while,switch等,還要了解結構體,就差不多了,然後我們是大二開始學單片機的,老師會開始介紹51系列,52系列的單片機,掌握內部結構,重點是定時,中斷上面,書名叫單片機原理與介面技術,市面上的書內容大部分差不多,也不必專門買有程序的書,程序在網上有很多可以下載,關鍵是弄懂原理。然後學串口通信,I2C協議,ISP下載,以及各種電平轉換協議。

學單片機肯定少不了和硬體打交道的,所以也要學好模擬電路和數字電路,這些我們都是在大二上學期開的課,如果你自己要做小系統板,就需要學習制PCB的軟體,比較常用的有PROTEL 99SE 和Altium Designer 6.9(現在有更高的版本)。布線的時候要學習高頻電子電路(王衛東編),這樣你就知道為什麼要考慮電磁兼容和電氣檢查的原因。學好模擬電路和數字電路是為了熟悉各種元器件:二極體,三極體,電路,電容,電感,開關,蜂鳴器等。

學習的時候最重要的是不要眼高手低,不要看到別人驗證了一個DEMO就在那裡和學著追隨潮流,這樣什麼都學不到。要踏踏實實的把原理學好。這樣將來做什麼都事半功倍的,下面將實驗方面的,我個人最喜歡硬體了,所以找的工作也是做電源的,呵呵。剛開始做實驗要培養興趣,不要一開始就想做一個大的系統,這樣會越來越討厭學單片機的,建議開始是:
1.最先設計個最小系統版,然後做成實物,我們學校的實驗室有製版機,呵呵,比較方便,不過我做了兩個,一個是製版機做的,還有一個是自己手工焊的。性能一樣,如果你沒有條件就自己手工焊,其實賣系統版的地方有賣版子的,上面沒有焊任何元器件,要自己買器件焊。這樣的也行。實驗室包括我用的單片機是STC51系列的,因為他的下載器網上有電路圖,自己也可以做一個,成本不超過10元。貴的是元器件啊,像電源晶元,AD/DA晶元,DS18B20晶元,單片機晶元,導線,覆銅板,鑽頭等等,要錢啊,幾個月都和泡麵接下不解之緣。
2.點亮一個發光二極體(哈哈,老生常談啊),然後點亮led點陣,然後設計廣告燈,發揮自己的想像力設計出比較好看的廣告牌啊。可以弄一個在自己的寢室門口,那多帥啊!
3.按鍵控制的,這是絕對少不了的,呵呵,單個按鍵,按鍵組,ZLG7290按鍵板(順便學習一下I2C協議)
4.LCD液晶顯示:字元顯示,圖像顯示,這裡重要的是讀懂時序圖,各函數調用,這裡要用到C的功底了,呵呵
5.AD/DA轉換,這個用的知識比較多,模擬電路和數字電路都要會,還要用到數學(呵呵,那就是編碼啊)。
上面的弄會了,接下來自己可以做一些比較好玩的的產品了:電子琴,日曆,步進電機,機器人,充電器,紅外遙控,波形發生器,語音存儲,甚至mp3都可以做出來,呵呵
51學完後,我然後學的是MSP430,這時上手就比較快,只不過是編程改了一點,其他的硬體沒有變,學完後學嵌入式ARM板。。。

實驗要用到的兩個軟體:Keil uVision3和ISIS 7 Professional(我用的是7.4版本的,常用的是7.2版本的),Keil uVision3是用來寫程序並生成HEX文件,ISIS 7 Professional是用來模擬的,越用越喜歡,不過也不要迷戀它,等你成為高手了,就不要它的,呵呵,這些都可以在網上下載,不要錢的,免費的就是好。呵呵
工具:電烙鐵,錫焊槍,人民幣(這個是少不了的,人民幣用來買元器件的)。模擬和做實物是有很大的區別的。實物做好了,相當於學好了,前提是自己做的,不要是別人做的,自己拿來玩,記得面試的時候很多女生拿著一大塊實驗板,一看就知道是買的,以為面試官都是sb,呵呵。
學單片機要忍住寂寞,要把它當作自己的戀人,呵呵,越摸越有感覺的,不摸就忘了。呵呵
好了,這是本人在實驗室學的一點經驗,拿出來YY,呵呵,望各位拍磚啊!
更高級的就不說了,呵呵,我也正在學,更高級的要自己創造了。


給你推薦一本書:《新概念51單片機C語言教材》,電子工業出版社,作者是郭天祥。個人覺得是非常基礎的一本書,只要你有一點模電數電C語言的知識就能看懂,我們學院以前的一些師兄很多都是靠這本書入門的,如果真的是想學好單片機應用的話建議買一個開發板100元左右,如果有開放實驗室就更好了。至於C比彙編好,不能這麼說,畢竟彙編寫的程序更好,搞懂彙編能更好的了解單片機的工作原理,但是要學好彙編難度很大,而且彙編能寫的程序用C語言也能實現,但C語言學起來較簡單,而且工科學生都有C語言基礎,所以一般傾向於用C寫。


本人也正在學習51單片機。推薦視頻《郭天祥十天學會單片機》,推薦書籍《51單片機應用從零開始》。視頻講的很詳細,關鍵不是看懂要自己多操作,自己買板子動手能力強就自己焊板子。


我是2005年開始大學生涯的,物理師範生。2005年年底左右,我在圖書館發現了名字包含單片機的書,講51彙編的,如獲至寶。因為小時候(93、94年那會兒),我一直好奇想知道,我家那台日立錄像機的遙控器是怎麼隔空完成遙控的?另外,錄像機的遙控器居然知道1996年是閏年,日期在兩月底神奇的自己增加了2/29一天,居然沒有跳轉錯誤!這在那個沒有互聯網、甚至walkman都還沒普及的年代,是很神奇的事情!回到大學看到單片機書的話頭,當時輾轉看了一年也沒怎麼看懂,原因就是:
①編程完全零基礎,沒概念!
②電路完全零基礎,對集成晶元(IC)一無所知!
軟硬體完全零基礎,也沒有條件和機會實踐,因為書里沒說買什麼學習板!也不曉得該如何開始下手,應試教育體制下的12年,只動手做過幾部四驅車和橡皮筋動力飛機,還有一兩艘船模。

我是物理專業的,但對電子、單片機充滿好奇,憧憬著有一天能學會單片機,知道這些晶元運行的原理以及如何駕馭它們,進行創造發明,這變成了我最濃厚的興趣之一和心生無限嚮往的事情!
大學二年級先學了VB限定選修課程(限定選修就是必修,只是給你選擇,比如五門選項里選擇三門),當時發現自己學習編程進度很快、也超級感興趣!然後是學習模擬電路和數字電路限定選修課程。之後大三選了單片機選修課。感謝學院開設這門課程!但這是入門通識課,一個學期的課程,老師只讓我們上機了一次,在一個很笨重很笨重的大實驗箱里,做了一個流水燈實驗,和一個與非門、異或門之類的實驗。搭建電路很簡單,主要就是上機編程。其餘大部分時候老師在課上、大階梯教室里,面對近80人的選修學生,講解的都是如何使用軟體proteus做模擬實驗。考慮到物理系只需要打打基礎,就只講了51彙編,省去了C51。其實那個單片機老師學科背景不是一般的牛逼,當時神六剛剛上天、神七還沒發射起飛,他已經在做神八的某個測量模塊了,他有航天課題項目在手。2007年那會兒,他在學院里開設招收來自中國各地的大學老師的FPGA培訓班。
儘管當時學習單片機還沒實物開發板,我還是一如既往地如痴如醉,而且我熱愛編程,看彙編的書也覺得很有趣。接下來,上數字電路課的老師是通訊系的,告訴我上海北京東路賽格電子市場逛點啥,買點啥,怎麼實際開始動手實驗。當時51單片機也開始普及」在線編程」了,不再需要買昂貴的下載器了。我的第一塊最小系統板緊接著也出現了!是通訊系學生設計的PCB,然後大家眾籌(那會還沒眾籌概念,也還沒團購的概念,當時就是一次工廠做的多比較划算,而且,一夥學生都需要一塊最小系統板用來學習),於是一人50幾塊錢,等著公司發來通訊系大神自主設計的PCB過來,再等他焊接好。送到我手裡那天,我到今天還記憶猶新,太興奮了,那天大三的我去上金融物理選修課(也是很前沿的一門選修課),手裡就時不時拿出板子來看,覺得來之不易、倍感珍惜!那塊51是飛利浦的,16K內存,當時飛利浦可能還沒叫NXP!然後我就開始了自學生涯,繼續看很多很多書,彙編的和C51的,然後搭電路、編程、做實驗。也許是因為我熱愛編程的緣故吧,所以當時單片機對我來說,主要就是編程的樂趣!原來是編VB桌面應用程序,做做模擬物理實驗、數據處理小軟體。現在可以有單片機硬體實體運行程序了,當時那種學習的快樂,是很純真的孩子般的快樂!後來大四教育實習在一所區重點高中,運氣好遇到個單片機大牛高中老師,他推薦我花了800多塊錢買了個PIC學習套裝、啃李學海的兩本書,我就抓緊時間自學了RISC精簡指令彙編和Hitech C。繼續愉快玩耍!
從大三開始我也同時研究學習樂高機器人(我是教育師範生,樂高是我們物理系一個新的研究項目),跟老師一起研究LabVIEW和RobotC給樂高NXT編程、開發物理教育教學案例,NXT是2006年樂高公司推出的第二代32位教育機器人,當時還是很新的。
2009年畢業工作後,我繼續學習,那年11月因為有幸從一名保持聯繫的大學電子通訊系同學(他爸爸是華師大電子系老師)那裡得到了四塊現代電梯的雙色點陣顯示板,它是用AVRmega8單片機控制的,於是自學了AVR單片機的C編程,玩那幾塊雙色點陣。但當時有個困惑,就是我能編程使用的感測器模塊種類其實不多,因此我學java,研究Android手機編程、調用手機感測器,並且藍牙連接樂高,進行反饋控制。另外,為了利用加速度感測器做實驗和物理教具,我還學習研究如何用LabVIEW結合教育類Vernier感測器進行開發。轉機馬上出現了,2010年10月,我有幸跟著一個培訓機構老闆去了「新車間」參加活動。那個時候還很少人知道新車間和來自台灣的李大維(新車間應該是中國最早的創客空間,Ardublock插件是李大維開發的。)去新車間當天看到,那裡大部分是老外,那個時候看到他們用arduino在編程,立刻覺得,我可以更快實現駕馭更多感測器了!那個時候還幾乎沒啥arduino中文論壇,我是看著http://arduino.cc英文官網學的arduino,軟體版本連0.9都還沒到,現在是1.8.x。但因為開源,淘寶上已經有賣arduino了。
現在回頭想想,依然覺得這十多年來特別有意思!雖然我不是科班出身,也不是工程技術、研發人員,也不完全靠單片機來謀生。但一路走過來,全憑興趣,愉快玩耍,拚命看書、編程、動手實驗!2007、2008年那會兒,Google和Youtube也都還沒被封鎖,那個時候貪婪地學習著各種新鮮的單片機和編程知識的狀態還歷歷在目!
分享完畢,如果說有什麼建議,我覺得要找機會多看看人家是怎麼玩單片機的,有老司機帶帶新司機總是最好的!但如果沒有,也沒關係,那就要去多看論壇、看教學視頻、多看書了,確實有很多人是通過上網和啃書中學習單片機的!
加油!開開心心玩耍!


如何學好單片機
摘要:單片機越來越多的受到電子產品研發人員和我國高等技術類學校的應用與重視。本文在多年實際經驗的基礎上,從單片機結構、邏輯思維、和微觀理念方面著手,詳細介紹了如何學好單片機這門應用技術的幾點經驗之談。 引言 單片機誕生於20世紀70年代。所謂單片機是利用大規模集成電路技術把中央處理單元(Center Processing Unit,也即常稱的CPU)和數據存儲器(RAM)、程序存儲器(ROM)及其他I/O通信口集成在一塊晶元上,構成一個最小的計算機系統,再加上了中斷單元,定時單元及A/D轉換等更複雜、更完善的電路,使得單片機的功能越來越強大,應用更廣泛[1]。現在更多單片機的發展已經進入了嵌入式系統時代, 由於製造工藝的進步,有如 VHDL、RTOS、CPLD、FPA、DSP、ARM等這一系列可編程器件的體積越來越小、成本越來越低,而功能是越來越能滿足人們的需要。自上世紀 80年代以來,單片機技術在我國各個控制領域得到了廣泛應用,各個世界半導體公司都非常看好中國這個龐大的市場而紛紛到中國來投資建廠,如在蘇州就有日本的瑞薩、松下、美國的快捷等半導體公司在中的生產廠地。同時面對這一技術的不斷發展,我國大部分高校都已經把單片機方面的課程作為學生的必修課,這為我國近些年來的科技、工業控制等方面的發展培養了大量人才,而且社會對此方面的人才需求還在不斷的增加。面對如此情況,作為在校學生,又該從何學起?如何學好這門課程呢?又怎樣才能不讓自己學了等於沒學呢?本文在多年實踐的基礎上,介紹自已的一些感受和經驗。 1理解單片機的結構 對於一個初學者,最迷糊的就是對單片機晶元裡面的結構的理解,小小的一個晶元為何能完成如此神奇的功能。 第一次從事電子方面的工作,也總對那黑黑的晶元裡面感到不可思意的神奇。直到有一天,在檢修一台日本二手電筒子市場里買來的程式控制交換機時,發現裡面有一塊黑東西上的黑膠已經裂開,把它撬開一看,裡面就是一塊電路板,上面焊滿了密密麻麻的電子零件。終於有點明白,原來晶元也可以這樣做成。當然當時所見的那塊電路板是不能被稱之為晶元的,那只是日本的電子製造公司為了防止別人抄襲而把整個電路板密封起來或其它原因,只引出幾個的引腳與其它電路連接。不過它可以讓人聯想到晶元的基本結構與此相類似,如果把那些內眼看得見的電子零件再縮小一千倍或更小以至於能把所有電子零件做在一個矽片上,那也就成了名副其實的晶元了。我們不防以圖1所示的電路及電路板來做一個生動形象的介紹。該圖是一個直流馬達可以正反兩個方向轉動的電路,做成電路板並焊好電子元件後,經測試沒有問題就可以用黑膠(通常採用酚醛樹脂等材料)把所有電子元件封起來,只留六個引腳來與外部電路連接,這樣看起來就好像是一個晶元。 知道了一般晶元的原理,同樣可以更進一步想像單片機為什麼會執行邏輯運算等功能,這就牽涉到數字電路和模擬電路的知識。其實不管一個單片機的功能是如何的強大,其只不過是把許多以微米,甚至是納米為單位級的數字的和模擬電子器件組成。為了形象的來說明單片機內部的結構原理,這裡不訪舉如圖2所示的跑馬燈電路來闡述。圖中電路表明的最終目的是讓LED依次輪流被點亮。首先是通過計數器對輸入脈衝計數,從0到15共16個脈衝為一個輪迴,也即計數器的輸出依次為二進位的0000B到1111B,再由四-十六解碼器把計數器的結果解碼輸出,即依次置Y0到Y15由高電平變為高電平。當某一輸出為高電平時,經過反向器後,與此線路相連接的LED的陰極被拉為低電平從而點亮該發光二極體。這樣一來,計數器和解碼器就相當於單片機里的處理器與PC地址寄存器了,與解碼器輸出腳相連的線就相當於地址線,與LED負極相連的輸出線就相當於數據線,每一條「地址線」都與8根「數據線」有一個交叉,每一個交叉就相當於存儲單元的每一個位。在這些交叉處是否要連通就相當於把程式燒錄到存儲器(ROM)里。最後總體來看就相當於一個只有16個地址的8位單片機。如果把LED換成圖中數碼管,改變圖中的二極體連接,在「單片機」通電和輸入時鐘脈衝後,就可以不停的來顯示數字了。 另外,要做到對單片機內部結果真正的了解,還必須得先要有很紮實的電路基礎、模擬電路、數字電路等方面的知識,否則可能就是空中樓閣。 2理清邏輯思維 學習單片機是最重要的一點就是不能糊塗,不能把邏輯關係搞得亂七八糟。對於初學單片機時,要學會把一個程式的邏輯性關係用流程圖的形式清楚的表示出來。至於用來編寫程式的單片機的語言是很簡單的,不要把它想像得很神秘,不管是彙編語言、C語言、還是更高級的VC++和圖示化語言(如LABVIEW),都只不過是把我們清楚的邏輯思維告訴單片機處理器,並指令它將要被如何進行邏輯操作。把單片機的指令看得很重要應該是我們大家在學習單片機時的一個最大的誤區,老是擔心指令記不住、不會用,這也是學習單片機還沒入門、上路的主要表現。其實這樣有什麼擔心的呢,記不住就不要強求好了,把指令放在旁邊,當把邏輯關係清理好之後,再來對著指令表確定哪個邏輯關係由哪些指令來完成,當一條指令運用得幾次後,根本就用不著擔心不知道指令不會用了。退一步講,即使真的記不得指令,參照書本的指令用法也完全可行,現在的知識量是海量,全把所學的知識死記在腦子裡肯定會把腦袋漲破。在寫程序時,只要程序的邏輯關係調理清楚了,寫起來就好比做簡單的翻譯工作,把邏輯關係翻譯成計算機語言來表示。如下圖3和圖4是一個簡單的鍵掃描電路和程式流程圖,我們根據這個流程圖就很快能用目前非常普遍的51彙編語言來寫出這個程序。KEY_SCAN:PUSH A ;保存寄存器AINC R1 ;AND R1,00000011BMOV R2,3MOVC DPHL,TABLE ;取表首址MOVC A,@DPHL+R1 ;讀取表中數據AND A,00001111B ;保留低4位MOV P1,A ;按所取表中數據由P1低4位輸出CALL DELAY_TIME ;延時MOV A,P1 ;讀取P1埠AND A,11100000B ;保留P14、P16、P17LOOP:RLC A ;左移A一位到位寄存器「C」JC R1,LOOP1 ;判斷位寄存器「C」是否為「0」CALL KEY_CAL ;調用鍵碼計運算元程序LOOP1:DJNE R2,LOOP ;判斷是否已移3位POP A ;恢復寄存器ARTI ;本次掃描結束KEY_CAL: ;鍵碼計運算元程序… … …RTSDELAY_TIME: ;延時子程序… … …RTSTABLE: ;鍵掃描輸出表DB 11111110BDB 11111101BDB 11111011BDB 11110111B 3對微觀世界的想像 曾經在設計電路板時,為了讓線路中的電流能流暢的通過線路,為了所設計的電路板能滿足各種測試條件下的安全標準,如UL標準要求最長的電源地線不能過 0.02歐姆(其測試條件是在20A的電流情況下測量它的功率P=I2R)。如果假如是0.02歐姆,通以20A的電流,那這條線路的發熱功率將會是 8W。把電流看作是我們宏觀世界裡的水,線路就好比一條水溝。要讓水在水溝里怎麼流,這理所當然是很容易控制的了。如水在急轉彎的地方會起漩渦,會對急轉達彎的溝的對面產生衝擊。同樣在電路板上的線路如果存在急轉彎的情況,電流也會引起渦流,也會對線路的拐點處有一個衝擊作用而產生輻射。這樣一來,在理解了這一原理之後,每一次電路板的設計完成之後,所有的測試都能一次通過。可見把微觀世界想像成宏觀世界相類似的事物或過程是非常有幫助的。現代電子世界,特別是微電子,要想看清他的真面目,只有在高清昕度的顯微鏡下才能看到他的外形,可是即使了解了它的外形,也只不過是知其然而不知其所以然,它的工作過程根本無法看得到。 現在單片機結構越來越複雜,集成度越來越高,存儲量越來越大,將來還可能採用分子級電子晶體管呢。它的運行速度也是如此的越來越快,現在已經是採用納秒級來定義它的運行時間了,最長的運行一條指令的時間最多不過一兩個微秒,簡直就是比一閃而過還要少好多好多。既然我們可以在空間上利用放大鏡把外形放大後來了解,那麼同樣可以在時間上把時間拉長來解。不訪把一微秒當作時一分鐘或一小時來理解,這樣我們就不難理解CPU就如人一樣在處理某一條指令。比如指令 「MOV A,01H」就是CPU把數據01H送到A累加器,在這個運送的過程就如人搬運東西的過程,這個過程的處理時間就是CPU處理一個指令的時間,通常稱之為指令周期。有些時候單片機會出現對某個操作處理的時間不夠,如進行數據採集時,被採集的信號相對於單片機處理時間比較快就會出現數據遺失的情況,這就要求單片機的運行速度更快。如果沒有這處微觀時間的概念,就很難理解怎麼會出現這種情況。 4結束語 單片機變化發展迅速,但萬變不離其宗,只要清楚了它們的基本原理和構造思想,不管它怎麼變,都能做到知其然知其所以然。


1、怎樣動手從頭開始?
答:工欲善其事必先利其器。正想學習單片機,最好能有一個開發板和一些基本的資料。下一步就是實踐了。沒有別的捷徑。一定要花時間去鑽研。
2、怎樣理解晶振/中斷/存儲器等?
晶振 是一個電子元件
中斷 是單片機裡面的一項功能
存儲器 就是存儲程序 的地方
----------這些問題非常基礎,而且不是一個類別,不是很好回答。建議增強基礎知識
3.怎樣記住單片機彙編指令?
不需要記,熟能生巧。多用就會了
4.怎樣看懂單片機外圍電路?
單片機的外圍電路一般不會太複雜,多實踐多問身邊的老師
5.為什麼都說用C比彙編好?
c語言的可移植性強,結構化編程的c語言更易理解
-----------------------------------
總結:
單片機是一門非常強調實踐的技術,光看書本不動手永遠也學不會。熟能生巧!


彙編能幫助你更好的理解計算機以及編程究竟是怎麼回事,相信我,學一點彙編能讓你以後學任何計算機語言都事半功倍。

學單片機就是為以後打基礎嘛,彙編也是。

題外話,學彙編記住一句,所有語句按段來看。


轉專業到電氣,後來參加電子設計大賽,也是從小白開始,我是先跟著看學長他們搞,然後有了興趣,開始看視頻學的,開始不懂,就依葫蘆畫瓢,做了個小板,就是簡單的最小系統,然後看書理解工作原理,再逐行理解代碼,個人只會c,彙編能看懂,彙編不過編起來不順手,而且編譯率太低,個人覺得c編寫的模塊移植比較容易。到後面就用電腦軟體模擬《名字竟然忘了,好像電路原理課上有用這個模擬》,因為很多東西做起來沒那麼容易,尤其是有時做pcb板很麻煩。學完這個,個人覺得對plc的理解也回更近一步。如果是學習就就多學,從理解到自己動手練習,在把它『』實現『』很有成就感,如果是比賽,還是多做些,因為硬體和軟體之間有時是個很漫長的調試時間,可以多積累找bug的能力。總得來說,念書時就這個最有成就感,可惜後來也放棄了,上著這坑爹的夜班~~!


1、勤動手寫程序燒到開發板里看效果。
2、寫程序之前先想清楚要寫的函數乃至整個程序的基本架構,想明白了再動手。
3、多看看高手寫的代碼。
4、多思考,少記憶。


上面說的都不錯

我只補充一個 因為先入為主的關係 學完單片機 再學ARM會很多觀念混亂 微機原理才是重點


16.12.11更新
突然想起來有幾個回答說可以用模擬學的,我的意見是盡量不要用模擬。
雖然模擬軟體方便,成本低,但是它有一個致命弱點:太過理想化。

在模擬軟體里搭載出來的電路放到實際可能會出各種毛病,有可能某些元器件不工作,也有可能會直接燒掉一些器件。
但是這其實是好事,您在檢查電路毛病的同時會熟練掌握各種技能和思想,而這些知識對您的專業知識可技能有很大提高。在檢查過程中你會學會熟練應用萬用表通過各種方式查找問題,您會知道從全局考慮如何合理布置接地來減少干擾,知道某些元器件需要的最低電流,以及如何改善電路。
紙上得來終覺淺,絕知此事要躬行。
再廢話兩句。
以前聽過一句話。原句忘了,大意是這樣。
學這些東西最次的方法就是在書上學,好一點的是在模擬軟體里學,最好的還是用實物學。

-------------------分割線---------------------------------------------------------
原文:


首先先簡單回答一下您的問題:
1.怎樣動手從頭開始?
買塊板子開始學習就是最好的開始,有目標就不要猶豫。(具體學習步驟下面給出)
2.怎樣理解中端/晶振/存儲器等?
這些東西不要上來先求理解,從基礎學到那塊再去試圖理解也不遲。沒有基礎真的很難給你講。(倒是很好理解,但是我這裡不想講…)
3.怎樣記住單片機彙編指令?
說實話,別記了。現在大部分都用C語言編程,你能看懂彙編就行,不用記。
4.怎樣看懂單片機外圍電路?
有些外圍電路是常用用法,用多了就看懂了,如上拉電路等。有些外圍電路是特殊用法決定的,用到的是模電(有可能還會有數電)知識,這些與你的電子電路基礎是相關的。跟單片機沒關係,單片機就是個編程的工具。
5.為什麼都說C比彙編好?
因為C語言簡單啊…相比彙編,C程序更好理解,學起來也容易。 但是據說現在也有些對程序有極端要求的用彙編,不過我沒見過…
6.需要什麼知識基礎?
C語言,以及一些其他零碎知識。(這些知識怎麼補我下面說)

我說一下我對於題主學習單片機的建議哈。

1.首先要先學會C語言。找本好的C語言課本(書我就不瞎推薦了,當初我學的時候用的學校課本,我也覺得不大好。)您跟著書一章章學下去,學到掌握二維數組就可以了。這些知識足夠讓您完成單片機基本常式。如果以後有看不懂的程序可以回來翻書再現學補上。(如果您以後要寫大程序或者學到其他單片機如STM32您會發現需要補結構體和指針的知識)

2.掌握了C語言之後,就要開始學習單片機了。單片機編程用C的方便程度遠遠大於彙編,這個題主您到時候買個單片機學習板看看常式就明白了。至於學習板淘寶買就可以,具體牌子我就不說了… 其實都差不多。買個50左右那種就行,不要買那種貴一些帶很多贈品的。(您挑的時候就明白了…) 書我推薦郭天祥的,您到時候看他的書和視頻教程就可以。這是我見過最好的學習資料。(不用買他的單片機學習板。。。太貴了。。。)

3.學習過程中,要視頻與書還有單片機常式相結合。如果您覺得可以把書啃下去就看書,看不下去的時候看視頻。如果照著視頻編程出不來結果的時候您可以看看淘寶買的單片機自帶的常式,是不是IO口位置不對或者某個模塊用法不一樣。舉個栗子,如果您照這個方法學,可能學到數碼管的時候,發現郭天祥教程里用的是鎖存器,而您買的單片機用的是138解碼器。這時候怎麼辦呢? 我建議您如果基礎不好可以看看您的單片機自帶常式,掌握一下解碼器用法。如果看懂了可以再百度一下這個解碼器型號,根據數據手冊寫程序。

4.在這個過程中應該學會什麼東西:
學C語言階段:
掌握基本編程思想,課本上例題你要會自己寫。什麼分支結構循環結構用的也要6。
學單片機編程階段:
知道如果給你一個陌生的模塊,你可以根據自帶的常式改出自己需要的程序。這是基礎。
給你一個陌生的不帶常式的模塊,你可以上網查到數據手冊,根據時序圖或者某些說明寫出程序。這是基本進階了。
給你一個陌生不帶常式,查不到具體資料的模塊。你可以根據你的經驗,判斷這個模塊用法,進而使用。如,給你個步進電機你知道用PWM+驅動板去試它的運行方法,給你個什麼土壤濕度計你可以根據他有幾個引腳判斷用法。2個引腳應該就是當電阻用,3個引腳必然一個接地一個接VCC剩下一個當信號口,4個引腳可能是2個作供電,兩個其中一個數字信號一個模擬信號。 給你個陀螺儀模塊你知道去猜用的是I2C通信,給你個液晶顯示屏模塊你知道他的通信協議一般就兩種(具體哪兩種我忘了…)。 這些都是根據你的經驗得出的。
再進階就是學其他單片機了,但這其實只是進階。你可以學MSP430去做開關電源,學CC25系列去學物聯網智能傢具,學STM32做其他便攜設備。
高階就是就業了。目前我還沒經歷過這個所以不知道…不過希望您可以順利到這步。這才是大坑

說了這麼多,其實我覺得最重要的不是你會多少東西,而是您在學這些知識的過程中養成系統的工程思想,知道怎麼去配置單片機有關的一切。知道如何去設計電路,用什麼邏輯去設計程序,知道怎麼做這個項目可以優化產品。畢竟技術誰都會,但是思想不是人人都有。但這個思想養成卻與您的學習經歷密切相關,沒有知識積澱養不出獨特的眼光。
最後祝順利。


推薦閱讀:

一名從事自動化生產的實習生的疑問…?

TAG:微控制器 | 單片機 | 可編程邏輯控制器PLC |