C51語言

單片機語言

單片機C51語言是由C語言繼承而來的。和C語言不同的是,C51語言運行於單片機平台,而C語言則運行於普通的桌面平台。C51語言具有C語言結構清晰的優點,便於學習,同時具有彙編語言的硬體操作能力。對於具有C語言編程基礎的讀者,能夠輕鬆地掌握單片機C51語言的程序設計。

主要特點


單片機C51語言兼備高級語言與低級語言的優點。
單片機C51實驗板
單片機C51實驗板
語法結構和標準C語言基本一致,語言簡潔,便於學習。
運行於單片機平台,支持的微處理器種類繁多,可移植性好。對於兼容的8051系列單片機,只要將一個硬體型號下的程序稍加修改,甚至不加改變,就可移植到另一個不同型號的單片機中運行。
具有高級語言的特點,盡量減少底層硬體寄存器的操作。
單片機C51語言提供了完備的數據類型、運算符函數供使用。
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;
#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語言中,每個變數或者常量在使用前都必須指明數據類型。