11.11 51單片機編程規範簡述

1單片機C51編程規範- 前言

為了提高源程序的質量和可維護性,從而最終提高軟件產品生產力,特編寫此規範。


2 單片機C51編程規範-範圍

本標準規定了程序設計人員進行程序設計時必須遵循的規範。本規範主要針對C51編程語言和keil編譯器而言,包括排版、註釋、命名、變量使用、代碼可測性、程序效率、質量保證等內容。

3 單片機C51編程規範-總則

l 格式清晰

l 註釋簡明扼要

l 命名規範易懂

l 函數模塊化

l 程序易讀易維護

l 功能準確實現

l 代碼空間效率和時間效率高

l 適度的可擴展性


4 單片機C51編程規範-數據類型定義

編程時統一採用下述新類型名的方式定義數據類型。

建立一個datatype.h文件,在該文件中進行如下定義:

typedef bit bool; // 位變量 //

typedef unsigned char uint8; // 無符號8位整型變量 //

typedef signed char int8; // 有符號8位整型變量 //

typedef unsigned int uint16; // 無符號16位整型變量 //

typedef signed int int16; // 有符號16位整型變量 //

typedef unsigned long uint32; // 無符號32位整型變量 //

typedef signed long int32; // 有符號32位整型變量 //

typedef float fp32; // 單精度浮點數(32位長度) //

typedef double fp64; // 雙精度浮點數(64位長度) //

5 單片機C51編程規範-標識符命名

5.1 命名基本原則

l 命名要清晰明瞭,有明確含義,使用完整單詞或約定俗成的縮寫。通常,較短的單詞可通過去掉元音字母形成縮寫;較長的單詞可取單詞的頭幾個字母形成縮寫。即"見名知意"。

l 命名風格要自始至終保持一致。

l 命名中若使用特殊約定或縮寫,要有註釋說明。

l 除了編譯開關/頭文件等特殊應用,應避免使用以下劃線開始和/或結尾的定義。

l 同一軟件產品內模塊之間接口部分的標識符名稱之前加上模塊標識。

5.2 宏和常量命名

宏和常量用全部大寫字母來命名,詞與詞之間用下劃線分隔。對程序中用到的數字均應用有意義的枚舉或宏來代替。

5.3 變量命名

變量名用小寫字母命名,每個詞的第一個字母大寫。類型前綴(u8\\s8 etc.)全局變量另加前綴g_。

局部變量應簡明扼要。局部循環體控制變量優先使用

i、j、k等;

局部長度變量優先使用len、num等;

臨時中間變量優先使用temp、tmp等。

5.4 函數命名

函數名用小寫字母命名,每個詞的第一個字母大寫,並將模塊標識加在最前面。

5.5 文件命名

一個文件包含一類功能或一個模塊的所有函數,文件名稱應清楚表明其功能或性質。

每個.c文件應該有一個同名的.h文件作為頭文件。

6 單片機C51編程規範-註釋

6.1 註釋基本原則

l 有助於對程序的閱讀理解,說明程序在"做什麼",解釋代碼的目的、功能和採用的方法。

l 一般情況源程序有效註釋量在30%左右。

l 註釋語言必須準確、易懂、簡潔。

l 邊寫代碼邊註釋,修改代碼同時修改相應的註釋,不再有用的註釋要刪除。

6.2 文件註釋

文件註釋必須說明文件名、函數功能、創建人、創建日期、版本信息等相關信息。

修改文件代碼時,應在文件註釋中記錄修改日期、修改人員,並簡要說明此次修改的目的。所有修改記錄必須保持完整。

文件註釋放在文件頂端,用"/*……*/"格式包含。

註釋文本每行縮進4個空格;每個註釋文本分項名稱應對齊。

/***********************************************************

文件名稱:

作 者:

版 本:

說 明:

修改記錄:

***********************************************************/

6.3 函數註釋

6.3.1函數頭部註釋

函數頭部註釋應包括函數名稱、函數功能、入口參數、出口參數等內容。如有必要還可增加作者、創建日期、修改記錄(備註)等相關項目。

函數頭部註釋放在每個函數的頂端,用"/*……*/"的格式包含。其中函數名稱應簡寫為FunctionName(),不加入、出口參數等信息。

/***********************************************************

函數名稱:

函數功能:

入口參數:

出口參數:

備 注:

***********************************************************/

6.3.2代碼註釋

代碼註釋應與被註釋的代碼緊鄰,放在其上方或右方,不可放在下面。如放於上方則需與其上面的代碼用空行隔開。一般少量註釋應該添加在被註釋語句的行尾,一個函數內的多個註釋左對齊;較多註釋則應加在上方且註釋行與被註釋的語句左對齊。

函數代碼註釋用"//…//"的格式。

通常,分支語句(條件分支、循環語句等)必須編寫註釋。其程序塊結束行"}"的右方應加表明該程序塊結束的標記"end of ……", 尤其在多重嵌套時。

6.4 變量、常量、宏的註釋

同一類型的標識符應集中定義,並在定義之前一行對其共性加以統一註釋。對單個標識符的註釋加在定義語句的行尾。

全局變量一定要有詳細的註釋,包括其功能、取值範圍、哪些函數或過程存取它以及存取時的注意事項等。

註釋用"//…//"的格式。


7 單片機C51編程規範-函數

7.1 設計原則

函數的基本要求:

l 正確性:程序要實現設計要求的功能。

l 穩定性和安全性:程序運行穩定、可靠、安全。

l 可測試性:程序便於測試和評價。

l 規範/可讀性:程序書寫風格、命名規則等符合規範。

l 擴展性:代碼為下一次升級擴展留有空間和接口。

l 全局效率:軟件系統的整體效率高。

l 局部效率:某個模塊/子模塊/函數的本身效率高。

編制函數的基本原則:

l 單個函數的規模儘量限制在200行以內(不包括註釋和空行)。一個函數只完成一個功能。

l 函數局部變量的數目一般不超過5~10個。

l 函數內部局部變量定義區和功能實現區(包含變量初始化)之間空一行。

l 函數名應準確描述函數的功能。通常使用動賓詞組為執行某操作的函數命名。

l 函數的返回值要清楚明瞭,尤其是出錯返回值的意義要準確無誤。

l 不要把與函數返回值類型不同的變量,以編譯系統默認的轉換方式或強制的轉換方式作為返回值返回。

l 減少函數本身或函數間的遞歸調用。

l 儘量不要將函數的參數作為工作變量。

7.2 函數定義

l 函數若沒有入口參數或者出口參數,應用void明確申明。

l 函數名稱與出口參數類型定義間應該空一格且只空一格。

l 函數名稱與括號()之間無空格。

l 函數形參必須給出明確的類型定義。

l 多個形參的函數,後一個形參與前一個形參的逗號分割符之間添加一個空格。

l 函數體的前後花括號"{}" 各獨佔一行。

7.3 局部變量定義

l 同一行內不要定義過多變量。

l 同一類的變量在同一行內定義,或者在相鄰行定義。

l 先定義data型變量,再定義idtata型變量,再定義xdata型變量.

l 數組、指針等複雜類型的定義放在定義區的最後。

l 變量定義區不做較複雜的變量賦值。

7.4 功能實現區規範

l 一行只寫一條語句。

l 注意運算符的優先級,並用括號明確表達式的操作順序,避免使用默認優先級。

l 各程序段之間使用一個空行分隔,加以必要的註釋。程序段指能完一個較具體的功能的一行或多行代碼。程序段內的各行代碼之間相互依賴性較強。

l 不要使用難懂的技巧性很高的語句。

l 源程序中關係較為緊密的代碼應儘可能相鄰。

l 完成簡單功能、關係非常密切的一條或幾條語句可編寫為函數或定義為宏。

8 單片機C51編程規範-排版

8.1 縮進

代碼的每一級均往右縮進4個空格的位置。

8.2 分行

過長的語句(超過80個字符)要分成多行書寫;長表達式要在低優先級操作符處劃分新行,操作符放在新行之首,劃分出的新行要進適當的縮進,使排版整齊,語句可讀。避免把註釋插入分行中。

8.3 空行

l 文件註釋區、頭文件引用區、函數間應該有且只有一行空行。

l 相鄰函數之間應該有且只有一行空行。

l 函數體內相對獨立的程序塊之間可以用一行空行或註釋來分隔。

l 函數註釋和對應的函數體之間不應該有空行。

l 文件末尾有且只有一行空行。

8.4 空格

l 函數語句尾部或者註釋之後不能有空格。

l 括號內側(即左括號後面和右括號前面)不加空格,多重括號間不加空格。

l 函數形參之間應該有且只有一個空格(形參逗號後面加空格)。

l 同一行中定義的多個變量間應該有且只有一個空格(變量逗號後面加空格)。

l 表達式中,若有多個操作符連寫的情況,應使用空格對它們分隔:

在兩個以上的關鍵字、變量、常量進行對等操作時,它們之間的操作符前後均加一個空格;在兩個以上的關鍵字、變量、常量進行非對等操作時,其前後均不應加空格;

逗號只在後面加空格;

雙目操作符,如比較操作符, 賦值操作符"="、"+=",算術操作符"+"、"%",邏輯操作符"&&"、"&",位操作符"<

單目操作符,如"!"、"~"、"++"、"-"、"&"(地址運算符)等,前後不加空格;

"->"、"."前後不加空格;

if、for、while、switch等關鍵字與後面的括號間加一個空格;

8.5 花括號

l if、else if、else、for、while語句無論其執行體是一條語句還是多條語句都必須加花括號,且左右花括號各獨佔一行。

l do{}while()結構中,"do"和"{"均各佔一行,"}"和"while();"共同佔用一行。

if ( ) do

{ {

} }while( );

else

{

}

8.6 switch語句

l 每個case和其判據條件獨佔一行。

l 每個case程序塊需用break結束。特殊情況下需要從一個case塊順序執行到下一個case塊的時候除外,但需要在交界處明確註釋如此操作的原因,以防止出錯。

l case程序塊之間空一行,且只空一行。

l 每個case程序塊的執行語句保持4個空格的縮進。

l 一般情況下都應該包含default分支。

Switch ( )

{

case x:

break;

case x:

break;

default:

break;

}

9 單片機C51編程規範-程序結構

9.1 基本要求

l 有main()函數的.c文件應將main()放在最前面,並明確用void聲明參數和返回值。

l 對由多個.c文件組成的模塊程序或完整監控程序,建立公共引用頭文件,將需要引用的庫頭文件、標準寄存器定義頭文件、自定義的頭文件、全局變量等均包含在內,供每個文件引用。通常,標準函數庫頭文件採用尖角號< >標誌文件名,自定義頭文件採用雙撇號″″標誌文件名。

l 每個.c文件有一個對應的.h文件,.c文件的註釋之後首先定義一個唯一的文件標誌宏,並在對應的.h文件中解析該標誌。

在.c文件中:

#define FILE_FLAG

在.h文件中:

#ifdef FILE_FLAG

#define XXX

#else

#define XXX extern

#endif

l 對於確定只被某個.c文件調用的定義可以單獨列在一個頭文件中、單獨調用。

9.2 可重入函數

可重入函數中若使用了全局變量,應通過關中斷、信號量等操作手段對其加以保護。

9.3 函數的形參

l 由函數調用者負責檢查形參的合法性。

l 儘量避免將形參作為工作變量使用。

9.4 循環

l 儘量減少循環嵌套層數

l 在多重循環中,應將最忙的循環放在最內層

l 循環體內工作量最小

l 儘量避免循環體內含有判斷語句

51單片機編程規範簡述


分享到:


相關文章: