新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)程序開發(fā)入門知識(shí)

51單片機(jī)程序開發(fā)入門知識(shí)

作者: 時(shí)間:2016-11-20 來源:網(wǎng)絡(luò) 收藏
51單片機(jī)在我的理解上來說,就是遵循51指令集工作的芯片。他就像一臺(tái)超微型的電腦,里面有內(nèi)存、硬盤、CPU等基本配備。

而他所謂的CPU使用的就是51指令集,他的硬盤就是內(nèi)置的Flash,他的內(nèi)存也是內(nèi)置的RAM和擴(kuò)展RAM。不過這些基本配備是小了一點(diǎn)而已。

本文引用地址:http://butianyuan.cn/article/201611/318638.htm

在網(wǎng)上,我們??吹揭恍┙榻B什么AT89C51或AT89C52等51的單片機(jī)的范例,對(duì)于一些初學(xué)者來說可能就會(huì)認(rèn)為只有AT89C51或AT89C52才是51單片機(jī),當(dāng)你給他個(gè)STC89S52他都不敢用,認(rèn)為可能不對(duì)(我剛開始學(xué)的時(shí)候就碰到這種情況,)。其實(shí)不是這樣的,只要芯片內(nèi)部使用的是51指令集,那么它就可以認(rèn)為是51單片機(jī),就可以用51單片機(jī)的開發(fā)方式進(jìn)行開發(fā)代碼。他們之間的區(qū)別就是開發(fā)芯片的廠商不同,CPU支持頻率不同,F(xiàn)lash大小、RAM大小、串口接口、中斷數(shù)量、燒寫程序的接口等等稍微有些不同而已。這么看吧,就算同一個(gè)型號(hào)的51單片機(jī),比如 STC89C51和STC89S52的基本區(qū)別就是Flash大小,89C51的Flash大小是4kB,而89S52是8kB,而STC12C5A08S2和STC89S52的區(qū)別:他們的Flash大小都是8KB,但12C5A08S2有兩個(gè)串口處理,而89S52只有一個(gè)串口處理,12C5A08S2有1kB的擴(kuò)展RAM,而89S52卻沒有,只有128個(gè)子節(jié)的RAM,而這128個(gè)字節(jié)的RAM12C5A08S2也有,但定時(shí)器中斷12C5A08S2只有2個(gè),而89S52卻有3個(gè)。他們之間的區(qū)別就是如此,AT的和STC的也就是類似的不同而已,AT的是使用SPI接口燒寫程序,而STC的是用串口接口燒寫程序,其他的大致就參考芯片的PDF文件,里面有各種型號(hào)的各種參數(shù)說明,根據(jù)你的需求選購不同的芯片型號(hào),就像選電腦一樣,根據(jù)配置單選擇你適合的單片機(jī)。當(dāng)然,功能越強(qiáng),價(jià)格也就越貴,就比如CC2430,他是帶無線串口接口的一塊51單片機(jī),但價(jià)格就不是和普通51單片機(jī)一個(gè)檔次的東西了。當(dāng)然在51單片機(jī)以外,還有很多其他標(biāo)準(zhǔn)的單片機(jī),比如AT的AVR單片機(jī),型號(hào)有AT Mega 16、Mega 32等等等等,有16位的,還有32位的(我們的51通常是8 位的)。還有DSP、ARM等等等等。他們都有自己的指令集,自己的標(biāo)準(zhǔn),當(dāng)然,速度和各方面的參數(shù)都有著很多不同的地方,每一塊的水都很深。就比如說ARM,現(xiàn)在很多的掌上電腦、MP4、MP5、手機(jī)都是用它弄的,ARM9還可以直接上操作系統(tǒng)。至于這一塊,屬于嵌入式開發(fā)了,我也就不多說了,還是說回51單片機(jī)。

在51單片機(jī)開發(fā)上,要涉及到程序的開發(fā)。簡(jiǎn)單的理解就是你寫一個(gè)程序來控制單片機(jī)的管腳供電出去或是不供電出去,或是讀取某個(gè)管腳是否有電或沒電的事情,這些管腳我們管他叫I/O口(即:輸入/輸出口),根據(jù)不同的應(yīng)用設(shè)計(jì)出不同的外圍電路就可以控制或采集外圍的很多東西了(當(dāng)然也可以進(jìn)行通訊)。如果與PC通訊,還可將采集到的信息反饋給PC或按照PC發(fā)過來的信息執(zhí)行指定的任務(wù)。

下面我們來看一下如何開始51單片機(jī)的程序開發(fā)

通常的單片機(jī)程序開發(fā)方式有兩種:1、使用匯編語言進(jìn)行開發(fā) 2、使用C語言進(jìn)行開發(fā)

本人對(duì)匯編不熟,也就不多說了,說說C語言吧。先去下載個(gè) Keil 8 回來,安裝到你的電腦。這就是一個(gè)51單片機(jī)程序開發(fā)工具。

然后啟動(dòng) Keil,注冊(cè)完成后,開始寫第一個(gè)項(xiàng)目

先在“工程”菜單選擇“新建工程”,這時(shí)會(huì)彈出一個(gè)窗口,讓你選擇你的工程保存的位置

然后你可以按照你的需求定義你要保存的工程名稱,然后點(diǎn)擊保存,跟著會(huì)提示你選擇單片機(jī)的型號(hào)

我們選擇Atmel 的89C52就可以了,然后系統(tǒng)還會(huì)提示你,選擇否就可以了。新建完工程后如下圖:

這時(shí)我們可以看到工程中什么文件都沒有,那么下一步就是添加基本的文件了,我們點(diǎn)擊“文件”菜單的“新建”項(xiàng)

然后再點(diǎn)擊“保存”保存新建的文件為你的主程序

我這里保存的是Main.C,但這時(shí)在左邊的工程文件樹中還是找不到Main.c這個(gè)文件的,所以必須將這個(gè)文件插入工程樹中。

雙擊 “Source Group 1”的目錄圖標(biāo),會(huì)彈出插入文件的窗口,然后選擇你的文件,點(diǎn)擊"Add"按鈕

這時(shí)你可以看到下面的工程樹中已經(jīng)添加了你的文件,因?yàn)榭梢赃B續(xù)添加文件,所以必須手工關(guān)閉該窗口,我們點(diǎn)擊“Close”按鈕

這時(shí)我們看到工程中已經(jīng)有剛才新建的 Main.c 文件了,然后我們稍微設(shè)置一下環(huán)境,不然編譯不出目標(biāo)文件。

我們對(duì)著“Target 1”點(diǎn)擊鼠標(biāo)右鍵,選擇第一項(xiàng)“Options for Target Target 1”

然后回彈出設(shè)置窗口

我們將選擇卡選到“輸出”

我們把“創(chuàng)建 HEX 文件”選項(xiàng)選擇起來

然后點(diǎn)擊確定按鈕,回到了主界面,這樣我們的前期步驟就作完了

現(xiàn)在我們開始說說程序部分,在下位機(jī)的開發(fā)當(dāng)中,我們使用的是C語言(不是C++,沒有類的概念),我們可用的資源也很少,除了基本的C語言語句以外,還可以使用的東西并不多,全部可用的東西全在Keil安裝目錄的 /C51/INC 里。

我這里面多了一個(gè) STC12C5A60S2.H 文件,這時(shí)STC官網(wǎng)上提供的管腳和寄存器地址定義文件,通常我們只需要引用 REG52.H 就可以了。在C語言開發(fā)中,用 #Include 就是引用這些頭文件,第一步,我們先引用MCU管腳定義文件REG52.H,然后再寫上基本的程序入口函數(shù)Main,因?yàn)閱纹瑱C(jī)只跑這么一個(gè)程序,所以主程序中不能讓他執(zhí)行完,必須進(jìn)入死循環(huán),否則,如果執(zhí)行完了程序他就不會(huì)再工作了。

好了這樣就完成了一個(gè)基本的單片機(jī)程序。但是如何控制單片機(jī)的IO口呢?我們先來看一下芯片說明里的管腳定義圖:

這是STC DIP40 封裝的管腳定義圖,我們可以看到一些比較奇怪的說明,什么P0.0-P0.7呀、P1.0-P1.7呀的,這些就是IO端口

通常有4組IO口,P0、P1、P2、P3口,每組IO口有8個(gè)管腳,分別代表8個(gè)二進(jìn)制位,而每組IO口除了作基本的輸入輸出外都有可能有他特殊的用法,這就根據(jù)不同型號(hào)的單片機(jī)而定了。就比如STC的這款單片機(jī),P0口除了可以做基本的輸入輸出,還可以做A/D轉(zhuǎn)換用,所以他的P0口后面還標(biāo)有 AD0-AD7 的字樣,但這些是后面的應(yīng)用了,我們先談?wù)勅绾慰刂苹蜃x取這些IO口。

在單片機(jī)種,這些IO口的管腳都是由廠家指定的系統(tǒng)功能寄存器控制的,只要知道地址,讀取到指定寄存器地址的值就可以得到相對(duì)的IO口狀態(tài),同理,設(shè)置相應(yīng)的寄存器值,也會(huì)改變IO口的狀態(tài)。因?yàn)槲覀兪怯肅語言,沒必要直接用地址,我們可以將如0x80 這種地址以方便記憶的變量來表示,所以,我們看一下 REG52.H 就會(huì)發(fā)現(xiàn)

sfr P0 = 0x80;
sfr P1 = 0x90;
sfr P2 = 0xA0;
sfr P3 = 0xB0;

P0口的地址是 0x80 這個(gè)位置,P1口的地址是0x90。我們只需要在程序里用P0 = 255,或 P0=0 就可以改變 P0 口的8個(gè)管腳的狀態(tài)是有電或是沒電出去。

但是,如果想單獨(dú)控制一個(gè)針腳的狀態(tài)怎么做呢?有些朋友可能會(huì)想到用二進(jìn)制位運(yùn)算就可以了,比如非呀、與亞、或呀、異或呀什么的。

對(duì),這是個(gè)方法,但不是很靈活,在這里,還可以進(jìn)行尋址定義管腳。比如我們只想控制 P0.5 口的狀態(tài),那么用二進(jìn)制計(jì)算的方法就有點(diǎn)麻煩了,我們可以這樣做

sbitLED1= P0^5; //在這里 ^ 并不是異或運(yùn)算符,只是特定的尋址符號(hào)

這時(shí),程序里如果這樣操作

LED1 = 1;

那么P0.5口將處于供電出去的狀態(tài)

當(dāng)然,這樣操作將會(huì)取得P0.5口的當(dāng)前狀態(tài)

bit LEDState;

LEDState = LED1;



評(píng)論


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

關(guān)閉