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