新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)教程之基礎(chǔ)編(基于C語(yǔ)言)

51單片機(jī)教程之基礎(chǔ)編(基于C語(yǔ)言)

作者: 時(shí)間:2016-12-01 來(lái)源:網(wǎng)絡(luò) 收藏
大家好,我是陳濱,本人是去年9月份開(kāi)始學(xué)單片機(jī),到現(xiàn)在一年多了,現(xiàn)在本人基本掌握了單片機(jī)編程,開(kāi)始深入學(xué)習(xí)匯編語(yǔ)言了。很多初學(xué)者有很多的疑惑,我究竟是先學(xué)C語(yǔ)言,還是匯編語(yǔ)言?其實(shí)我告訴你,本人認(rèn)為,先學(xué)C語(yǔ)言!為什么呢?C語(yǔ)言是目前使用最廣泛的中級(jí)語(yǔ)言,就連現(xiàn)在的windows7也是C語(yǔ)言編寫(xiě)的,C語(yǔ)言易讀性好,無(wú)需對(duì)單片機(jī)內(nèi)部結(jié)構(gòu)十分熟悉即會(huì)編程,可移植性高,便于維護(hù)。C語(yǔ)言只有32個(gè)關(guān)鍵字,9種控制語(yǔ)句,而且編譯器提供了很多函數(shù)庫(kù),使用十分方便。而匯編語(yǔ)言達(dá)100多條指令,每條指令對(duì)應(yīng)一個(gè)機(jī)器碼,跟單片機(jī)內(nèi)部結(jié)構(gòu)息息相關(guān),而且不提供庫(kù)函數(shù),每種東西都要自己寫(xiě)。匯編語(yǔ)言最致命的地方是它不同硬件幾乎不可移植,維護(hù)麻煩。但是讀者又有疑問(wèn)了,既然C語(yǔ)言這么多優(yōu)點(diǎn),干嘛還要學(xué)匯編語(yǔ)言?雖然C語(yǔ)言易諸多優(yōu)點(diǎn),但是它也是有缺點(diǎn)的,就是代碼執(zhí)行效率不高,占用CPU資源高,這個(gè)就是中高級(jí)語(yǔ)言的缺點(diǎn),目前最流行的安卓系統(tǒng)就是用高級(jí)語(yǔ)言編寫(xiě)的,據(jù)說(shuō)是Java,具體本人沒(méi)去研究,大家都知道安卓CPU主頻沒(méi)有800M以上想流暢運(yùn)行是不太可能的就好,哈哈...匯編語(yǔ)言是在機(jī)器語(yǔ)言的基礎(chǔ)上發(fā)展起來(lái)的,每一條代碼對(duì)應(yīng)一個(gè)機(jī)器碼,所以執(zhí)行效率很高,就連windows底層的東西都是匯編寫(xiě)的,C語(yǔ)言難以達(dá)到要求。當(dāng)然隨著編譯器的改進(jìn),C語(yǔ)言執(zhí)行效率已經(jīng)接近匯編,但是想真正成為單片機(jī)高手的話,那么我告訴你,精通匯編是必須的!因?yàn)閰R編語(yǔ)言是直接操作單片機(jī)內(nèi)部硬件的,如果你精通匯編,那么意味著你對(duì)單片機(jī)十分熟悉,就能編出十分高效的程序。所以先學(xué)C語(yǔ)言能快速入門(mén),再學(xué)匯編就能精通單片機(jī)。

OK!說(shuō)了這么多,你會(huì)問(wèn):學(xué)習(xí)單片機(jī)能有什么錢(qián)途?嗯!學(xué)東西無(wú)非就是想賺錢(qián),現(xiàn)在說(shuō)學(xué)東西是業(yè)余愛(ài)好的話只有有錢(qián)人在說(shuō),誰(shuí)敢說(shuō)學(xué)手藝不是為了吃飯?你?你?還是你?呵呵...目前這個(gè)世界上單片機(jī)無(wú)所不在,洗衣機(jī),電視機(jī),電冰箱等等...都有單片機(jī)的身影,單片機(jī)就是單片微型計(jì)算機(jī)的簡(jiǎn)稱,最早由英特爾公司發(fā)明,沒(méi)錯(cuò)!就是大名鼎鼎的英特爾!哎!又一中國(guó)人的遺憾!電子技術(shù)什么東西才是我們中國(guó)的專利??!說(shuō)到計(jì)算機(jī),咦?名字很熟悉?這個(gè)計(jì)算機(jī)可不是我們用的計(jì)算器啊,而是指電腦!什么?你說(shuō)單片機(jī)是一個(gè)電腦?對(duì)!沒(méi)錯(cuò),單片機(jī)就是一個(gè)微型電腦。一個(gè)電腦的基本組成是這樣的:輸入系統(tǒng)(鍵盤(pán))、輸出系統(tǒng)(顯示器)、計(jì)算系統(tǒng)(主機(jī)),你看你家的電腦是不是這樣?其實(shí)主機(jī)還包含了運(yùn)算系統(tǒng)(CPU)、程序存儲(chǔ)器(硬盤(pán))、數(shù)據(jù)存儲(chǔ)器(內(nèi)存),拆開(kāi)你的電腦主機(jī),是不是也是這樣?我們用的單片機(jī)其實(shí)除了輸入輸出系統(tǒng),已經(jīng)包含了其它東西,所以就微型計(jì)算機(jī),英文叫MCU,又叫微處理器。早期的單片機(jī)是英特爾的4004單片機(jī),是4位的,由于功能太弱了,早已經(jīng)淘汰,本人就不羅嗦了?,F(xiàn)在我們用的單片機(jī)就51系列單片機(jī),是英特爾最經(jīng)典最成功的發(fā)明,由于51單片機(jī)價(jià)格便宜,功能齊全,到現(xiàn)在10幾年歷史,依然火爆,估計(jì)未來(lái)10年,51單片機(jī)不會(huì)淘汰,所以51單片機(jī)對(duì)初學(xué)者很合適。目前一個(gè)單片機(jī)工程師工資都在5000左右,視你的能力吧,上萬(wàn)的都有。單片機(jī)應(yīng)用小到手機(jī),大到火箭,都需要用到。只不過(guò)功能強(qiáng)弱不同,價(jià)格也不同,從幾塊錢(qián)到100多塊錢(qián)。你說(shuō)火箭的單片機(jī)要多少錢(qián)?我想最多100多塊!什么?是不是真的?我想是!既然單片機(jī)這么厲害,為什么這么便宜?主要是現(xiàn)在技術(shù)成熟,產(chǎn)量大,目前世界上很多公司都在生產(chǎn)51核心的單片機(jī),國(guó)內(nèi)的話就有STC公司。

本文引用地址:http://butianyuan.cn/article/201612/324318.htm

好了,那么學(xué)單片機(jī)該如何入手呢?俗話說(shuō),小錢(qián)不出,大錢(qián)不入,當(dāng)然是要先花點(diǎn)錢(qián)買(mǎi)設(shè)備了,放心,不貴,200多塊左右,不要告訴我你連200多塊的錢(qián)都沒(méi)有?現(xiàn)在淘寶上有很多開(kāi)發(fā)板,而且還送教程,價(jià)格都在200塊左右。開(kāi)發(fā)板就是用來(lái)學(xué)習(xí)單片機(jī)的,雖然現(xiàn)在有很多仿真軟件,但是跟實(shí)際應(yīng)用還是有區(qū)別的。本人就有這樣的經(jīng)歷,自己寫(xiě)了個(gè)程序,在仿真軟件始終無(wú)法正常運(yùn)行,但是到了實(shí)際電路運(yùn)行很正常,所以開(kāi)發(fā)板不能省。學(xué)習(xí)單片機(jī)最主要是多學(xué)習(xí)多實(shí)踐,多在論壇上逛,遇到問(wèn)題要自己研究,實(shí)在不行可以網(wǎng)上發(fā)帖問(wèn)問(wèn)。買(mǎi)了開(kāi)發(fā)板,首先你得先學(xué)習(xí)C語(yǔ)言,C語(yǔ)言最重要就是關(guān)鍵字,語(yǔ)法。目前最常用的51編譯器就是KEIL了,這個(gè)大家可以去網(wǎng)下載,現(xiàn)在都是破解版的了。單片機(jī)大家可以買(mǎi)ATMEL的單片機(jī),這個(gè)是最常用的了,就買(mǎi)AT89S52這個(gè)吧,注意S的支持ISP編程,而C的不支持。什么是ISP呢?ISP就是在線編程的意思,就是無(wú)需拔下芯片就能寫(xiě)程序,這個(gè)對(duì)我們學(xué)習(xí)是很方便的。

現(xiàn)在網(wǎng)上很多教程有一些都是誤人子弟,有不少錯(cuò)誤,本人總結(jié)了很多經(jīng)驗(yàn),因?yàn)樵诖酥氨救藢?duì)單片機(jī)也是小白一個(gè),所以很會(huì)理解初學(xué)者的心里。下載了KEIL,買(mǎi)了單片機(jī)開(kāi)發(fā)板和單片機(jī),下面我們就來(lái)開(kāi)始單片機(jī)學(xué)習(xí)之旅吧,先來(lái)看出自單片機(jī)教程網(wǎng)www.51hei.com第4課的一個(gè)閃爍燈的小程序(他文章中主要從匯編的角度詳解了閃爍燈的工作原理,我對(duì)此進(jìn)行了C語(yǔ)言方面的詳解算是對(duì)第4課的補(bǔ)全.):
#include //頭文件
#define uchar unsigned char //宏定義
sbit LED=P1^0; //定義引腳
void delay() //延時(shí)函數(shù)
{
uchar a,b;
for(a=200;a>0;a--)
for(b=200;b>0;b--);
}
void main() //主函數(shù)
{
while(1)
{
LED=0; //點(diǎn)亮LED
delay(); //延時(shí)
LED=1; //熄滅LED
delay(); //延時(shí)
}
}

在這里我先說(shuō)明一個(gè)問(wèn)題,關(guān)于KEIL的使用網(wǎng)上有很多教程,由于時(shí)間關(guān)系這里我就不說(shuō)了。上面是一個(gè)LED閃爍的小程序,初學(xué)者往往連這個(gè)也看不懂,好像在看天書(shū),別急!本人剛開(kāi)始也是!我一個(gè)個(gè)說(shuō)明。第一個(gè),就是頭文件,什么是頭文件呢?就是編譯器里面的一個(gè)庫(kù),里面定義了單片機(jī)的一些寄存器,寫(xiě)了這個(gè)頭文件,編譯器就知道你使用的是52單片機(jī),以下的操作它就認(rèn)識(shí)了,否則編譯會(huì)報(bào)錯(cuò)!第二個(gè),宏定義,就是自己定義的新名字,上面的操作就是告訴編譯器,以后遇到uchar就是unsigned char了,便于書(shū)寫(xiě),節(jié)省時(shí)間。第三個(gè),就是定義單片機(jī)的引腳,如果我的LED接在P1.0這個(gè)引腳上,就這樣定義了,以此類推。好了,開(kāi)始說(shuō)函數(shù),有人說(shuō)編程要大學(xué)生才可以,NO!NO!NO!就拿我來(lái)說(shuō),我才初中畢業(yè)呢!不過(guò)話說(shuō)回來(lái),你的英語(yǔ)必須有30分以上,代數(shù)在60分以上才可以,否則吃力!呵呵....因?yàn)镃語(yǔ)言運(yùn)用到了計(jì)算,單詞等初中知識(shí)。這個(gè)是一個(gè)延時(shí)函數(shù),因?yàn)閱纹瑱C(jī)運(yùn)行速度很快,如果不延時(shí),LED閃爍就十分快,我們是分辨不出來(lái)的。那么這個(gè)是怎么延時(shí)的呢?首先我們定義了兩個(gè)變量a、b,然后a先賦值200,for這個(gè)是32個(gè)關(guān)鍵字其中一個(gè),是一個(gè)循環(huán)語(yǔ)句,首先執(zhí)行a=200,接著判斷a是否大于0,如果不是,則執(zhí)行a--,就是a-1,直到a=0,這個(gè)語(yǔ)句執(zhí)行了200次,同樣下面的語(yǔ)句也是,這兩個(gè)語(yǔ)句這樣寫(xiě)起到了嵌套作用,就是上面執(zhí)行完了執(zhí)行下面,這樣就執(zhí)行了200*200=40000次。為什么要這樣呢?就是為了延時(shí)!其實(shí)這個(gè)程序就是讓CPU在那里執(zhí)行空操作浪費(fèi)時(shí)間來(lái)達(dá)到延時(shí)目的。下面的函數(shù)叫主函數(shù),C語(yǔ)言每一個(gè)程序都有且只有一個(gè)主函數(shù)main,程序都是從主函數(shù)開(kāi)始執(zhí)行,上面的延時(shí)函數(shù)叫子函數(shù),也叫子程序,主函數(shù)可以調(diào)用子函數(shù),反過(guò)來(lái)子函數(shù)是不可以調(diào)用主函數(shù)的。前面大家都注意到有一個(gè)void ,void在英文的意思是空,意思這個(gè)函數(shù)不帶返回值,至于什么是返回值,以后再說(shuō)。在函數(shù)的后面還有一個(gè)小括號(hào),這個(gè)里面也是有一個(gè)void的,只是省略了,那這個(gè)是什么作用呢?這個(gè)就是函數(shù)的參數(shù),什么參數(shù)?也是以后再說(shuō)!程序從主函數(shù)開(kāi)始,進(jìn)入了while(1)這個(gè)函數(shù)體,每個(gè)函數(shù)體都要有一個(gè)大括號(hào)來(lái)包括,while的意思是如果括號(hào)里面的條件為真即為1,就執(zhí)行里面的程序,否則退出,所以也是一個(gè)循環(huán)函數(shù),把里面寫(xiě)1就是這個(gè)while永遠(yuǎn)為真,永遠(yuǎn)執(zhí)行這個(gè)函數(shù),這樣做的目的就 是讓程序不斷執(zhí)行下去,這樣LED就不斷閃爍了。到了LED=0時(shí),意思是把單片機(jī)P1.0這個(gè)引腳置為低電平,LED正極是接電源的,負(fù)極接P1.0,這樣LED就亮了。接著,延時(shí),到這里單片機(jī)執(zhí)行延時(shí)函數(shù),緊接著LED=1,意思P1.0置為高電平,這個(gè)時(shí)候LED就滅了,然后又是延時(shí),再點(diǎn)亮,周而復(fù)始,LED就閃爍了。閃爍的頻率由延時(shí)函數(shù)決定,當(dāng)然你可以再寫(xiě)個(gè)for,這個(gè)LED閃爍就更慢了。

看了這個(gè)小程序,你有什么感覺(jué)?實(shí)際上設(shè)備上的程序比這個(gè)可是復(fù)雜多了,要學(xué)的東西太多了。好了,先到這里,我會(huì)慢慢教大家繼續(xù)深入單片機(jī)編程,大家有什么要交流可以加本人QQ.只要我有時(shí)間,絕對(duì)做出回答。



評(píng)論


技術(shù)專區(qū)

關(guān)閉