寫給喜歡單片機(jī)的初學(xué)者
今晚又是寫程序,睡不著,寫點(diǎn)東西吧,也算是自己的一個(gè)總結(jié) 。
首先是兩個(gè)字 “喜歡”?。?br /> 一個(gè)東西 光有10分鐘的熱度是不夠的。從事單片機(jī)工作,就意味著你以后是和枯燥的程序、調(diào)試、亂碼、 未知的軟硬件錯(cuò)誤、熬夜、臉上的豆豆……聯(lián)系在一起。(有點(diǎn)夸張,哈哈?。?br /> 如果你選擇了這種生活,并且確定你有一種精神能指引你一路走到底,至于是什么精神,只有你自己知道。是滿屏幕的0101,還是一串串胡亂的ABCD,還是成功后的成就感,還是天生俱來的對(duì)電子類東西的癡迷,還是喜歡別人在外面花天酒地……卻喜歡獨(dú)坐電腦面前,攻克技術(shù)的顛峰。不需要理由,世界上就有這樣一種人。那么確定了上面的之后,讓我們開始吧!單片機(jī)也叫做單板機(jī)、單片微型計(jì)算機(jī)。麻雀雖小,五臟俱全,那么如果你學(xué)過計(jì)算機(jī)組成原理,我相信你應(yīng)該能更好的理解單片機(jī)的內(nèi)部結(jié)構(gòu)。如果沒有學(xué)過,也不要緊,那就拿小麻雀開刀,再一層層自下而上的學(xué)習(xí)。
剛開始學(xué)單片機(jī)的時(shí)候,看到厚厚的一本書,不要一咬牙要一下子把書全部看完??吹米凶屑?xì)細(xì)明明白白。先看看目錄,無非就是介紹單片機(jī)的歷史,然后它內(nèi)部的組成原理,然后是指令,然后就是接口。先說歷史,知道51單片機(jī)是現(xiàn)在資料最豐富,最適合上手拿來開刀的就是了。不要覺得書上的知識(shí)老。這都N多年前的了,現(xiàn)在是不是都不一樣了。兼容這個(gè)詞的意思是:比如你用ATC51寫的程序,拿到ATS51、52 STC 都能用,只是后續(xù)的片子在一些地方更加完善,功能更強(qiáng)大。
比如:在書上老掉牙的2051上的MOV A,#00H 用到其他51系列上也是一樣的。你看它的片子的介紹上,寫了一句“完全兼容51系列單片機(jī)” 那么OK 。別管那么多,只管用就是了。我發(fā)覺我廢話多了,這不知道寫到那去了。。抽跟煙,繼續(xù)。。。
上面的意思是說:面前是一坐山很高,然后我就一咬牙,慢慢爬吧,我不信我爬不上去了,或許爬到一半就退縮了,退而再攻之。
我拿個(gè)測(cè)量?jī)x來,噢,原來這山總共7000米,半山腰有個(gè)亭子,到那是3500米,剛開始那1000米坡度很小 2000米的時(shí)候有個(gè)茅房(^_^) 6000米的時(shí)候有個(gè)美女正在洗澡,山頂有個(gè)和尚廟。行,心中有了底,上??!
剛開始的時(shí)候初學(xué)一定要用匯編,可能大家也看到了,關(guān)于C和匯編的討論,各有各的說法,我個(gè)人覺得初學(xué)者,完全沒有必要去追求什么飄逸的風(fēng)格,就用笨拙的匯編。雖然它像一頭大苯熊一樣,但是,當(dāng)你能和大笨熊親切的交流,屈駕自如的時(shí)候,再去和漂亮的兔子MM 鴛鴦戲水,會(huì)更加的得心應(yīng)手。
匯編剛開始你會(huì)覺得很煩,就是在那MOV 過去MOV 過來。JB、JC、 JNB 、JNC 、DJNZ 很難記,不像C 一個(gè)IF 一個(gè)DO WHILE 就搞定的事。但是,用匯編你能更加了解一條指令在CPU內(nèi)存的執(zhí)行過程,能更加親切的和P0 、P1 、P2 、P3 的每一個(gè)口線交流,不需要C 的屏蔽底層,而是直接的就和底層親密接觸。這里有人要說我什么什么的了,還是那句話:個(gè)人意見,僅供參考。在寫延時(shí)程序的時(shí)候,DJNZ 是雙周期指令,比如12M的晶振,那么,一條指令是1US,那么你要精確的知道自己這段延時(shí)程序能延時(shí)多少US 或者多少M(fèi)S ,那么你對(duì)51單片機(jī)內(nèi)部的指令、周期,對(duì)以后寫有嚴(yán)格時(shí)序操作的程序就更加得心應(yīng)手。比如,看到一個(gè)片子的PDF 數(shù)據(jù)總線要拉低多少M(fèi)S ,地址總線要拉高多少US ,等待周期要等待多少US/MS ,那么,不要懷疑,自己寫指令搞定它,成功以后你會(huì)發(fā)現(xiàn)你從最底層的了解了一個(gè)片子是怎么傳送數(shù)據(jù),怎么通信。這樣的經(jīng)歷對(duì)你以后再接觸其他子的時(shí)候是莫大的幫助。像關(guān)于書上的內(nèi)容,指令不用記得那么死,或者說完全不需要記。需要的時(shí)候,馬上查,在查的過程中會(huì)更加加深你的印象(說點(diǎn)丟人的話 JC JB JNB JB 這些 指令我到現(xiàn)在都從來不記,我又不應(yīng)付考試,我書隨時(shí)就在旁邊 用的時(shí)候去翻就是了。)
這也就提到了練習(xí),程序和指令不要只看不用,實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn)。實(shí)踐出真知,這都是老話了,不過用在單片機(jī)的學(xué)習(xí)上是太貼切了,單片機(jī)本來就是實(shí)踐性很強(qiáng)的。像我在學(xué)校的時(shí)候,每次實(shí)驗(yàn)課都認(rèn)真的做,抓住每次上機(jī)的機(jī)會(huì)。板子很貴,自己買不現(xiàn)實(shí),而上機(jī)的時(shí)候能接觸到的每一次都很寶貴。LED流水燈、十字****通燈這些程序很基礎(chǔ)。在一次一次的小程序成功的過程中,你會(huì)更加喜歡上單片機(jī),并且堅(jiān)定繼續(xù)為之不離不棄的決心。
熟能生巧,我還記得我剛開始的時(shí)候,經(jīng)常是把指令寫錯(cuò),把跳轉(zhuǎn)的標(biāo)號(hào)寫錯(cuò)。經(jīng)常用系統(tǒng)的關(guān)鍵字,變量未定一存儲(chǔ)空間就用等等等等。。但是一次又一次錯(cuò)誤下來,得到的是程序的正確性的大大的提高。在這里我建議剛開始先多讀別人的程序,而且是完整的,備注多的,格式規(guī)范的。從最開始就養(yǎng)成良好的編程風(fēng)格,而不是隨意的亂添亂加 胡亂的復(fù)制粘貼。
看懂別人程序里的每一句代碼的意思,為什么要加這條,這條指令的作用是什么?如果不清楚,馬上翻書去查,在查的過程中,更加加深對(duì)這條指或者這段子程序的用法的深刻的記憶。下次自己用的時(shí)候才能像自己一樣的拿來得心應(yīng)手,這也是為什么要選擇51系列的單片機(jī)。因?yàn)樗氖纠a網(wǎng)上鋪天蓋地,而且高手也不會(huì)吝嗇的把初學(xué)要用的代碼共享,得到這些代碼的途徑是很方便的。得到的有用的信息也是最多的,像 1302 、1602 、DS18B20 、LED 、串口 、DA /AD 、常用的接口與51的驅(qū)動(dòng)程序,這些五六電子網(wǎng)都有很多, 匯編版本的 、C 版本的都有。不要覺得都是幾年前的東西,都是人轉(zhuǎn)來轉(zhuǎn)去,老掉牙的東西,先都拿來消化掉,再為自己所用。[!--empirenews.page--]
大家也許也發(fā)現(xiàn)了,在百度里找一些程序的時(shí)候看到一版的匯編代碼,但是沒有一點(diǎn)注釋,2個(gè)字:痛苦!所以,為了方便大家,也為了以后你能方便別人,剛開始寫程序就要習(xí)慣,給程序?qū)憘渥?,為了別人能看懂像一個(gè)大的工程,都是團(tuán)隊(duì)合作。你幾千的代碼而且沒有備注,別人幾千的代碼也沒備注,那好吧,先花個(gè)1天的時(shí)間把程序看懂了,再干其他的吧。
程序中像子程序名,入口參數(shù),出口參數(shù),內(nèi)存的分配,關(guān)鍵語句的單條備注,標(biāo)號(hào)的頂格,代碼的縮進(jìn) 等等 。良好的編程風(fēng)格絕對(duì)會(huì)讓你在以后的工作和學(xué)習(xí)過程中事半功倍。
;-------------------------
;****子程序
;-------------------------
next:
mov a,th0 ;//讀取計(jì)數(shù)值TH0
swap a ;//高4位與低4位對(duì)換
mov r1,a ;//保存到R1
anl tl0,#0f0h ;//取TL0高4位,低4位忽略不計(jì)
寫了一些小程序之后,就可以做些完整的小實(shí)驗(yàn),也可以參照別人的程序來寫。比如寫一個(gè)接口芯片的驅(qū)動(dòng),不再是點(diǎn)亮一個(gè)燈,又點(diǎn)另外一個(gè)燈。
這種的完整的驗(yàn)證型的實(shí)驗(yàn)非常重要,不要希望上課的時(shí)候老師給你的程序能讓你突飛猛進(jìn),只有自己不斷的做實(shí)驗(yàn),寫程序,才能讓自己學(xué)得更快。
像買到的板子,都有完整的代碼,這對(duì)于學(xué)習(xí)是很好的資料,因?yàn)樗芩娂此?,不再是書上的紙上談兵,那么程序是正確的,看懂了以后自己可有試著改里面的某個(gè)地方。你能找到它的核心的那幾條或一段代碼,那么說明你對(duì)這段程序的理解已經(jīng)更上一層樓了。初學(xué)者買板子很重要,而板子上的示例代碼和技術(shù)支持更重要。通過這個(gè)板子你能接觸到一個(gè)平臺(tái)供你學(xué)習(xí),那么這個(gè)板子就是值的。如果板子買來了就閉門造車,那么,板子再好也不是件好事。功能特別強(qiáng)大的板子,沒有必要去買,當(dāng)你用到板子上的什么激光、攝像頭的時(shí)候,我想你也已經(jīng)不會(huì)再用那塊板子開發(fā)東西了,基本的液晶、數(shù)碼管(是個(gè)很強(qiáng)大的東西 像我不喜歡什么軟件仿真 在有問題的地方 設(shè)置個(gè)斷點(diǎn) 程序執(zhí)行到這一步 把值讀出來 顯示到LED上簡(jiǎn)單方便 )常用的51的接口有就夠了,說到自己做實(shí)驗(yàn)板,買來的板子都有完整的電路圖,對(duì)于電子基本共不扎實(shí)的朋友,買來后看懂原理圖,再慢慢自己做板子好一點(diǎn)。
買了同一種板子的能有個(gè)交流區(qū)是最好的,各個(gè)問題和程序拿出來大家交流,能起到很大的作用,也會(huì)少走很多彎路,目前這個(gè)正在籌劃當(dāng)中。我會(huì)盡快和站長(zhǎng)聯(lián)系,開個(gè)專區(qū)供大家交流和學(xué)習(xí)用。上面提到了基本功,這才記起。。(不好意思^_^) 像搞單片機(jī),分幾種:上層的和底層的、上下通吃的。不過剛開始的都不是很復(fù)雜,我建議大家上下通吃。還是那句話,有不懂的馬上查資料。電容、三級(jí)管、二級(jí)管、放大、整流、穩(wěn)壓、濾波、上拉 /限流電阻,還有Protel 99 SE 自己畫電路圖等等這些基本功,隨著學(xué)習(xí)的深入,都要一點(diǎn)一點(diǎn)的累積起來,不懂不要緊,問題是不能讓一個(gè)問題一直捆饒著你,要有一種精神:不搞懂它 ,我就不罷休的精神。那么我相信任何困難都不會(huì)成為阻止你成功的絆腳石。
又說到哪來了?夜深了,瞌睡來了**
單片機(jī),要天天碰。調(diào)程序就到板子上結(jié)合著硬件環(huán)境調(diào)試,像DA/AD 我剛開始學(xué)的時(shí)候那一章的內(nèi)容根本都沒看,直到后來要做個(gè)東西,需要AD轉(zhuǎn)換,去翻了下TLC1543D 的PDF,然后看了下它的時(shí)序,去網(wǎng)上找了下示例代碼,然后寫的程序。像書上的 ADC0809、DAC0832 我是在用了其他轉(zhuǎn)換片子后,回過頭去看的時(shí)候發(fā)現(xiàn)這片子缺陷確實(shí)太多,然后再去看它的程序和使用方法很簡(jiǎn)單。這里的意思并不是說書上的 ADC0809、DAC0832 不重要,而是說大家學(xué)一個(gè)東西的時(shí)候,如果能結(jié)合板子學(xué)的話或者說能馬上用到,那么是最好,成效也是最快的。實(shí)踐的力量確實(shí)是不能小窺的,而現(xiàn)在普遍的大學(xué)生的高分低能,學(xué)軟件工程的,讓用VB 寫個(gè)小程序都不會(huì)寫。單片機(jī)90多分的寫個(gè)LED都不會(huì),連單片機(jī)具體什么樣子都沒見過,找工作的時(shí)候一大堆的獎(jiǎng),一大堆的廢話。拿出自己做的作品,隨意的和招聘的人聊各個(gè)單片機(jī)的優(yōu)缺點(diǎn),正確的說出每種常用的片子的用途、用法,證明自己的實(shí)際的動(dòng)手能力。找工作是難,但是分人。我相信,在大學(xué)實(shí)驗(yàn)室里呆 2年的人和在大學(xué)里談2年戀愛的人、打2年網(wǎng)游、看2年小說、聊2年QQ 、打2年CS的人的結(jié)果絕對(duì)是不一樣的,亂七八糟的寫了。很多……大家能看完不甚感激。如果有什么地方不對(duì)的,還請(qǐng)大家多多指正,我也是個(gè)學(xué)習(xí)者,深切的感到剛學(xué)單片機(jī)的時(shí)候的困惑。希望寫下的東西,對(duì)大家能有少許的幫助。寫得不好,請(qǐng)大家見晾了。