揭曉新手學(xué)習(xí)單片機(jī)最常見的六大誤區(qū)
隨著電子技術(shù)的迅速發(fā)展,計算機(jī)已深入地滲透到我們的生活中,許多電子愛好者開始學(xué)習(xí)單片機(jī)知識,但單片機(jī)的內(nèi)容比較抽象,相對電子愛好者已熟悉的模擬電路、數(shù)字電路,單片機(jī)中有一些新的概念,這些概念非常基本以至于一般作者不屑去談,教材自然也不會很深入地講解這些概念,但這些內(nèi)容又是學(xué)習(xí)中必須要理解的,下面就結(jié)合本人的學(xué)習(xí)、教學(xué)經(jīng)驗(yàn),對這些最基本概念作一說明,希望對自學(xué)者有所幫助。
一、總線:我們知道,一個電路總是由元器件通過電線連接而成的,在模擬電路中,連線并不成為一個問題,因?yàn)楦髌骷g一般是串行關(guān)系,各器件之間的連線并不很多,但計算機(jī)電路卻不一樣,它是以微處理器為核心,各器件都要與微處理器相連,各器件之間的工作必須相互協(xié)調(diào),所以就需要的連線就很多了,如果仍如同模擬電路一樣,在各微處理器和各器件間單獨(dú)連線,則線的數(shù)量將多得驚人,所以在微處理機(jī)中引入了總線的概念,各個器件共同享用連線,所有器件的8根數(shù)據(jù)線全部接到8根公用的線上,即相當(dāng)于各個器件并聯(lián)起來,但僅這樣還不行,如果有兩個器件同時送出數(shù)據(jù),一個為0,一個為1,那么,接收方接收到的究竟是什么呢?這種情況是不允許的,所以要通過控制線進(jìn)行控制,使器件分時工作,任何時候只能有一個器件發(fā)送數(shù)據(jù)(可以有多個器件同時接收)。器件的數(shù)據(jù)線也就被稱為數(shù)據(jù)總線,器件所有的控制線被稱為控制總線。在單片機(jī)內(nèi)部或者外部存儲器及其它器件中有存儲單元,這些存儲單元要被分配地址,才能使用,分配地址當(dāng)然也是以電信號的形式給出的,由于存儲單元比較多,所以,用于地址分配的線也較多,這些線被稱為地址總線。
二、數(shù)據(jù)、地址、指令:之所以將這三者放在一起,是因?yàn)檫@三者的本質(zhì)都是一樣的──數(shù)字,或者說都是一串‘0’和‘1’ 組成的序列。換言之,地址、指令也都是數(shù)據(jù)。指令:由單片機(jī)芯片的設(shè)計者規(guī)定的一種數(shù)字,它與我們常用的指令助記符有著嚴(yán)格的一一對應(yīng)關(guān)系,不可以由單片機(jī)的開發(fā)者更改。地址:是尋找單片機(jī)內(nèi)部、外部的存儲單元、輸入輸出口的依據(jù),內(nèi)部單元的地址值已由芯片設(shè)計者規(guī)定好,不可更改,外部的單元可以由單片機(jī)開發(fā)者自行決定,但有一些地址單元是一定要有的(詳見程序的執(zhí)行過程)。數(shù)據(jù):這是由微處理機(jī)處理的對象,在各種不同的應(yīng)用電路中各不相同,一般而言,被處理的數(shù)據(jù)可能有這么幾種情況:
1·地址(如MOV DPTR,#1000H),即地址1000H送入DPTR。
2·方式字或控制字(如MOV TMOD,#3),3即是控制字。
3·常數(shù)(如MOV TH0,#10H)10H即定時常數(shù)。
4·實(shí)際輸出值(如P1口接彩燈,要燈全亮,則執(zhí)行指令:MOV P1,#0FFH,要燈全暗,則執(zhí)行指令:MOV P1,#00H)這里0FFH和00H都是實(shí)際輸出值。又如用于LED的字形碼,也是實(shí)際輸出的值。
什么是單片機(jī)?怎樣學(xué)習(xí)單片機(jī)?這是單片機(jī)初學(xué)者的靈魂拷問。
一、去背寄存器
千萬不要去記寄存器,我做開發(fā)這么多年了,一個寄存器都記不住。
寄存器一般是我們要使用單片機(jī)外設(shè)的時候會去配置。
一流的方法是直接參考別人的配置程序。
二流的方法是看數(shù)據(jù)手冊,最傻雕的做法就是去背寄存器。
二、去背匯編指令
除了一些在校大學(xué)生應(yīng)付學(xué)校考試要背以外,我到現(xiàn)在為止,做過幾十個項目都是用c語言,沒用匯編做過一個項目。
很多人說還是有必要學(xué),學(xué)了對單片機(jī)理解地透徹一點(diǎn)。
我想說的是你又不制造單片機(jī),理解這么透徹干嘛。
單片機(jī)只是工具,90%的人都是用這個工具做應(yīng)用,你理解透徹和我只會用這個工具,沒任何區(qū)別。
三、以為C語言學(xué)習(xí)門檻很高
C語言小學(xué)生都能學(xué)會。
我沒有跟你在吹牛逼啊,前端時間有一個大姐讓我?guī)膬鹤訉W(xué)習(xí)單片機(jī)。
他兒子才11歲,然后我拒絕了,因?yàn)樵谖业恼J(rèn)知范圍里,這么小很難學(xué)的會。
然后她說她兒子之前學(xué)了c++,有點(diǎn)基礎(chǔ),我當(dāng)時都驚呆了,現(xiàn)在的學(xué)生真的是一個比一個厲害。
不過最后我還是讓她慎重考慮下,畢竟我們培訓(xùn)的定位是那些學(xué)習(xí)完之后想找到工作的,我們課程也是以項目驅(qū)動去學(xué)習(xí)。
新手在學(xué)習(xí)c語言前期的時候,只要學(xué)習(xí)基本語法就可以了,來來去去就5條最常用的語句。
比如說if..else,switch, for,while, 賦值語句(=).
7個運(yùn)算符:加減乘除,或運(yùn)算、與運(yùn)算、非運(yùn)算。
4個邏輯關(guān)系符:||、&&、!=、==
3個最常用的數(shù)據(jù)類型unsigned char、unsigned char short、unsigned char long。
3個進(jìn)制轉(zhuǎn)換:二進(jìn)制、十進(jìn)制、十六進(jìn)制
還有就是函數(shù)的定義和調(diào)用。
基本上掌握這些,你就能編寫很多程序了。
學(xué)c語言是一個循環(huán)漸進(jìn)的過程,不要一上來就像寫很復(fù)雜的程序,再牛逼的大佬也是從點(diǎn)燈開始。
等你寫多了,熟悉了,到時候再學(xué)習(xí)指針、結(jié)構(gòu)體之類的。
因?yàn)槟銢]有一定的基礎(chǔ)時候,去學(xué)一些高級應(yīng)用肯定是學(xué)不懂得。
只有等你碰到了只能用指針、結(jié)構(gòu)體去實(shí)現(xiàn)的功能的時候,你才會深刻理解它們的作用。
四、總是因?yàn)橛洸蛔「鞣N協(xié)議而煩惱
做單片機(jī)開發(fā)會經(jīng)常接觸各種協(xié)議,但是總體來說也就是:IIC、SPI、USART、單口通訊。
前期的話也先不要去學(xué)習(xí)USB,CAN之類的協(xié)議,這些一般只會用在細(xì)分的領(lǐng)域。
大家如果工作中碰到了,再針對性去學(xué)習(xí)。
大家真正只需要掌握IIC、SPI、串口、單片通訊就行了。
學(xué)習(xí)這個也很簡單,直接搜別人的例程來用,先用起來,再根據(jù)程序的去理解這些時序圖就簡單多了。
這里沒有說錯啊,是通過程序去理解時序圖,這個邏輯跟大多數(shù)人的思維可能是反的。
但是我個人就是這樣看懂時序圖的,也是我的經(jīng)驗(yàn),大家可以去嘗試,并不一定適合大家。
五、糾結(jié)代碼寫得好不好
新手前期做項目寫代碼以實(shí)現(xiàn)功能為主,特別是51單片機(jī),你代碼寫好了內(nèi)存也未必夠你用。
在你沒接觸過大項目程序開發(fā)的時候,你根本不知道代碼的好壞,在功能上有什么區(qū)別。
反正都能實(shí)現(xiàn)功能對吧?
等你真正碰到一些大項目的時候,如果你代碼水平不行,肯定是做不出來的。
代碼量大了你Hold不住,不知道怎么去整合,整合完以后功能之間也有沖突。
最后好不容易整合好了,又發(fā)現(xiàn)移植性太差,可擴(kuò)展性太差,萬一項目經(jīng)理讓你增加或者改個功能,你就掛逼了。
這個時候就是你該去思考怎么樣把代碼寫得更好的時候了。
因?yàn)槟阒劳袋c(diǎn)在哪里了,在針對這個痛點(diǎn)去找解決的辦法。
最好的方法依然是去參考,寫程序比你厲害的人。
你再針對性去學(xué)習(xí),比如說看我錄制的那個程序架構(gòu)教程。
我那個教程就是我這么多年產(chǎn)品開發(fā)當(dāng)中碰到問題,再學(xué)習(xí)解決,最終總結(jié)出來的精華。
六、什么都想學(xué)成專家
很多新手在學(xué)習(xí)過程中碰到不懂的就想把那個知識點(diǎn)系統(tǒng)學(xué)一下,不學(xué)精學(xué)透不回頭。
舉個例子,比如說一個電路看不懂,就以為是自己模擬電路、數(shù)字電路基礎(chǔ)太差。
然后去把模電數(shù)電系統(tǒng)學(xué)一遍,學(xué)著學(xué)著就學(xué)不下去了,然后就以為做單片機(jī)開發(fā)太難了,最后也就放棄了。
就像上面這種圖,你去分析唄,等你真正吃透,人都老了。
關(guān)鍵實(shí)際產(chǎn)品開發(fā)直接用一個功放芯片就行了,又節(jié)約尺寸又便宜還穩(wěn)定。
所以,除非你到時候去做芯片,做開發(fā)學(xué)這些還為時過早,也很少用到。
即便你系統(tǒng)學(xué)完模電數(shù)電,你再回過頭去看當(dāng)初看不懂的電路,我保證你90%幾率還是看不懂。
因?yàn)槟銢]抓住解決問題的核心。
這就是典型的走了彎路了。
正確做法是針對性學(xué)習(xí),比如說這個電路你看不懂,那你首先要分析這個電路你是哪里看不懂。