基于單片機的壓力傳感器實驗_第1頁
基于單片機的壓力傳感器實驗_第2頁
基于單片機的壓力傳感器實驗_第3頁
基于單片機的壓力傳感器實驗_第4頁
基于單片機的壓力傳感器實驗_第5頁
已閱讀5頁,還剩75頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、貴 州 大 學 課 程 設(shè) 計 說 明 書 PAGE - 79 - 課 程 設(shè) 計 說 明 書題目: 基于單片機壓力傳感器設(shè)計 學院(系): 年級專業(yè): 電子信息科學與技術(shù) 學 號: 學生姓名: 指導教師: 目錄摘要 2關(guān)鍵字 2第一章 總體設(shè)計方案及模塊劃分21.1總體設(shè)計方案31.2模塊劃分41.3設(shè)計框圖如下圖所示5第二章各模塊設(shè)計參數(shù)52.1傳感器元件模塊52.2 A/D轉(zhuǎn)換模塊82.3控制器處理模塊12 2.4 AD0809接口電路及LED接口電路14第三章 壓力傳感器實驗數(shù)據(jù)采集、顯示及程序14 3.1數(shù)據(jù)采集及顯示14第四章 心得體會15附錄 16程序設(shè)計 16參考文獻資料 25

2、實物圖 25摘要 此次設(shè)計是基于8051單片機的壓力檢測系統(tǒng),簡要介紹了壓力傳感器電路的工作原理和弱信號傳感器電路以及A/D變換電路的工作原理,通過壓力傳感器將需要測量的位置的壓力信號轉(zhuǎn)化為電信號,再經(jīng)過運算放大器進行信號放大,送至8位AD轉(zhuǎn)換器ADC0808,然后將模擬信號轉(zhuǎn)換成單片機可以識別的數(shù)字信號,再經(jīng)單片機轉(zhuǎn)換成LED顯示器可以識別的信息,最后顯示輸出。 關(guān)鍵詞: 單片機 壓力傳感器A/D變換電路LED顯示器第一章總體設(shè)計方案及模塊劃分1.1 總體設(shè)計方案本次設(shè)計是基于8051單片機的測量與顯示。電路采用ADC0809模數(shù)轉(zhuǎn)換電路,ADC0809是CMOS工藝,采用逐次逼近法的8位A

3、/D轉(zhuǎn)換芯片,片內(nèi)有帶鎖存功能的8路模擬電子開關(guān),先用ADC0809的轉(zhuǎn)換器對各路電壓值進行采樣,然后將模擬信號轉(zhuǎn)換成單片機可以識別的數(shù)字信號,再經(jīng)單片機轉(zhuǎn)換成LED顯示器可以識別的信息,最后顯示輸出。本次設(shè)計是以單片機組成的壓力測量,系統(tǒng)中必須有前向通道作為電信號的輸入通道,用來采集輸入信息。壓力的測量,需要傳感器,利用傳感器將壓力轉(zhuǎn)換成電信號后,再經(jīng)放大并經(jīng)A/D轉(zhuǎn)換為數(shù)字量后才能由計算機進行有效處理。然后用LED進行顯示。本設(shè)計的最終結(jié)果是,將軟件下載到硬件上調(diào)試出來了需要顯示的數(shù)據(jù),當輸入的模擬信號發(fā)生變化的時候,通過A/D轉(zhuǎn)換后,LED將顯示不同的數(shù)值。1.2 模塊劃分傳感器元件模塊

4、 傳感器元件主要是對壓力這樣的物理量轉(zhuǎn)變成電信號。A/D轉(zhuǎn)換電路模塊 A/D轉(zhuǎn)換電路是將模擬量轉(zhuǎn)換為數(shù)字量,便于單片機的處理??刂破魈幚砟K 控制器是通過51系列單片機對數(shù)字信號,按照預定目的進行處理。顯示與報告模塊 顯示與報告是對于最終輸出結(jié)果進行直觀的表達。1.3設(shè)計框圖如下圖所示:圖1.3.1 設(shè)計框圖第二章 各模塊設(shè)計參數(shù)2.1傳感器元件模塊壓力傳感器是壓力檢測系統(tǒng)中的重要組成部分,由各種壓力敏感元件將被測壓力信號轉(zhuǎn)換成容易測量的電信號作輸出,給顯示儀表顯示壓力值,或供控制和報警使用。力學傳感器的種類繁多,如 HYPERLINK o 電阻 t _blank 電阻應變片 HYPERLIN

5、K o 壓力傳感器 t _blank 壓力傳感器、半導體應變片 HYPERLINK o 壓力傳感器 t _blank 壓力傳感器、壓阻式 HYPERLINK o 壓力傳感器 t _blank 壓力傳感器、電感式 HYPERLINK o 壓力傳感器 t _blank 壓力傳感器、 HYPERLINK o 電容 t _blank 電容式 HYPERLINK o 壓力傳感器 t _blank 壓力傳感器諧振式 HYPERLINK o 壓力傳感器 t _blank 壓力傳感器及 HYPERLINK o 電容 t _blank 電容式加速度傳感器等。 而電阻應變式傳感器具有悠久的歷史。由于它具有結(jié)構(gòu)簡單

6、、體積小、使用方便、性能穩(wěn)定、可靠、靈敏度高動態(tài)響應快、適合靜態(tài)及動態(tài)測量、測量精度高等諸多優(yōu)點,因此是目前應用最廣泛的傳感器之一,本實驗采用電阻應變式傳感器作為壓力傳感器。壓力傳感器構(gòu)成:電阻應變式傳感器由彈性元件和電阻應變片構(gòu)成,當彈性元件感受到物理量時,其表面產(chǎn)生應變,粘貼在彈性元件表面的電阻應變片的電阻值將隨著彈性元件的應變而相應變化。通過測量電阻應變片的電阻值變化,可以用來測量位移加速度、力、力矩、壓力等各種參數(shù)。壓力傳感器的工作原理:本質(zhì)上是惠斯通電橋,這里采用的是最常見的電阻應變片式的壓力傳感器。它得到廣泛應用的原因是溫度特性好,減小溫度變化帶來的誤差。膜片上的壓力使得電橋不平衡

7、,從而產(chǎn)生一個差動的輸出信號,這種結(jié)構(gòu)的基本特性之一是它的差動輸出電壓U與偏置電壓U成正比關(guān)系,這種關(guān)系隱含壓力測量精度直接決定偏置電源的容限值,當四個橋臂電阻達到相應的關(guān)系時,電橋輸出為零,或則就有電壓輸出同時,它也能提供一種溫度補償最通用的方法。本實驗研究壓力傳感器電路如圖2.1.1所示,為壓力傳感器的電路,其由三部分組成(1)電源電路部分;(2)電橋電路部分;(3)放大電路部分。 圖2.1.1壓力傳感器電路 如圖示,傳感器采用恒壓源供電,為+15V,經(jīng)過與分壓(電容起濾波作用),點5、6、7三點處有相同電壓: (2.1.1) 根據(jù)上式,帶入數(shù)據(jù) , ,求得。 經(jīng)過電路電橋部分,簡化如下圖

8、2.1.2 UO圖2.1.2壓力傳感器電橋電路設(shè)橋臂電阻分別為, ,則當壓力傳感器受力時,電阻變化對應的輸出電壓值為,由于 100us;*;工程量代換:B存高八位,A存低八位;程序中除以256相當于右移八位,即高八位變?yōu)檎麛?shù)位,低八位變?yōu)樾?shù)位;最后結(jié)果為: B存整數(shù)部分,A存小數(shù)部分;*DAIHUAN:MOV B,#200MOV A,ADResultMUL AB MOV 51H,A;小數(shù)部分MOV 50H,B;整數(shù)部分RET;INT1查詢服務子程式;INT: MOV DPTR,#8000HMOVX A, DPTR ; 讀入結(jié)果CALL CLSMOV A,#10000000B ;將二進制100

9、00000的值放入累加器內(nèi),代表設(shè)定DDRAM的地址為00H, ;即將光標移到第一行第一個列的位置上。 CALL Write_instruction ;調(diào)用寫指令碼子程式。 MOV DPTR,#LINE1 ;將第一行字串在程式記憶體中的起始地址存入DPTR CALL STRING ;調(diào)用STRING子程式,將字串顯示到LCMMOV A,#11000010B ;將二進制11000000的值放入累加器內(nèi),代表設(shè)定DDRAM的地址為40H, ;即將光標移到第二行第三個列的位置上 CALL Write_instruction ;調(diào)用寫指令碼子程式。 MOV A,#50H MOV ADResult, A

10、 CALL DAIHUAN MOV DPTR,#LINE2 ;將第二行字串在程式記憶體中的起始地址存DPTR。 CALL DATE ;調(diào)用DATE子程式,將數(shù)據(jù)顯示到LCM RETI;TO中斷服務子程式;INSERS: MOV TH0,#0 MOV TL0,#0 DJNZ R5,NO MOV R5,#50 NO: RETI ;Initial子程序設(shè)定LCM使用8BITS匯流排,顯示兩行,;使用5*7字型,顯示器要顯示光標要顯示但不閃爍;Initial: MOV A,#00111000B ; CALL Write_instruction ;第一次設(shè)置顯示模式 MOV A,#00111000B ;

11、 CALL Write_instruction ;第二次設(shè)置顯示模式 MOV A,#00111000B ; CALL Write_instruction ;第三次設(shè)置顯示模式 MOV A,#00111000B ; CALL Write_instruction ;第四次設(shè)置顯示模式 MOV A,#00001110B ; CALL Write_instruction ;設(shè)置光標 MOV A,#00000110B ; CALL Write_instruction ;設(shè)置LCD數(shù)據(jù)指針自動加一 RET;CheckBusy子程序;等待LCM有空可以執(zhí)行下一行命令;CheckBusy: PUSH ACC

12、;將累加器ACC的內(nèi)容放到堆棧內(nèi), ;以免破壞原來的ACC的資料CheckBusyLoop: CLR ENABLE ;設(shè)定E=0,禁能讀模式 SETB R_W ;設(shè)定R/W=1,選擇讀模式 CLR RS ;設(shè)定RS=0,選擇指令寄存器IR SETB ENABLE ;將P3.3腳設(shè)定為1,使能LCM MOV A,DB0_DB7 ;將存在ACC內(nèi)的資料經(jīng)由P1存入ACC中 ;以便查封第7位元及BF是否為0什么 CLR ENABLE ;將P3.3腳設(shè)定為0 MOV A,#00H JB ACC.7,CheckBusyLoop ; 判斷由LCM讀入資料的第7位及BF ;是否為1,若等于1表示LCM忙碌中

13、,CPU ;跳到標記CheckBusyLoop繼續(xù)執(zhí)行程序 POP ACC ;將累加器ACC內(nèi)容從堆棧區(qū)取出 CALL DELAY ;調(diào)用延遲子程序,延時約數(shù)個mS RET ;返回主程序;Write_instruction子程序;將ACC內(nèi)的資料輸入到LCM的IR寄存器;Write_instruction: CALL CheckBusy ;調(diào)用CheckBusy子程序確定LCM可以執(zhí)行指令 CLR ENABLE ;設(shè)定E=0,禁能LCM CLR R_W ;設(shè)定R/W=0,選擇寫模式 CLR RS ;設(shè)定RS=0,選擇指令寄存器IR SETB ENABLE ;將P3.3腳設(shè)定為1,使能LCM M

14、OV DB0_DB7,A ;將存在ACC內(nèi)的指令碼經(jīng)由P1輸出到LCM CLR ENABLE ;將P3.3設(shè)定為0,MCS-51向LCM存取資料后, ;必須將LCM的E腳輸出0,讓LCM禁能(Disable) ;不做介面的資料傳送或設(shè)定 RET ;返回主程序;WriteLCDData子程序;將ACC內(nèi)的資料輸入到LCM的DR寄存器;WriteLCDData: CALL CheckBusy ;調(diào)用CheckBusy子程序,確定LCM可以執(zhí)行指令 CLR ENABLE ;設(shè)定E=0,禁能LCM CLR R_W ;設(shè)定R/W=0,選擇寫模式 SETB RS ;設(shè)定RS=1,選擇U寄資料存器DR SE

15、TB ENABLE ;將P3.3腳設(shè)定為1,使能LCM MOV DB0_DB7,A ;將存在ACC內(nèi)的指令碼經(jīng)由P0輸出到LCM CLR ENABLE RET ;返回主程序;CLS子程序清除LCM的顯示字幕;CLS: MOV A,#01H CALL Write_instruction RET;DATE子程序;壓力數(shù)據(jù)的掃描顯示;DATE:PUSH ACC;入棧累加器APUSH PSW;入棧PSW中的CYHIG:MOV R1,#50HMOV A,R1CJNE A,#64H,CJ1;判斷是否等于100,等于100則直接顯示100MOV A,#01HMOVC A,A+DPTRLCALL WriteL

16、CDDataDEC ALCALL WriteLCDDataLCALL WriteLCDDataSJMP XSDCJ1:JC SHI;判斷是否大于100 大于100則繼續(xù)執(zhí)行分位操作MOV B,#64H;否則跳轉(zhuǎn)到十位分位程序DIV AB;除法做分位處理MOVC A,A+DPTRLCALL WriteLCDDataMOV A,BSHI:CLR CCJNE A,#0AH,CJ2;判斷是否等于10等于10則直接顯示10MOV A,#01HMOVC A,A+DPTRLCALL WriteLCDDataDEC ALCALL WriteLCDDataSJMP XSDCJ2:JC GEE;判斷是否大于10M

17、OV A,B;否則跳轉(zhuǎn)到個位顯示程序GEE:MOV B,#0AHDIV ABMOVC A,A+DPTRLCALL WriteLCDDataMOV A,BMOVC A,A+DPTRLCALL WriteLCDDataXSD:MOV A,#0AH;小數(shù)點顯示程序MOVC A,A+DPTRLCALL WriteLCDDataLOWER:INC R1;小數(shù)位顯示程序 分位原理同上MOV A,R1MOV B,#64HDIV ABMOVC A,A+DPTRLCALL WriteLCDDataMOV A,BMOV B,#0AHDIV ABMOVC A,A+DPTRLCALL WriteLCDDataMOV

18、A,BMOVC A,A+DPTRLCALL WriteLCDDataPOPPSWPOPACCRET;STRING子程序;將一個字幕顯示在LCM,字串的起地址要存入DPTR,字串必須以00H結(jié)束;STRING: PUSH ACC LOOP1: CLR A MOVC A,A+DPTR JZ END_PR CALL WriteLCDData INC DPTR JMP LOOP1 END_PR: POP ACC RET ;DELAY子程所延遲的時間約為2.5mS;延時時間約為R6*(500uS);DELAY: MOV R6,#5 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1

19、 RET DELAY0: MOV R3,#20 D2: MOV R4,#248D3: MOV R2,#200 DJNZ R2,$ DJNZ R4,D3 DJNZ R3,D2 RET END 參考文獻資料:1、單片微型計算機接口技術(shù)及其應用 張淑清 國防工業(yè)出版社單片機原理及應用技術(shù) 張淑清單片機應用技術(shù)匯編實物圖:附錄資料:不需要的可以自行刪除C語言編程規(guī)范(僅供參考)1. 基本要求1.1 程序結(jié)構(gòu)清析,簡單易懂,單個函數(shù)的程序行數(shù)不得超過100行。1.2 打算干什么,要簡單,直接了當,代碼精簡,避免垃圾程序。1.3 盡量使用標準庫函數(shù)和公共函數(shù)。1.4 不要隨意定義全局變量,盡量使用局部變量

20、。1.5 使用括號以避免二義性。2.可讀性要求2.1 可讀性第一,效率第二。2.2 保持注釋與代碼完全一致。2.3 每個源程序文件,都有文件頭說明,說明規(guī)格見規(guī)范。2.4 每個函數(shù),都有函數(shù)頭說明,說明規(guī)格見規(guī)范。2.5 主要變量(結(jié)構(gòu)、聯(lián)合、類或?qū)ο螅┒x或引用時,注釋能反映其含義。2.7 常量定義(DEFINE)有相應說明。2.8 處理過程的每個階段都有相關(guān)注釋說明。2.9 在典型算法前都有注釋。2.10 利用縮進來顯示程序的邏輯結(jié)構(gòu),縮進量一致并以Tab鍵為單位,定義Tab為 6個字節(jié)。2.11 循環(huán)、分支層次不要超過五層。2.12 注釋可以與語句在同一行,也可以在上行。2.13 空行和

21、空白字符也是一種特殊注釋。2.14 一目了然的語句不加注釋。2.15 注釋的作用范圍可以為:定義、引用、條件分支以及一段代碼。2.16 注釋行數(shù)(不包括程序頭和函數(shù)頭說明部份)應占總行數(shù)的 1/5 到 1/3 。3. 結(jié)構(gòu)化要求3.1 禁止出現(xiàn)兩條等價的支路。3.2 禁止GOTO語句。3.3 用 IF 語句來強調(diào)只執(zhí)行兩組語句中的一組。禁止 ELSE GOTO 和 ELSE RETURN。3.4 用 CASE 實現(xiàn)多路分支。3.5 避免從循環(huán)引出多個出口。3.6 函數(shù)只有一個出口。3.7 不使用條件賦值語句。3.8 避免不必要的分支。3.9 不要輕易用條件分支去替換邏輯表達式。4. 正確性與容

22、錯性要求4.1 程序首先是正確,其次是優(yōu)美4.2 無法證明你的程序沒有錯誤,因此在編寫完一段程序后,應先回頭檢查。4.3 改一個錯誤時可能產(chǎn)生新的錯誤,因此在修改前首先考慮對其它程序的影響。4.4 所有變量在調(diào)用前必須被初始化。4.5 對所有的用戶輸入,必須進行合法性檢查。4.6 不要比較浮點數(shù)的相等,如: 10.0 * 0.1 = 1.0 , 不可靠4.7 程序與環(huán)境或狀態(tài)發(fā)生關(guān)系時,必須主動去處理發(fā)生的意外事件,如文件能否邏輯鎖定、打印機是否聯(lián)機等。4.8 單元測試也是編程的一部份,提交聯(lián)調(diào)測試的程序必須通過單元測試。5. 可重用性要求5.1 重復使用的完成相對獨立功能的算法或代碼應抽象為

23、公共控件或類。5.2 公共控件或類應考慮OO思想,減少外界聯(lián)系,考慮獨立性或封裝性。5.3 公共控件或類應建立使用模板。附:C 編程規(guī)范,delphi作相應的參考1適用范圍本標準適用于利用Visul C+ ,Borland C+進行軟件程序開發(fā)的人員.。.2變量命名命名必須具有一定的實際意義,形式為xAbcFgh,x由變量類型確定,Abc、Fgh表示連續(xù)意義字符串,如果連續(xù)意義字符串僅兩個,可都大寫.如OK.具體例程:BOOL類型 bEnable;ch *char chTextc * 類對象 cMain(對象實例)h * Handle(句柄) hWndi * intn * 無符號整型p * 指

24、針sz,str * 字符串w WORDx,y 坐標Char或者TCHAR類型 與Windows API有直接聯(lián)系的用szAppName10形式否則用FileName10形式,單個字符也可用小寫字母表示;Int類型 nCmdShow;LONG類型 lParam;UINT類型 uNotify;DWORD類型 dwStart;PSTR類型 pszTip;LPSTR類型 lpCmdLineLPTSTR類型 lpszClassName;LPVOID類型 lpReservedWPARAM類型 wParam,LPARAM類型 lParamHWND類型 hDlg;HDC類型 hDC;HINSTANCE類型 h

25、InstanceHANDLE類型 hInstance,HICON類型 hIcon;int iTmpfloat fTmpDWORD dw*String , AnsiString str *m_ 類成員變量 m_nVal, m_bFlagg_ 全局變量 g_nMsg, g_bFlag局部變量中可采用如下幾個通用變量:nTemp,nResult,I,J(一般用于循環(huán)變量)。其他資源句柄同上.3常量命名和宏定義常量和宏定義必須具有一定的實際意義;常量和宏定義在#include和函數(shù)定義之間;常量和宏定義必須全部以大寫字母來撰寫,中間可根據(jù)意義的連續(xù)性用下劃線連接,每一條定義的右側(cè)必須有一簡單的注釋,說

26、明其作用;資源名字定義格式:菜單:IDM_XX或者CM_XX位圖:IDB_XX對話框:IDD_XX字符串:IDS_XXDLGINIT:DIALOG_XXICON:IDR_XX.4函數(shù)命名函數(shù)原型說明包括引用外來函數(shù)及內(nèi)部函數(shù),外部引用必須在右側(cè)注明函數(shù)來源:模塊名及文件名, 如是內(nèi)部函數(shù),只要注釋其定義文件名;第一個字母必須使用大寫字母,要求用大小寫字母組合規(guī)范函數(shù)命名,必要時可用下劃線間隔,示例如下:voidUpdateDB_Tfgd (TRACK_NAME); file:/ModuleName :r01/sdw.cvoidPrintTrackData (TRACK_NAME); file:

27、/Module Name :r04/tern.cvoidImportantPoint (void); file:/ModuleName :r01/sdw.cvoidShowChar (int , int , chtype); file:/Local ModulevoidScrollUp_V(int , int); file:/Local Module.5結(jié)構(gòu)體命名結(jié)構(gòu)體類型命名必須全部用大寫字母,原則上前面以下劃線開始;結(jié)構(gòu)體變量命名必須用大小寫字母組合,第一個字母必須使用大寫字母,必要時可用下劃線間隔。對于私有數(shù)據(jù)區(qū),必須注明其所屬的進程。全局數(shù)據(jù)定義只需注意其用途。 示例如下: typed

28、ef struct char szProductName20; char szAuthor20; char szReleaseDate16; char szVersion10; unsigned long MaxTables; unsigned long UsedTables;DBS_DATABASE;DBS_DATABASE GdataBase;6 控件的命名:用小寫前綴表示類別用小寫前綴表示類別:fm 窗口cmd 按鈕cob combo,下拉式列表框txt 文本輸入框lab labal,標簽img image,圖象pic picturegrd Grid,網(wǎng)格scr 滾動條lst 列表框fr

29、m fram7注釋原則上注釋要求使用中文;文件開始注釋內(nèi)容包括:公司名稱、版權(quán)、作者名稱、時間、模塊用途、背景介紹等,復雜的算法需要加上流程說明;函數(shù)注釋包括:輸入、輸出、函數(shù)描述、流程處理、全局變量、調(diào)用樣例等,復雜的函數(shù)需要加上變量用途說明;程序中注釋包括:修改時間和作者、方便理解的注釋等;引用一: 文件開頭的注釋模板/* 文件名:* Copyright (c) 1998-1999 *公司技術(shù)開發(fā)部* 創(chuàng)建人:* 日期:* 修改人:* 日期:* 描述:* 版本:*/引用二: 函數(shù)開頭的注釋模板/* 函數(shù)名:* 輸入: a,b,c* a* b* c* 輸出: x*x 為 1, 表示.*x 為

30、 0, 表示.* 功能描述:* 全局變量:* 調(diào)用模塊:* 作者:* 日期:* 修改:* 日期:* 版本*/引用三: 程序中的注釋模板/*/* 注釋內(nèi)容 */*/8 程序a. 程序編碼力求簡潔,結(jié)構(gòu)清晰,避免太多的分支結(jié)構(gòu)及太過于技巧性的程序,盡量不采用遞歸模式。b. 編寫程序時,亦必須想好測試的方法,換句話說,”單元測試” 的測試方案應在程序編寫時一并擬好。c. 注釋一定要與程序一致。d. 版本封存以后的修改一定要將老語句用/* */ 封閉,不能自行刪除或修改,并要在文件及函數(shù)的修改記錄中加以記錄。e. 程序中每個block 的開頭 ” 及 ” 必須對齊,嵌套的block 每進一套,縮進一個

31、tab,TAB 為4個空格,block類型包括if、for、while、do等關(guān)鍵字引出的。f.對于比較大的函數(shù),每個block 和特殊的函數(shù)調(diào)用,都必須注明其功能,舉例如下:count.divisor = 1193280 / freq; /compute the proper countOutByte(unsigned short)67, (unsigned char)182);/tell 8253 that acount is comingOutByte(unsigned short)66, count. c0);/send low-order byteOutByte(unsigned s

32、hort)66, count. c1);/send high-order bytebcb,delphi中的變量命名:遵循匈牙利命名法,命名必須有意義,制定如下規(guī)定窗體:以大寫的W開始,如About版權(quán)窗體, 命名為WAbout文件:以大寫的F開始,如About版權(quán)窗體,文件命名為FAbout.cpp按鈕(Button):如退出按鈕,命名為btnExit基類:加base標記,如報表基類,窗體命名為:WBaseRep, 文件命名為FBaseRep.cpp轉(zhuǎn)貼 1. 在.h/.cpp的開頭應有一段格式統(tǒng)一的說明,內(nèi)容包括: a. 文件名 (FileName); b. 創(chuàng)建人 (Creater); c

33、. 文件創(chuàng)建時間 (Date); d. 簡短說明文件功能、用途 (Comment)。好習慣 2. 除非極其簡單,否則對函數(shù)應有注釋說明。內(nèi)容包括:功能、入口/出口參數(shù),必要 時還可有備注或補充說明。還是好習慣 3. 每列代碼的長度推薦為 80列,最長不得超過120列;折行以對齊為準。太寬了,我的限制是60列,因為文本方式下屏幕一共80列,如果你用BC這一類的編輯器,窗口邊框等又要占據(jù)一定空間,所以80列太寬 4. 循環(huán)、分支代碼,判斷條件與執(zhí)行代碼不得在同一行上。很對 5. 指針的定義,* 號既可以緊接類型,也可以在變量名之前。 例:可寫做:int*pnsize; 也可寫做:int*pnsiz

34、e; 但不得寫做:int*pnsize;建議采用第二種,除非附加另外一條規(guī)定:一次只聲明一個變量,否則就會讓人混淆,比如:int* a, b;看起來b好像也是個指針,其實不是。 6. 在類的成員函數(shù)內(nèi)調(diào)用非成員函數(shù)時,在非成員函數(shù)名前必須加上:。這一條我倒覺得并不是必需的,我的看法是決不要讓你的類成員函數(shù)和全局函數(shù)的名稱相同(或類似) 7. 函數(shù)入口參數(shù)有缺省值時,應注釋說明。 例:BOOL CWpsDib:PaintDIB(CDC* pDC, CRect& rc,int nBrightness, file:/*=0*/BOOL bGrayScale file:/*=FALSE*/ )每個變量

35、寫一行,必要時加上/*in, out*/注釋 8. elseif 必須寫在一行。應該盡量避免else if這樣的結(jié)構(gòu) 9. 與、有關(guān)的各項規(guī)定:9.1、應獨占一行。在該行內(nèi)可有注釋。 9.2 必須另起一行, 之后的代碼必須縮進一個Tab。與必須在同 一列上。 9.3 在循環(huán)、分支之后若只有一行代碼,雖然可省略、,但不推薦這么 做。若省略后可能引起歧義,則必須加上、。持保留意見,因為GNU的代碼規(guī)范是這樣的:if ( NULL = ptr )/ do something here或者if ( NULL = ptr ) / do something here爭論哪個更好并沒有意義,關(guān)鍵是統(tǒng)一,如果

36、用VC當然你的辦法最方便,可是如果你用emacs或者vi,就不是這樣了。 10. 與空格有關(guān)的各項規(guī)定。 10.1 在所有兩目、三目運算符的兩邊都必須有空格。在單目運算符兩端不必空格。但 在、:、.、等運算符前后,及&(取地址)、* (取值)等運算符之后不得有空格。 10.2for、while、if 等關(guān)鍵詞之后應有1個空格,再接(,之后無空格;在結(jié)尾 的)前不得有空格。我認為在括號兩端加空格并不是什么錯誤,尤其是在一個條件十分復雜的if語句里 10.3 調(diào)用函數(shù)、宏時,(、)前后不得有空格。 10.4類型強制轉(zhuǎn)換時,()前后不得有空格同上 11. 與縮進有關(guān)的各項規(guī)定 11.1 縮進以 Ta

37、b 為單位。1 個 Tab 為 4 個空格我認為這個值應該更大,我自己使用8個空格,如果你的代碼因為縮進幅度太大而導致折行,那么幾乎可以肯定你的程序設(shè)計方案有問題。 11.2 下列情況,代碼縮進一個 Tab: 1. 函數(shù)體相對函數(shù)名及、。 2. if、else、for、while、do 等之后的代碼。 3. 一行之內(nèi)寫不下,折行之后的代碼,應在合理的位置進行折行。若有 + - * / 等運 算符,則運算符應在上一行末尾,而不應在下一行的行首。這一條我反對,運算符應該放在下一行行首,以使人能清楚的知道這一行是續(xù)上一行的,比如if ( something& somethingelse& other

38、things )如果寫做if ( something &somethingelse &otherthings )反而看不清楚 11.3 下列情況,不必縮進:switch 之后的 case、default。編程規(guī)范與范例目 錄1 排版 62 注釋 113 標識符命名 184 可讀性 205 變量、結(jié)構(gòu) 226 函數(shù)、過程 287 可測性 368 程序效率 409 質(zhì)量保證 4410 代碼編輯、編譯、審查 5011 代碼測試、維護 5212 宏 53 1 排版1-1:程序塊要采用縮進風格編寫,縮進的空格數(shù)為4個。說明:對于由開發(fā)工具自動生成的代碼可以有不一致。1-2:相對獨立的程序塊之間、變量說明

39、之后必須加空行。示例:如下例子不符合規(guī)范。if (!valid_ni(ni) . / program coderepssn_ind = ssn_dataindex.repssn_index;repssn_ni = ssn_dataindex.ni;應如下書寫if (!valid_ni(ni) . / program coderepssn_ind = ssn_dataindex.repssn_index;repssn_ni = ssn_dataindex.ni;1-3:較長的語句(80字符)要分成多行書寫,長表達式要在低優(yōu)先級操作符處劃分新行,操作符放在新行之首,劃分出的新行要進行適當?shù)目s進,使

40、排版整齊,語句可讀。示例:perm_count_msg.head.len = NO7_TO_STAT_PERM_COUNT_LEN + STAT_SIZE_PER_FRAM * sizeof( _UL );act_task_tableframe_id * STAT_TASK_CHECK_NUMBER + index.occupied = stat_poiindex.occupied;act_task_tabletaskno.duration_true_or_false = SYS_get_sccp_statistic_state( stat_item );report_or_not_flag

41、= (taskno MAX_ACT_TASK_NUMBER) & (n7stat_stat_item_valid (stat_item) & (act_task_tabletaskno.result_data != 0); 1-4:循環(huán)、判斷等語句中若有較長的表達式或語句,則要進行適應的劃分,長表達式要在低優(yōu)先級操作符處劃分新行,操作符放在新行之首。示例:if (taskno max_act_task_number) & (n7stat_stat_item_valid (stat_item) . / program codefor (i = 0, j = 0; (i BufferKeyword

42、word_index.word_length) & (j NewKeyword.word_length); i+, j+) . / program codefor (i = 0, j = 0; (i first_word_length) & (j ),后不應加空格。說明:采用這種松散方式編寫代碼的目的是使代碼更加清晰。由于留空格所產(chǎn)生的清晰性是相對的,所以,在已經(jīng)非常清晰的語句中沒有必要再留空格,如果語句已足夠清晰則括號內(nèi)側(cè)(即左括號后面和右括號前面)不需要加空格,多重括號間不必加空格,因為在C/C+語言中括號已經(jīng)是最清晰的標志了。在長語句中,如果需要加的空格非常多,那么應該保持整體清晰,而在

43、局部不加空格。給操作符留空格時不要連續(xù)留兩個以上空格。示例:(1) 逗號、分號只在后面加空格。int a, b, c; (2)比較操作符, 賦值操作符=、 +=,算術(shù)操作符+、%,邏輯操作符&、&,位域操作符= MAX_TIME_VALUE) a = b + c;a *= 2;a = b 2;(3)!、+、-、&(地址運算符)等單目操作符前后不加空格。*p = a; / 內(nèi)容操作*與內(nèi)容之間flag = !isEmpty; / 非操作!與內(nèi)容之間p = &mem; / 地址操作& 與內(nèi)容之間i+; / +,-與內(nèi)容之間(4)-、.前后不加空格。p-id = pid; / -指針前后不加空格(5

44、) if、for、while、switch等與后面的括號間應加空格,使if等關(guān)鍵字更為突出、明顯。if (a = b & c d) 1-1:一行程序以小于80字符為宜,不要寫得過長。 2 注釋2-1:一般情況下,源程序有效注釋量必須在20以上。說明:注釋的原則是有助于對程序的閱讀理解,在該加的地方都加了,注釋不宜太多也不能太少,注釋語言必須準確、易懂、簡潔。2-2:說明性文件(如頭文件.h文件、.inc文件、.def文件、編譯說明文件.cfg等)頭部應進行注釋,注釋必須列出:版權(quán)說明、版本號、生成日期、作者、內(nèi)容、功能、與其它文件的關(guān)系、修改日志等,頭文件的注釋中還應有函數(shù)功能簡要說明。示例:

45、下面這段頭文件的頭注釋比較標準,當然,并不局限于此格式,但上述信息建議要包含在內(nèi)。/* Copyright (C), 1988-1999, Huawei Tech. Co., Ltd. File name: / 文件名 Author: Version: Date: / 作者、版本及完成日期 Description: / 用于詳細說明此程序文件完成的主要功能,與其他模塊 / 或函數(shù)的接口,輸出值、取值范圍、含義及參數(shù)間的控 / 制、順序、獨立或依賴等關(guān)系 Others: / 其它內(nèi)容的說明 Function List: / 主要函數(shù)列表,每條記錄應包括函數(shù)名及功能簡要說明 1. History:

46、 / 修改歷史記錄列表,每條修改記錄應包括修改日期、修改 / 者及修改內(nèi)容簡述 1. Date: Author: Modification: 2. .*/2-3:源文件頭部應進行注釋,列出:版權(quán)說明、版本號、生成日期、作者、模塊目的/功能、主要函數(shù)及其功能、修改日志等。示例:下面這段源文件的頭注釋比較標準,當然,并不局限于此格式,但上述信息建議要包含在內(nèi)。/* Copyright (C), 1988-1999, Huawei Tech. Co., Ltd. FileName: test.cpp Author: Version : Date: Description: / 模塊描述 Versio

47、n: / 版本信息 Function List: / 主要函數(shù)及其功能 1. History: / 歷史修改記錄 David 96/10/12 1.0 build this moudle */說明:Description一項描述本文件的內(nèi)容、功能、內(nèi)部各部分之間的關(guān)系及本文件與其它文件關(guān)系等。History是修改歷史記錄列表,每條修改記錄應包括修改日期、修改者及修改內(nèi)容簡述。2-4:函數(shù)頭部應進行注釋,列出:函數(shù)的目的/功能、輸入?yún)?shù)、輸出參數(shù)、返回值、調(diào)用關(guān)系(函數(shù)、表)等。示例:下面這段函數(shù)的注釋比較標準,當然,并不局限于此格式,但上述信息建議要包含在內(nèi)。/* Function: / 函數(shù)

48、名稱 Description: / 函數(shù)功能、性能等的描述 Calls: / 被本函數(shù)調(diào)用的函數(shù)清單 Called By: / 調(diào)用本函數(shù)的函數(shù)清單 Table Accessed: / 被訪問的表(此項僅對于牽扯到數(shù)據(jù)庫操作的程序) Table Updated: / 被修改的表(此項僅對于牽扯到數(shù)據(jù)庫操作的程序) Input: / 輸入?yún)?shù)說明,包括每個參數(shù)的作 / 用、取值說明及參數(shù)間關(guān)系。 Output: / 對輸出參數(shù)的說明。 Return: / 函數(shù)返回值的說明 Others: / 其它說明*/2-5:邊寫代碼邊注釋,修改代碼同時修改相應的注釋,以保證注釋與代碼的一致性。不再有用的注釋

49、要刪除。2-6:注釋的內(nèi)容要清楚、明了,含義準確,防止注釋二義性。說明:錯誤的注釋不但無益反而有害。規(guī)則2-7:避免在注釋中使用縮寫,特別是非常用縮寫。說明:在使用縮寫時或之前,應對縮寫進行必要的說明。2-8:注釋應與其描述的代碼相近,對代碼的注釋應放在其上方或右方(對單條語句的注釋)相鄰位置,不可放在下面,如放于上方則需與其上面的代碼用空行隔開。示例:如下例子不符合規(guī)范。例1:/* get replicate sub system index and net indicator */repssn_ind = ssn_dataindex.repssn_index;repssn_ni = ssn

50、_dataindex.ni;例2:repssn_ind = ssn_dataindex.repssn_index;repssn_ni = ssn_dataindex.ni;/* get replicate sub system index and net indicator */應如下書寫/* get replicate sub system index and net indicator */repssn_ind = ssn_dataindex.repssn_index;repssn_ni = ssn_dataindex.ni;2-9:對于所有有物理含義的變量、常量,如果其命名不是充分自注釋

51、的,在聲明時都必須加以注釋,說明其物理含義。變量、常量、宏的注釋應放在其上方相鄰位置或右方。示例:/* active statistic task number */#define MAX_ACT_TASK_NUMBER 1000#define MAX_ACT_TASK_NUMBER 1000 /* active statistic task number */2-10:數(shù)據(jù)結(jié)構(gòu)聲明(包括數(shù)組、結(jié)構(gòu)、類、枚舉等),如果其命名不是充分自注釋的,必須加以注釋。對數(shù)據(jù)結(jié)構(gòu)的注釋應放在其上方相鄰位置,不可放在下面;對結(jié)構(gòu)中的每個域的注釋放在此域的右方。示例:可按如下形式說明枚舉/數(shù)據(jù)/聯(lián)合結(jié)構(gòu)。/*

52、sccp interface with sccp user primitive message name */enum SCCP_USER_PRIMITIVE N_UNITDATA_IND, /* sccp notify sccp user unit data come */ N_NOTICE_IND, /* sccp notify user the No.7 network can not */ /* transmission this message */ N_UNITDATA_REQ, /* sccp users unit data transmission request*/;2-11

53、:全局變量要有較詳細的注釋,包括對其功能、取值范圍、哪些函數(shù)或過程存取它以及存取時注意事項等的說明。示例:/* The ErrorCode when SCCP translate */* Global Title failure, as follows */ / 變量作用、含義/* 0 SUCCESS 1 GT Table error */* 2 GT error Others no use */ / 變量取值范圍/* only function SCCPTranslate() in */* this modual can modify it, and other */* module can

54、 visit it through call */* the function GetGTTransErrorCode() */ / 使用方法BYTE g_GTTranErrorCode; 2-12:注釋與所描述內(nèi)容進行同樣的縮排。說明:可使程序排版整齊,并方便注釋的閱讀與理解。示例:如下例子,排版不整齊,閱讀稍感不方便。void example_fun( void )/* code one comments */ CodeBlock One /* code two comments */ CodeBlock Two應改為如下布局。void example_fun( void ) /* cod

55、e one comments */ CodeBlock One /* code two comments */ CodeBlock Two2-13:將注釋與其上面的代碼用空行隔開。示例:如下例子,顯得代碼過于緊湊。/* code one comments */program code one/* code two comments */program code two應如下書寫/* code one comments */program code one/* code two comments */program code two2-14:對變量的定義和分支語句(條件分支、循環(huán)語句等)必須編寫

56、注釋。說明:這些語句往往是程序?qū)崿F(xiàn)某一特定功能的關(guān)鍵,對于維護人員來說,良好的注釋幫助更好的理解程序,有時甚至優(yōu)于看設(shè)計文檔。2-15:對于switch語句下的case語句,如果因為特殊情況需要處理完一個case后進入下一個case處理,必須在該case語句處理完、下一個case語句前加上明確的注釋。說明:這樣比較清楚程序編寫者的意圖,有效防止無故遺漏break語句。示例(注意斜體加粗部分):case CMD_UP: ProcessUp(); break;case CMD_DOWN: ProcessDown(); break;case CMD_FWD: ProcessFwd(); if (.)

57、 . break;else ProcessCFW_B(); / now jump into case CMD_Acase CMD_A: ProcessA(); break;case CMD_B: ProcessB(); break;case CMD_C: ProcessC(); break;case CMD_D: ProcessD(); break;. 2-1:避免在一行代碼或表達式的中間插入注釋。說明:除非必要,不應在代碼或表達中間插入注釋,否則容易使代碼可理解性變差。 2-2:通過對函數(shù)或過程、變量、結(jié)構(gòu)等正確的命名以及合理地組織代碼的結(jié)構(gòu),使代碼成為自注釋的。說明:清晰準確的函數(shù)、變量等

58、的命名,可增加代碼可讀性,并減少不必要的注釋。 2-3:在代碼的功能、意圖層次上進行注釋,提供有用、額外的信息。說明:注釋的目的是解釋代碼的目的、功能和采用的方法,提供代碼以外的信息,幫助讀者理解代碼,防止沒必要的重復注釋信息。示例:如下注釋意義不大。/* if receive_flag is TRUE */if (receive_flag)而如下的注釋則給出了額外有用的信息。 /* if mtp receive a message from links */if (receive_flag) 2-4:在程序塊的結(jié)束行右方加注釋標記,以表明某程序塊的結(jié)束。說明:當代碼段較長,特別是多重嵌套時,

59、這樣做可以使代碼更清晰,更便于閱讀。示例:參見如下例子。if (.) / program code while (index MAX_INDEX) / program code /* end of while (index MAX_INDEX) */ / 指明該條while語句結(jié)束 /* end of if (.)*/ / 指明是哪條if語句結(jié)束 2-5:注釋格式盡量統(tǒng)一,建議使用“/* */”。 2-6:注釋應考慮程序易讀及外觀排版的因素,使用的語言若是中、英兼有的,建議多使用中文,除非能用非常流利準確的英文表達。說明:注釋語言不統(tǒng)一,影響程序易讀性和外觀排版,出于對維護人員的考慮,建議使用

60、中文。3 標識符命名3-1:標識符的命名要清晰、明了,有明確含義,同時使用完整的單詞或大家基本可以理解的縮寫,避免使人產(chǎn)生誤解。說明:較短的單詞可通過去掉“元音”形成縮寫;較長的單詞可取單詞的頭幾個字母形成縮寫;一些單詞有大家公認的縮寫。示例:如下單詞的縮寫能夠被大家基本認可。temp 可縮寫為 tmp ;flag 可縮寫為 flg ;statistic 可縮寫為 stat ;increment 可縮寫為 inc ;message 可縮寫為 msg ;3-2:命名中若使用特殊約定或縮寫,則要有注釋說明。說明:應該在源文件的開始之處,對文件中所使用的縮寫或約定,特別是特殊的縮寫,進行必要的注釋說

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論