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