忙活了半天,準(zhǔn)備工作做了那么多,終于要編寫我們的程序代碼了。如果學(xué)過 C 語言的話,你應(yīng)該很輕松的跟著我的編程自己寫出來,如果沒學(xué)過 C 語言也沒關(guān)系,你先照著我的抄,我會在合適的位置寫出來對 C 語言語法的解釋,這樣抄幾次后再看看解釋,就應(yīng)該很明白了,抄的時(shí)候一定要認(rèn)真,尤其標(biāo)點(diǎn)符號不可以搞錯。
第一個(gè)單片機(jī)程序:
#include <reg52.h> //包含特殊功能寄存器定義的頭文件
sbit LED = P0^0; //位地址聲明,注意:sbit 必須小寫、P 大寫!
void main(){ //任何一個(gè) C 程序都必須有且僅有一個(gè) main 函數(shù)
LED = 0; //分號表示一條語句結(jié)束
}
先從程序語法上來分析一下:
邏輯上來看,程序這樣寫就可以了,但是在實(shí)際單片機(jī)應(yīng)用中,存在一個(gè)問題。比如我們的程序空間可以容納100行代碼,但是我們實(shí)際上的程序只用了50行代碼,當(dāng)運(yùn)行完了50行,再繼續(xù)運(yùn)行時(shí),第51行的程序不是我們想運(yùn)行的程序,而是不確定的未知內(nèi)容,一旦執(zhí)行下去程序就會出錯從而可能導(dǎo)致單片機(jī)自動復(fù)位,所以我們通常在程序中加入一個(gè)死循環(huán),讓程序停留在我們希望的這個(gè)狀態(tài)下,不要亂運(yùn)行,有以下兩種寫法可以參考:
參考程序一:
#include <reg52.h>
sbit LED = P0^0;
void main(){
while(1){
LED = 0;
}
}
參考程序二:
#include <reg52.h>
sbit LED = P0^0;
void main(){
LED = 0;
while(1);
}
程序一的功能是程序在反復(fù)不斷的無限次執(zhí)行 LED = 0;這條語句,而程序二的功能是執(zhí)行一次,然后程序直接停留下來等待,相對程序一來說程序二更加簡潔一些。針對于圖2-6,我們這個(gè)程序能夠把小燈點(diǎn)亮,但是這個(gè)程序卻點(diǎn)不亮我們板子上的小燈,這是為什么呢?
這里大家就要培養(yǎng)一個(gè)意識了,我們做單片機(jī)編程,實(shí)際上算是硬件底層驅(qū)動程序開發(fā),這種程序的開發(fā),是離不開電路圖的,必須根據(jù)我們的電路圖來進(jìn)行程序的編寫。如果我們設(shè)計(jì)電路板的電路圖和圖2-6一樣的話,程序可以成功點(diǎn)亮小燈,但是如果不一樣,就可能點(diǎn)不亮。
我們的開發(fā)板上,還有一個(gè) 74HC138 作為8個(gè) LED 小燈的總開關(guān),而 P0.0 僅僅是個(gè)分開關(guān)。如同我們家里總是有一個(gè)供電總閘,然后每個(gè)電燈又有一個(gè)專門的開關(guān),我們剛才的程序僅僅打開了那個(gè)電燈的開關(guān),但是沒有打開那個(gè)總電閘,所以程序需要加上這部分代碼。
因?yàn)檫@節(jié)課要介紹的內(nèi)容比較多,所以我們把 74HC138 的原理以及為什么要加額外的代碼在下節(jié)課統(tǒng)一介紹,這節(jié)課我們直接加上這部分代碼,大家知道有這么一回事就可以了。
#include <reg52.h> //包含特殊功能寄存器定義的頭文件
sbit LED = P0^0; //位地址聲明,注意:sbit 必須小寫、P 大寫!
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
void main(){
ENLED = 0;
ADDR3 = 1;
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;
LED = 0; //點(diǎn)亮小燈
while (1); //程序停止在這里
}
寫了這么多啰嗦的語句,剛開始大家可能覺得很麻煩,為什么有的書上程序很簡單就可以點(diǎn)亮小燈,我們這里卻這么麻煩呢。大家要了解一點(diǎn),就是我們做這個(gè)學(xué)習(xí)板,雖然僅僅提供給大家簡單學(xué)習(xí)使用,但是我們也得按照實(shí)際產(chǎn)品的開發(fā)模式去設(shè)計(jì),所以綜合考慮因素很多,大家學(xué)到后邊就會明白它的設(shè)計(jì)價(jià)值了,這里大家只要跟著我們?nèi)プ鼍涂梢粤恕?/p>
程序編好了,我們要對我們的程序進(jìn)行編譯,生成我們需要的可以下載到單片機(jī)里的文件,在編譯之前,我們先要勾選一個(gè)選項(xiàng),Project-->Options for Target ?Target1?...,或者直接點(diǎn)圖 2-17中紅框內(nèi)的快捷圖標(biāo):
http://wiki.jikexueyuan.com/project/mcu-tutorial-one/images/17.png" alt="" />
圖2-17 工程選項(xiàng)圖標(biāo)
在彈出的對話框中,點(diǎn)擊 Output 選項(xiàng)頁,勾選其中的“Create HEX File”復(fù)選框,然后點(diǎn) OK,如圖2-18所示。
http://wiki.jikexueyuan.com/project/mcu-tutorial-one/images/18.png" alt="" />
圖2-18 創(chuàng)建 HEX 文件
設(shè)置好以后呢,點(diǎn)擊“Project-->rebuild all target files”,或者鼠標(biāo)點(diǎn)擊圖2-19中紅框內(nèi)的快捷圖標(biāo),就可以對程序進(jìn)行編譯了。
http://wiki.jikexueyuan.com/project/mcu-tutorial-one/images/19.png" alt="" />
圖2-19 編譯程序
編譯完成后,在我們的 Keil 下方的 Output 窗口會出現(xiàn)相應(yīng)的提示,大家注意看圖2-20,這個(gè)窗口告訴我們編譯完成后的情況,data=9.0,指的是我們的程序使用了單片機(jī)內(nèi)部的256字節(jié) RAM 資源中的9個(gè)字節(jié),code=29 的意思是使用了 8 K 代碼 Flash 資源中的29個(gè)字節(jié)。
當(dāng)提示“0 Error(s), 0 warning(s)”表示我們的程序沒有錯誤和警告,就會出現(xiàn)“creating hex file from “LED”...,意思是從當(dāng)前工程生成了一個(gè) HEX 文件,我們要下載到單片機(jī)上的就是這個(gè) HEX 文件。如果出現(xiàn)有錯誤和警告提示的話,就是 Error 和 warning 不是0,那么我們就要對程序進(jìn)行檢查,找出問題,解決好了再進(jìn)行編譯產(chǎn)生 HEX 才可以。
http://wiki.jikexueyuan.com/project/mcu-tutorial-one/images/20.png" alt="" />
圖2-20 編譯輸出信息
到此為止,程序就編譯好了,下邊我們就要把編譯好的程序文件下載到單片機(jī)里了。