主要特點
單片機C51語言兼備高級語言與低級語言的優點。
語法結構和標準C語言基本一致,語言簡潔,便於學習。
運行於單片機平台,支持的微處理器種類繁多,可移植性好。對於兼容的8051系列單片機,只要將一個硬體型號下的程式稍加修改,甚至不加改變,就可移植到另一個不同型號的單片機中運行。
具有高級語言的特點,儘量減少底層硬體暫存器的操作。
單片機C51語言提供了完備的數據類型、運算符及函式供使用。
C51語言是一種結構化程式設計語言,可以使用一對花括弧“{}”將一系列語句組合成一個複合語句,程式結構清晰明了。
C51語言代碼執行的效率方面十分接近彙編語言,且比彙編語言的程式易於理解,便於代碼共享。
“Hello world”程式
編程技巧
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;
#endif
main()
{
for(I=0;I
}
這樣源程式不作任何修改就可適用於不同時鐘頻率的單片機系統,並可根據情況的不同取不同的delay值,完成不同的目的。
混合編程
C51編譯器能對C語言源程式進行高效率的編譯,生成高效簡潔的代碼,在絕大多數場合採用C語言編程即可完成預期的目的。但有時為了編程直觀或某些特殊地址的處理,還須採用一定的彙編語言編程。而在另一些場合,出於某種目的,彙編語言也可調用C語言。在這種混合編程中,關鍵是參數的傳遞和函式的返回值。它們必須有完整的約定,否則數據的交換就可能出錯,例 C語言程式與彙編語言程式的調用,其子程式如下:
PUBLIC AD ;入口地址
SEG_AD SEGMENT CODE ;程式段
RSEG SEG_AD
USING 0
AD: MOV R6,#00
MOV R7,#00
SETB P1.1
ACALL DELAY
CLR P1.1
ACALL DELAY
MOV R0,#10
RR0: SETB P1.2
NOP
CLR P1.2
DJNZ R0,RR0
ACALL DELAY
MOV 30H,R6 ;A/D轉換的高
;兩位保存在R6中
ACALL CIR
MOV R6,30H
SETB P1.2
NOP
CLR P1.2
MOV 30H,R6
ACALL CIR
MOV R6,30H
MOV R0,#8 ;A/D轉換的低
;8位保存在R7中
RR2: SETB P1.2
NOP
CLR P1.2
MOV 30H,R7
ACALL CIR
MOV R7,30H
DJNZ R0,RR2
RET
CIR: CLR C
MOV C,P1.0
MOV A,30H
RLC A
MOV 30H,A
RET
END
在以上程式中,函式的返回值為一無符號整型數,根據調用規則,返回值的高位必須在R6中,低位在R7中,這樣才可保證數據的傳遞不出錯。另外,在調用過程中,必須注意暫存器的入棧。這樣在以後用到A/D轉換時,在C語言中調用彙編語言子程式AD()即可。
數據類型
在C51語言中,每個變數或者常量在使用前都必須指明數據類型。