2.3LED小燈
LED(light-emitting diode),即發光二極管,俗稱LED小燈,它的種類很多,參數也不盡相同,Kingst51開發板上用的是普通的貼片發光二極管。這種二極管通常的正向導通電壓是1.8V到2.2V之間,工作電流一般在1mA~20mA之間。其中,當電流在1mA~5mA之間變化時,隨著通過LED的電流越來越大,肉眼會明顯感覺到這個小燈越來越亮,而當電流從5mA~20mA之間變化時,看到的發光二極管的亮度變化就不太明顯了。當電流超過20mA時,LED就會有燒壞的危險了,電流越大,燒壞的速度也就越快。所以在使用過程中應該特別注意它在電流參數上的設計要求。
下面來看一下發光二極管在Kingst51開發板上的設計應用。USB供電接口圖以及電源開關圖如圖2-3所示。

圖2-3 USB接口電路和電源開關電路
圖2-3是Kingst51開發板上的USB接口電路。通過USB線,電腦給開發板供電和下載程序以及實現電腦和開發板之間的通信。這是一個標準16引腳的type-C的USB接口,從圖上可以看出,其中A6腳和A7腳是數據通信引腳,+5IN為USB電源正極,GND為電源負極。
將電源開關左邊的LED部分的電路單獨摘出來分析,如圖2-4所示。

圖2-4 LED小燈電路(一)
發光二極管是二極管中的一種,因此和普通二極管一樣,這個二極管也有陰極和陽極,習慣上也稱之為負極和正極,方向必須接對了才會有電流通過讓LED小燈發光。剛才提到接入的VCC電壓是5V,發光二極管自身壓降大概是2V,那么在右邊R34這個電阻上承受的電壓就是3V。現在要求電流范圍是1~20mA的話,就可以根據歐姆定律R=U/I,把這個電阻的上限和下限值求出來。
U=3V,當電流是1mA的時候,電阻值是3K;當電流是20mA的時候,電阻值是150歐,也就是R34的取值范圍是150~3K歐姆。這個電阻值大小的變化,直接可以限制整條通路的電流的大小,因此這個電阻通常稱之為“限流電阻”。在圖2-3中用的電阻是1K,這條支路電流的大小可以計算出來了,而這個發光二極管在這里的作用,是作為電源指示燈的,使用USB線將開發板和電腦連起來,這個燈就會亮了。
同理,在電源開關后級控制的位置,又添加了一個LED10發光二極管,當打開開關時,這個二極管才會亮起,如圖2-5所示。

圖2-5 電源開關電路
把圖2-4進行一下變化,把右側的GND去掉,改成一個單片機的I/O口,如圖2-6所示。

圖2-6 LED小燈電路(二)
圖2-4由于電源從正極到負極有電壓差,并且電路是導通的,所以就會有電流通過,LED小燈因為有了電流通過,就會發光。把右側的原GND處接到單片機P0.0引腳上,那么如果單片機輸出一個低電平,也就是跟GND一樣的0V電壓,就可以讓LED小燈和圖2-4一樣發光了。
因為單片機是可以編程控制的,可以讓P0.0這個引腳輸出一個高電平,就是跟VCC一樣的5V電壓,那么這個時候,左側VCC電壓和右側的P0.0的電壓是一致的,那就沒有電壓差,沒有電壓差就不會產生電流,沒有電流LED小燈就不會亮,也就是會處于熄滅狀態。下面,就用編程軟件來實現控制小燈的亮和滅。
2.4程序代碼編寫
這是第一個實驗程序,編程之前,需要先來了解一些51單片機特有的程序語法以及Keil軟件的基本操作步驟。
1.2.1特殊功能寄存器和位定義
不同廠家的單片機除了采用通用的C語言編程外,有的廠家的單片機會有那么幾條很特殊的獨有的編程語句,51單片機就有,先介紹2條。
第一條語句是:sfr P0 = 0x80;
sfr這個關鍵字,是51單片機特有的,它的作用是定義一個單片機特殊功能寄存器(special function register)。51單片機內部有很多個小模塊,每個模塊居住在擁有唯一房間號的房間內,同時每個模塊都有8個控制開關。P0就是一個功能模塊,就住在了0x80這個房間里,用戶就是通過設置P0內部這個模塊的8個開關,來讓單片機的P0這8個I/O口輸出高電平或者低電平的。而51單片機內部有很多寄存器,如果想使用必須提前進行sfr聲明。不過Keil軟件已經把所有這些聲明都預先寫好并保存到一個專門的文件中去了,用戶只需要文件開頭添加一行#include即可,這個在后邊有用法詳解。
第二條語句是:sbit LED = P0^0;
這個sbit,就是對剛才的SFR里邊的8個開關其中的一個進行定義。經過上邊第二條語句后,以后只要在程序里寫LED,就代表了P0.0口(“^”這個符號在數字鍵6上邊),注意這個P必須大寫,也就是說給P0.0又取了一個更形象的名字叫做LED。
了解了這兩個語句后,再來看一下單片機的特殊功能寄存器。請注意,每個型號的單片機都會配有生產廠商所編寫的數據手冊(Datasheet),STC89C52的數據手冊從21頁到24頁,全部是對特殊功能寄存器的介紹以及地址映射列表。用戶在使用這個寄存器之前,必須對這個寄存器的地址進行說明。是不是花花綠綠的太多了記不住,這個沒關系的,不需要記住,后邊大部分都會解釋,少部分需要用到的時候過來查手冊就可以,再次強調做技術不是為了應付考試,可以隨時翻閱手冊查找需要的資料。
如圖2-7,是截取的手冊中第22頁最下邊的一個表格。

圖2-7 I/O口特殊功能寄存器
來看一下這個表,其中STC89C52RC的P4口對標準51的擴展,先忽略它,只看前邊的P0、P1、P2、P3這4個,每個P口本身又有8個控制端口。可以結合Kingst51開發板原理圖或者圖2-1來看,那么這樣就確定了單片機一共有32個I/O口(I/O,Input和Output,分別是輸入和輸出)。
其中P0口所在的地址是0x80,一共有從7到0這8個I/O口控制位,后邊有個Reset Value(復位值),這個很重要,是看寄存器必看的一個參數,8個控制位復位值全部都是1。這就是告訴用戶,每當單片機上電復位的時候,所有的引腳的值默認是都是1,即高電平,在設計電路的時候也要充分的考慮這個問題。
前邊那2條語句寫sfr的時候,必須根據手冊里的這個地址(Add)去寫,寫sbit的時候,就可以直接將一個字節其中某一位取出來。編程的時候,也有現成的寫好寄存器地址的頭文件,直接包含該頭文件就可以了,不需要逐一去寫了。
2.4.2新建一個工程
對于單片機程序來說,每個功能程序都必須要有一個配套的工程(Project),即使是點亮LED這樣簡單的功能程序也不例外。因此首先要新建一個工程,打開Keil軟件后,點擊:Project-->New uVision Project...然后會出現一個新建工程的界面,如圖2-8所示。

圖2-8 新建一個工程
在計算機硬盤上建立一個lesson2的目錄,然后把LED這個工程的路徑指定到這里,這樣方便今后管理程序,不同的功能程序放到不同的文件夾下,并且給這個工程起一個名字叫做LED,軟件會自動添加擴展名.uvproj,如圖2-9所示。

圖2-9 保存工程
點擊“保存”按鈕,工程會自動保存成LED.uvproj文件,下次要打開LED這個工程時,可以直接找到文件夾,雙擊這個.uvproj文件就可以直接打開。
保存之后會彈出一個對話框,這個對話框讓用戶選擇單片機型號。因為Keil軟件是外國人開發的,所以國內的STC89C52并沒有上榜,但是只要選擇同類型號就可以了。因為51內核是由Intel公司創造的,所以這里直接選擇Intel公司名下的80/87C52來代替,這個選項的選擇對于后邊的編程沒有任何的不良影響。如圖2-10所示

圖2-10 單片機型號選擇
點擊OK之后,會彈出一個對話框,如圖2-11所示,每個工程都需要一段啟動代碼,如果點“否”按鈕,編譯器會自動處理這個問題,如果點“是”按鈕,這部分代碼會提供給用戶,用戶就可以按需要自己去處理這部分代碼,那這部分代碼在初學51的這段時間內,一般是不需要去修改的,但是隨著技術的提高和知識的擴展,就有可能會需要了解這塊內容,因此這個地方單擊“是”按鈕,讓這段代碼出現,但是暫時不需要修改它,大家知道這么回事就可以了。

圖2-11 啟動代碼選擇
這樣工程就建立好了,如圖2-12所示,如果點擊Target 1左邊的加號,會出現剛才加入的初始化文件STARTUP.A51,這個先不管。

圖2-12 工程文件
工程有了之后,要建立編寫代碼的文件,點擊File-->New,如圖2-13所示,新建一個文件,也就是編寫程序的平臺。然后點File-->Save或者直接點擊Save的快捷鍵,可以保存文件,保存時把它命名為LED.c,這個地方必須加上.c,如果寫匯編語言,這個地方的擴展名是.asm,頭文件就是.h等等,這里編寫的是C語言程序,這個地方必須自己添加文件的擴展名.c,如圖2-14所示。

圖2-13 新建文件

圖2-14 保存文件
現在就可以在已經建立好的文件中輸入程序代碼了,在編寫之前還有個工作要做,每做一個功能程序,必須要新建一個工程,一個工程代表了單片機要實現的一個功能。但是一個工程有時可以把程序分多個文件寫,所以每寫一個文件,都要添加到所建立的工程中去,右鍵點Source Group 1,點Add Files to Group ‘Source Group 1’...,如圖2-15所示。

圖2-15 添加文件(一)
在彈出的對話框中,單擊LED.c選中它,然后點Add,或者直接雙擊LED.c都可以將文件加入到這個工程下,然后單擊Close,關閉添加。這個時候會看到在Source Group 1下邊又多了一個LED.c文件。

圖2-16 添加文件(二)
2.4.3編寫點亮小燈的程序
準備工作做了那么多,終于要編寫程序代碼了。如果學過C語言,應該很輕松的編程,如果沒學過C語言也沒關系,先照著抄,后邊有針對一些C語言語法的講解,多看幾遍就懂了。
#include //包含特殊功能寄存器定義的頭文件
sbit LED = P0^0; //位地址聲明,注意:sbit必須小寫、P大寫!
void main() //任何一個C程序都必須有且僅有一個main函數
{ //{}是成對存在的,在這里表示函數的起始和結束
LED = 0; //分號表示一條語句結束
}
先從程序語法上來分析一下。
1、main是主函數的函數名字,每一個C程序都必須有且僅有一個main函數。
2、void是函數的返回值類型,本程序沒有返回值,用void表示。
3、{}在這里是函數開始和結束的標志,不可省略。
4、每條C語言語句以;結束的。
邏輯上來看,程序這樣寫就可以了,但是在單片機實際應用中存在一個問題。比如程序空間可以容納100行代碼,但是實際的程序只用了50行代碼,當運行完了50行,再繼續運行時,第51行的程序不是用戶的程序,而是不確定的未知內容,一旦執行下去程序就會出錯從而可能導致單片機自動復位,所以通常在程序中加入一個死循環,讓程序停留在所希望的這個狀態下,不要亂運行,有以下兩種寫法可以參考:
參考程序一: 參考程序二:
#include #include
sbit LED = P0^0; sbit LED = P0^0;
void main() void main()
{ {
while(1) LED = 0;
{ while(1);
LED = 0; }
}
}
程序一的功能是程序在反復不斷的無限次執行LED = 0;這條語句,而程序二的功能是執行一次,然后程序直接停留下來等待,相對程序一來說程序二更加簡潔一些。針對于圖2-6,這個程序能夠把小燈點亮,但是這個程序卻點不亮Kingst51開發板上的小燈,這是為什么呢?
這里就要培養一個意識,單片機編程實際上算是硬件底層驅動程序開發,這種程序的開發是離不開電路圖的,必須根據電路圖來進行程序的編寫。如果電路板的電路圖和圖2-6一樣的話,程序可以成功點亮小燈,但是如果不一樣,就可能點不亮。
開發板上還有一個74HC138作為8個LED小燈的總開關,而P0.0僅僅是個分開關。如同家里有一個供電總閘,然后每個電燈又有一個專門的分支開關。剛才的程序僅僅打開了那個電燈的分支開關,但是沒有打開那個總電閘。所以程序需要加上這部分代碼。因為這節課要介紹的內容比較多,所以74HC138的原理以及為什么要加額外的代碼在下節課統一介紹,這節課直接加上這部分代碼做一下功能演示。
#include //包含特殊功能寄存器定義的頭文件
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); //程序停止在這里
}
為什么有的書上程序很簡單就可以點亮小燈,這里卻要麻煩一些呢?Kingst51開發板雖然僅僅提供給大家簡單學習使用,但是也是按照實際產品的開發模式去設計,所以綜合考慮因素很多,學到后邊就會明白它的設計價值了,這里只要跟著去做就可以,后續章節會慢慢理解其中的價值。
程序編好了,要對程序進行編譯,生成可以下載到單片機里的文件,在編譯之前要勾選一個選項,Project-->Options for Target ‘Target1’...,或者直接點圖2-17中紅框內的快捷圖標。

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

圖2-18 創建HEX文件
設置好以后,點擊“Project-->rebuild all target files”,或者點擊圖2-19中紅框內的快捷圖標,就可以對程序進行編譯了。

圖2-19 編譯程序
編譯完成后,在Keil下方的Output窗口會出現相應的提示,如圖2-20,這個窗口提供了編譯完成后的信息,data=9.0,xdata=0指的是本程序使用了單片機內部的data區域RAM資源中的9個字節,xdata區域的RAM使用為0,data和xdata是51單片機特定的內存區域劃分,這兩部分都屬于51單片機的內存;code=29的意思是使用了8K代碼Flash資源中的29個字節。當提示“0 Error(s), 0 warning(s)”表示程序沒有錯誤和警告,就會出現“creating hex file from “LED”...,意思是從當前工程生成了一個HEX文件,要下載到單片機的就是這個HEX文件。如果出現有錯誤和警告提示的話,Error和warning不是0,那么就要對程序進行檢查,找出問題,解決好了再重新編譯產生HEX才可以。

圖2-20 編譯輸出信息
到此為止,程序就編譯好了,下邊就要把編譯好的程序文件下載到單片機里了。
審核編輯 黃宇
-
led
+關注
關注
243文章
24594瀏覽量
690813 -
usb
+關注
關注
60文章
8438瀏覽量
284453
發布評論請先 登錄
第7章 變量進階與點陣LED(7.3 7.4)
第2章 點亮你的LED
2.3 - 2.4 GHz 小型蜂窩功率放大器模塊 skyworksinc
【RA4E2開發板評測】1、從開箱到點亮 LED
【RA4E2開發板評測】點亮LED燈
【創龍TLT113-MiniEVM開發板試用體驗】點亮LED
2.4 A 雙通道閃光燈 LED 驅動器 skyworksinc
2.4 A 三通道閃光燈 LED 驅動器,帶 I<sup>2</sup>C 控制接口 skyworksinc
2.4 A / 2 A 雙路獨立閃光燈 LED 驅動器,帶 TrueFlash? skyworksinc
【VisionFive 2單板計算機試用體驗】GPIO口點亮LED燈
單片機外圍電路設計 (第2版)
LED顯示屏:點亮商業未來的璀璨之光
第2章 點亮你的LED(2.3 2.4)
評論