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