新聞中心

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

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

作者: 時間:2016-11-20 來源:網絡 收藏
51單片機在我的理解上來說,就是遵循51指令集工作的芯片。他就像一臺超微型的電腦,里面有內存、硬盤、CPU等基本配備。

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

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

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

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

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

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

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

然后啟動 Keil,注冊完成后,開始寫第一個項目

先在“工程”菜單選擇“新建工程”,這時會彈出一個窗口,讓你選擇你的工程保存的位置

然后你可以按照你的需求定義你要保存的工程名稱,然后點擊保存,跟著會提示你選擇單片機的型號

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

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

然后再點擊“保存”保存新建的文件為你的主程序

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

雙擊 “Source Group 1”的目錄圖標,會彈出插入文件的窗口,然后選擇你的文件,點擊"Add"按鈕

這時你可以看到下面的工程樹中已經添加了你的文件,因為可以連續(xù)添加文件,所以必須手工關閉該窗口,我們點擊“Close”按鈕

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

我們對著“Target 1”點擊鼠標右鍵,選擇第一項“Options for Target Target 1”

然后回彈出設置窗口

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

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

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

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

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

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

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

通常有4組IO口,P0、P1、P2、P3口,每組IO口有8個管腳,分別代表8個二進制位,而每組IO口除了作基本的輸入輸出外都有可能有他特殊的用法,這就根據(jù)不同型號的單片機而定了。就比如STC的這款單片機,P0口除了可以做基本的輸入輸出,還可以做A/D轉換用,所以他的P0口后面還標有 AD0-AD7 的字樣,但這些是后面的應用了,我們先談談如何控制或讀取這些IO口。

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

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

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

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

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

sbitLED1= P0^5; //在這里 ^ 并不是異或運算符,只是特定的尋址符號

這時,程序里如果這樣操作

LED1 = 1;

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

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

bit LEDState;

LEDState = LED1;



評論


技術專區(qū)

關閉