單片機(jī)C語言知識點(diǎn)全攻略(一)
為 test1.c,保存在項(xiàng)目所在的目錄中,這個(gè)時(shí)候您會發(fā)現(xiàn)程序單詞有了不一樣的顏色,說明 KEIL的C語言語法檢查生效了。如圖 1-6 鼠標(biāo)在屏幕左邊的 Source Group1 文件夾圖標(biāo)上右擊彈出 菜單,在這里能做在項(xiàng)目中增加減少文件等操作。選“Add File to Group ‘Source Group 1’” 彈出文件窗口,選擇剛剛保存的文件,按 ADD 按鈕,關(guān)閉文件窗,程序文件已加到項(xiàng)目中了。這個(gè)時(shí)候在 Source Group1 文件夾圖標(biāo)左邊出現(xiàn)了一個(gè)小+號說明,文件組中有了文件,點(diǎn)擊它能展開查看。
圖 1-6 把文件加入到項(xiàng)目文件組中
?。?)C程序文件已被加到了項(xiàng)目中了,下面就剩下編譯運(yùn)行了。這個(gè)項(xiàng)目只是用做學(xué) 習(xí)新建程序項(xiàng)目和編譯運(yùn)行仿真的基本方法,所以使用軟件默認(rèn)的編譯設(shè)置,它不會生成用 于芯片燒寫的 HEX 文件。先來看圖 1-7 吧,圖中 1、2、3 都是編譯按鈕,不一樣是 1 是用 于編譯單個(gè)文件。2 是編譯鏈接當(dāng)前項(xiàng)目,如果先前編譯過一次之后文件沒有做動編輯改動, 這個(gè)時(shí)候再點(diǎn)擊是不會再次重新編譯的。3 是重新編譯,每點(diǎn)擊一次均會再次編譯鏈接一次,不 管程序是否有改動。在 3 右邊的是停止編譯按鈕,只有點(diǎn)擊了前三個(gè)中的任一個(gè),停止按鈕 才會生效。5 是菜單中的它們。在 4 中能看到編譯的錯(cuò)誤信息和使用的系統(tǒng)資源情況等, 以后我們要查錯(cuò)就靠它了。6 是有一個(gè)小放大鏡的按鈕,這就是開啟關(guān)閉調(diào)試模式的按鈕, 它也存在于菜單 Debug-StartStop Debug Session,快捷鍵為 Ctrl+F5。
圖 1-7 編譯程序
?。?)進(jìn)入調(diào)試模式,軟件窗口樣式大致如圖 1-8 所示。圖中 1 為運(yùn)行,當(dāng)程序處于停止 狀態(tài)時(shí)才有效,2 為停止,程序處于運(yùn)行狀態(tài)時(shí)才有效。3 是復(fù)位,模擬芯片的復(fù)位,程序 回到最開頭處執(zhí)行。按 4 能打開 5 中的串行調(diào)試窗口,這個(gè)窗口能看到從 51 芯片的串 行口輸入輸出的字符,這里的第一個(gè)項(xiàng)目也正是在這里看運(yùn)行結(jié)果。這些在菜單中也有。首 先按 4 打開串行調(diào)試窗口,再按運(yùn)行鍵,這個(gè)時(shí)候就能看到串行調(diào)試窗口中不斷的打印“Hello World!”。最后要停止程序運(yùn)行回到文件編輯模式中,就要先按停止按鈕再按開啟關(guān)閉調(diào)試 模式按鈕。然后就能進(jìn)行關(guān)閉 KEIL 等相關(guān)操作了。
圖 1-8 調(diào)試運(yùn)行程序
第二課、C51HEX文件的生成和單片機(jī)最小系統(tǒng)
上一篇建立了第一個(gè)單片機(jī)C語言項(xiàng)目,但為了讓編譯好的程序能通過編程器寫入51芯 片中,要先用編譯器生成HEX文件,下面來看看如何用KEIL uVISION2來編譯生成用于燒寫 芯片的HEX文件。HEX文件格式是Intel公司提出的按地址排列的數(shù)據(jù)信息,數(shù)據(jù)寬度為字 節(jié),所有數(shù)據(jù)使用16進(jìn)制數(shù)字表示, 常用來保存單片機(jī)或其他處理器的目標(biāo)程序代碼。它保 存物理程序存儲區(qū)中的目標(biāo)代碼映象。一般的編程器都支持這種格式。我們先來打開第一個(gè) 項(xiàng)目,打開它的所在目錄,找到test.Uv2的文件就能打開先前的項(xiàng)目了。然后右擊圖2-1 中的1項(xiàng)目文件夾,彈出項(xiàng)目功能菜單,選Options for Target’Target1’,彈出項(xiàng)目選項(xiàng)設(shè)置窗口, 同樣先選中項(xiàng)目文件夾圖標(biāo),這個(gè)時(shí)候在Project菜單中也有一樣的菜單可選。打開項(xiàng)目選項(xiàng)窗口, 轉(zhuǎn)到Output選項(xiàng)頁圖2-2所示,圖中1是選擇編譯輸出的路徑,2是設(shè)置編譯輸出生成的文件 名,3則是決定是否要?jiǎng)?chuàng)建HEX文件,選中它就能輸出HEX文件到指定的路徑中。選好了? 好,我們再將它重新編譯一次,很快在編譯信息窗口中就顯示HEX文件創(chuàng)建到指定的路徑 中了,如圖2-3。這樣我們就可用自己的編程器所附帶的軟件去讀取并燒到芯片了,再用實(shí) 驗(yàn)板看結(jié)果,至于編程器或仿真器品種繁多具體方法就看它的說明書了,這里也不做討論。
?。记桑阂?、在圖2-1中的1里的項(xiàng)目文件樹形目錄中,先選中對象,再單擊它就可對它進(jìn) 行重命名操作,雙擊文件圖標(biāo)便可打開文件。二、在Project下拉菜單的最下方有最近編輯過
的項(xiàng)目路徑保存,這里能快速打開最近在編輯的項(xiàng)目。)
圖2-1項(xiàng)目功能菜單
圖2-2 項(xiàng)目選項(xiàng)窗口
圖 2-3 編譯信息窗口
或許您已把編譯好的文件燒到了芯片上,如果您購買或自制了帶串行口輸出元件的學(xué)習(xí)實(shí) 驗(yàn)板,那您就能把串行口和 PC 機(jī)串行口相聯(lián)用串行口調(diào)試軟件或 Windows 的超級終端,將其波特 率設(shè)為 1200,就能看到不停輸出的“Hello World!”字樣。如果您還沒有實(shí)驗(yàn)板,那這 里先說說 AT89c51 的最小化系統(tǒng),再以一實(shí)例程序驗(yàn)證最小化系統(tǒng)是否在運(yùn)行,這個(gè)最小化 系統(tǒng)也易于自制用于實(shí)驗(yàn)。圖 2-4 便是 AT89c51 的最小化系統(tǒng),不過為了讓我們能看出它 是在運(yùn)行的,加了一個(gè)電阻和一個(gè) LED,用以顯示它的狀態(tài),晶體震蕩器能根據(jù)自己的情況使用, 一般實(shí)驗(yàn)板上是用 11.0592MHz 或 12MHz,使用前者的好外是能產(chǎn)生標(biāo)準(zhǔn)的串行口波特率,后 者則一個(gè)機(jī)器周期為 1 微秒,便于做精確定時(shí)。在自己做實(shí)驗(yàn)里,注意的是 VCC 是+5V 的, 不能高于此值,不然將損壞單片機(jī),太低則不能正常工作。在 31 腳要接高電平,這樣我們 才能執(zhí)行片內(nèi)的程序,如接低電平則使用片外的程序存儲器。下面建一個(gè)新的項(xiàng)目名為 OneLED 來驗(yàn)證最小化系統(tǒng)是否能工作(所有的例程都可在筆者的主頁下面下載到,網(wǎng)址: http://www.51hei.com 。程序如下:
#include 《 AT89X51.h》 //預(yù)處理命令
void main(void) //主函數(shù)名
{
//這是第一種注釋方式
unsigned int a; //定義變量 a 為 int 類型
/* 這是第二種注釋方式
*/
do{ //do while 組成循環(huán)
for (a=0; a《50000; a++); //這是一個(gè)循環(huán) P1_0 = 0; //設(shè) P1.0 口為低電平,點(diǎn)亮 LED for (a=0; a《50000; a++); //這是一個(gè)循環(huán) P1_0 = 1; //設(shè) P1.0 口為高電平,熄滅 LED
}
while(1);
}
圖 2-4 AT89c51 最小化系統(tǒng)
這里先講講 KEIL C 編譯器所支持的注釋語句。一種是以“//”符號開始的語句,符號之后 的語句都被視為注釋,直到有回車換行。另一種是在“/*”和“*/”符號之內(nèi)的為注釋。注 釋不會被 C 編譯器所編譯。一個(gè) C 應(yīng)用程序中應(yīng)有一個(gè) main 主函數(shù),main 函數(shù)能調(diào)用別
的功能函數(shù),但其它功能函數(shù)不允許調(diào)用 main 函數(shù)。不論 main 函數(shù)放在程序中的那個(gè)位置, 總是先被執(zhí)行。用上面學(xué)到的知識編譯寫好的 OneLED 程序,并把它燒到剛做好的最小化系 統(tǒng)中。上電,剛開始時(shí) LED 是不亮的(因?yàn)樯想姀?fù)位后所有的 IO 口都置 1 引腳為高電平), 然后延時(shí)一段時(shí)間(for (a=0; a《50000; a++)這句在運(yùn)行),LED 亮,再延時(shí),LED 熄滅, 然后交替亮、滅。第一個(gè)真正的小實(shí)驗(yàn)就做完,如果沒有這樣的效果那么您就要認(rèn)真檢查一下電路或編譯燒寫的步驟了。
第三課、C51數(shù)據(jù)類型
每寫一個(gè)程序,總離不開數(shù)據(jù)的應(yīng)用,在學(xué)習(xí) c51 語言的過程中掌握理解數(shù)據(jù)類型也是 很關(guān)鍵的。先看表 3-1,表中列出了 KEIL uVision2 單片機(jī)c語言編譯器所支持的數(shù)據(jù)類型。在標(biāo)準(zhǔn)C語言中基本的數(shù)據(jù)類型為 char,int,short,long,float 和 double,而在c51編譯器中int 和 short 相同,float 和 double 相同,這里就不列出說明了。下面來看看它們的具體定 義:
表 3-1 KEIL uVision2 單片機(jī)c語言編譯器所支持的數(shù)據(jù)類型
1. char 字符類型
char 類型的長度是一個(gè)字節(jié),通常用于定義處理字符數(shù)據(jù)的變量或常量。分無符號字 符類型 unsigned char 和有符號字符類型 signed char,默認(rèn)值為 signed char 類型。 unsigned char 類型用字節(jié)中所有的位來表示數(shù)值,所能表達(dá)的數(shù)值范圍是 0~255。 signed char 類型用字節(jié)中最高位字節(jié)表示數(shù)據(jù)的符號,“0”表示正數(shù),“1”表示負(fù)數(shù), 負(fù)數(shù)用補(bǔ)碼表示。所能表示的數(shù)值范圍是-128~+127。unsigned char 常用于處理 ASCII 字符或用于處理小于或等于 255 的整型數(shù)。
?。龜?shù)的補(bǔ)碼與原碼相同,負(fù)二進(jìn)制數(shù)的補(bǔ)碼等于它的絕對值按位取反后加 1。
2. int 整型
int 整型長度為兩個(gè)字節(jié),用于存放一個(gè)雙字節(jié)數(shù)據(jù)。分有符號 int 整型數(shù) signed int 和無符號整型數(shù) unsigned int,默認(rèn)值為 signed int 類型。signed int 表示的數(shù)值范 圍是-32768~+32767,字節(jié)中最高位表示數(shù)據(jù)的符號,“0”表示正數(shù),“1”表示負(fù)數(shù)。 unsigned int 表示的數(shù)值范圍是 0~65535。
先停一下來寫個(gè)小程序看看 unsigned char 和 unsigned int 用于延時(shí)的不一樣效果,說 明它們的長度是不一樣的,學(xué)習(xí)它們的使用方法。依舊用上一篇的最小化系統(tǒng)做實(shí)驗(yàn),不過要加多 一個(gè)電阻和 LED,如圖 3-1。實(shí)驗(yàn)中用 D1 的點(diǎn)亮表明正在用 unsigned int 數(shù)值延時(shí),用D2 點(diǎn)亮表明正在用 unsigned char 數(shù)值延時(shí)。
圖 3-1 第 3 課實(shí)驗(yàn)用電路 把這個(gè)項(xiàng)目稱為 TwoLED,實(shí)驗(yàn)程序如下:
單片機(jī)相關(guān)文章:單片機(jī)教程
單片機(jī)相關(guān)文章:單片機(jī)視頻教程
單片機(jī)相關(guān)文章:單片機(jī)工作原理
評論