本教材是針對51內(nèi)核單片機編寫的。
請允許我假設(shè)你已經(jīng)掌握基本的模擬與數(shù)字電路知識、基本的計算機理論知識(比如知道二進制是怎么回事,RAM和ROM是什么東西)與操作知識(比如會裝載與使用應(yīng)用軟件)、明白C語言的基本規(guī)則與語句。同時,我默認你有一本經(jīng)典51教材(哪個版本都可以)、一本51單片機應(yīng)用教材(內(nèi)容為給出硬件電路和源程序的單片機開發(fā)實例)、一塊51單片機實驗板(含一條串口線)、一塊具有ISP(在系統(tǒng)編程)功能的單片機、某個版本的KEIL軟件、某個版本的ISP燒寫軟件、一臺性能一般的PC電腦。
如果不具備上述任何一項,請不要繼續(xù)閱讀本教程,收起你的書本,回家吧,你無法學(xué)會單片機。知識方面的欠缺請自己盡快彌補。教材與應(yīng)用書籍可以借閱,但是我建議各買一本,因為它們屬于工具書,需要隨時翻看,版本我就不推薦了,各種版本內(nèi)容基本都一樣,這個投資需要數(shù)十元。實驗板可以使用我提供的這一款,硬件功底好的也可以自制,成本在100元以內(nèi),網(wǎng)上有很多這方面的資料,且基本配置都大同小異。具有ISP功能的51單片機我推薦使用飛利浦系列,本實驗板就是針對P89C51RD2系列(價格40元左右)設(shè)計的(周立功單片機公司全面代理飛利浦單片機,可以聯(lián)系郵購)。其他ISP功能的單片機也行,如華邦的W78E系列,AVR哈佛結(jié)構(gòu)(不是51內(nèi)核)高速系列,不過我都沒有使用過。具有ISP功能的單片機雖然比AT89C51之類(10元左右)貴很多,但是配置很強(僅ROM容量就有64K,是AT89C51的16倍),而且相對于數(shù)百元的編程器或者仿真器來說,性價比還是很高的,有利于降低硬件投資給初學(xué)者造成的門檻。KEIL軟件網(wǎng)上隨處都可以下載到(搜索KEIL下載即可),當(dāng)然盡量使用高版本的。ISP編程軟件周立功單片機的網(wǎng)站可以下載,名稱為ZLGISP,飛利浦的WINISP也可以。不算PC電腦的話,200元的投資足夠開始學(xué)習(xí)51單片機了(實驗板+串口線+單片機+教材)。
OK,這是一份面向?qū)纹瑱C一無所知的初學(xué)者的入門教程。單片機技術(shù)就如同一張窗戶紙,這份膚淺的教程就是來戳穿它的,呵呵。就如同你來到一個陌生的城市,我送你一張地圖——不是我水平高,是我比你來得早,就這么點優(yōu)勢,呵呵。它的作用僅僅是幫助你在茫然的情況下順利上手,至于上手之后的進展,就全靠你自己的辛勤鉆研了。你要明白,沒有任何路標能夠代替你走完腳下的路。顯然,我不想你們再像我一樣在入門上花費過多寶貴時間。你們當(dāng)然會感謝我,這是可以理解的,因為我也曾感謝過在我入門的時候給過我?guī)椭呐笥选?/p>
好了,我們開始學(xué)習(xí)單片機的旅程。
第一章:單片機開發(fā)的基本流程
不是所有人都學(xué)過地理,但是幾乎每個人都能找到回家的路,學(xué)習(xí)單片機也是如此。我們先不要看什么教材,我們直接進入開發(fā)過程的介紹與學(xué)習(xí),爭取在最短的時間內(nèi)獲得最多的感性認識。千萬不要像學(xué)英語那樣學(xué)單片機,就像背了十年單詞卻沒見著一回老外——看一年教材也沒見過單片機什么樣的話,那就不可能學(xué)會了。
針對我們前言中的軟硬件,基本開發(fā)流程是這樣的:
1、在PC電腦上安裝并啟動KEIL軟件,建立一個單片機
工程項目,調(diào)整設(shè)置,使項目輸出時生成HEX格式(INTERL公司
規(guī)定的一種二進制格式)燒寫文件。具體操作詳見第二章。
2、新建程序文件,將其加入項目。用匯編或者C51語言編寫一個程序,編譯,糾錯,再編譯,再糾錯,直到錯誤全部消失,編譯成功,系統(tǒng)會自動生成HEX格式文件,保存在項目所在的文件夾里。
3、在實驗板斷電的情況下(如果帶電容易擊穿PC機串口),用串口線連接單片機與PC機串口。接通實驗板電源,選擇ISP編程(紅色發(fā)光管亮),復(fù)位,進入編程狀態(tài)。啟動ISP編程軟件ZLGISP,選擇需要擦除的FLASH塊(初學(xué)編程代碼不會很大,擦除第一塊BLOCK8K足夠)。點擊設(shè)置選項,VECTOR為FC不要改動,STATUS改為00,點擊寫入。然后點擊讀出,確認VECTOR確實為FC,而STATUS確實為00,如果不是,重新寫入,然后退出ISP狀態(tài),則設(shè)置完成。也就是說每次退出ISP功能之前,必須確認向量為FC,否則下次將無法進入ISP狀態(tài),就好比你把鑰匙放在屋子里卻從外邊鎖上了門一樣。因為VECTOR和STATUS是同時被改寫的,所以改寫STATUS的時候VECTOR可能發(fā)生誤碼或丟失等錯誤,一旦發(fā)生這種情況,只能使用支持P89C51RD2的并行編程器將VECTOR的入口地址FC重新燒入,等于破門而入拿鑰匙,比較麻煩了。注意,這一步非常關(guān)鍵,STATUS不為00程序?qū)⒉荒苷_\行程序,原理下文再做介紹。打開編譯好的HEX格式燒寫文件。點擊編程選項,不必做任何選擇,等待編程自動結(jié)束。
4、切換到運行狀態(tài)(綠色發(fā)光管亮),按下復(fù)位鍵。此時程序開始運行,實驗板的器件會有相應(yīng)的反應(yīng)。至此一次完整的單片機開發(fā)流程成功結(jié)束。
第二章:KEIL軟件使用方法
如何安裝與啟動KEIL軟件我就不說了,這個軟件的功能有三個:編輯程序源代碼,編譯源程序為目標文件(目標文件就是翻譯過來的機器碼),軟件仿真運行結(jié)果。作為初學(xué)者,你要明白編輯和編譯的區(qū)別——就像你要明白秘書和翻譯的區(qū)別一樣。
啟動軟件以后,點擊PROJECT(工程),在下拉菜單中選擇NEW(新建),在對話框中設(shè)置項目文件的保存位置,具體位置隨你便了。給該工程項目命名,隨你便,但是要把擴展名設(shè)為.UV2,比如可以命名為LED.UV2,保存。此時彈出單片機設(shè)備選擇對話框,針對我們的實驗板請選擇ATMEL公司的AT89C51或者PHILIPS公司的8XC51RD2,點擊確定。
點擊FILE(文件)中的NEW,此時會出現(xiàn)一個文本界面,點擊FILE中的SAVE(保存),在對話框中設(shè)置保存路徑(最好與剛才的工程文件在一個文件夾中)。給該源程序文件命名,擴展名要根據(jù)你使用的編程語言確定,如果使用匯編語言,就命名為.ASM,如果使用C51語言,就命名為.C。對于沒有學(xué)過C51的初學(xué)者來說,應(yīng)使用.ASM,比如LED.ASM,保存。
在左面的工程窗口里用右鍵點擊TARGET1,選擇OPTIONS FOR TARGET ‘TARGET 1’ ,在對話框中選擇OUTPUT選項,在CREAT HEX FILE選項前打勾,點擊確定,這樣編譯之后,在工程項目所在的文件夾中就能夠生成HEX格式的燒寫文件了。
點擊TARGET1前面的加號,用右鍵點擊SOURSE GROUP 1,選擇ADD FILES TO GROUP ‘SOURSE GROUP 1’ ,將剛才新建的源程序文件加入。此時SOURSE GROUP 1之前也有加號了,點擊會看到你新建的文件。
雙擊進入你建立的文件,現(xiàn)在可以編寫你的第一個程序了。
第三章:你的第一個單片機程序
源程序如下:
ORG 00H
MOV P0 , #55H
LOOP: SJMP LOOP
END
什么?這么簡單?!是不是在搞笑?!沒錯,雖然簡單,但這就是一個完整的單片機程序。具體語句我先不作解釋,你要先把這個程序在實驗板上跑起來才行。點擊編譯按鈕(項目窗口上面那三個蛋糕一樣的按鈕中間或者右邊那個),也可以選擇PROJECT選項中的BUILD TARGET選項,編譯就自動開始。如果有錯誤或者警告,下面的編譯輸出欄將會顯示,如果你編譯過C語言的程序,就會比較熟悉,所以要求你具有一定的C語言基礎(chǔ)。如果沒有錯誤和警告,系統(tǒng)將顯示代碼量,DATA表示占用內(nèi)部RAM空間的大小,XDATA表示占用外部RAM空間的大小,CODE表示占用片內(nèi)ROM空間的大小。P89C51RD2HBP本身有1K內(nèi)部數(shù)據(jù)存儲器RAM,64K內(nèi)部程序存儲器ROM,本實驗板沒有擴展外部RAM,所以暫時不能做有關(guān)外部RAM存儲的實驗。至于你使用AT89C51+編程器的話,資源就比較少了,只有128B(1字節(jié)=8位)RAM和4K大小的ROM,不過對于初學(xué)者,足夠使用了。
好的,對于你這樣一個一點成就感都沒有的初學(xué)者來說,激動人心的時候就要到了:我們要把這個程序固化到單片機的ROM里了。連接好串口線,寫入STATUS為00(切記!寫一次就行了,頻繁擦寫有可能導(dǎo)致向量丟失,那麻煩就大了),擦除,固化,復(fù)位——哈,程序運行了嗎?8個LED發(fā)光管隔一個亮一個嗎?如果是的話,恭喜你!你已經(jīng)成為一名單片機的開發(fā)人員啦!呵呵,雖然這個程序沒有什么實用價值,你也不明白語句的意義,但是它給你帶來了成就感和自信心,這才是作為初學(xué)者最最需要的,有了信心與興趣,一切都不再成為負擔(dān)和難題。
是不是開始躍躍欲試了?好的,我們繼續(xù)講下去。
第四章:程序解釋與軟件仿真功能的介紹
現(xiàn)在我們回過頭來解釋這個程序。
ORG是一個偽指令。不懂?呵呵,正常,當(dāng)初我也不懂。偽指令就是一條沒有真正操作的指令,說白了就是什么活也不干,耍耍嘴皮子而已。ORG是個定位偽指令,告訴系統(tǒng)程序從00地址開始執(zhí)行,至于執(zhí)行什么,怎么執(zhí)行,它不管。就像一次掃雪任務(wù),一個領(lǐng)導(dǎo)來了,指著腳下說:從這里開始掃。至于具體怎么掃,那是你的事情,呵呵。還有幾條偽指令,去看教材。
MOV P0 , #55H是這個程序的核心指令,工作全部都是它做的。參照教材,它的意思是將十六進制數(shù)55輸出給寄存器P0,而P0口的狀態(tài)由8個LED顯示。我知道你會對這個十六進制數(shù)字感到糊涂,因為我們長了10手指頭。這里的55不是十進制轉(zhuǎn)換來的,它實際是二進制數(shù)字的一種壓縮寫法,寫成二進制就是01010101,這樣P0口接的8個LED就會隔一個亮一個。55屁股后面的H表示它是十六進制數(shù),如果去掉H就表示55是十進制數(shù)了。十進制數(shù)55轉(zhuǎn)換為十六進制數(shù)是37,二進制數(shù)是00110111,就不是01010101了,不信可以試試看,去掉55后面的H。為了明確輸出狀態(tài),你可以將55H寫成01010101B,這個B表示是二進制數(shù),顯示結(jié)果一樣,我寫輸出一般都使用二進制寫法。你必須明白十進制、二進制、十六進制之間的轉(zhuǎn)換方法,各種計算機書里都有的。以后你就不要用十進制思考了,二進制是一種重要思維方式,你務(wù)必熟悉。具體計算你不要動手,那很傻哦——PC機的附件里不是有個很好的計算器嗎?可以非常方便的轉(zhuǎn)換多種數(shù)制,編程的時候同時打開就行了。
現(xiàn)在來解釋那個很有趣味的軟件仿真,你不用燒寫芯片就可以看到運行結(jié)果,神奇吧!我當(dāng)初都不知道有這么好的軟件,為了改變一個簡單的程序會白白燒片十幾次,簡直是傻瓜。現(xiàn)在我使你避免成為傻瓜,你是不是應(yīng)該感謝我呢?呵呵。編譯成功后點擊DEBUG(調(diào)試或者叫除錯,因為BUG是錯誤的意思)選項里的STARTSTOP DEBUG SESSION,工具欄里也有這個快捷圖標(有個帶紅色B字母的放大鏡)。點擊PERIPHERAL(外設(shè))選項,選擇需要察看的部分,這里我們選擇P0口。點擊左上角文件下面的RET復(fù)位,然后點擊RET右面的帶下箭頭的小方塊來運行程序,這時可以看到P0口狀態(tài)變?yōu)?1010101,表明運行成功。想要退出運行中的程序,點擊那個圓形的紅色叉。要回到編輯界面請再次點擊DEBUG的快捷圖標。
現(xiàn)在有個問題,那個LOOP : SJMP LOOP是干嘛的?這是一個死循環(huán),指令反復(fù)跳轉(zhuǎn)到本身,相信你能夠看懂。你會覺得它沒有什么用,你感覺很對,它的確沒有什么實際的作用。那么好,讓我們把它刪除——編譯照樣通過,沒有任何錯誤和警告,而且就算你現(xiàn)在把它燒寫到芯片里,它也能正確運行,那為什么還要加上?你不服?好,那我們進入剛才的調(diào)試界面,運行程序,不好!系統(tǒng)提示出錯NO ‘EXECUTE/REDA’ PERMISSION !什么原因?問題出來了吧?因為你刪除了這個循環(huán),程序就跑飛了!跑飛了是什么意思?比如你讓一只小狗在廣場上隨便跑,你怎么知道它會跑到哪里去?這就是跑飛,結(jié)果是你丟失了這條小狗,當(dāng)然你可以重新買一只,這就是復(fù)位了,哈哈。如果你讓一只小狗在院子里跑,它就不會丟失啦。循環(huán)的意義就在這里,讓程序掉到這個循環(huán)里,你和系統(tǒng)就能把它控制住。你還是不以為然嗎?這是一個簡單程序,也許問題不大,但是當(dāng)程序復(fù)雜之后,跑飛了是件很麻煩很可怕的事情,會出現(xiàn)莫名其妙的錯誤,而且你也無法使用軟件仿真功能了。要是你還不服氣,那就嘗試每次編程都讓程序跑飛一次,如此之后你就有感覺了,我曾經(jīng)被這個簡單問題困擾了數(shù)周之多,現(xiàn)在我提示你,你要當(dāng)回事。
END也是個偽指令,是個編譯結(jié)束標志,編譯器編譯到END的時候就結(jié)束編譯了,不再編譯END以下的程序。
這就是軟件仿真的基本過程,后面我還會介紹到仿真的其他功能。建議你每次編寫程序以后都要先進行軟件仿真,反復(fù)修改,反復(fù)調(diào)試,直到需要完成的功能完全仿真成功再將程序燒寫到芯片,這樣能夠提高開發(fā)效率,延長單片機使用壽命。
第五章:關(guān)于編程器、仿真器與ISP
我建議你使用具有ISP功能的單片機完全是考慮到初學(xué)者的資金問題,因為很多人一聽說學(xué)習(xí)要花錢就會放棄學(xué)習(xí)。世界上沒有免費的知識,更沒有免費的技能,投資是非常必要的,但是成本越低就越容易上手,所以我推薦具有ISP功能的單片機,但這并非說編程器與仿真器已經(jīng)沒用,這一點你們要明白。
首先說說編程器,它是干什么用的呢?程序編輯好后,并且通過編譯生成了HEX格式的二進制燒寫文件,就要用編程器把它燒寫到單片機里面。我最初入門的時候就是使用AT89C51 +編程器的開發(fā)模式,過了半年多才在發(fā)現(xiàn)具有ISP功能的單片機,白花了那么多銀子。編程器本身很貴的,最好的上千,好一點的數(shù)百元,最便宜的簡易型的也要上百元,是個不小的投資,很多人之所以對單片機望而卻步,正是在這個投資上出現(xiàn)了猶豫。另外編程器使用起來也比較麻煩,每一次編程都要把芯片從實驗板上拔下來,燒寫好了再插回去,很容易弄壞插座和管腳,為此配置零插拔力插座的話,又要花一只單片機的錢了(十多元一只)。而且如果去現(xiàn)場工作的話,拎著個編程器多麻煩!設(shè)備復(fù)雜的話插拔芯片也很困難,一旦弄壞了管腳或者印刷板,設(shè)備就完蛋了。但是編程器在開發(fā)產(chǎn)品中具有重要作用,因為產(chǎn)品的目標板(相當(dāng)于完成指定功能的實驗板)一般沒有空間額外加掛串口電平轉(zhuǎn)換部分的器件,所以要通過編程器編程。而且開發(fā)產(chǎn)品如果使用一般的51芯片,成本也會大幅度下降。對于那些不用改動程序的產(chǎn)品比較有利。當(dāng)然如果產(chǎn)量非常大的話,就選擇掩膜(就是把程序直接做到芯片里)生產(chǎn)了,編程器也不用了,成本非常低。
仿真器在高校教學(xué)、實驗與復(fù)雜產(chǎn)品開發(fā)中可以使用。使用編程器和ISP的開發(fā)方法叫做“崩潰——燒寫”模式,如果程序運行結(jié)果錯誤,只能改動程序后擦除芯片重新燒寫,為了調(diào)試一個程序連續(xù)燒寫芯片數(shù)十次是很正常的事情,但是這樣不但麻煩,還會縮短芯片使用壽命,而且無法觀察程序運行中的狀態(tài)。仿真器正是針對這一問題,它無需燒寫,通過它可以直接觀察運行結(jié)果,而且可以單步運行,能夠最直接的找到問題所在,所以高級產(chǎn)品的開發(fā)都要用到。不過初學(xué)者一般買不起仿真器,也沒必要買,KEIL本身就有軟件仿真功能,可以大大減少燒寫次數(shù)。只要不涉及到外部擴展接口,在KEIL上仿真運行成功的程序,絕大部分燒寫以后都能正常運行,下文將有說明。
ISP的意思是在系統(tǒng)編程,但是我不喜歡這個說法,剛?cè)腴T誰能理解?我的解釋就是單片機本身自帶編程功能,就像把一臺編程器集成到單片機上,這就很容易理解了。它本身有一個出廠時候就固化好的編程程序,放在BOOT ROM里,不可修改。這個BOOT ROM不占用系統(tǒng)本身的ROM空間,具體放在哪里我們不必關(guān)心,VECTOR(向量)設(shè)置為FC(針對P89C51RD2系列)就是BOOT ROM的入口的地址,不得改動。順便解釋一下,BOOT不是靴子的意思哦,是啟動的意思。向量的意思我理解就是一個地址,線性代數(shù)中不是有N維向量的概念嗎?其實就是一串?dāng)?shù)字,你記住是地址就行了,不要去想什么向量。對于P89C51RD2來說,PSEN腳(29腳)接地(低電平)是進入ISP功能的硬件激活條件,所以編程的時候要按下選擇開關(guān)到編程端。編程結(jié)束后使PSEN腳恢復(fù)高電平,復(fù)位之后即可啟動程序,但是此時STATUS(狀態(tài)字)必須為00,它的意思就是程序從00地址開始啟動,因為編程操作是把程序燒寫到00地址開始的空間里,如果不從00啟動,程序就發(fā)生錯誤了。有關(guān)ISP的詳細資料可以從網(wǎng)上下載。不懂什么叫高低電平?不準確的說,低電平就是0V,高電平就是電源電壓5V,低電平相當(dāng)于邏輯里的0,高電平相當(dāng)于邏輯里的1,數(shù)字電路教材里一定有描述,我就不說了。
我覺得開發(fā)器材的選擇是這樣的:當(dāng)你是初學(xué)者的時候,用一塊具有ISP功能的單片機學(xué)習(xí)足夠;當(dāng)你能夠獨立設(shè)計目標板進行小產(chǎn)品開發(fā)時,可以考慮購置編程器;當(dāng)你成為專業(yè)單片機技術(shù)人員乃至嵌入式系統(tǒng)工程師的時候,仿真器對于高級產(chǎn)品的開發(fā)是必須的了。