糯米文學吧

位置:首頁 > 計算機 > C語言

c51語言程序設計的若干問題

C語言2.57W
  c51語言程序設計的若干問題

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

c51語言程序設計的若干問題

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

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

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

#define flag 1#ifdef flag==1 #define fosc 6m delay=10;#elif flag = = 0#define fosc 8m delay=12;#else#define fosc 12m delay=20;#endifmain(){for(i=0;i<delay;i++);}

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

2 c51語言與彙編語言程序的混合編程

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

圖1 tlc1549管腳圖

1549的管腳圖和時序圖分別如圖1和圖2所示,假定data out接p1.0, 接p1.1,clock接p1.2。

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

圖2 tlc1549時序圖

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

public ad ;入口地址seg_ad segment code ;程序段 rseg seg_adusing 0 ad:mov r6,#00mov r7,#00setb p1.1acall delayclr p1.1acall delaymov r0,#10 rr0:setb p1.2nopclr p1.2djnz r0,rr0acall delaymov 30h,r6 ;a/d轉換的高 ;兩位保存在r6中acall cirmov r6,30hsetb p1.2nopclr p1.2mov 30h,r6acall cirmov r6,30hmov r0,#8 ;a/d轉換的低 ;8位保存在r7中 rr2:setb p1.2nopclr p1.2mov 30h,r7acall cirmov r7,30hdjnz r0,rr2ret cir:clr cmov c,p1.0mov a,30hrlc amov 30h,aretend

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

3 c51中斷處理過程

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

void 函數名(void)[模式]

[再入]interrupt n [using r]

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

例3 設單片機的fosc=12mhz,要求用t0的方式1編程,在p1.0腳輸出週期為2ms的方波。

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

#includesbit p1_0=p1^0;void timer0(void)interrupt 1 using 1 { /*t0中斷服務程序入口*/p1_0=!p1_0;th0=-(1000/256); /*計數初值重裝*/tl0=-(1000%256);}void main(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語言是廣大單片機開發人員的強有力的工具。