版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、贵 州 大 学 课 程 设 计 说 明 书 PAGE - 79 - 课 程 设 计 说 明 书题目: 基于单片机压力传感器设计 学院(系): 年级专业: 电子信息科学与技术 学 号: 学生姓名: 指导教师: 目录摘要 2关键字 2第一章 总体设计方案及模块划分21.1总体设计方案31.2模块划分41.3设计框图如下图所示5第二章各模块设计参数52.1传感器元件模块52.2 A/D转换模块82.3控制器处理模块12 2.4 AD0809接口电路及LED接口电路14第三章 压力传感器实验数据采集、显示及程序14 3.1数据采集及显示14第四章 心得体会15附录 16程序设计 16参考文献资料 25
2、实物图 25摘要 此次设计是基于8051单片机的压力检测系统,简要介绍了压力传感器电路的工作原理和弱信号传感器电路以及A/D变换电路的工作原理,通过压力传感器将需要测量的位置的压力信号转化为电信号,再经过运算放大器进行信号放大,送至8位AD转换器ADC0808,然后将模拟信号转换成单片机可以识别的数字信号,再经单片机转换成LED显示器可以识别的信息,最后显示输出。 关键词: 单片机 压力传感器A/D变换电路LED显示器第一章总体设计方案及模块划分1.1 总体设计方案本次设计是基于8051单片机的测量与显示。电路采用ADC0809模数转换电路,ADC0809是CMOS工艺,采用逐次逼近法的8位A
3、/D转换芯片,片内有带锁存功能的8路模拟电子开关,先用ADC0809的转换器对各路电压值进行采样,然后将模拟信号转换成单片机可以识别的数字信号,再经单片机转换成LED显示器可以识别的信息,最后显示输出。本次设计是以单片机组成的压力测量,系统中必须有前向通道作为电信号的输入通道,用来采集输入信息。压力的测量,需要传感器,利用传感器将压力转换成电信号后,再经放大并经A/D转换为数字量后才能由计算机进行有效处理。然后用LED进行显示。本设计的最终结果是,将软件下载到硬件上调试出来了需要显示的数据,当输入的模拟信号发生变化的时候,通过A/D转换后,LED将显示不同的数值。1.2 模块划分传感器元件模块
4、 传感器元件主要是对压力这样的物理量转变成电信号。A/D转换电路模块 A/D转换电路是将模拟量转换为数字量,便于单片机的处理。控制器处理模块 控制器是通过51系列单片机对数字信号,按照预定目的进行处理。显示与报告模块 显示与报告是对于最终输出结果进行直观的表达。1.3设计框图如下图所示:图1.3.1 设计框图第二章 各模块设计参数2.1传感器元件模块压力传感器是压力检测系统中的重要组成部分,由各种压力敏感元件将被测压力信号转换成容易测量的电信号作输出,给显示仪表显示压力值,或供控制和报警使用。力学传感器的种类繁多,如 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 电容式加速度传感器等。 而电阻应变式传感器具有悠久的历史。由于它具有结构简单
6、、体积小、使用方便、性能稳定、可靠、灵敏度高动态响应快、适合静态及动态测量、测量精度高等诸多优点,因此是目前应用最广泛的传感器之一,本实验采用电阻应变式传感器作为压力传感器。压力传感器构成:电阻应变式传感器由弹性元件和电阻应变片构成,当弹性元件感受到物理量时,其表面产生应变,粘贴在弹性元件表面的电阻应变片的电阻值将随着弹性元件的应变而相应变化。通过测量电阻应变片的电阻值变化,可以用来测量位移加速度、力、力矩、压力等各种参数。压力传感器的工作原理:本质上是惠斯通电桥,这里采用的是最常见的电阻应变片式的压力传感器。它得到广泛应用的原因是温度特性好,减小温度变化带来的误差。膜片上的压力使得电桥不平衡
7、,从而产生一个差动的输出信号,这种结构的基本特性之一是它的差动输出电压U与偏置电压U成正比关系,这种关系隐含压力测量精度直接决定偏置电源的容限值,当四个桥臂电阻达到相应的关系时,电桥输出为零,或则就有电压输出同时,它也能提供一种温度补偿最通用的方法。本实验研究压力传感器电路如图2.1.1所示,为压力传感器的电路,其由三部分组成(1)电源电路部分;(2)电桥电路部分;(3)放大电路部分。 图2.1.1压力传感器电路 如图示,传感器采用恒压源供电,为+15V,经过与分压(电容起滤波作用),点5、6、7三点处有相同电压: (2.1.1) 根据上式,带入数据 , ,求得。 经过电路电桥部分,简化如下图
8、2.1.2 UO图2.1.2压力传感器电桥电路设桥臂电阻分别为, ,则当压力传感器受力时,电阻变化对应的输出电压值为,由于 100us;*;工程量代换:B存高八位,A存低八位;程序中除以256相当于右移八位,即高八位变为整数位,低八位变为小数位;最后结果为: B存整数部分,A存小数部分;*DAIHUAN:MOV B,#200MOV A,ADResultMUL AB MOV 51H,A;小数部分MOV 50H,B;整数部分RET;INT1查询服务子程式;INT: MOV DPTR,#8000HMOVX A, DPTR ; 读入结果CALL CLSMOV A,#10000000B ;将二进制100
9、00000的值放入累加器内,代表设定DDRAM的地址为00H, ;即将光标移到第一行第一个列的位置上。 CALL Write_instruction ;调用写指令码子程式。 MOV DPTR,#LINE1 ;将第一行字串在程式记忆体中的起始地址存入DPTR CALL STRING ;调用STRING子程式,将字串显示到LCMMOV A,#11000010B ;将二进制11000000的值放入累加器内,代表设定DDRAM的地址为40H, ;即将光标移到第二行第三个列的位置上 CALL Write_instruction ;调用写指令码子程式。 MOV A,#50H MOV ADResult, A
10、 CALL DAIHUAN MOV DPTR,#LINE2 ;将第二行字串在程式记忆体中的起始地址存DPTR。 CALL DATE ;调用DATE子程式,将数据显示到LCM RETI;TO中断服务子程式;INSERS: MOV TH0,#0 MOV TL0,#0 DJNZ R5,NO MOV R5,#50 NO: RETI ;Initial子程序设定LCM使用8BITS汇流排,显示两行,;使用5*7字型,显示器要显示光标要显示但不闪烁;Initial: MOV A,#00111000B ; CALL Write_instruction ;第一次设置显示模式 MOV A,#00111000B ;
11、 CALL Write_instruction ;第二次设置显示模式 MOV A,#00111000B ; CALL Write_instruction ;第三次设置显示模式 MOV A,#00111000B ; CALL Write_instruction ;第四次设置显示模式 MOV A,#00001110B ; CALL Write_instruction ;设置光标 MOV A,#00000110B ; CALL Write_instruction ;设置LCD数据指针自动加一 RET;CheckBusy子程序;等待LCM有空可以执行下一行命令;CheckBusy: PUSH ACC
12、;将累加器ACC的内容放到堆栈内, ;以免破坏原来的ACC的资料CheckBusyLoop: CLR ENABLE ;设定E=0,禁能读模式 SETB R_W ;设定R/W=1,选择读模式 CLR RS ;设定RS=0,选择指令寄存器IR SETB ENABLE ;将P3.3脚设定为1,使能LCM MOV A,DB0_DB7 ;将存在ACC内的资料经由P1存入ACC中 ;以便查封第7位元及BF是否为0什么 CLR ENABLE ;将P3.3脚设定为0 MOV A,#00H JB ACC.7,CheckBusyLoop ; 判断由LCM读入资料的第7位及BF ;是否为1,若等于1表示LCM忙碌中
13、,CPU ;跳到标记CheckBusyLoop继续执行程序 POP ACC ;将累加器ACC内容从堆栈区取出 CALL DELAY ;调用延迟子程序,延时约数个mS RET ;返回主程序;Write_instruction子程序;将ACC内的资料输入到LCM的IR寄存器;Write_instruction: CALL CheckBusy ;调用CheckBusy子程序确定LCM可以执行指令 CLR ENABLE ;设定E=0,禁能LCM CLR R_W ;设定R/W=0,选择写模式 CLR RS ;设定RS=0,选择指令寄存器IR SETB ENABLE ;将P3.3脚设定为1,使能LCM M
14、OV DB0_DB7,A ;将存在ACC内的指令码经由P1输出到LCM CLR ENABLE ;将P3.3设定为0,MCS-51向LCM存取资料后, ;必须将LCM的E脚输出0,让LCM禁能(Disable) ;不做介面的资料传送或设定 RET ;返回主程序;WriteLCDData子程序;将ACC内的资料输入到LCM的DR寄存器;WriteLCDData: CALL CheckBusy ;调用CheckBusy子程序,确定LCM可以执行指令 CLR ENABLE ;设定E=0,禁能LCM CLR R_W ;设定R/W=0,选择写模式 SETB RS ;设定RS=1,选择U寄资料存器DR SE
15、TB ENABLE ;将P3.3脚设定为1,使能LCM MOV DB0_DB7,A ;将存在ACC内的指令码经由P0输出到LCM CLR ENABLE RET ;返回主程序;CLS子程序清除LCM的显示字幕;CLS: MOV A,#01H CALL Write_instruction RET;DATE子程序;压力数据的扫描显示;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则继续执行分位操作MOV B,#64H;否则跳转到十位分位程序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;否则跳转到个位显示程序GEE:MOV B,#0AHDIV ABMOVC A,A+DPTRLCALL WriteLCDDataMOV A,BMOVC A,A+DPTRLCALL WriteLCDDataXSD:MOV A,#0AH;小数点显示程序MOVC A,A+DPTRLCALL WriteLCDDataLOWER:INC R1;小数位显示程序 分位原理同上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结束;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、单片微型计算机接口技术及其应用 张淑清 国防工业出版社单片机原理及应用技术 张淑清单片机应用技术汇编实物图:附录资料:不需要的可以自行删除C语言编程规范(仅供参考)1. 基本要求1.1 程序结构清析,简单易懂,单个函数的程序行数不得超过100行。1.2 打算干什么,要简单,直接了当,代码精简,避免垃圾程序。1.3 尽量使用标准库函数和公共函数。1.4 不要随意定义全局变量,尽量使用局部变量
20、。1.5 使用括号以避免二义性。2.可读性要求2.1 可读性第一,效率第二。2.2 保持注释与代码完全一致。2.3 每个源程序文件,都有文件头说明,说明规格见规范。2.4 每个函数,都有函数头说明,说明规格见规范。2.5 主要变量(结构、联合、类或对象)定义或引用时,注释能反映其含义。2.7 常量定义(DEFINE)有相应说明。2.8 处理过程的每个阶段都有相关注释说明。2.9 在典型算法前都有注释。2.10 利用缩进来显示程序的逻辑结构,缩进量一致并以Tab键为单位,定义Tab为 6个字节。2.11 循环、分支层次不要超过五层。2.12 注释可以与语句在同一行,也可以在上行。2.13 空行和
21、空白字符也是一种特殊注释。2.14 一目了然的语句不加注释。2.15 注释的作用范围可以为:定义、引用、条件分支以及一段代码。2.16 注释行数(不包括程序头和函数头说明部份)应占总行数的 1/5 到 1/3 。3. 结构化要求3.1 禁止出现两条等价的支路。3.2 禁止GOTO语句。3.3 用 IF 语句来强调只执行两组语句中的一组。禁止 ELSE GOTO 和 ELSE RETURN。3.4 用 CASE 实现多路分支。3.5 避免从循环引出多个出口。3.6 函数只有一个出口。3.7 不使用条件赋值语句。3.8 避免不必要的分支。3.9 不要轻易用条件分支去替换逻辑表达式。4. 正确性与容
22、错性要求4.1 程序首先是正确,其次是优美4.2 无法证明你的程序没有错误,因此在编写完一段程序后,应先回头检查。4.3 改一个错误时可能产生新的错误,因此在修改前首先考虑对其它程序的影响。4.4 所有变量在调用前必须被初始化。4.5 对所有的用户输入,必须进行合法性检查。4.6 不要比较浮点数的相等,如: 10.0 * 0.1 = 1.0 , 不可靠4.7 程序与环境或状态发生关系时,必须主动去处理发生的意外事件,如文件能否逻辑锁定、打印机是否联机等。4.8 单元测试也是编程的一部份,提交联调测试的程序必须通过单元测试。5. 可重用性要求5.1 重复使用的完成相对独立功能的算法或代码应抽象为
23、公共控件或类。5.2 公共控件或类应考虑OO思想,减少外界联系,考虑独立性或封装性。5.3 公共控件或类应建立使用模板。附:C 编程规范,delphi作相应的参考1适用范围本标准适用于利用Visul C+ ,Borland C+进行软件程序开发的人员.。.2变量命名命名必须具有一定的实际意义,形式为xAbcFgh,x由变量类型确定,Abc、Fgh表示连续意义字符串,如果连续意义字符串仅两个,可都大写.如OK.具体例程:BOOL类型 bEnable;ch *char chTextc * 类对象 cMain(对象实例)h * Handle(句柄) hWndi * intn * 无符号整型p * 指
24、针sz,str * 字符串w WORDx,y 坐标Char或者TCHAR类型 与Windows API有直接联系的用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(一般用于循环变量)。其他资源句柄同上.3常量命名和宏定义常量和宏定义必须具有一定的实际意义;常量和宏定义在#include和函数定义之间;常量和宏定义必须全部以大写字母来撰写,中间可根据意义的连续性用下划线连接,每一条定义的右侧必须有一简单的注释,说
26、明其作用;资源名字定义格式:菜单:IDM_XX或者CM_XX位图:IDB_XX对话框:IDD_XX字符串:IDS_XXDLGINIT:DIALOG_XXICON:IDR_XX.4函数命名函数原型说明包括引用外来函数及内部函数,外部引用必须在右侧注明函数来源:模块名及文件名, 如是内部函数,只要注释其定义文件名;第一个字母必须使用大写字母,要求用大小写字母组合规范函数命名,必要时可用下划线间隔,示例如下: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结构体命名结构体类型命名必须全部用大写字母,原则上前面以下划线开始;结构体变量命名必须用大小写字母组合,第一个字母必须使用大写字母,必要时可用下划线间隔。对于私有数据区,必须注明其所属的进程。全局数据定义只需注意其用途。 示例如下: 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,网格scr 滚动条lst 列表框fr
29、m fram7注释原则上注释要求使用中文;文件开始注释内容包括:公司名称、版权、作者名称、时间、模块用途、背景介绍等,复杂的算法需要加上流程说明;函数注释包括:输入、输出、函数描述、流程处理、全局变量、调用样例等,复杂的函数需要加上变量用途说明;程序中注释包括:修改时间和作者、方便理解的注释等;引用一: 文件开头的注释模板/* 文件名:* Copyright (c) 1998-1999 *公司技术开发部* 创建人:* 日期:* 修改人:* 日期:* 描述:* 版本:*/引用二: 函数开头的注释模板/* 函数名:* 输入: a,b,c* a* b* c* 输出: x*x 为 1, 表示.*x 为
30、 0, 表示.* 功能描述:* 全局变量:* 调用模块:* 作者:* 日期:* 修改:* 日期:* 版本*/引用三: 程序中的注释模板/*/* 注释内容 */*/8 程序a. 程序编码力求简洁,结构清晰,避免太多的分支结构及太过于技巧性的程序,尽量不采用递归模式。b. 编写程序时,亦必须想好测试的方法,换句话说,”单元测试” 的测试方案应在程序编写时一并拟好。c. 注释一定要与程序一致。d. 版本封存以后的修改一定要将老语句用/* */ 封闭,不能自行删除或修改,并要在文件及函数的修改记录中加以记录。e. 程序中每个block 的开头 ” 及 ” 必须对齐,嵌套的block 每进一套,缩进一个
31、tab,TAB 为4个空格,block类型包括if、for、while、do等关键字引出的。f.对于比较大的函数,每个block 和特殊的函数调用,都必须注明其功能,举例如下: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中的变量命名:遵循匈牙利命名法,命名必须有意义,制定如下规定窗体:以大写的W开始,如About版权窗体, 命名为WAbout文件:以大写的F开始,如About版权窗体,文件命名为FAbout.cpp按钮(Button):如退出按钮,命名为btnExit基类:加base标记,如报表基类,窗体命名为:WBaseRep, 文件命名为FBaseRep.cpp转贴 1. 在.h/.cpp的开头应有一段格式统一的说明,内容包括: a. 文件名 (FileName); b. 创建人 (Creater); c
33、. 文件创建时间 (Date); d. 简短说明文件功能、用途 (Comment)。好习惯 2. 除非极其简单,否则对函数应有注释说明。内容包括:功能、入口/出口参数,必要 时还可有备注或补充说明。还是好习惯 3. 每列代码的长度推荐为 80列,最长不得超过120列;折行以对齐为准。太宽了,我的限制是60列,因为文本方式下屏幕一共80列,如果你用BC这一类的编辑器,窗口边框等又要占据一定空间,所以80列太宽 4. 循环、分支代码,判断条件与执行代码不得在同一行上。很对 5. 指针的定义,* 号既可以紧接类型,也可以在变量名之前。 例:可写做:int*pnsize; 也可写做:int*pnsiz
34、e; 但不得写做:int*pnsize;建议采用第二种,除非附加另外一条规定:一次只声明一个变量,否则就会让人混淆,比如:int* a, b;看起来b好像也是个指针,其实不是。 6. 在类的成员函数内调用非成员函数时,在非成员函数名前必须加上:。这一条我倒觉得并不是必需的,我的看法是决不要让你的类成员函数和全局函数的名称相同(或类似) 7. 函数入口参数有缺省值时,应注释说明。 例:BOOL CWpsDib:PaintDIB(CDC* pDC, CRect& rc,int nBrightness, file:/*=0*/BOOL bGrayScale file:/*=FALSE*/ )每个变量
35、写一行,必要时加上/*in, out*/注释 8. elseif 必须写在一行。应该尽量避免else if这样的结构 9. 与、有关的各项规定:9.1、应独占一行。在该行内可有注释。 9.2 必须另起一行, 之后的代码必须缩进一个Tab。与必须在同 一列上。 9.3 在循环、分支之后若只有一行代码,虽然可省略、,但不推荐这么 做。若省略后可能引起歧义,则必须加上、。持保留意见,因为GNU的代码规范是这样的:if ( NULL = ptr )/ do something here或者if ( NULL = ptr ) / do something here争论哪个更好并没有意义,关键是统一,如果
36、用VC当然你的办法最方便,可是如果你用emacs或者vi,就不是这样了。 10. 与空格有关的各项规定。 10.1 在所有两目、三目运算符的两边都必须有空格。在单目运算符两端不必空格。但 在、:、.、等运算符前后,及&(取地址)、* (取值)等运算符之后不得有空格。 10.2for、while、if 等关键词之后应有1个空格,再接(,之后无空格;在结尾 的)前不得有空格。我认为在括号两端加空格并不是什么错误,尤其是在一个条件十分复杂的if语句里 10.3 调用函数、宏时,(、)前后不得有空格。 10.4类型强制转换时,()前后不得有空格同上 11. 与缩进有关的各项规定 11.1 缩进以 Ta
37、b 为单位。1 个 Tab 为 4 个空格我认为这个值应该更大,我自己使用8个空格,如果你的代码因为缩进幅度太大而导致折行,那么几乎可以肯定你的程序设计方案有问题。 11.2 下列情况,代码缩进一个 Tab: 1. 函数体相对函数名及、。 2. if、else、for、while、do 等之后的代码。 3. 一行之内写不下,折行之后的代码,应在合理的位置进行折行。若有 + - * / 等运 算符,则运算符应在上一行末尾,而不应在下一行的行首。这一条我反对,运算符应该放在下一行行首,以使人能清楚的知道这一行是续上一行的,比如if ( something& somethingelse& other
38、things )如果写做if ( something &somethingelse &otherthings )反而看不清楚 11.3 下列情况,不必缩进:switch 之后的 case、default。编程规范与范例目 录1 排版 62 注释 113 标识符命名 184 可读性 205 变量、结构 226 函数、过程 287 可测性 368 程序效率 409 质量保证 4410 代码编辑、编译、审查 5011 代码测试、维护 5212 宏 53 1 排版1-1:程序块要采用缩进风格编写,缩进的空格数为4个。说明:对于由开发工具自动生成的代码可以有不一致。1-2:相对独立的程序块之间、变量说明
39、之后必须加空行。示例:如下例子不符合规范。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字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使
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:循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分,长表达式要在低优先级操作符处划分新行,操作符放在新行之首。示例: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 ),后不应加空格。说明:采用这种松散方式编写代码的目的是使代码更加清晰。由于留空格所产生的清晰性是相对的,所以,在已经非常清晰的语句中没有必要再留空格,如果语句已足够清晰则括号内侧(即左括号后面和右括号前面)不需要加空格,多重括号间不必加空格,因为在C/C+语言中括号已经是最清晰的标志了。在长语句中,如果需要加的空格非常多,那么应该保持整体清晰,而在
43、局部不加空格。给操作符留空格时不要连续留两个以上空格。示例:(1) 逗号、分号只在后面加空格。int a, b, c; (2)比较操作符, 赋值操作符=、 +=,算术操作符+、%,逻辑操作符&、&,位域操作符= MAX_TIME_VALUE) a = b + c;a *= 2;a = b 2;(3)!、+、-、&(地址运算符)等单目操作符前后不加空格。*p = a; / 内容操作*与内容之间flag = !isEmpty; / 非操作!与内容之间p = &mem; / 地址操作& 与内容之间i+; / +,-与内容之间(4)-、.前后不加空格。p-id = pid; / -指针前后不加空格(5
44、) if、for、while、switch等与后面的括号间应加空格,使if等关键字更为突出、明显。if (a = b & c d) 1-1:一行程序以小于80字符为宜,不要写得过长。 2 注释2-1:一般情况下,源程序有效注释量必须在20以上。说明:注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。2-2:说明性文件(如头文件.h文件、.inc文件、.def文件、编译说明文件.cfg等)头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者、内容、功能、与其它文件的关系、修改日志等,头文件的注释中还应有函数功能简要说明。示例:
45、下面这段头文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。/* Copyright (C), 1988-1999, Huawei Tech. Co., Ltd. File name: / 文件名 Author: Version: Date: / 作者、版本及完成日期 Description: / 用于详细说明此程序文件完成的主要功能,与其他模块 / 或函数的接口,输出值、取值范围、含义及参数间的控 / 制、顺序、独立或依赖等关系 Others: / 其它内容的说明 Function List: / 主要函数列表,每条记录应包括函数名及功能简要说明 1. History:
46、 / 修改历史记录列表,每条修改记录应包括修改日期、修改 / 者及修改内容简述 1. Date: Author: Modification: 2. .*/2-3:源文件头部应进行注释,列出:版权说明、版本号、生成日期、作者、模块目的/功能、主要函数及其功能、修改日志等。示例:下面这段源文件的头注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。/* Copyright (C), 1988-1999, Huawei Tech. Co., Ltd. FileName: test.cpp Author: Version : Date: Description: / 模块描述 Versio
47、n: / 版本信息 Function List: / 主要函数及其功能 1. History: / 历史修改记录 David 96/10/12 1.0 build this moudle */说明:Description一项描述本文件的内容、功能、内部各部分之间的关系及本文件与其它文件关系等。History是修改历史记录列表,每条修改记录应包括修改日期、修改者及修改内容简述。2-4:函数头部应进行注释,列出:函数的目的/功能、输入参数、输出参数、返回值、调用关系(函数、表)等。示例:下面这段函数的注释比较标准,当然,并不局限于此格式,但上述信息建议要包含在内。/* Function: / 函数
48、名称 Description: / 函数功能、性能等的描述 Calls: / 被本函数调用的函数清单 Called By: / 调用本函数的函数清单 Table Accessed: / 被访问的表(此项仅对于牵扯到数据库操作的程序) Table Updated: / 被修改的表(此项仅对于牵扯到数据库操作的程序) Input: / 输入参数说明,包括每个参数的作 / 用、取值说明及参数间关系。 Output: / 对输出参数的说明。 Return: / 函数返回值的说明 Others: / 其它说明*/2-5:边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释
49、要删除。2-6:注释的内容要清楚、明了,含义准确,防止注释二义性。说明:错误的注释不但无益反而有害。规则2-7:避免在注释中使用缩写,特别是非常用缩写。说明:在使用缩写时或之前,应对缩写进行必要的说明。2-8:注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。示例:如下例子不符合规范。例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:数据结构声明(包括数组、结构、类、枚举等),如果其命名不是充分自注释的,必须加以注释。对数据结构的注释应放在其上方相邻位置,不可放在下面;对结构中的每个域的注释放在此域的右方。示例:可按如下形式说明枚举/数据/联合结构。/*
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、:全局变量要有较详细的注释,包括对其功能、取值范围、哪些函数或过程存取它以及存取时注意事项等的说明。示例:/* 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:注释与所描述内容进行同样的缩排。说明:可使程序排版整齐,并方便注释的阅读与理解。示例:如下例子,排版不整齐,阅读稍感不方便。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:对变量的定义和分支语句(条件分支、循环语句等)必须编写
56、注释。说明:这些语句往往是程序实现某一特定功能的关键,对于维护人员来说,良好的注释帮助更好的理解程序,有时甚至优于看设计文档。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:通过对函数或过程、变量、结构等正确的命名以及合理地组织代码的结构,使代码成为自注释的。说明:清晰准确的函数、变量等
58、的命名,可增加代码可读性,并减少不必要的注释。 2-3:在代码的功能、意图层次上进行注释,提供有用、额外的信息。说明:注释的目的是解释代码的目的、功能和采用的方法,提供代码以外的信息,帮助读者理解代码,防止没必要的重复注释信息。示例:如下注释意义不大。/* if receive_flag is TRUE */if (receive_flag)而如下的注释则给出了额外有用的信息。 /* if mtp receive a message from links */if (receive_flag) 2-4:在程序块的结束行右方加注释标记,以表明某程序块的结束。说明:当代码段较长,特别是多重嵌套时,
59、这样做可以使代码更清晰,更便于阅读。示例:参见如下例子。if (.) / program code while (index MAX_INDEX) / program code /* end of while (index MAX_INDEX) */ / 指明该条while语句结束 /* end of if (.)*/ / 指明是哪条if语句结束 2-5:注释格式尽量统一,建议使用“/* */”。 2-6:注释应考虑程序易读及外观排版的因素,使用的语言若是中、英兼有的,建议多使用中文,除非能用非常流利准确的英文表达。说明:注释语言不统一,影响程序易读性和外观排版,出于对维护人员的考虑,建议使用
60、中文。3 标识符命名3-1:标识符的命名要清晰、明了,有明确含义,同时使用完整的单词或大家基本可以理解的缩写,避免使人产生误解。说明:较短的单词可通过去掉“元音”形成缩写;较长的单词可取单词的头几个字母形成缩写;一些单词有大家公认的缩写。示例:如下单词的缩写能够被大家基本认可。temp 可缩写为 tmp ;flag 可缩写为 flg ;statistic 可缩写为 stat ;increment 可缩写为 inc ;message 可缩写为 msg ;3-2:命名中若使用特殊约定或缩写,则要有注释说明。说明:应该在源文件的开始之处,对文件中所使用的缩写或约定,特别是特殊的缩写,进行必要的注释说
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医院信息系统管理员招聘面试题集
- 委托转让商铺合同范本
- 企业托管员工合同范本
- 光谷融媒体中心公开招聘工作人员笔试考试备考试题及答案解析
- 2025年湖北职业技术学院辅导员考试参考题库附答案
- 金融投资行业分析师面试题解析
- 新兴际华企业审计人员培养与考核制度
- 建筑包干施工合同范本
- 2026年试验检测师之交通工程考试题库300道完整版
- 资金入股协议合同范本
- 防范非计划性拔管
- 2025年考研政治《马克思主义基本原理》模拟卷
- (新教材)部编人教版三年级上册语文 第25课 手术台就是阵地 教学课件
- 2026天津农商银行校园招聘考试历年真题汇编附答案解析
- 2025重庆市环卫集团有限公司招聘27人笔试历年参考题库附带答案详解
- 钻井安全操作规程
- 精密减速机行业发展现状及趋势预测报告2026-2032
- 中小学《信息技术》考试试题及答案
- 2025及未来5年挂钟机芯项目投资价值分析报告
- IPO融资分析师融资报告模板
- 搏击裁判员培训课件
评论
0/150
提交评论