C51語言應用編程論文

時間:2022-09-11 04:35:00

導語:C51語言應用編程論文一文來源于網友上傳,不代表本站觀點,若需要原創文章可咨詢客服老師,歡迎參考。

C51語言應用編程論文

摘要簡要介紹了Franklinc51交叉編譯器的特點,較詳細地討論了C51語言程序設計的基本技巧及其與匯編語言程序的混合編程、中斷處理過程等實際問題,并給出了相應的處理程序。

關鍵詞FranklinC51編譯器匯編語言結構化設計模塊中斷

--------------------------------------------------------------------------------

在研制單片機應用系統時,匯編語言是一種常用的軟件工具。它能直接操作硬件,指令的執行速度快。但其指令系統的固有格式受硬件結構的限制很大,且難于編寫與調試,可移植性也差。隨著單片機硬件性能的提高,其工作速度越來越快,因此在編寫單片機應用系統程序時,更著重于程序本身的編寫效率。而FranklinC51交叉編譯器是專為80C51系列單片機設計的一種高效的C語言編譯器,使用它可以縮短開發周期,降低開發成本,而且開發出的系統易于維護,可靠性高,可移植性好,即使在代碼的使用效率上,也完全可以和匯編語言相比,因此目前它已成為開發80C51系列單片機的流行工具。

1C51語言程序設計的基本技巧

C語言是一種高級程序設計語言,它提供了十分完備的規范化流程控制結構。因此采用C51語言設計單片機應用系統程序時,首先要盡可能地采用結構化的程序設計方法,這樣可使整個應用系統程序結構清晰,易于調試和維護。對于一個較大的程序,可將整個程序按功能分成若干個模塊,不同的模塊完成不同的功能。對于不同的功能模塊,分別指定相應的入口參數和出口參數,而經常使用的一些程序最好編成函數,這樣既不會引起整個程序管理的混亂,還可增強可讀性,移植性也好。

在程序設計過程中,要充分利用C51語言的預處理命令。對于一些常用的常數,如TRUE,FALSE,PI以及各種特殊功能寄存器,或程序中一些重要的依據外界條件可變的常量,可采用宏定義"#define"或集中起來放在一個頭文件中進行定義,再采用文件包含命令"#include"將其加入到程序中去。這樣當需要修改某個參量時,只須修改相應的包含文件或宏定義,而不必對使用它們的每個程序文件都作修改,從而有利于文件的維護和更新。現舉例說明如下:

例1對于不同的單片機晶振,程序取不同的延時時間,而且可根據外界條件的變化修改延時時間的長短。對于這樣的程序,可利用宏定義和條件編譯來實現。程序如下:

#defineflag1

#ifdefflag==1

#definefosc6M

delay=10;

#elifflag==0

#definefosc8M

delay=12;

#else

#definefosc12M

delay=20;

#endif

main()

{

for(I=0;I<delay;I++);

}

這樣源程序不作任何修改就可適用于不同時鐘頻率的單片機系統,并可根據情況的不同取不同的delay值,完成不同的目的。

2C51語言與匯編語言程序的混合編程

C51編譯器能對C語言源程序進行高效率的編譯,生成高效簡潔的代碼,在絕大多數場合采用C語言編程即可完成預期的目的。但有時為了編程直觀或某些特殊地址的處理,還須采用一定的匯編語言編程。而在另一些場合,出于某種目的,匯編語言也可調用C語言。在這種混合編程中,關鍵是參數的傳遞和函數的返回值。它們必須有完整的約定,否則數據的交換就可能出錯。下面就以力源公司的10位串行A/D轉換器TLC1549為例說明C語言程序與匯編語言程序的調用。

圖1TLC1549管腳圖

1549的管腳圖和時序圖分別如圖1和圖2所示,假定DATAOUT接P1.0,接P1.1,CLOCK接P1.2。

1549的具體特性請查閱有關資料。

例2C語言程序與匯編語言程序的調用,其子程序如下:

PUBLICAD;入口地址

SEG_ADSEGMENTCODE;程序段

RSEGSEG_AD

USING0

AD:MOVR6,#00

MOVR7,#00

SETBP1.1

ACALLDELAY

CLRP1.1

ACALLDELAY

MOVR0,#10

RR0:SETBP1.2

NOP

CLRP1.2

DJNZR0,RR0

ACALLDELAY

MOV30H,R6;A/D轉換的高

;兩位保存在R6中

ACALLCIR

MOVR6,30H

SETBP1.2

NOP

CLRP1.2

MOV30H,R6

ACALLCIR

MOVR6,30H

MOVR0,#8;A/D轉換的低

;8位保存在R7中

RR2:SETBP1.2

NOP

CLRP1.2

MOV30H,R7

ACALLCIR

MOVR7,30H

DJNZR0,RR2

RET

CIR:CLRC

MOVC,P1.0

MOVA,30H

RLCA

MOV30H,A

RET

END

在以上程序中,函數的返回值為一無符號整型數,根據調用規則,返回值的高位必須在R6中,低位在R7中,這樣才可保證數據的傳遞不出錯。另外,在調用過程中,必須注意寄存器的入棧。這樣在以后用到A/D轉換時,在C語言中調用匯編語言子程序AD()即可。

3C51中斷處理過程

C51編譯器支持在C源程序中直接開發中斷過程,因此減輕了使用匯編語言的繁瑣工作,提高了開發效率。中斷服務函數的完整語法如下:

void函數名(void)[模式]

[再入]interruptn[usingr]

其中n(0~31)代表中斷號。C51編譯器允許32個中斷,具體使用哪個中斷由80C51系列的芯片決定。r(0~3)代表第r組寄存器。在調用中斷函數時,要求中斷過程調用的函數所使用的寄存器組必須與其相同。"再入"用于說明中斷處理函數有無"再入"能力。C51編譯器及其對C語言的擴充允許編程者對中斷所有方面的控制和寄存器組的使用。這種支持能使編程者創建高效的中斷服務程序,用戶只須在C語言下關心中斷和必要的寄存器組切換操作。

例3設單片機的fosc=12MHz,要求用T0的方式1編程,在P1.0腳輸出周期為2ms的方波。

用C語言編寫的中斷服務程序如下:

#include<reg51.h>

sbitP1_0=P1^0;

voidtimer0(void)interrupt1using1{

/*T0中斷服務程序入口*/

P1_0=!P1_0;

TH0=-(1000/256);/*計數初值重裝*/

TL0=-(1000%256);

}

voidmain(void)

{

TMOD=0x01;/*T0工作在定時器方式1*/

P1_0=0;

TH0=-(1000/256);/*預置計數初值*/

TL0=-(1000%256);

EA=1;/*CPU開中斷*/

ET0=1;/*T0開中斷*/

TR0=1;/*啟動T0*/

do{}while(1);

}

在編寫中斷服務程序時必須注意不能進行參數傳遞,不能有返回值。

4結論

C51編譯器不但可以縮短單片機控制系統的開發周期,而且易于調試和維護。此外,C51語言還有許多強大的功能,如提供豐富的庫函數供用戶直接調用,完整的編譯控制指令為程序調試提供必要的符號信息等等。總之,C51語言是廣大單片機開發人員的強有力的工具。