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