每個入門單片機(jī)的朋友,我想第一個程序幾乎都是點(diǎn)亮一顆led燈了,這同軟件工程的“hello world”一樣經(jīng)典,是很簡單,但卻有著很多回憶,依然記得學(xué)習(xí)單片機(jī)的那段經(jīng)歷,那時經(jīng)典的8051單片機(jī)比如at89c52要大約8個大洋,電阻電容等等都得自己去買(學(xué)校那時沒開發(fā)實(shí)驗(yàn)室),有時為了幾顆電阻,幾顆led燈,還得花4元的公交車費(fèi)跑去電子市場,還論顆買,電阻1毛錢2顆,led燈m5粗的那種1毛錢1顆,然后興高采烈的各種焊接,各種跳線,還各種燒毀……回想起來都說淚??!
言歸正傳,我認(rèn)為單片機(jī)第一個程序是點(diǎn)亮led的理由有幾點(diǎn):
1、學(xué)會用keil軟件建立單片機(jī)工程,建立程序文件,軟件配置和程序編譯。
2、學(xué)會分析電路并分析驗(yàn)證。
3、學(xué)會用proteus繪制電路原理圖,并調(diào)試仿真。
4、了解一個小實(shí)驗(yàn)的基本流程。
綜合以上幾點(diǎn),認(rèn)真的做好這個實(shí)驗(yàn),對提高學(xué)習(xí)興趣,很有必要。
什么是led?
led中文名稱叫發(fā)光二極管,它會發(fā)出可見光,常見及常用的有可發(fā)紅、黃、綠色光的led燈,在產(chǎn)品中,紅色常用來指示系統(tǒng)錯誤,綠色常用來指示系統(tǒng)正常,黃色常用來警告,根據(jù)應(yīng)用需求的不同,led燈也各有千秋,如圖。
圖中有方形,圓形,貼片等led,顏色也不一樣,一般地,發(fā)光顏色與燈的外形顏色相同,使用的時候,必須注意幾點(diǎn):
1、引腳判斷:本例使用2腳的led燈,新的led長的引腳為正極,短的引腳為負(fù)極。
2、工作電壓:通常為1.2~2.2v
3、工作電流:2ma~20ma
如何點(diǎn)亮?
知道led的基本參數(shù)后,就可以根據(jù)需求設(shè)計(jì)電路了,噢!電路?什么是電路?
電路:指的是由電源,導(dǎo)線,用電器,開關(guān)組成的回路。(大概這樣吧)
那么,點(diǎn)亮led燈的電路必須包含定義中的部分:
1、電源:本例用5v直流電源供電。
2、導(dǎo)線:本例用proteus仿真,連線即為導(dǎo)線。
3、用電器:led燈,當(dāng)然,還得加電阻。
4、開關(guān):仿真中“運(yùn)行”相當(dāng)于開關(guān)。
好了,下面見證led的成長:
1、計(jì)算:參考led的參數(shù),本例使用m3大的圓形紅色led來演示,它的工作電流取3ma就足夠亮,led的亮度與電流有關(guān);工作電壓取2v(實(shí)測得的數(shù)據(jù)), 那么,怎樣滿足該條件? 電源用5v供電,而led只需要2v,還剩3v,怎么辦?這時,該電阻出場了,電阻是一種能“吃電能”的家伙,剩余的3v電壓就加在它上面,這樣就清楚了, vled = 2v vr = 3v ,i = 3ma , 電阻和led燈應(yīng)該串聯(lián),不解釋,這里還差一個參數(shù)——電阻值,這時,歐姆定律出場, r = u / i = 3v / 3ma = 1k 。
2、繪制仿真電路圖: 過程就不說了,看圖
運(yùn)行仿真后。
加入電流表和電壓表,測測數(shù)據(jù)和計(jì)算的是否有偏差。
ok,正確。
單片機(jī)如何控制led?
上圖中是給led燈直接加電壓,使之點(diǎn)亮,這種控制方式是靠控制開關(guān)的通斷使之亮滅,同家庭里的燈是一樣一樣的,單片機(jī)的出現(xiàn)開啟了電子設(shè)備智能時代,換一種方式,用單片機(jī)去控制led燈的亮滅,而單片機(jī)靠執(zhí)行程序去輸出想要的結(jié)果,真真正正地把人的思想實(shí)現(xiàn)出來。
單片機(jī)是數(shù)字電路,輸出/輸入只有高電平1和低電平0之分,通常0~0.4v的電壓范圍定義為低電平,大于2v定義為高電平,如圖是單片機(jī)控制led燈的電路圖。
ps:由于是仿真,這里偷懶了,圖中省略了時鐘電路,電源電路和復(fù)位電路
將led燈的負(fù)極連接到單片機(jī)p1.0口,正極串口電阻r1到+5v,這樣原理相同的,單片機(jī)輸出低電平0,使得led和電阻通路的兩端產(chǎn)生電勢差,相當(dāng)于上面圖中的“5v電源”,從而滿足led燈的參數(shù),點(diǎn)亮led燈;而當(dāng)單片機(jī)p1.0口輸出高電平時,電勢差約為0,不滿足led燈亮的要求,此時led燈熄滅,要達(dá)到這樣的效果,必須將“想法”裝給單片機(jī),這時程序閃亮登場。
程序編寫:用keil新建一個c語言程序工程,代碼如下:
運(yùn)行仿真,可以看到led燈亮了,具體步驟不多說,網(wǎng)上一大堆
可是,這樣好嗎?嗯,實(shí)驗(yàn)到這步,流程基本走通了,然而這樣的程序并沒多大意義,當(dāng)我們需要點(diǎn)亮多顆燈時,需要shit led1 = 。.. sbit led2 = 。.. 然后再賦值,也許你會說:“簡單,同時端口賦值嘛, 如 p1 = 0x6d 完事兒” ,但是,這幾顆燈要是都不在一個端口呢?這時還是得一個個端口去定義,去賦值?這樣好嗎?可能不好,下面的程序案例,將點(diǎn)亮led燈封裝在一個函數(shù)里,這個函數(shù)僅實(shí)現(xiàn)點(diǎn)亮led燈的邏輯功能,使用時根據(jù)硬件連接設(shè)置函數(shù)參數(shù)即可,希望起到拋磚引玉的效果。
運(yùn)行結(jié)果為p1^2和p1^7輸出低電平,led燈點(diǎn)亮。