第4章 C51語言程序設(shè)計v1.0_第1頁
第4章 C51語言程序設(shè)計v1.0_第2頁
第4章 C51語言程序設(shè)計v1.0_第3頁
第4章 C51語言程序設(shè)計v1.0_第4頁
第4章 C51語言程序設(shè)計v1.0_第5頁
已閱讀5頁,還剩31頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、 第第4 4章章 C51C51語言程序設(shè)計語言程序設(shè)計學(xué)習(xí)目標(biāo)學(xué)習(xí)目標(biāo)n掌握掌握C51C51程序結(jié)構(gòu)程序結(jié)構(gòu)n掌握掌握C51C51程序的編輯和編譯程序的編輯和編譯n掌握掌握C51C51對對C C語言的擴(kuò)展語言的擴(kuò)展n了解匯編語言和了解匯編語言和C C語言的混合編程語言的混合編程n了解了解C51C51程序的優(yōu)化程序的優(yōu)化n掌握掌握C51C51程序設(shè)計方法程序設(shè)計方法主要內(nèi)容主要內(nèi)容n4.1 C514.1 C51語言簡介語言簡介n4.2 C514.2 C51對對C C語言的擴(kuò)展語言的擴(kuò)展n4.3 C514.3 C51使用技巧使用技巧n4.4 C514.4 C51程序設(shè)計方法程序設(shè)計方法4.1 C5

2、14.1 C51語言簡介語言簡介 與匯編語言相比,用與匯編語言相比,用C51C51語言編寫程序具有如下優(yōu)點:語言編寫程序具有如下優(yōu)點:n無需深入了解系統(tǒng)硬件及單片機(jī)指令系統(tǒng);無需深入了解系統(tǒng)硬件及單片機(jī)指令系統(tǒng);nC51C51編譯器自動完成內(nèi)部寄存器分配、存儲空間分編譯器自動完成內(nèi)部寄存器分配、存儲空間分配和數(shù)據(jù)類型處理等細(xì)節(jié)問題;配和數(shù)據(jù)類型處理等細(xì)節(jié)問題;n語言簡潔、表達(dá)能力強(qiáng)、表達(dá)方式靈活;語言簡潔、表達(dá)能力強(qiáng)、表達(dá)方式靈活;n程序由若干函數(shù)組成,具有完全的模塊化結(jié)構(gòu);程序由若干函數(shù)組成,具有完全的模塊化結(jié)構(gòu);n有豐富的庫子程序,可減少用戶的編程工作量;有豐富的庫子程序,可減少用戶的編程

3、工作量;n可顯著縮短編程和調(diào)試時間,提高軟件開發(fā)效率;可顯著縮短編程和調(diào)試時間,提高軟件開發(fā)效率;n程序具有良好的可讀性和可維護(hù)性;程序具有良好的可讀性和可維護(hù)性;n具有良好的可移植性,應(yīng)用程序稍加修改就可以移具有良好的可移植性,應(yīng)用程序稍加修改就可以移植到其它系統(tǒng)中。植到其它系統(tǒng)中。 為何要使用為何要使用C51C51語言?語言?4.1.1 C514.1.1 C51程序結(jié)構(gòu)程序結(jié)構(gòu) 為了理解為了理解C51C51程序結(jié)構(gòu),這里用一個程序結(jié)構(gòu),這里用一個“星星閃爍星星閃爍”程序來開啟學(xué)習(xí)程序來開啟學(xué)習(xí)C51C51程序之旅。如右圖的單片機(jī)系統(tǒng)程序之旅。如右圖的單片機(jī)系統(tǒng)中中P1.0P1.0口連接了一

4、個口連接了一個LEDLED發(fā)光指示燈。要使這個指示發(fā)光指示燈。要使這個指示燈按一定的時間間隔閃爍,我們編寫如下程序燈按一定的時間間隔閃爍,我們編寫如下程序 。 P1.0輸出高電平輸出高電平 點亮點亮LEDLED第第1 1部分是說明區(qū),部分是說明區(qū),它包含了程序說明、它包含了程序說明、功能說明、設(shè)計者、功能說明、設(shè)計者、設(shè)計日期、修改日設(shè)計日期、修改日期、版本號等說明期、版本號等說明 第第2 2部分是預(yù)處理區(qū)部分是預(yù)處理區(qū) 第第3 3部分是全局變量定部分是全局變量定義區(qū)義區(qū) 4.1.1 C514.1.1 C51程序結(jié)構(gòu)程序結(jié)構(gòu)第第4 4部分是真正能部分是真正能夠生成目標(biāo)代碼的夠生成目標(biāo)代碼的程序

5、區(qū),它包含了程序區(qū),它包含了一個一個main()main()函數(shù),函數(shù),也稱之為該程序的也稱之為該程序的主函數(shù),一個主函數(shù),一個C51C51程序有且必須且只程序有且必須且只能有一個名為能有一個名為main()main()的主函數(shù)。的主函數(shù)。nC51C51程序的書寫格式十分自由。每條語句都必須以分號程序的書寫格式十分自由。每條語句都必須以分號“;”作為結(jié)束符。作為結(jié)束符。nC51C51是對大小寫字母敏感的。是對大小寫字母敏感的。n實際編寫程序時一般應(yīng)按程序的功能以實際編寫程序時一般應(yīng)按程序的功能以“縮格縮格”形式來寫程序。形式來寫程序。n加入必要的注釋。注釋的目的是增強(qiáng)程序的可閱讀性加入必要的注

6、釋。注釋的目的是增強(qiáng)程序的可閱讀性。4.1.2 C514.1.2 C51程序的編輯和編譯程序的編輯和編譯以以uVision3uVision3集成開發(fā)環(huán)境為例,集成開發(fā)環(huán)境為例,C51C51程序的程序的編輯、編譯和調(diào)試過程如下:編輯、編譯和調(diào)試過程如下: n 新建一個工程文件新建一個工程文件n 新建一個新建一個C51C51程序文件程序文件n 把把C51C51程序文件添加到工程程序文件添加到工程文件文件n 程序編譯程序編譯n 運行和調(diào)試運行和調(diào)試主要內(nèi)容主要內(nèi)容n4.1 C514.1 C51語言簡介語言簡介n4.2 C514.2 C51對對C C語言的擴(kuò)展語言的擴(kuò)展n4.3 C514.3 C51使

7、用技巧使用技巧n4.4 C514.4 C51程序設(shè)計方法程序設(shè)計方法4.2 C514.2 C51對對C C語言的擴(kuò)展語言的擴(kuò)展 C51 C51是支持符合是支持符合ANSIANSI標(biāo)準(zhǔn)的標(biāo)準(zhǔn)的C C語言,為了支持語言,為了支持5151系系列單片機(jī)專門加入了一些擴(kuò)展的內(nèi)容。列單片機(jī)專門加入了一些擴(kuò)展的內(nèi)容。C51C51對標(biāo)準(zhǔn)對標(biāo)準(zhǔn)C C語言擴(kuò)展的內(nèi)容主要包括:語言擴(kuò)展的內(nèi)容主要包括:n特殊功能寄存器定義特殊功能寄存器定義n位變量位變量n數(shù)據(jù)存儲空間的定義數(shù)據(jù)存儲空間的定義n絕對地址訪問絕對地址訪問n中斷函數(shù)中斷函數(shù)n匯編程序接口匯編程序接口n庫函數(shù)庫函數(shù)n關(guān)鍵字關(guān)鍵字 本節(jié)將重點介紹本節(jié)將重點介紹

8、C51C51編程語言和標(biāo)準(zhǔn)編程語言和標(biāo)準(zhǔn)C C語言之間的語言之間的區(qū)別。即介紹區(qū)別。即介紹C51C51對標(biāo)準(zhǔn)對標(biāo)準(zhǔn)C C語言的擴(kuò)展。語言的擴(kuò)展。4.2 C514.2 C51對對C C語言的擴(kuò)展語言的擴(kuò)展 C51 C51聲明特殊功能寄存器的一般語法格式如下:聲明特殊功能寄存器的一般語法格式如下: sfrsfr或或sfr16 sfr16 特殊寄存器名特殊寄存器名 = = 特殊寄存器地址特殊寄存器地址例如把地址分別為例如把地址分別為0 x800 x80、0 x900 x90、0 xa00 xa0、0 xb00 xb0的端口寄存器的端口寄存器分別聲明為分別聲明為P0P0、P1P1、P2P2、P3P3,

9、可以用,可以用sfrsfr分別聲明如下:分別聲明如下:sfr P0 = 0 x80; sfr P0 = 0 x80; / /* *P0P0口口, ,地址為地址為0 x80 0 x80 * */ /sfr P1 = 0 x90; sfr P1 = 0 x90; / /* *P1P1口口, ,地址為地址為0 x90 0 x90 * */ /sfr P2 = 0 xA0;sfr P2 = 0 xA0; / /* *P2P2口口, ,地址為地址為0 xA0 0 xA0 * */ /sfr P3 = 0 xB0;sfr P3 = 0 xB0; / /* *P3P3口口, ,地址為地址為0 xB0 0 x

10、B0 * */ / 51 51系列單片機(jī)的特殊功能寄存器的數(shù)量與類型不盡相同,系列單片機(jī)的特殊功能寄存器的數(shù)量與類型不盡相同,因此建議將所有特殊的因此建議將所有特殊的“sfr”sfr”定義放入一個頭文件中,如定義放入一個頭文件中,如“reg51.h” reg51.h” 。這樣只要在。這樣只要在C51C51程序編制的開頭用程序編制的開頭用#include#include加入該文件,即可在程序中直接使用加入該文件,即可在程序中直接使用5151特殊功能寄存器的名特殊功能寄存器的名稱,免除使用者逐一定義的麻煩。稱,免除使用者逐一定義的麻煩。4.2.14.2.1特殊功能寄存器的定義特殊功能寄存器的定義4

11、.2 C514.2 C51對對C C語言的擴(kuò)展語言的擴(kuò)展 5151系列單片機(jī)中,有一些特殊功能寄存器是系列單片機(jī)中,有一些特殊功能寄存器是可以位尋址的,為了便于使用這些可位尋址的特可以位尋址的,為了便于使用這些可位尋址的特殊寄存位,殊寄存位,C51C51提供了特殊寄存器位定義方法,定提供了特殊寄存器位定義方法,定義的一般語法格式如下:義的一般語法格式如下: sbitsbit 特殊寄存器位名特殊寄存器位名 = = 位地址;位地址; 例如,例如,0 xAF0 xAF位地址是總中斷控制位,把它聲明位地址是總中斷控制位,把它聲明為為EAEA的聲明方法是:的聲明方法是: sbitsbit EA = 0

12、xAF;/ EA = 0 xAF;/* *位地址位地址0 xAF0 xAF定義為定義為EA EA * */ / 注意:不是所有的注意:不是所有的SFRSFR都是可位尋址的,都是可位尋址的,SFRSFR中中有有1111個寄存器具有位尋址能力,它們的字節(jié)地址個寄存器具有位尋址能力,它們的字節(jié)地址都能被都能被8 8整除,即字節(jié)地址是以整除,即字節(jié)地址是以8 8或或0 0為尾數(shù)的。為尾數(shù)的。 可位尋址的特殊寄存位也已在頭文件中定義可位尋址的特殊寄存位也已在頭文件中定義。4.2.24.2.2數(shù)據(jù)類型數(shù)據(jù)類型4.2 C514.2 C51對對C C語言的擴(kuò)展語言的擴(kuò)展 C51C51具有標(biāo)準(zhǔn)具有標(biāo)準(zhǔn)C C語言

13、的所有標(biāo)準(zhǔn)數(shù)據(jù)類型。除此之外,還加入了位語言的所有標(biāo)準(zhǔn)數(shù)據(jù)類型。除此之外,還加入了位變量數(shù)據(jù)類型,用關(guān)鍵字變量數(shù)據(jù)類型,用關(guān)鍵字bitbit聲明。聲明。 bit bit 數(shù)據(jù)類型可以在變量聲明、參數(shù)列表和函數(shù)返回值中使用,數(shù)據(jù)類型可以在變量聲明、參數(shù)列表和函數(shù)返回值中使用,bitbit變變量放在量放在5151單片機(jī)的片內(nèi)位尋址寄存器中。位變量聲明的一般格式如下:單片機(jī)的片內(nèi)位尋址寄存器中。位變量聲明的一般格式如下:bit bit 位變量名位變量名=初值初值 例如:例如:bit High_bitbit High_bit; / /* * 把把High_bitHigh_bit定義為位變量定義為位變量

14、 * */ /bit High_bit=0bit High_bit=0; / /* * 把把High_bitHigh_bit定義為位變量,初值為定義為位變量,初值為0 0* */ / 特別要注意特別要注意bitbit變量和變量和bitbit聲明有如下限制:聲明有如下限制:1.1. 不能聲明一個不能聲明一個bitbit類型的數(shù)組;類型的數(shù)組;2.2. 不能聲明一個位指針;不能聲明一個位指針;3.3. 禁止中斷的函數(shù)(禁止中斷的函數(shù)(#pragma disable#pragma disable)和用明確的寄存器組)和用明確的寄存器組(using nusing n)聲明的函數(shù)不能返回一個位型值。這樣

15、使用時,編譯過程)聲明的函數(shù)不能返回一個位型值。這樣使用時,編譯過程將返回一個將返回一個bitbit類型錯誤信息。類型錯誤信息。4.2.24.2.2數(shù)據(jù)類型數(shù)據(jù)類型4.2 C514.2 C51對對C C語言的擴(kuò)展語言的擴(kuò)展1.1.變量變量的存儲類型的存儲類型4.2.34.2.3數(shù)據(jù)存儲空間的定義數(shù)據(jù)存儲空間的定義 一般把頻繁使用的變量放在內(nèi)部數(shù)據(jù)寄存器,把占用存儲一般把頻繁使用的變量放在內(nèi)部數(shù)據(jù)寄存器,把占用存儲單元較多、使用頻率低的變量放在外部數(shù)據(jù)存儲器中,以提高單元較多、使用頻率低的變量放在外部數(shù)據(jù)存儲器中,以提高程序執(zhí)行程序執(zhí)行的效率。的效率。4.2 C514.2 C51對對C C語言的

16、擴(kuò)展語言的擴(kuò)展 2.2.編譯器的存儲模式選擇編譯器的存儲模式選擇4.2.34.2.3數(shù)據(jù)存儲空間的定義數(shù)據(jù)存儲空間的定義 C51 C51中數(shù)據(jù)存儲類型聲明的一般格式為:中數(shù)據(jù)存儲類型聲明的一般格式為: 數(shù)據(jù)類型數(shù)據(jù)類型 存儲類型存儲類型 標(biāo)識符標(biāo)識符 =初值初值 例如,例如,unsigned char bdata High=0 x10unsigned char bdata High=0 x10; 如果在變量聲明中省略了存儲類型,編譯器會自動選擇編譯器設(shè)置的缺如果在變量聲明中省略了存儲類型,編譯器會自動選擇編譯器設(shè)置的缺省或暗含的存儲類型。省或暗含的存儲類型。 1)SMALL1)SMALL模式:

17、模式:所有變量在缺省的情況下定位于所有變量在缺省的情況下定位于80518051系統(tǒng)的內(nèi)部數(shù)據(jù)寄系統(tǒng)的內(nèi)部數(shù)據(jù)寄存器(與用存器(與用datadata存儲類型一樣),因此訪問十分方便,數(shù)據(jù)訪問效率是最高存儲類型一樣),因此訪問十分方便,數(shù)據(jù)訪問效率是最高的。的。 2)COMPACT2)COMPACT模式:模式:所有變量在缺省的情況下都放在外部數(shù)據(jù)存儲區(qū)的一所有變量在缺省的情況下都放在外部數(shù)據(jù)存儲區(qū)的一頁中(象用頁中(象用pdatapdata聲明一樣),因此最多可同時聲明聲明一樣),因此最多可同時聲明256256個字符型變量,訪問個字符型變量,訪問是采用是采用R0R0和和R1R1間接尋址的方式進(jìn)行的

18、。間接尋址的方式進(jìn)行的。 3)LARGE3)LARGE模式模式:所有未定義存儲類型的變量放在外部數(shù)據(jù)存儲區(qū)(:所有未定義存儲類型的變量放在外部數(shù)據(jù)存儲區(qū)(64K64K字字節(jié),與使用節(jié),與使用xdataxdata存儲類型一樣)。訪問是通過數(shù)據(jù)指針(存儲類型一樣)。訪問是通過數(shù)據(jù)指針(DPTRDPTR)間接尋址)間接尋址來進(jìn)行的。來進(jìn)行的。4.2 C514.2 C51對對C C語言的擴(kuò)展語言的擴(kuò)展4.2.44.2.4絕對地址訪問絕對地址訪問 由于由于5151系列單片機(jī)資源有限,往往需要實現(xiàn)絕對地址訪問,系列單片機(jī)資源有限,往往需要實現(xiàn)絕對地址訪問,C51C51提供了提供了三種訪問絕對地址的方法。三

19、種訪問絕對地址的方法。1.1.絕對絕對宏宏 所謂所謂絕對宏是利用絕對宏是利用C51C51提供的頭文件提供的頭文件absacc.habsacc.h中定義的宏來訪問絕對地中定義的宏來訪問絕對地址,址,absacc.habsacc.h中定義的宏包括:中定義的宏包括:CBYTECBYTE、XBYTEXBYTE、PWORDPWORD、DBYTEDBYTE、CWORDCWORD、XWORDXWORD、PBYTEPBYTE、DWORDDWORD,絕對宏的使用可以通過以下幾個例子來理解。,絕對宏的使用可以通過以下幾個例子來理解。rval = CBYTE0 x0002;rval = CBYTE0 x0002;/

20、指向程序存儲區(qū)地址指向程序存儲區(qū)地址0 x00020 x0002。rval = CWORD0 x0002; /rval = CWORD0 x0002; /指向程序存儲區(qū)地址指向程序存儲區(qū)地址0 x00040 x0004。rval = DBYTE0 x0002;rval = DBYTE0 x0002;/指向內(nèi)部數(shù)據(jù)存儲區(qū)地址指向內(nèi)部數(shù)據(jù)存儲區(qū)地址0 x00020 x0002。rval = DWORD0 x0002;rval = DWORD0 x0002;/指向內(nèi)部數(shù)據(jù)存儲區(qū)地址指向內(nèi)部數(shù)據(jù)存儲區(qū)地址0 x00040 x0004。rval = XBYTE0 x0002;rval = XBYTE0

21、x0002; /指向外部數(shù)據(jù)存儲區(qū)地址指向外部數(shù)據(jù)存儲區(qū)地址0 x00020 x0002。rval = XWORD 0 x0002;rval = XWORD 0 x0002;/指向外部數(shù)據(jù)存儲區(qū)地址指向外部數(shù)據(jù)存儲區(qū)地址0 x00040 x0004。CWORDCWORD、DWORDDWORD、XWORDXWORD所用的索引不代表存儲區(qū)地址的整數(shù)值。為了得到存所用的索引不代表存儲區(qū)地址的整數(shù)值。為了得到存儲區(qū)地址,必須索引乘以一個整數(shù)(一個字長儲區(qū)地址,必須索引乘以一個整數(shù)(一個字長2 2字節(jié))的大小。字節(jié))的大小。4.2 C514.2 C51對對C C語言的擴(kuò)展語言的擴(kuò)展4.2.44.2.4絕

22、對地址訪問絕對地址訪問2._at_2._at_關(guān)鍵字關(guān)鍵字 使用使用“_at_”_at_”關(guān)鍵字可以實現(xiàn)絕對地址訪問,具體的格式如下所示:關(guān)鍵字可以實現(xiàn)絕對地址訪問,具體的格式如下所示: 變量類型變量類型存儲類型存儲類型 變量名變量名 _at_ _at_ 地址常數(shù);地址常數(shù); 若要指定若要指定texttext數(shù)組從片外數(shù)據(jù)存儲器數(shù)組從片外數(shù)據(jù)存儲器0 xE0000 xE000單元開始存放,可這樣定義單元開始存放,可這樣定義 char xdata text25 _at_ 0 xE000char xdata text25 _at_ 0 xE000; 在使用在使用“_at_”_at_”關(guān)鍵字實現(xiàn)絕對

23、地址訪問時必須注意以下幾點關(guān)鍵字實現(xiàn)絕對地址訪問時必須注意以下幾點n_at_at_后面的絕對地址必須在可用的實際存儲空間內(nèi);后面的絕對地址必須在可用的實際存儲空間內(nèi);n絕對變量不能初始化;絕對變量不能初始化;nbitbit類型的函數(shù)和變量不能定位到一個絕對地址;類型的函數(shù)和變量不能定位到一個絕對地址;n用用_at_at_關(guān)鍵詞聲明一個變量來訪問一個關(guān)鍵詞聲明一個變量來訪問一個XDATAXDATA外圍設(shè)備時,應(yīng)使用外圍設(shè)備時,應(yīng)使用volatilevolatile關(guān)鍵詞,使關(guān)鍵詞,使C C編譯器不對他進(jìn)行優(yōu)化,確保可以訪問到要編譯器不對他進(jìn)行優(yōu)化,確??梢栽L問到要訪問的存儲區(qū)。具體應(yīng)用方法如下:

24、訪問的存儲區(qū)。具體應(yīng)用方法如下: volatile unsigned char xdata rval _at_ 0 x1000;volatile unsigned char xdata rval _at_ 0 x1000;3.3.連接定位控制連接定位控制 這種絕對地址方法是利用連接控制指令中這種絕對地址方法是利用連接控制指令中code xdata pdata data code xdata pdata data bdatabdata,對,對“段段”地址進(jìn)行控制,如要指定某具體變量地址,則很有很地址進(jìn)行控制,如要指定某具體變量地址,則很有很大局限性,不作詳細(xì)討論。大局限性,不作詳細(xì)討論。 4.2

25、 C514.2 C51對對C C語言的擴(kuò)展語言的擴(kuò)展4.2.5 函數(shù)的使用函數(shù)的使用1.1. 函數(shù)聲明函數(shù)聲明 C51C51中對標(biāo)準(zhǔn)中對標(biāo)準(zhǔn)C C的函數(shù)聲明做了如下擴(kuò)展:的函數(shù)聲明做了如下擴(kuò)展:1)1) 可以指定一個函數(shù)為中斷處理函數(shù);可以指定一個函數(shù)為中斷處理函數(shù);2)2) 可以選擇函數(shù)中所使用的寄存器組;可以選擇函數(shù)中所使用的寄存器組;3)3) 可選擇函數(shù)中變量的默認(rèn)存儲模式;可選擇函數(shù)中變量的默認(rèn)存儲模式;4)4) 可以指定函數(shù)為重入函數(shù);可以指定函數(shù)為重入函數(shù); C51C51中的函數(shù)聲明語法格式如下:中的函數(shù)聲明語法格式如下:返回值類型返回值類型 函數(shù)名(函數(shù)參數(shù))函數(shù)名(函數(shù)參數(shù))

26、存儲模式存儲模式 reentrant interrupt n using m reentrant interrupt n using m其中,符號其中,符號“ ” ”中間的部分為可選項,關(guān)鍵字中間的部分為可選項,關(guān)鍵字“reentrantreentrant代表聲明的函數(shù)是可重入函數(shù);關(guān)鍵字代表聲明的函數(shù)是可重入函數(shù);關(guān)鍵字“interrupt”interrupt”表示聲表示聲明的函數(shù)是中斷函數(shù),明的函數(shù)是中斷函數(shù),“n”n”則代表中斷源的編號;則代表中斷源的編號; “using m”using m”表示函數(shù)編譯過程中使用第表示函數(shù)編譯過程中使用第m m組通用寄存器組。組通用寄存器組。4.2 C

27、514.2 C51對對C C語言的擴(kuò)展語言的擴(kuò)展4.2.54.2.5函數(shù)的使用函數(shù)的使用2.2. 中斷函數(shù)中斷函數(shù) 使用使用C51C51編程語言可以直接編寫中斷程序。中斷函數(shù)定義的語法格式如下:編程語言可以直接編寫中斷程序。中斷函數(shù)定義的語法格式如下:返回值返回值 函數(shù)名函數(shù)名(void) interrupt (void) interrupt 中斷號中斷號 using using 寄存器組號寄存器組號 一個標(biāo)準(zhǔn)的一個標(biāo)準(zhǔn)的5151單片機(jī)中斷如下表單片機(jī)中斷如下表4242。4.2 C514.2 C51對對C C語言的擴(kuò)展語言的擴(kuò)展4.2.54.2.5函數(shù)的使用函數(shù)的使用2.2. 中斷函數(shù)中斷函數(shù)

28、 下面的中斷函數(shù)使用計數(shù)器下面的中斷函數(shù)使用計數(shù)器0 0來實現(xiàn)計數(shù)功能,來實現(xiàn)計數(shù)功能,interruptcntinterruptcnt為計數(shù)變?yōu)橛嫈?shù)變量,每中斷一次加量,每中斷一次加1 1,當(dāng)加到,當(dāng)加到40004000時清零,時清零,secondsecond為第二計數(shù)器,用于記為第二計數(shù)器,用于記錄加滿到錄加滿到40004000的次數(shù)。的次數(shù)。1 1unsigned int interruptcnt;unsigned int interruptcnt;2 2unsigned char second;unsigned char second;/ /* *中斷函數(shù)中斷函數(shù)1 1,使用寄存器組,

29、使用寄存器組2 2* */ /3 3void timer0 (void) interrupt 1 using 2void timer0 (void) interrupt 1 using 2 5 5if (+interruptcnt = 4000) if (+interruptcnt = 4000) 6 6 second+; second+; / /* * 第二計數(shù)器第二計數(shù)器 * */ /7 7 interruptcnt interruptcnt = 0; / = 0; /* * 中斷計數(shù)器清零中斷計數(shù)器清零 * */ /8 89 9 1010 4.2 C514.2 C51對對C C語言的擴(kuò)展

30、語言的擴(kuò)展4.2.54.2.5函數(shù)的使用函數(shù)的使用2.2. 中斷函數(shù)中斷函數(shù) 在使用中斷函數(shù)時必須注意以下問題在使用中斷函數(shù)時必須注意以下問題1)1) 中斷號是整型常數(shù)值,取值為中斷號是整型常數(shù)值,取值為0 0 到到3131,不允許用帶操作數(shù)的,不允許用帶操作數(shù)的表達(dá)式。表達(dá)式。2)2) 編譯器根據(jù)中斷號自動產(chǎn)生中斷矢量。編譯器根據(jù)中斷號自動產(chǎn)生中斷矢量。3)3) ACCACC、B B、DPHDPH、DPLDPL和和PSWPSW的內(nèi)容,在中斷函數(shù)調(diào)用時保存在堆的內(nèi)容,在中斷函數(shù)調(diào)用時保存在堆棧中。棧中。4)4) 中斷函數(shù)中所用的中斷函數(shù)中所用的R0R7R0R7寄存器,如果不用寄存器,如果不用u

31、sing using 屬性指定一屬性指定一個寄存器組則保存在堆棧中。個寄存器組則保存在堆棧中。5)5) 保存在堆棧中的寄存器和保存在堆棧中的寄存器和SFR SFR 在退出中斷函數(shù)前恢復(fù)。在退出中斷函數(shù)前恢復(fù)。6)6) RETIRETI指令終止中斷函數(shù)的執(zhí)行。指令終止中斷函數(shù)的執(zhí)行。4.2 C514.2 C51對對C C語言的擴(kuò)展語言的擴(kuò)展4.2.54.2.5函數(shù)的使用函數(shù)的使用3.3. 重入函數(shù)重入函數(shù) 所謂重入函數(shù)是指一個可以被多個任務(wù)調(diào)用的函數(shù),在調(diào)用該函數(shù)的過所謂重入函數(shù)是指一個可以被多個任務(wù)調(diào)用的函數(shù),在調(diào)用該函數(shù)的過程中又可以間接或直接地調(diào)用其本身。函數(shù)的重入又被稱為遞歸調(diào)用。程中又

32、可以間接或直接地調(diào)用其本身。函數(shù)的重入又被稱為遞歸調(diào)用。C51C51使用寄存器傳遞參數(shù),內(nèi)部變量在數(shù)據(jù)存儲器中,函數(shù)重入時會破壞上次使用寄存器傳遞參數(shù),內(nèi)部變量在數(shù)據(jù)存儲器中,函數(shù)重入時會破壞上次調(diào)用的數(shù)據(jù)。調(diào)用的數(shù)據(jù)。因此在因此在C51C51中所有函數(shù)默認(rèn)都是非重入的中所有函數(shù)默認(rèn)都是非重入的。可重入函數(shù)的定義形式為:可重入函數(shù)的定義形式為:reentrant reentrant 函數(shù)類型函數(shù)類型 函數(shù)名函數(shù)名( (形式參數(shù)表形式參數(shù)表) )例如,計算階乘函數(shù)例如,計算階乘函數(shù)f(n)f(n)n!n!,可以先計算,可以先計算f(n-1)f(n-1)(n-1)!(n-1)!,而計算,而計算f(

33、n-1)f(n-1)時又可以先計算時又可以先計算f(n-2)f(n-2)(n-2)(n-2)!,這就是遞歸算法。其再入函數(shù)可以這樣來!,這就是遞歸算法。其再入函數(shù)可以這樣來編寫:編寫:reentrant fucation1reentrant fucation1(int nint n) if if(n=0|n=1n=0|n=1)return 1 /return 1 /當(dāng)當(dāng)n=0n=0或或1 1時返回時返回1 1elseelsereturn nreturn n* * fucation1 fucation1(n-1n-1) /否則遞歸調(diào)用,計算否則遞歸調(diào)用,計算n n! 單片機(jī)編程中一般情況下應(yīng)盡量

34、避免采用函數(shù)遞歸調(diào)用。單片機(jī)編程中一般情況下應(yīng)盡量避免采用函數(shù)遞歸調(diào)用。 4.2 C514.2 C51對對C C語言的擴(kuò)展語言的擴(kuò)展4.2.64.2.6C51C51指針指針 C51 C51支持兩種指針:通用指針(支持兩種指針:通用指針(Generic PointerGeneric Pointer)和指定)和指定存儲器指存儲器指針(針(Memory_Specific PointerMemory_Specific Pointer)。)。1.1. 通用指針通用指針C51C51中的通用指針占用中的通用指針占用3 3個字節(jié)的存儲空間,分別存儲指針變量的存儲類型、個字節(jié)的存儲空間,分別存儲指針變量的存儲類

35、型、高位偏移量、低位偏移量。通用指針的聲明和使用均與標(biāo)準(zhǔn)高位偏移量、低位偏移量。通用指針的聲明和使用均與標(biāo)準(zhǔn)C C語言相同,另語言相同,另外外還可以說明指針變量的存儲類型。例如:還可以說明指針變量的存儲類型。例如:long long * * state; state;unsigned char unsigned char * * xdata ptr; xdata ptr;第一第一條語句聲明一個指向長整型數(shù)據(jù)的指針,而指針變量條語句聲明一個指向長整型數(shù)據(jù)的指針,而指針變量statestate本身本身則根據(jù)則根據(jù)編譯器編譯器設(shè)置的默認(rèn)存儲模式存放在對應(yīng)的數(shù)據(jù)單元中設(shè)置的默認(rèn)存儲模式存放在對應(yīng)的數(shù)據(jù)

36、單元中。第二第二條語句聲明一個指向無符號字符型數(shù)據(jù)的指針,指針變量條語句聲明一個指向無符號字符型數(shù)據(jù)的指針,指針變量ptrptr本身本身則根則根據(jù)據(jù)變量聲明時設(shè)定的存儲模式存放于外部數(shù)據(jù)存儲空間中變量聲明時設(shè)定的存儲模式存放于外部數(shù)據(jù)存儲空間中。4.2 C514.2 C51對對C C語言的擴(kuò)展語言的擴(kuò)展4.2.6 C514.2.6 C51指針指針 C51 C51支持兩種指針:通用指針(支持兩種指針:通用指針(Generic PointerGeneric Pointer)和指和指定定存儲器指針(存儲器指針(Memory_Specific PointerMemory_Specific Pointe

37、r)。)。2.2. 指定存儲器指針指定存儲器指針 C51C51還支持占用空間更小的指針變量,即指定存儲器指還支持占用空間更小的指針變量,即指定存儲器指針。指定存儲器指針實際上是在指針變量聲明時,同時指明指針。指定存儲器指針實際上是在指針變量聲明時,同時指明指針指向數(shù)據(jù)的存儲類型。例如:針指向數(shù)據(jù)的存儲類型。例如:long data long data * * state; state;unsigned char xdata unsigned char xdata * * ptr; ptr; 第一條語句聲明的指針變量指向的數(shù)據(jù)存儲在內(nèi)部數(shù)據(jù)第一條語句聲明的指針變量指向的數(shù)據(jù)存儲在內(nèi)部數(shù)據(jù)單元中,

38、這樣指針變量本身占用單元中,這樣指針變量本身占用1 1個字節(jié)。第二條語句聲明的指個字節(jié)。第二條語句聲明的指針變量指向的數(shù)據(jù)存儲在外部數(shù)據(jù)存儲空間,指針變量本身占針變量指向的數(shù)據(jù)存儲在外部數(shù)據(jù)存儲空間,指針變量本身占用用2 2個字節(jié)。個字節(jié)。4.2 C514.2 C51對對C C語言的擴(kuò)展語言的擴(kuò)展4.2.64.2.6C51C51指針指針3.3. 指定存儲器指針與通用指針比較指定存儲器指針與通用指針比較 使用指定存儲區(qū)指針的好處是節(jié)省了存儲空間(如表使用指定存儲區(qū)指針的好處是節(jié)省了存儲空間(如表4-44-4),編譯器),編譯器不用為存儲器的選擇和操作指令產(chǎn)生代碼,使代碼更加簡短;但使用時不用為存

39、儲器的選擇和操作指令產(chǎn)生代碼,使代碼更加簡短;但使用時必須保證指針不指向所聲明的存儲區(qū)之外的地方,否則將產(chǎn)生錯誤。必須保證指針不指向所聲明的存儲區(qū)之外的地方,否則將產(chǎn)生錯誤。 通用指針產(chǎn)生的代碼執(zhí)行速度要比存儲器指針慢,因為其存儲區(qū)在通用指針產(chǎn)生的代碼執(zhí)行速度要比存儲器指針慢,因為其存儲區(qū)在運行前是未知的,編譯器不能優(yōu)化存儲區(qū)訪問,必須產(chǎn)生可以訪問任何運行前是未知的,編譯器不能優(yōu)化存儲區(qū)訪問,必須產(chǎn)生可以訪問任何存儲區(qū)空間的通用代碼。存儲區(qū)空間的通用代碼。 如果優(yōu)先考慮執(zhí)行速度,應(yīng)該盡可能地使用指定存儲器指針而不是如果優(yōu)先考慮執(zhí)行速度,應(yīng)該盡可能地使用指定存儲器指針而不是通用指針。通用指針。4

40、.2 C514.2 C51對對C C語言的擴(kuò)展語言的擴(kuò)展4.2.74.2.7庫函數(shù)庫函數(shù)3.3. 指定存儲器指針與通用指針比較指定存儲器指針與通用指針比較 C51 C51編譯器包含編譯器包含6 6個不同的編譯庫,這些庫幾乎支持所有的個不同的編譯庫,這些庫幾乎支持所有的ANSIANSI標(biāo)準(zhǔn)標(biāo)準(zhǔn)函數(shù)調(diào)用。函數(shù)調(diào)用。C51C51中的編譯庫都有源代碼,可作與硬件相關(guān)的修改。用戶中的編譯庫都有源代碼,可作與硬件相關(guān)的修改。用戶改變對于現(xiàn)有硬件輸入和輸出結(jié)構(gòu)的兩個模塊,就可修改庫函數(shù)使之適改變對于現(xiàn)有硬件輸入和輸出結(jié)構(gòu)的兩個模塊,就可修改庫函數(shù)使之適用新的硬件結(jié)構(gòu)。比如重新構(gòu)造如用新的硬件結(jié)構(gòu)。比如重新構(gòu)

41、造如“printf”printf”和和“puts”puts”函數(shù)可以用于函數(shù)可以用于LCDLCD顯示。顯示。C51C51的庫函數(shù)與的庫函數(shù)與ANSI C ANSI C 標(biāo)準(zhǔn)庫的差別參見表標(biāo)準(zhǔn)庫的差別參見表4-9 4-9 、表、表4-104-10和表和表4-114-11。 4.2 C514.2 C51對對C C語言的擴(kuò)展語言的擴(kuò)展4.2.84.2.8關(guān)鍵字關(guān)鍵字3.3. 指定存儲器指針與通用指針比較指定存儲器指針與通用指針比較 C51 C51包含包含ANSI CANSI C關(guān)鍵字的同時,也針對關(guān)鍵字的同時,也針對5151系列單片機(jī)擴(kuò)展了一些關(guān)系列單片機(jī)擴(kuò)展了一些關(guān)鍵字。鍵字。C51C51的擴(kuò)展關(guān)

42、鍵字從某種意義上體現(xiàn)了的擴(kuò)展關(guān)鍵字從某種意義上體現(xiàn)了C51C51語言與標(biāo)準(zhǔn)語言與標(biāo)準(zhǔn)C C語言的不同。語言的不同。C51C51的擴(kuò)展關(guān)鍵字及其作用如表的擴(kuò)展關(guān)鍵字及其作用如表4949所示。所示。4.34.3 C51C51使用技巧使用技巧4.3.14.3.1C51C51與匯編程序接口與匯編程序接口 C51 C51的編譯器能對的編譯器能對C51C51源程序進(jìn)行高效率的編譯,生成高效簡潔的目標(biāo)代源程序進(jìn)行高效率的編譯,生成高效簡潔的目標(biāo)代碼,在絕大多數(shù)場合采用碼,在絕大多數(shù)場合采用C51C51編程即可完成預(yù)期的任務(wù)。但對于一些特殊問編程即可完成預(yù)期的任務(wù)。但對于一些特殊問題的處理還可能要用匯編程序來

43、處理,題的處理還可能要用匯編程序來處理,C51C51提供了兩種與匯編程序接口的方提供了兩種與匯編程序接口的方法,即模塊內(nèi)接口和模塊間接口方法。法,即模塊內(nèi)接口和模塊間接口方法。1.1.模塊內(nèi)接口模塊內(nèi)接口 該方法是用該方法是用pragmapragma語句來實現(xiàn)的,其具體結(jié)構(gòu)是:語句來實現(xiàn)的,其具體結(jié)構(gòu)是:#pragma asm #pragma asm 匯編語句行匯編語句行1 1匯編語句行匯編語句行2 2 #pragma endasm#pragma endasm 這種方法實質(zhì)是通過這種方法實質(zhì)是通過asmasm與與endasmendasm告訴告訴C51C51編譯器中間行不用編譯為編譯器中間行不用

44、編譯為匯編,并將這些匯編語言語句行直接存入編譯后的匯編文件中。匯編,并將這些匯編語言語句行直接存入編譯后的匯編文件中。 例如在例如在“星星閃爍星星閃爍”程序,為了得到精確的延時,可以程序,為了得到精確的延時,可以用匯編程序來實現(xiàn)延時,程序代碼如下:用匯編程序來實現(xiàn)延時,程序代碼如下: 主要內(nèi)容主要內(nèi)容n4.1 C514.1 C51語言簡介語言簡介n4.2 C514.2 C51對對C C語言的擴(kuò)展語言的擴(kuò)展n4.3 C514.3 C51使用技巧使用技巧n4.4 C514.4 C51程序設(shè)計方法程序設(shè)計方法4.34.3 C51C51使用技巧使用技巧4.3.14.3.1C51C51與匯與匯編程序接口

45、編程序接口/ /* *-主程序開始主程序開始-* */ /void main(void)void main(void) while while(1 1) LED=1; LED=1; /LED/LED燈點亮燈點亮 #pragma asm#pragma asm MOV R7,#40 MOV R7,#40DELAY1: MOV R6,#248DELAY1: MOV R6,#248DJNZ R6,$DJNZ R6,$DJNZ R7,DELALY1DJNZ R7,DELALY1#pragma endasm#pragma endasmLED=0LED=0/LED/LED燈熄滅燈熄滅#pragma asm#

46、pragma asmMOV R7,#40MOV R7,#40DELAY2: MOV R6,#248DELAY2: MOV R6,#248DJNZ R6,$DJNZ R6,$DJNZ R7,DELAY2DJNZ R7,DELAY2#pragma endasm#pragma endasm 4.34.3 C51C51使用技巧使用技巧4.3.14.3.1C51C51與匯編程序接口與匯編程序接口2.2.模塊間接口模塊間接口 是為了實現(xiàn)是為了實現(xiàn)C51C51程序模塊和匯編程序模塊之間的相互調(diào)用,這種相互程序模塊和匯編程序模塊之間的相互調(diào)用,這種相互調(diào)用可以理解為函數(shù)的調(diào)用調(diào)用可以理解為函數(shù)的調(diào)用, ,只不

47、過函數(shù)是采用不同語言編寫的而已。只不過函數(shù)是采用不同語言編寫的而已。 為了實現(xiàn)為了實現(xiàn)C51C51調(diào)用匯編模塊,匯編程序中各種段的命名和安排、參數(shù)傳調(diào)用匯編模塊,匯編程序中各種段的命名和安排、參數(shù)傳遞和返回等必須符合遞和返回等必須符合C51C51編譯器的命名規(guī)則,同時還必須要清楚編譯器的命名規(guī)則,同時還必須要清楚C51C51函數(shù)的函數(shù)的參數(shù)傳遞、函數(shù)返回規(guī)則等才能實現(xiàn)正確調(diào)用。參數(shù)傳遞、函數(shù)返回規(guī)則等才能實現(xiàn)正確調(diào)用。 當(dāng)當(dāng)C51C51模塊程序編譯成目標(biāo)文件后模塊程序編譯成目標(biāo)文件后, ,其函數(shù)名依據(jù)其定義的性質(zhì)不同會其函數(shù)名依據(jù)其定義的性質(zhì)不同會轉(zhuǎn)換為不同的函數(shù)名轉(zhuǎn)換為不同的函數(shù)名, ,因此

48、因此, ,在模塊間的相互調(diào)用中在模塊間的相互調(diào)用中, ,要求匯編程序必須服從要求匯編程序必須服從這種函數(shù)名的轉(zhuǎn)換規(guī)則這種函數(shù)名的轉(zhuǎn)換規(guī)則, ,否則將無法調(diào)用到所需的函數(shù)或出現(xiàn)錯誤。否則將無法調(diào)用到所需的函數(shù)或出現(xiàn)錯誤。4.34.3 C51C51使用技巧使用技巧4.3.24.3.2C51C51程序的優(yōu)化程序的優(yōu)化 由于由于5151系列單片機(jī)本身資源有限,必要時需對系列單片機(jī)本身資源有限,必要時需對C51C51程序進(jìn)行優(yōu)化。程序進(jìn)行優(yōu)化。1.1.盡量減小變量長度盡量減小變量長度2.2.使用無符號類型使用無符號類型3.3.減少浮點變量的使用減少浮點變量的使用4.4.使用位變量使用位變量5.5.盡量使用局部變量盡量使用局部變量6.6.為變量合理分配內(nèi)部存儲區(qū)為變量合理分配內(nèi)部存儲區(qū)7.7.使用特定指針使用特定指針8.8.使用宏代替函數(shù)使用宏代替函數(shù)主要內(nèi)容主要內(nèi)容n4.1 C514.1 C51語言簡介語言簡介n4.2 C514.2 C51對對C C語言的擴(kuò)展語言的擴(kuò)展n4.3 C514.3 C51使用技巧使用技巧n4.4 C514.4 C51程序設(shè)計方法程序設(shè)計方法4.44.4 C51C51程序設(shè)計方法程序設(shè)計方法 C51C51程序設(shè)計是用程

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論