51單片機(jī)編程開發(fā)(三)之第一個(gè)例程

這篇內(nèi)容的是51單片機(jī)點(diǎn)燈實(shí)驗(yàn)視頻教程的文字版說明,看完視頻還有疑惑朋友不妨再參考一下這篇文章。
51單片機(jī)最小系統(tǒng)
今天我們開始進(jìn)行51單片機(jī)編程學(xué)習(xí),首先我們要了解一下單片機(jī)工作需要的基本條件。前面的內(nèi)容中我們知道了51單片機(jī)的引腳有電源引腳,時(shí)鐘引腳,控制引腳,以及通用輸入輸出端口。那要怎樣才能讓單片機(jī)工作呢?
如果將單片機(jī)與人類比,那它的電源就像人的心臟;時(shí)鐘信號(hào)就像人的脈搏;控制引腳就如人的五官;通用端口就如人的四肢;芯片內(nèi)部的控制邏輯就如我們的神經(jīng)系統(tǒng)。這么說的話我們就很容易確定單片機(jī)的最小系統(tǒng)了吧。首先我們需要給單片機(jī)供電,再給他提供時(shí)鐘,然后配置它的控制電路,最后給它的引腳接上一些外部電路,據(jù)此我們就可以繪制出下圖這個(gè)最小系統(tǒng)電路了。

例程實(shí)圖
以上最小系統(tǒng)電路圖中使用的是89C51單片機(jī),因?yàn)樗墓δ軟]有現(xiàn)在市場(chǎng)上具有更多拓展功能的增強(qiáng)版單片機(jī)那么多,我們就以C52單片機(jī)來(lái)進(jìn)行實(shí)驗(yàn)。考慮到接下來(lái)我們需要講解一些程序延伸內(nèi)容,因此額外又添加了幾個(gè)LED電路。

說到新版的增強(qiáng)版51系單片機(jī)就再講個(gè)題外話,現(xiàn)在的生產(chǎn)51內(nèi)核單片機(jī)的芯片制造商已經(jīng)在原來(lái)的基礎(chǔ)上開發(fā)出了其他豐富的功能,比如STC 有1T 型的51單片機(jī),甚至還有了32位內(nèi)核的51單片機(jī),它們的內(nèi)核時(shí)鐘提升到了最高72MHz,其他方面RAM,FLASH,電壓參數(shù)等等。這些單片機(jī)各種功能,外設(shè)相對(duì)傳統(tǒng)51單片機(jī)更豐富,我工作中沒用過這些芯片,所以具體效果怎么樣不清楚,如果有使用過的朋友可以在文后談?wù)勈褂酶惺?。接下?lái)我們還是繼續(xù)講解今天的知識(shí)點(diǎn)。
點(diǎn)亮一個(gè)燈的程序
我們先來(lái)看看這個(gè)最簡(jiǎn)單的例程之后我在具體解釋程序功能:
#include <reg52.h>?
sbit led1 = P1^0;?
void main()?
{
//以下代碼最好在死循環(huán)(以后會(huì)做說明)中執(zhí)行!這里只做演示用
led1 = 0;?
}
可以看到程序內(nèi)容是不是非常簡(jiǎn)單?就這么幾行代碼即可。
#include <reg52.h> 這是單片機(jī)開發(fā)必須包含的頭文件,它是KEIL公司自己編寫的文件,里面包含對(duì)單片機(jī)特殊功能寄存器地址聲明以及部分寄存器位的聲明,搞不清楚的朋友可以打開該文件看一下。

以后的工作或?qū)W習(xí)過程中我們碰到的其他單片機(jī)在對(duì)其進(jìn)行程序開發(fā)時(shí)都需要調(diào)用編譯器平臺(tái)對(duì)單片機(jī)基礎(chǔ)聲明的頭文件。即現(xiàn)在我們使用keil編譯器就使用他們提供的頭文件,如果我們使用其他編譯器平臺(tái),如IAR,則調(diào)用它們平臺(tái)提供的頭文件,不同平臺(tái)編寫的頭文件是不一樣的,使用這些頭文件是保障程序功能正常的前提。
sbit led1 = P1^0; 這一句程序是使用單片機(jī)的位操作異或運(yùn)算對(duì)單片機(jī)P1端口寄存器第一位進(jìn)行聲明,把它定義為一個(gè)叫l(wèi)ed1的變量。如果是設(shè)置其他引腳也是以此類推。

void main() 就是我們之前說的主函數(shù),注意不要寫錯(cuò)了喲,否則你就不會(huì)得到想要的效果。
最后這句主函數(shù)中的內(nèi)容led1 = 0; 就是我們需要的實(shí)現(xiàn)點(diǎn)燈的代碼,它就是將剛剛聲明的變量led1,即P1端口寄存器的第一位寫入0,意思就是然他輸出低電平。為什么這樣就達(dá)到目的了呢?因?yàn)槲覀冊(cè)韴D中二極管的陰極接的是單片機(jī),陽(yáng)極接的是電源,所以要使LED發(fā)光,它陰極就必須是低電平,所以我們把對(duì)應(yīng)的單片機(jī)引腳輸出低電平他就可以點(diǎn)亮了。如果要把它熄滅那將他改成led1 = 1; 即對(duì)應(yīng)的寄存器位被置位了,該引腳就會(huì)輸出高電平,這時(shí)燈自然就滅了。
整個(gè)控制過程代碼就講解完了,是不是非常簡(jiǎn)單,很容易就能接受吧?如果還有問題的話自己一定要?jiǎng)邮侄嘣囋?,或者看看視頻內(nèi)容。
點(diǎn)亮一排燈
有了以上的基礎(chǔ)講解,可能有人就會(huì)問,如果要點(diǎn)亮一排燈呢?
是不是馬上就有辦法了,直接把前面的內(nèi)容都重復(fù)一遍,想點(diǎn)亮哪個(gè)就控制哪個(gè)就行了。
#include <reg52.h>?
sbit led1 = P1^0;?
sbit led2 = P1^1;
sbit led3 = P1^2;
sbit led4 = P1^3;
sbit led5 = P1^4;
sbit led6 = P1^5;
sbit led7 = P1^6;
sbit led8 = P1^7;
void main() ?
{
led1 = 0;?
led2 = 0;
led3 = 0;
led4 = 0;
led5 = 0;
led6 = 0;
led7 = 0;
led8 = 0;
}
這么看程序確實(shí)都很簡(jiǎn)單,但就是有點(diǎn)怪怪的吧,差不多的代碼非要寫那么多,即使復(fù)制,粘貼,修改起來(lái)也麻煩呀。有沒有更好的辦法呢,少寫幾行也行呀。辦法當(dāng)然是有的,只是理解起來(lái)就相對(duì)上面的難一點(diǎn)。
我們都知道P0~P3這4個(gè)端口寄存器本來(lái)在reg52.h這個(gè)頭文件中是定義好的呀,它本來(lái)就可以當(dāng)做一個(gè)整體使用的吧。初學(xué)者可能不好理解這個(gè)意思,詳細(xì)說明就是P0~P3這4個(gè)端口寄存器都是8位寄存器,每個(gè)剛好是一個(gè)字節(jié),每個(gè)字節(jié)上的0~7位也一一對(duì)應(yīng)每組端口上的0~7位引腳,這也是我們上面使用異或運(yùn)算來(lái)定義led1~led8這些變量的初衷吧。那當(dāng)我們使用多個(gè)引腳時(shí),我們也可以直接對(duì)這個(gè)寄存器進(jìn)行賦值的吧比如我們編寫代碼P1 = 0xf0;這樣就可以對(duì)寄存器的所有位進(jìn)行輸出賦值了吧,上面代碼中將0xf0由十六進(jìn)制轉(zhuǎn)化為二進(jìn)制就是11110000B對(duì)應(yīng)的就是將P1寄存器中高四位賦值1,低四位賦值0,那么此時(shí)P1端口信息就是P1.0~P1.3輸出低電平,對(duì)應(yīng)的LED燈亮,P1.4~P1.7引腳輸出高電平,對(duì)應(yīng)的LED不亮。
這時(shí)我們輸入如下代碼:
#include <reg52.h>?
void main() ?
{
????P1 = 0x00;
}
執(zhí)行這段程序我們就可以點(diǎn)亮所有LED了吧。代碼量瞬間少了很多了吧,是不是看起來(lái)更順眼了
當(dāng)然如果修改一下:P1 = 0xff;就是熄滅所有燈吧
如果修改成P1 = 1;那會(huì)變成什么結(jié)果呢?1是不是就是0x01這么轉(zhuǎn)換就明白什么意思了吧,它對(duì)應(yīng)的就是除P1.0外其他引腳對(duì)應(yīng)的LED都點(diǎn)亮。其他情況當(dāng)然也可以以此類推。后面我們的例程中會(huì)經(jīng)常這樣操作寄存器,并且還會(huì)涉及更多的編程技能。
思考:
P1 &= 0xf2;
P1 |= 0x23;
P1 ^= 0x8;
這幾句是什么意思呢?
前面內(nèi)容看懂的朋友這幾句應(yīng)該能夠看懂是什么意思吧。
下一節(jié)內(nèi)容我們?cè)倬唧w分析。
小結(jié)
以上內(nèi)容就是初學(xué)者入門不可不學(xué)的點(diǎn)燈實(shí)驗(yàn)例程,通過前面的仿真視頻相信很多朋友都能看的明白了,單片機(jī)開發(fā)也就是這么回事。現(xiàn)在回顧一下是否發(fā)現(xiàn)之前講的基礎(chǔ)內(nèi)容其實(shí)都是在講解編程思維?學(xué)技術(shù)和說話一樣,都是掌握基礎(chǔ)邏輯原理了后面就是順理成章了吧,所以不管怎樣一定要打好底層基礎(chǔ),基礎(chǔ)不好,蓋樓不穩(wěn),基礎(chǔ)夯實(shí),才是高樓的保障。學(xué)英語(yǔ)最快的辦法是到說英語(yǔ)的國(guó)家去生活一段時(shí)間,學(xué)編程也是一樣,自己要用計(jì)算機(jī)的思維和它交流你才能學(xué)得快。最后還是祝愿每位初學(xué)者早日學(xué)成,如有疑問歡迎一起交流探討。