鍍金池/ 教程/ 數(shù)據(jù)庫/ 2.6 第一個單片機程序(C 語言編寫)
2.1 單片機內(nèi)部資源(內(nèi)部結(jié)構(gòu))
5.1 單片機邏輯電路與邏輯運算
6.1 C 語言數(shù)組
5.7 單片機數(shù)碼管的靜態(tài)顯示
4.8 單片機 LED 流水燈程序[詳細(xì)]
6.7 單片機中斷的優(yōu)先級
5.2 單片機定時器介紹
1. 如何學(xué)習(xí)單片機
1.3 單片機學(xué)習(xí)的準(zhǔn)備工作
4.3 C 語言基本運算符
5.5 單片機中 LED 數(shù)碼管的介紹
2.6 第一個單片機程序(C 語言編寫)
3.5 單片機中 74HC138 三八譯碼器的應(yīng)用
3.2 單片機中去耦電容的應(yīng)用
6.4 單片機數(shù)碼管動態(tài)顯示程序[帶解釋]
1.5 Keil uVision4簡單使用教程
第一章問題匯總
1.2 如何學(xué)習(xí)單片機
4.4 C 語言 for 循環(huán)語句
6.5 單片機數(shù)碼管顯示消隱
單片機上的發(fā)光二極管(LED 燈)
5. 單片機定時器與數(shù)碼管基礎(chǔ)
5.3 單片機定時器的寄存器
5.6 單片機數(shù)碼管的真值表
6.2 C 語言 if 語句
3.3 三極管的的概念及其工作原理
4. C 語言基礎(chǔ)及流水燈的實現(xiàn)
點亮你的 LED 燈
4.6 C 語言函數(shù)的簡單介紹
2.4 51單片機特殊功能寄存器和位定義
6.6 單片機中斷系統(tǒng)
3.1 電磁干擾 EMI
4.1 二進(jìn)制、十進(jìn)制和十六進(jìn)制
4.5 C 語言 while 循環(huán)語句
3. 單片機硬件基礎(chǔ)知識學(xué)習(xí)
2.5 使用 Keil uVision 新建一個工程
1.4 單片機開發(fā)環(huán)境搭建--Keil uVision4安裝教程
4.7 單片機延時方法(Keil 軟件延時)
6. 單片機的中斷與數(shù)碼管動態(tài)顯示
3.6 單片機 LED 燈閃爍程序
6.3 C 語言 switch 語句
1.1 學(xué)習(xí)什么單片機
4.2 C 語言變量類型和范圍
5.4 單片機中定時器的應(yīng)用
2.7 將程序下載到單片機
3.4 單片機中三極管的應(yīng)用
2.2 單片機最小系統(tǒng)[配圖][超詳細(xì)]

2.6 第一個單片機程序(C 語言編寫)

忙活了半天,準(zhǔn)備工作做了那么多,終于要編寫我們的程序代碼了。如果學(xué)過 C 語言的話,你應(yīng)該很輕松的跟著我的編程自己寫出來,如果沒學(xué)過 C 語言也沒關(guān)系,你先照著我的抄,我會在合適的位置寫出來對 C 語言語法的解釋,這樣抄幾次后再看看解釋,就應(yīng)該很明白了,抄的時候一定要認(rèn)真,尤其標(biāo)點符號不可以搞錯。

第一個單片機程序:

#include <reg52.h>  //包含特殊功能寄存器定義的頭文件
sbit LED = P0^0;  //位地址聲明,注意:sbit 必須小寫、P 大寫!
void main(){  //任何一個 C 程序都必須有且僅有一個 main 函數(shù)
    LED = 0;  //分號表示一條語句結(jié)束
}

先從程序語法上來分析一下:

  • main 是主函數(shù)的函數(shù)名字,每一個 C 程序都必須有且僅有一個 main 函數(shù)。
  • void 是函數(shù)的返回值類型,本程序沒有返回值,用 void 表示。
  • {}在這里是函數(shù)開始和結(jié)束的標(biāo)志,不可省略。
  • 每條 C 語言語句以;結(jié)束的。

邏輯上來看,程序這樣寫就可以了,但是在實際單片機應(yīng)用中,存在一個問題。比如我們的程序空間可以容納100行代碼,但是我們實際上的程序只用了50行代碼,當(dāng)運行完了50行,再繼續(xù)運行時,第51行的程序不是我們想運行的程序,而是不確定的未知內(nèi)容,一旦執(zhí)行下去程序就會出錯從而可能導(dǎo)致單片機自動復(fù)位,所以我們通常在程序中加入一個死循環(huán),讓程序停留在我們希望的這個狀態(tài)下,不要亂運行,有以下兩種寫法可以參考:

參考程序一:

#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,我們這個程序能夠把小燈點亮,但是這個程序卻點不亮我們板子上的小燈,這是為什么呢?

這里大家就要培養(yǎng)一個意識了,我們做單片機編程,實際上算是硬件底層驅(qū)動程序開發(fā),這種程序的開發(fā),是離不開電路圖的,必須根據(jù)我們的電路圖來進(jìn)行程序的編寫。如果我們設(shè)計電路板的電路圖和圖2-6一樣的話,程序可以成功點亮小燈,但是如果不一樣,就可能點不亮。

我們的開發(fā)板上,還有一個 74HC138 作為8個 LED 小燈的總開關(guān),而 P0.0 僅僅是個分開關(guān)。如同我們家里總是有一個供電總閘,然后每個電燈又有一個專門的開關(guān),我們剛才的程序僅僅打開了那個電燈的開關(guā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;  //點亮小燈
    while (1);  //程序停止在這里
}

寫了這么多啰嗦的語句,剛開始大家可能覺得很麻煩,為什么有的書上程序很簡單就可以點亮小燈,我們這里卻這么麻煩呢。大家要了解一點,就是我們做這個學(xué)習(xí)板,雖然僅僅提供給大家簡單學(xué)習(xí)使用,但是我們也得按照實際產(chǎn)品的開發(fā)模式去設(shè)計,所以綜合考慮因素很多,大家學(xué)到后邊就會明白它的設(shè)計價值了,這里大家只要跟著我們?nèi)プ鼍涂梢粤恕?/p>

程序編好了,我們要對我們的程序進(jìn)行編譯,生成我們需要的可以下載到單片機里的文件,在編譯之前,我們先要勾選一個選項,Project-->Options for Target ?Target1?...,或者直接點圖 2-17中紅框內(nèi)的快捷圖標(biāo):

http://wiki.jikexueyuan.com/project/mcu-tutorial-one/images/17.png" alt="" />

圖2-17 工程選項圖標(biāo)

在彈出的對話框中,點擊 Output 選項頁,勾選其中的“Create HEX File”復(fù)選框,然后點 OK,如圖2-18所示。

http://wiki.jikexueyuan.com/project/mcu-tutorial-one/images/18.png" alt="" />

圖2-18 創(chuàng)建 HEX 文件

設(shè)置好以后呢,點擊“Project-->rebuild all target files”,或者鼠標(biāo)點擊圖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,這個窗口告訴我們編譯完成后的情況,data=9.0,指的是我們的程序使用了單片機內(nèi)部的256字節(jié) RAM 資源中的9個字節(jié),code=29 的意思是使用了 8 K 代碼 Flash 資源中的29個字節(jié)。

當(dāng)提示“0 Error(s), 0 warning(s)”表示我們的程序沒有錯誤和警告,就會出現(xiàn)“creating hex file from “LED”...,意思是從當(dāng)前工程生成了一個 HEX 文件,我們要下載到單片機上的就是這個 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 編譯輸出信息

到此為止,程序就編譯好了,下邊我們就要把編譯好的程序文件下載到單片機里了。