您的位置:網(wǎng)站首頁 > 電器維修資料網(wǎng) > 正文 >
用Keil C為單片機(jī)編程的編程環(huán)境
來源: 日期:2013-11-17 19:38:14 人氣:標(biāo)簽:
這個(gè)程序用來使led1每兩秒鐘閃爍一次。下面解釋程序各行功能:00行:#include<at89x051.h>
該行的作用是把“at89x051.h”這個(gè)文件包含進(jìn)來。當(dāng)你把一個(gè)文件包含進(jìn)c程序后,keilc會(huì)在編譯程序的時(shí)候把它的內(nèi)容連接到被編譯的單片機(jī)程序中,這樣你就可以不要把這個(gè)文件的內(nèi)容重寫一遍了。
#include命令通常用在程序的開頭。在寫單片機(jī)程序的時(shí)候,一般在開始處都要把與你所使用的單片機(jī)相關(guān)的頭文件包含進(jìn)來(頭文件是什么,初學(xué)者可以先不管它),因?yàn)樵谒锩嬗性S多在寫程序時(shí)要用到的變量聲明(有關(guān)變量的含義在后面討論),如10行的變量“p1_7”,就是在頭文件中聲明的。這個(gè)例子中,我們使用的是at89c2051單片機(jī),·所以包含了“at89x051.h”這個(gè)頭文件。
在keilc的頭文件中,包含著許多關(guān)于單片機(jī)緩存器和i/o口的聲明,聲明都以變量的形式描述,并且這些變量都是以通用的名稱來命名的。有了這些聲明,我們在編寫c程序的時(shí)候,就可以不需要考慮單片機(jī)內(nèi)部的存儲(chǔ)器分配(存儲(chǔ)器分配在匯編程序中是一個(gè)難以處理的問題,要把存儲(chǔ)器分配好,必須對單片機(jī)的存儲(chǔ)結(jié)構(gòu)有很深入的了解),直接把這些變量當(dāng)作緩存器和i/o口來使用。在keilc的頭文件中,常用的重要緩存器和i/o口的聲明有:
*p0、pl、p2、p3:聲明po-p3四組i/0口。對于at89c2051,只有pl和p3口;
*p0_0,…,p0_7;pl_0,…,p1_7;p2_0,…,p2_7;p3_0,…,p3_7;聲明po-p3四組i/o口各引腳。如p1_5表示,pl口的5號引腳,即p1.5引腳;
*有關(guān)uart串行通信的變量聲明;
*有關(guān)中斷的變量聲明;
*有關(guān)定時(shí)/計(jì)數(shù)器的變量聲明。
在keilc中,把相關(guān)頭文件包含進(jìn)來的方法很簡單,你只要在編寫c程序時(shí)右擊鼠標(biāo),并從彈出的菜單中選擇“插入
即可。這樣你就無需考慮應(yīng)該包含什么名稱的頭文件了,大大地方便了源程序的編寫。
在數(shù)學(xué)上,數(shù)被分為有理數(shù)、無理數(shù)、整數(shù)、小數(shù)……等等。在c語言中,數(shù)也要作類似的劃分,稱為數(shù)據(jù)類型。不同的數(shù)據(jù)類型所占用的存儲(chǔ)空間不一樣。
在一般應(yīng)用中,用得 多的一種數(shù)據(jù)類型是整型數(shù),即它只能用來存放整數(shù),其表示符號為“int”。它占用兩字節(jié)的存儲(chǔ)空間。若在int前面加上unsigned,則表示所聲明的變量是無符號整型數(shù)。也就是說,此時(shí)變量所存放的數(shù)值范圍是0—65535。另一個(gè)用得很多的數(shù)據(jù)類型是void,這個(gè)數(shù)據(jù)類型只用于函數(shù)聲明中。
本行中unsignedintk的作用,是聲明一個(gè)無符號整型變量k。我們在求解數(shù)學(xué)題目的時(shí)候,經(jīng)常要假設(shè)末知數(shù),以便于求解。之所以稱作末知數(shù),是因?yàn)樗闹凳遣淮_定的,是會(huì)變化的。在單片機(jī)程序中也會(huì)用到與這種未知數(shù)相類似的量,這就是變量。變量是用來存放數(shù)據(jù)的,它的值會(huì)因程序的執(zhí)行而變化,因此稱為變量。如例中的i、j、k都是變量。與數(shù)學(xué)中的未知數(shù)在使用之前要先假設(shè)一樣,變量在使用之前也要先假設(shè),即先聲明變量。
01行:聲明延時(shí)子函數(shù)delay()什么是函數(shù)?所謂函數(shù),就是能完成特定功能的程序段。在c語言中,它是一個(gè)重要的概念。這是因?yàn)樵谝话闱闆r下,都是就是把經(jīng)常使用的語句群組成函數(shù),這樣在程序中就可以多次調(diào)用,以減少重復(fù)編寫代碼的麻煩,也可以減小程序的長度。任何一個(gè)c程序都是由若干個(gè)函數(shù)組成的。c程序的函數(shù)結(jié)構(gòu)如下:
該函數(shù)結(jié)構(gòu)中各部分含義如下:
*返回的數(shù)據(jù)類型:用于確定當(dāng)函數(shù)結(jié)束時(shí)要返回一個(gè)什么樣類型的數(shù)據(jù)。上例01、08行中兩個(gè)函數(shù)返7回的數(shù)據(jù)類型都是void,void數(shù)據(jù)類型是指沒有具體數(shù)據(jù),即函數(shù)結(jié)束時(shí)不需要返回具體的數(shù)據(jù)。
*函數(shù)名:指定函數(shù)的名稱。在c語言中,函數(shù)有主函數(shù)和和子函數(shù)之分。子函數(shù)的函數(shù)名由程序員自己確定,例中的delay()就是一個(gè)子函數(shù),這個(gè)子函數(shù)的作用是讓程序延時(shí)k毫秒。子函數(shù)的個(gè)數(shù)可以有任意個(gè),也可以沒有。
*參數(shù):我們在解數(shù)學(xué)函數(shù)slnx時(shí),要知道x的值。在e程序中,當(dāng)調(diào)用一個(gè)函數(shù)時(shí),也可能需要一個(gè)類似的值,這個(gè)值就稱為參數(shù)。參數(shù)的本質(zhì)就是個(gè)變量,正因?yàn)檫@樣,參數(shù)也要有數(shù)據(jù)類型及名稱。
例中的第01行聲明delay()函數(shù)時(shí)就用到了一個(gè)無符號整型參數(shù)k,在第11到第13行調(diào)用該函數(shù)時(shí)就把所需的參數(shù)值1000寫上了,即讓程序延時(shí)1000毫秒(1秒)。當(dāng)然,如果函數(shù)不需要參數(shù),就可省略這個(gè)部分,如例中的main()函數(shù)就是如此。
*函數(shù)體:包含執(zhí)行函數(shù)功能的具體語句,是在函數(shù)中用花括號括起來的部分。必須注意的是,所有由 外層花括號括起來的都是函數(shù)體。如上例中02和07行這對花括號中括起來的都是函數(shù)體,雖然它們中間還有其它花括號。
根據(jù)前面的函數(shù)結(jié)構(gòu)及其各部分的含義,我們可以判斷,上例中01行的delay()和08行的main()都是函數(shù),但04、05、10行的for不是函數(shù),因?yàn)樗鼪]有“返回的數(shù)據(jù)類型”部分。
同時(shí),跟變量一樣,在使用一個(gè)函數(shù)之前必須聲明它。如本例中,01行首先聲明了delay()函數(shù),因?yàn)樵?3、15行要調(diào)用它。
“;”表示一行語句的結(jié)束。對初學(xué)者來說,很容易忘記書寫分號,因此值得大家注意。
表達(dá)式,它是用來表示某種運(yùn)算關(guān)系的式子。c語言的表達(dá)式大部分同數(shù)學(xué)上的一樣,但也有例外,如這里的“i=i+1”,它的意思就是讓i的值加1后保存回i中。若i為50,則執(zhí)行該表達(dá)式后,i的值會(huì)變成51。這個(gè)表達(dá)式在c語言中也經(jīng)常寫成“i++”的形式。
兩個(gè)for循環(huán)的嵌套。循環(huán)的作用是讓單片機(jī)在循環(huán)條件滿足時(shí)重復(fù)執(zhí)行一段程序。for循環(huán)的格式如下:
該循環(huán)的作用是,首先執(zhí)行一次“表達(dá)式1”,然后判斷“條件表達(dá)式2”是否成立,若不成立,則執(zhí)行“循環(huán)體”后面的語句,反之,執(zhí)行“循環(huán)體”中的語句,接著執(zhí)行“表達(dá)式3”,執(zhí)行完“表達(dá)式3”后,又一次判斷“條件表達(dá)式2”是否成立……,以此循環(huán)。它的程序流程如下圖所示。從流程圖中可以清楚看出,“表達(dá)式1”只會(huì)執(zhí)行一次。
在一個(gè)循環(huán)的循環(huán)體中可以包含另一個(gè)或更多的循環(huán),這就是循環(huán)的嵌套。
本例中04-06行是兩個(gè)循環(huán)的嵌套。
第05、06行的for循環(huán)就是先讓j的值為0,然后判斷j是否小于120,接著執(zhí)行第06行的循環(huán)體(這里只是個(gè)分號,即一條什么也不做的空語句,它只占用一個(gè)機(jī)器時(shí)間而已),執(zhí)行完后,讓j的值增加1,又一次判斷j是否小于l20……。這個(gè)循環(huán)的作用就是執(zhí)行120次空語句。千萬不要以為執(zhí)行120次空語句是徒勞的,其實(shí)這是 常用的延時(shí)方法。
第04行的for循環(huán)的作用是讓05、06行的for循環(huán)執(zhí)行k次。
循環(huán)嵌套可以獲得更大的循環(huán)次數(shù),如本例中利用兩個(gè)for循環(huán)來達(dá)到kx120次的循環(huán),在13、15行調(diào)用delay()函數(shù)時(shí),k=1000,即完成120000次循環(huán)。當(dāng)然,你可能會(huì)說,為什么不通過加大“條件表達(dá)式2”值的方法,來達(dá)到只用單循環(huán)就可滿足所需循環(huán)次數(shù)的目的呢?如把05行的“j<120”改成“j<120000”。但實(shí)際上這是行不通的,因?yàn)闊o符號整型數(shù)所能表示的 大數(shù)只有65535。
主函數(shù)是c程序的主控函數(shù),程序的執(zhí)行是從main()函數(shù)開始,在實(shí)際編寫c程序的時(shí)候,主函數(shù)可以不放在程序的開始,但編譯器仍然會(huì)以main()函數(shù)的位置為程序執(zhí)行的起始位置。
c程序有且只能有一個(gè)主函數(shù),而且它的名稱也是固定的,即“main”。
for循環(huán)。這個(gè)循環(huán)比較特別,它省略了for循環(huán)結(jié)構(gòu)中的“表達(dá)式1”、“條件表達(dá)式2”、“表達(dá)式3”,這是無條件循環(huán),即循環(huán)永不結(jié)束,直到關(guān)閉電源為止。在單片機(jī)程序中,經(jīng)常使用無條件循環(huán),這是因?yàn)閱纹瑱C(jī)程序基本上都是重復(fù)執(zhí)行任務(wù)的。
讓p1口的7號引腳(即p1.7引腳)輸出高電平,根據(jù)圖l可知,此時(shí)led1會(huì)處于截止?fàn)顟B(tài),即關(guān)閉了該引腳上led的顯示。
在c程序中,凡是以“//”開始的都是注釋。注釋是用來解釋程序行功能的,凡是位于該行此符號之后的任何字符,c編譯器都不予編譯。換言之,注釋只是給編程人員閱讀的,它的存在與否,并不影響程序的執(zhí)行。這里的注釋,就是用來說明語句“p1_7=1”的功能。
以參數(shù)值1000來調(diào)用延時(shí)子函數(shù)delay(),即讓單片機(jī)執(zhí)行到此處時(shí),延時(shí)1000毫秒。
讓pl口的7號引腳(即p1.7引腳)輸出低電平,根據(jù)圖1可知,此時(shí)led1會(huì)處于導(dǎo)通狀態(tài),即點(diǎn)亮了該引腳上led的顯示。
在這里,還需要說明一下有關(guān)字母的大小寫的問題:
與一般的程序語言不同.c程序是區(qū)分字母大小寫的,因此,在c程序中,“i”和“i”是兩個(gè)不同的變量。我們在書寫c程序的時(shí)候,要特別注意字母大小寫的問題。習(xí)慣上,單片機(jī)系統(tǒng)聲明的變量全部用大寫表示,程序員自己聲明的變量用小寫,程序員自己聲明的函數(shù)首字母大寫。我們在平時(shí)的學(xué)習(xí)中就要養(yǎng)成良好的書寫習(xí)慣,以減少因?yàn)樽帜复笮懖灰恢露鸬某绦蝈e(cuò)誤。
- 1
- 2
- 下一頁
【看看這篇文章在百度的收錄情況】