本章的標(biāo)題名為“點亮你的第一個 LED”,從功能上講是一項非常簡單的工作。其實本章包含的內(nèi)容比較多,包括單片機硬件知識的介紹、C 語言程序的編寫、程序的下載、LED 功能的驗證等。通過本章可以建立起對單片機開發(fā)的整套流程,培養(yǎng)學(xué)習(xí)單片機的興趣。本章包括以下內(nèi)容:
- 1.單片機硬件知識介紹;
- 2.C 語言程序的編寫;
- 3.程序下載驗證。
3.1 單片機硬件知識介紹
3.1.1 單片機內(nèi)部資源
這里我們講解單片機的內(nèi)部資源,作為單片機開發(fā)者最主要的工作就是要熟練的運用單片機的各種內(nèi)部資源??偨Y(jié)起來單片機的內(nèi)部資源主要包括以下幾個方面:
我們這里先介紹前三個的功能及作用:
程序存儲器 Flash,程序存儲器顧名思義就是用來存儲單片機應(yīng)用程序的,我們在編寫好程序代碼之后,通過計算機將程序下載到 flash 程序存儲器中,功能類似于計算機的硬盤。因此,flash 存儲器的容量大小決定了單片機應(yīng)用程序的大小,容量越大能存儲的代碼量就越大,也就是能存儲復(fù)雜度更高的程序代碼,該款開發(fā)板選用的單片機 Flash 的容量為 8K 字節(jié)。
FLASH 程序存儲器的一個重要特點為斷電后程序不會丟失,一旦將代碼下載到了 FLASH 中,將永遠(yuǎn)存留在里面。這就是為什么我們每次給單片機重新加電后,程序還會繼續(xù)運行而不需要重新下載的原因。
數(shù)據(jù)存儲器 RAM,顧名思義就是用來存儲數(shù)據(jù)的,單片機在運行過程中產(chǎn)生的變量、數(shù)據(jù)都是存儲在 RAM 當(dāng)中的,功能類似于計算機的內(nèi)存。因此,RAM 的大小決定了單片機程序中能產(chǎn)生數(shù)據(jù)量的多少,該款開發(fā)板選用的單片機的 RAM 容量為 512 字節(jié)。他的特點為斷電之后數(shù)據(jù)不會保持,但是讀寫的速度非???,而且壽命長,理論上讀寫的次數(shù)是無限的。
特殊功能寄存器 SFR,這個是單片機特有的寄存器。單片機的每一個功能都會對應(yīng)一個或多個特殊功能寄存器,我們在程序中控制這些特殊功能寄存器就能實現(xiàn)某些功能了。例如單片機的定時器、串口都有對用的特殊功能寄存器 SFR。作為初學(xué)者需要先在心中建立一個特殊功能寄存器的概念,等到后面具體實現(xiàn)什么功能的時候再來詳細(xì)的學(xué)習(xí) SFR 的使用。
3.1.2 單片機最小系統(tǒng)
什么是單片機最小系統(tǒng)?最小系統(tǒng)指的是需要最少的硬件就能使單片機運轉(zhuǎn)起來的電路。單片機通用最小系統(tǒng)的三要素:電源電路、晶振電路、復(fù)位電路。RY-51 開發(fā)板單片機最小系統(tǒng)如圖 3-1 所示。下面我們結(jié)合 RY-51 開發(fā)板原理圖就三要素進(jìn)行一一介紹。
圖 3-1 單片機最小系統(tǒng)原理圖
讓單片機運行起來的第一件事就是給單片機進(jìn)行供電,就像我們使用電腦一樣首先得按下電源開關(guān)。不同的單片機供電電壓的大小是不一樣的,主流的單片機的供電電壓分為 5V、3.3V、1.5V。我們開發(fā)板選用的單片機 STC89C52 是 5V 供電的,如圖 3-1 所示單片機的第 40 引腳,20 引腳分別為單片機的正極和負(fù)極。40 引腳接著 VCC,20 引腳連接的 GND,通常我們用 VCC,GND 分別表示電源正、負(fù)。因為開發(fā)板是直接通過 USB 接口將電源引至 VCC 的,因此 VCC 對應(yīng)的 5V 電壓。
晶振
晶振電路為單片機提供時間基準(zhǔn),晶振震蕩一下,單片機的程序往下運行一次。因此,在單片機上電后,晶振一直在不停的震蕩,保證單片機程序一直在往下運行。晶振電路如圖 3-1 左下角所示。由兩個 30pf 的電容(C13、C15)和晶體振蕩器 Y2 組成。晶振電路的 X1,X2 腳分別接到單片機的 18,19 兩個晶振輸入管腳。晶振震蕩的頻率越快,單片機執(zhí)行的速度就越快,所以晶振的頻率決定了單片機的運行速度。我們開發(fā)板選用的晶振頻率為 11.0592MHz,即 1 秒鐘震蕩 11.0592 x 106 次。
復(fù)位
復(fù)位電路顧名思義是指該電路可以使單片機程序從頭開始運行,功能類似于計算機的重啟按鈕。當(dāng)單片機程序跑飛或者進(jìn)入某個死循環(huán)后,通過復(fù)位電路可以使程序從頭開始執(zhí)行。單片機的第 9 管腳 RST 為復(fù)位輸入管腳,圖 3-1 左上角為復(fù)位電路,由按鍵 K22、電容 C10 和電阻 R8 組成,當(dāng)按下 K22 時,可以使單片機進(jìn)入復(fù)位狀態(tài)。
3.1.3 LED 基礎(chǔ)知識
LED 又稱發(fā)光二極管,Light-Emitting Diode 是一種將電能轉(zhuǎn)換為光能的電子元器件,具有單向?qū)ㄌ匦?。LED 的發(fā)光原理是一個很復(fù)雜的過程,根據(jù)材料的不同可以發(fā)出不同顏色的光,我們在這里只是利用發(fā)光二極管的發(fā)光特性,對原理不進(jìn)行詳細(xì)的介紹。實物圖如 3-2 所示,左邊為直插式的發(fā)光二極管,共有 2 個管腳,一個為正極,一個為負(fù)極。右邊為貼片式發(fā)光二極管,兩端分別為 2 個管腳。
通常給 LED 正向施加一個電流可以控制 LED 發(fā)光,電流越大 LED 越亮,正常發(fā)光電流一般為 1-20mA,當(dāng)電流超過 20mA 時容易燒毀 LED。正向?qū)妷阂话銥椋?.8~2V。LED 的典型應(yīng)用原理圖如圖 3-3 所示。
圖 3-3 LED 典型應(yīng)用原理圖
如圖 3-3 所示,在電源 VCC 與地 GND 之間串聯(lián)的一個阻值 1K 的電阻 R2,LED 小燈 L2。其中,R2 稱之為限流電阻,選定一個合適的電阻才能使 LED 正常發(fā)光。根據(jù) LED 正常發(fā)光的條件我們來計算 R2 阻值的范圍。假設(shè) VCC 為 5V,LED 正向?qū)妷簽?2V,LED 發(fā)光電流為 1-20mA。根據(jù)歐姆定理:
R2max=(5V-2V)/1mA=3k Ω
R2min=(5V-2V)/20mA=150 Ω
經(jīng)計算的限流電阻 R2 的范圍為 150 Ω ~3K Ω,我們這里選擇的電阻為 1K,滿足正常發(fā)光的要求。
通過典型電路不難發(fā)現(xiàn),只要給 VCC 上電,LED 就會一直點亮。那么怎么樣才能控制 LED 小燈,根據(jù)我的需要點亮或者熄滅呢?如果我們在這個典型電路上進(jìn)行個小的改動,將 GND 替換成單片機的管腳 P1.0,如圖 3-4 右邊部分所示。
圖 3-4 單片機控制 LED 電路
在單片機里面通過程序控制管腳 P1.0,就可以實現(xiàn) LED 亮滅的控制。如果在單片機程序中使 P1.0 輸出低電平,0V,那么 LED 就會導(dǎo)通點亮。如果使 P1.0 輸出高電平,5V,那么 LED 兩端沒有壓差,未導(dǎo)通,熄滅。根據(jù)這個原理我們就可以實現(xiàn)對 LED 亮滅的控制了。
3.2 C 語言程序的編寫
3.2.1 特殊功能寄存器聲明
前面講過用單片機實現(xiàn)某些功能的時候,實際上是在單片機程序里面對他對應(yīng)的特殊功能寄存器 SFR 的控制。那么這里首先要找出 P1.0 管腳對應(yīng)的寄存器。寄存器對應(yīng)表可以從單片機的技術(shù)文檔中找到,如圖 3-5 所示。
圖 3-5 SFR 映射表
如圖所示,端口 Port 1 為一個 8 位的寄存器,該寄存器的地址為 90H,該寄存器的最高位對應(yīng)單片機的 P1.7 管腳,依次往下排列,寄存器的最低位對應(yīng)的單片機的 P1.0 管腳。單片機的每一個寄存器都會有一個獨立的地址,例如 Port 0 對應(yīng)的地址為 80H,在 C 語言編程中就是通過地址來找到寄存器的。單片機 C 語言程序的編寫中需要對特殊功能寄存器進(jìn)行聲明,寄存器聲明語句如下:
sfr P1 = 0x90;
該語句表示,地址為 90H 的寄存器命名為 P1,聲明后在程序中“P1”可以當(dāng)作一個變量來使用。其中”sfr”為語句聲明的關(guān)鍵字,“0x”在 C 語言中表示十六進(jìn)制,“;”表示該語句的結(jié)束。
sbit led0 = P1^0;
該語句為位聲明語句,表示寄存器 P1 的第 0 位,即最低位命名為“l(fā)ed0”,這個名字不是固定的可以根據(jù)個人喜好來定義,例如也可以叫“l(fā)ed”。由圖 3-5 可知,寄存器 P1 最低位對應(yīng)的管腳為 P1.0。因此,在程序中對變量 led0 進(jìn)行賦值,就可以實現(xiàn)對 LED 小燈的控制了。
3.2.2 程序代碼設(shè)計
程序代碼設(shè)計如圖 3-6 所示:
圖 3-6 程序代碼設(shè)計
下面我們就程序代碼進(jìn)行逐一分析:
如圖所示,01,02 兩條語句為寄存器及位聲明語句,每條語句均以”;”結(jié)束。其中字母“P”必須為大寫,初學(xué)者容易忽視的地方。“//”后面的內(nèi)容為語句的注釋內(nèi)容,是為了方便程序閱讀的,在編譯過程中,編譯器會自動忽略。
03 為空格,作用為方便程序的閱讀,是程序結(jié)構(gòu)更加明朗,方便理解,因此在編寫程序中可以適當(dāng)?shù)脑黾涌崭瘛?/p>
04,05,07 為程序主函數(shù)入口的固定寫法,每一個 C 語言程序都必須有一個主函數(shù),而且是唯一的一個。程序下載到單片機內(nèi)部后,就是從 04 這條語句開始執(zhí)行的。”void”表示主函數(shù)沒有返回值,05,07 為大括號,執(zhí)行的程序語句必須包含在大括號內(nèi)部?!眒ain()”之后是不需要”;”來作為結(jié)束的。
06 語句為賦值語句,將 0 賦值給 led0,因此對應(yīng)的單片機 P1.0 管腳為低電平,從而控制 LED 小燈點亮。
到這里我們就完成了點亮 LED 燈程序的編寫,只需要建立工程,把程序下載到單片機中就可以了。對于有 C 語言基礎(chǔ)的同學(xué)來說上面的程序是很容易理解的,對于初學(xué)者也沒有關(guān)系,按照介紹一個字一個字的把程序抄一遍,慢慢的便熟能生巧了。
下面我們對程序兩個方面進(jìn)行改進(jìn),我們這里程序比較簡單,只有一條寄存器聲明語句,對于復(fù)雜的程序來說,需要聲明許多條,多條聲明語句寫在程序里既不方便閱讀也容易出錯。其實 keil 軟件已經(jīng)把所有的寄存器聲明都寫到了”reg52.h”文件中,我們只要把頭文件包含到程序中就可以了:
#include
另外,當(dāng)程序運行完 06 語句,后面就沒有語句可執(zhí)行了,當(dāng)程序下載到單片機后程序有可能跑飛了,我們這里把 06 語句放在一個 while()死循環(huán)中,讓程序一直循環(huán)執(zhí)行 06 語句。改進(jìn)的程序如下圖:
圖 3-7 改進(jìn)程序
3.3 建立第一個工程
下面我們講解如何利用 Keil4 軟件建立點亮 LED 小燈的工程。首先單擊桌面 Keil4 軟件桌面快捷方式啟動軟件,進(jìn)入軟件主界面:
圖 3-8 keil4 主界面
如圖 3-8 所示,點擊菜單中“project”,在下拉菜單中選中“New uViison Project”并單擊:
圖 3-9 設(shè)定工程文件存儲路徑
如圖 3-9 所示,選定工程的存儲路徑,我們這里是在計算機 D 盤目錄下新建了一個名為“點亮 LED 小燈工程”的文件夾,將他作為工程文件的存儲路徑,這里你可以根據(jù)自己的特點選擇路徑。同時將工程命名為”LED”,也就是在圖 3-9“文件名(N):”處輸入“LED”,設(shè)置好后點擊“保存(S)”按鈕:
圖 3-10 芯片選擇界面
如圖 3-10 所示,進(jìn)入了芯片選擇界面,我們開發(fā)板上用單片機為 STC 公司的 STC89C52 芯片。但是在該界面中并沒有 STC 公司選項,由于 51 系列單片機內(nèi)核都是通用的,因此我們這里選用 Atmel 公司的單片機型號來代替,點擊左側(cè) Atmel 的下拉框:
圖 3-11 單片機型號選擇界面
如圖 3-11 所示,單擊選擇“AT89C52”型號芯片,其他默認(rèn)設(shè)置,單擊“OK”按鈕進(jìn)入下一步:
圖 3-12 系統(tǒng)開始代碼添加選項
圖 3-12 為系統(tǒng)開始代碼添加選項,單擊“否”編譯器會自動處理,單擊“是”工程中會添加相關(guān)的文件,作為初學(xué)者兩個選項都是會有影響,我們這里選擇“是”。
圖 3-13 工程主界面
如圖 3-13 所示進(jìn)入工程主界面,到目前為止已經(jīng)建立好了名為 LED 的工程,接下來給該工程添加文件:
圖 3-14 給工程添加文件
點擊“File” ->“New…”,如圖 3-14 所示,新建好文件之后,點擊“File”->“Save As…”,出現(xiàn)對話框如下圖所示:
圖 3-15 新建文件并命名為。C 格式
如圖 3-15 所示,將文件保存到工程文件夾”點亮 LED 小燈工程”目錄下。同時將文件名稱命名為“l(fā)ed.c”,這里一定要注意文件的名稱為“.c”格式的,稍后我們的程序代碼就是在這個“.c”格式的文件中編輯的,單擊“保存”,進(jìn)入程序主界面。
圖 3-16 程序主界面并編輯代碼
如圖 3-16 所示,在主界面代碼編輯區(qū)將前面介紹的程序代碼輸入,編輯完之后點擊菜單欄的保存快捷按鈕。到目前為止,文件建立好了并且代碼已經(jīng)編輯完成,接下來將“l(fā)ed.c”文件添加到我們的工程中來:
圖 3-17 添加文件到工程
如圖 3-17 所示,右鍵點擊“Source Group1“,在下拉菜單中單擊”Add Files to Group 1……”。
圖 3-18 添加文件
如圖 3-18 所示,選中“l(fā)ed.c”單擊“Add”按鈕將文件添加到工程中,添加好后單擊“Close”關(guān)閉對話框。
接下來設(shè)置 Keil4 軟件輸出文件格式,如圖 3-19 所示。
圖 3-19 輸出文件設(shè)置
單擊上圖中快捷鍵按鈕,進(jìn)入輸出文件對話框。
圖 3-20 輸出文件格式選擇對話框
如圖 3-20 所示,選中”output”子選項下,勾選“Create HEX File”,其他保持默認(rèn),點擊“OK”,完成設(shè)置。該操作的目的為讓我們通過 Keil4 軟件編譯程序的時候生產(chǎn)”.HEX”格式的文件,這個文件就是我們最終要下載到單片機中的文件。下面我們講解程序的編譯以及查看”.HEX”文件生成情況。
圖 3-21 工程編譯
如圖 3-20 所示,點擊左上角的編譯快捷按鈕,當(dāng)編譯完成之后,左下角會出現(xiàn)編譯過程的相關(guān)信息,如果程序沒有語法錯誤,會出現(xiàn)“0 Error(s),0Warning(s).”字樣。如圖所示“creating hex file from “LED”…”表明已經(jīng)成功生成了 LED.HEX 文件了,可以打開工程目錄文件夾便可以找到這個文件,如下圖所示。
圖 3-22 工程目錄
將圖 3-22 所示的 LED.hex 文件下載到單片機就完成了整個工程。接下來我們講解程序下載。
3.4 程序下載驗證
程序下載的詳細(xì)操作步驟請參考第 2 章第 2.3 小節(jié),在下載之前務(wù)必先安裝好 USB 轉(zhuǎn)串口驅(qū)動軟件。最終下載界面如下圖所示。
圖 3-23 程序下載界面
3.5 本章小結(jié)
本章介紹了單片機的內(nèi)部資源,單片機的最小系統(tǒng)以及 led 的基礎(chǔ)知識。介紹了 C 語言程序的編寫,建立了點亮 LED 小燈的程序,并將程序下載到了單片機中。雖然整個程序的功能比較簡單,但讓我們熟悉了整個單片機開發(fā)的流程,對單片機開發(fā)在腦海中形成了一個初步的概念。對于初學(xué)者來說可能整個過程有點枯燥乏味,隨著我們后續(xù)慢慢的詳細(xì)展開,會對單片機形成一個很深的理解。
評論