上期單片機(jī)入門專題我們講述了點亮LED所需要知曉的基礎(chǔ)知識,本期專題我們要講述如何通過程序控制LED的點亮與熄滅,貌似很簡單的一件事情,但對于單片機(jī)入門來說,確實是必不可少的一步。下面我們開始我們今天的程序編寫。
這是我們第一個實驗程序,因此大家還是得耐心點,先來了解一下一些51單片機(jī)特有的程序語法以及Keil軟件的基本操作步驟。
我們主要是用C語言來對單片機(jī)編程,有的單片機(jī)也有那么幾條很特殊的獨有的編程語句,51單片機(jī)就有,先介紹兩條。
第一條語句是: sfr P0 = 0x80;
SFR這個關(guān)鍵字,是51單片機(jī)特有的,他的作用是定義一個單片機(jī)特殊功能寄存器(special function register)。51單片機(jī)內(nèi)部有很多個小模塊,每個模塊有8個開關(guān)。每個模塊呢,都有一個房間和唯一的房間號。那么P0就是一個功能模塊,就住在了0x80這個房間里,我們就是通過設(shè)置P0的內(nèi)部這個模塊的8個開關(guān),來讓單片機(jī)的P0這8個IO口輸出高電平或者低電平的。
第二條語句是: sbit LED = P0^0;
這個sbit,就是對剛才所說的SFR里邊的8個開關(guān)其中的一個進(jìn)行定義。經(jīng)過上邊第二條語句后,以后只要在程序里寫LED,就代表了P0.0口(“^”這個符號在數(shù)字鍵6上邊),注意這個P必須大寫,也就是說我們給P0.0又取了一個更形象的名字叫做LED。
了解了這兩個語句后,我們來大概看一下單片機(jī)的特殊功能寄存器。注意,每個型號的單片機(jī)都會配有生產(chǎn)廠商所寫的數(shù)據(jù)手冊(Datasheet),所以我們來看一下STC89C52RC的數(shù)據(jù)手冊,從21頁到24頁,全部是對特殊功能寄存器的介紹以及地址映射列表。我們在使用這個寄存器之前,必須對這個寄存器的地址進(jìn)行說明。是不是花花綠綠的太多了,記不住啊,這個沒關(guān)系的,不需要你記住,了解一下,后邊大部分我會慢慢給大家解釋,少部分需要用到的時候,自己過來查手冊就可以了,做技術(shù)不是為了應(yīng)付考試,你可以隨時翻閱手冊查找你需要的資料。
繼續(xù)往下看,在22頁最下邊有一個表格
我們來看一下表4-1,其中P4口是擴(kuò)展出來的功能,我們暫時先不看,只看前邊的P0,P1,P2,P3這4個,每個Px口本身又有8個控制端口。大家可以結(jié)合上期專題中的單片機(jī)封裝圖來看,那么這樣就確定了我們的單片機(jī)一共有32個IO口(IO,Input和Output,分別是輸入和輸出)。
其中P0口所在的地址是0x80,一共有從7到0這8個IO口控制位,后邊有個Reset Value(復(fù)位值),這個很重要,我們看寄存器必看的一個參數(shù),8個控制位復(fù)位值全部都是1。這里也就告訴了我們,這個單片機(jī)上電復(fù)位的時候,所有的引腳的值默認(rèn)是高電平,我們在設(shè)計電路的時候也要充分的考慮這個問題。
那么上邊那兩條語句,我們寫sfr的時候,必須要根據(jù)手冊里的這個地址(add)去寫,sbit的時候,就可以直接將一個字節(jié)其中某一位取出來。我們編程的時候,也有現(xiàn)成的寫好寄存器地址的頭文件,我們直接包含該頭文件就可以了,不需要逐一去寫了。
對于單片機(jī)程序來說,每個功能程序,都必須要有一個配套的工程文件(Project),即使是點亮LED這樣簡單的功能程序也不例外,因此我們首先要新建一個工程,打開我們的Keil軟件后,點擊:Project–>New uVision Project…然后會出現(xiàn)一個新建工程的界面,如圖4-2所示。
我們首先改一下路徑,改到了我們預(yù)先建立好的LED文件夾內(nèi),這樣方便我們今后管理我們的程序,不同的功能程序放到不同的文件夾下,并且給這個工程起一個名字叫做LED,軟件會自動加擴(kuò)展名為.uvproj。
我們直接點保存就可以了,工程會自動保存成LED.uvproj文件,下次你要打開LED這個工程,可以直接找到文件夾,雙擊這個.uvproj文件就可以直接打開了。
保存之后會彈出一個對話框,這個對話框讓我們選擇單片機(jī)型號。因為Keil這軟件是外國人開發(fā)的,所以我們國內(nèi)的STC89C52RC沒有上榜,但是只要選擇同類型號就可一樣編程和應(yīng)用,因為51內(nèi)核是Intel公司創(chuàng)始的,所以這里我們直接選擇Intel公司名下的80/87C52來代替,這個選項的選擇對于我們后邊的編程是沒有什么影響的,所以大家跟著我來選就可以了,不過感興趣的童鞋可以去STC官網(wǎng)下載STC單片機(jī)的庫文件,那么我們就可以直接選擇STC相應(yīng)單片機(jī)型號了。
點OK之后,會彈出一個對話框,如圖4-5所示,這個地方會有部分啟動代碼,如果點“否”編譯器會自動處理這個問題,如果點“是”,這部分代碼會提供給我們用戶,我們用戶就可以自己去處理這部分代碼,那這部分代碼在我們初學(xué)51的這個時間段,我們一般是不需要去修改的,但是隨著技術(shù)的提高和知識的擴(kuò)展,我們有可能會了解這塊內(nèi)容,因此這個地方我們選一下“是”,讓這段代碼出現(xiàn),但是我們暫時不需要修改它,大家知道這么回事就可以了。
這樣工程就建立好了,如圖4-6所示,如果我們點擊Target 1左邊的加號,會出現(xiàn)我們剛才加入的初始化文件STARTUP.A51,這個我們先不管。
工程有了之后,我們要建立編寫代碼的文件,點擊File–>New,新建一個文件,也就是我們編寫程序的平臺。然后點File–>Save或者直接點擊那個Save的快捷鍵,可以保存文件并且命名為LED.C,這個地方必須加上.C了,因為如果寫匯編語言,這個地方的擴(kuò)展名是.ASM,頭文件就是.H等等,我們編寫的是C語言程序,這個地方必須自己添加文件的擴(kuò)展名.C,如圖4-7所示。
現(xiàn)在我們就可以在我們建立好的文件中輸入我們編寫的程序了,在編寫之前還有個工作要做。我們每做一個功能程序,必須要新建一個工程,一個工程代表了單片機(jī)要實現(xiàn)的一個功能。但是一個工程,有時候我們可以把我們的程序分多個文件寫,所以每寫一個文件,我們都要添加到我們所建立的工程中去,鼠標(biāo)右鍵點Source Group 1,點Add Files to Group ‘Source Group 1’,
單擊LED.C然后點Add,或者雙擊LED.C都可以將文件加入到這個工程下,然后點Close,關(guān)閉添加。 這個時候大家會看到在Source Group 1下邊又多了一個LED.C文件。
忙活了半天,準(zhǔn)備工作做了那么多,終于要編寫我們的代碼了。如果有學(xué)過C語言的話,你應(yīng)該很輕松的跟著我的編程自己寫出來,如果沒學(xué)過C語言也沒關(guān)系,你先照著我的抄,我會在合適的位置寫出來對C語言語法的一些解釋,這樣抄幾次后再看看解釋,就應(yīng)該很明確了。
#include<reg51.h>
sbit LED = P0^0; //位地址聲明,注意:sbit必須小寫、P大寫!
void main() //任何一個C程序都是從main函數(shù)開始執(zhí)行的
{
LED = 0;
}
按照正常的邏輯,程序這樣寫就可以了,但是在實際單片機(jī)應(yīng)用中,存在一個問題。比如我們的程序空間可以寫100行代碼,但是我們程序只有50行代碼,當(dāng)運(yùn)行完了50行,再繼續(xù)運(yùn)行時,第51行的程序不是我們想運(yùn)行的程序,而是不確定的未知內(nèi)容,所以我們通常要在程序中加一個死循環(huán),讓程序停留在我們希望的這個狀態(tài)下,不要亂運(yùn)行,有以下兩種寫法可以參考:
參考程序一
#include<reg51.h>
sbit LED = P0^0;
void main()
{
while(1)
{
LED = 0;
}
}
參考程序二
#include<reg51.h>
sbit LED = P0^0;
void main()
{
LED = 0;
while(1);
}
這兩個程序都可以實現(xiàn)點亮LED小燈的功能,看起來第二種比較簡潔一些。
這里我們大家就要培養(yǎng)一個意識了,我們做單片機(jī)編程,實際上算是硬件底層驅(qū)動程序開發(fā),這種程序的開發(fā),是離不開電路圖的,必須根據(jù)我們的電路圖來進(jìn)行程序的編寫。
程序編好了,我們要對我們的程序編譯進(jìn)行編譯,生成我們需要的可以下載到單片機(jī)里的文件,在編譯之前,我們先要勾選一個選項,Project–>Options for Target‘Target1’…,或者直接點圖4-10中的快捷圖標(biāo):
在彈出的對話框中,點擊Output選項頁,勾選其中的“Create HEX File”復(fù)選框,然后點OK。
設(shè)置好以后呢,點擊“Project–>rebuild all target files”,或者鼠標(biāo)點擊圖4-12上的快捷圖標(biāo)。
編譯完成后,在我們的Keil下方的Output窗口會出現(xiàn)相應(yīng)的提示,大家注意看圖4-13,這個窗口告訴我們編譯完成后的情況,data=9.0,指的是我們的程序使用了單片機(jī)內(nèi)部的256字節(jié)RAM資源中的9個字節(jié),code=29的意思是使用了8K代碼Flash資源中的29個字節(jié)。當(dāng)提示“0 Error, 0 warning”表示我們的程序沒有錯誤和警告,就會出現(xiàn)“creating hex file from “LED”,意思是從當(dāng)前工程生成了一個HEX文件,我們下載給單片機(jī)的就是這個HEX文件。如果出現(xiàn)有錯誤和警告提示的話,就是Error和warning不是0,那么我們要對我們的程序進(jìn)行檢查,找出問題,解決好了再進(jìn)行編譯產(chǎn)生HEX才可以。
這樣就編譯好了,下邊我們就可以把我們編譯好的程序文件下載到單片機(jī)里邊了。
首先,我們要把硬件連接好,把板子插到我們的電腦上,通過設(shè)備管理器里找到是哪個COM口,這些基礎(chǔ)的知識就不多說了,說一下STC-ISP下載軟件的設(shè)置,如圖4-14所示。
另外,要把編譯好的程序燒寫到單片機(jī)中,還必須要有燒寫電路,大家可以按照單片機(jī)數(shù)據(jù)手冊中燒寫電路圖中的電路自己焊接,當(dāng)然如果你有一塊單片機(jī)開發(fā)板的話,也完全可以使用開發(fā)板自帶燒寫電路進(jìn)行燒寫。
下載程序共有以下五個步驟:
第一步,選擇單片機(jī)型號,我們現(xiàn)在用的單片機(jī)型號是STC89C52RC,這個一定不能錯了;
第二步,點擊“打開程序文件”,找到我們剛才建立工程的那個LED文件夾下,找到LED.HEX這個文件,點擊打開;
第三步,選擇正確的COM口;
第四步,設(shè)置里邊的所有選項我們暫時全部使用默認(rèn),不要隨便改動,有的選項改錯了以后可能會產(chǎn)生麻煩;
第五步,因為STC單片機(jī)要冷啟動下載,就是先點下載,然后給單片機(jī)上電,所以我們先關(guān)閉板子上的電源開關(guān),然后點擊“Download/下載”,等待軟件提示你請上電后,如圖4-15所示,然后再打開板子開關(guān),就可以將程序下載到單片機(jī)里邊,當(dāng)軟件顯示“已加密”就表示程序成功下載,如圖4-16所示。
程序下載完畢后,程序會自動運(yùn)行,下面可以看一下,LED是否已經(jīng)被成功點亮了呢?如果沒有,還是需要檢查下電路的。那現(xiàn)在如果我們把LED = 0改成LED = 1,再編譯程序下載進(jìn)去新的HEX文件,燈就會熄滅。至此,點亮一個LED的實驗已經(jīng)完成,我們在學(xué)習(xí)單片機(jī)的道路上,也終于邁出了第一步。
聯(lián)系客服