51单片机实战指南-基本功-C51编程基础(Ver2)_第1页
51单片机实战指南-基本功-C51编程基础(Ver2)_第2页
51单片机实战指南-基本功-C51编程基础(Ver2)_第3页
51单片机实战指南-基本功-C51编程基础(Ver2)_第4页
51单片机实战指南-基本功-C51编程基础(Ver2)_第5页
已阅读5页,还剩96页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基本功—C51编程基础51单片机实战指南本章内容:2C51语言的数据123C51语言的数组、函数4C51语言对单片机主要资源的控制C51语言的基本运算与流程控制语句单片机C51编程规范54.1.1数据类型4.1C51语言的数据4.1.2常量与变量常量

C51语言中的常量是不接受程序修改的固定值,常量可以是任意数据类型。

C51中的常量有整型常量、实型常量、字符型常量、字符串常量符号常量等。(1)整型常量

在整型常量后加一个字母“L”或“l”,表示该数位长整型。例如23L、0Xfd4l等。如果需要的是负值,则必须将负号“-”放置于常量表达式的最前面,例如-0x56、-9等。(2)实型常量

实型常量又称浮点常量,是一个十进制表示的符号实数。实型常量的值包括整数部分、尾数部分和指数部分。实型常量的形式如下:

[digits][.digits][E[+/-]digits]一些实型常量的示例如下:

15.75、1.575E1、1575E-3、

-0.0025、-2.5e-3、25E-4。(3)字符型常量

字符型常量是指用一对单引号括起来的一个字符。如‘a’、‘9’、‘!’等。字符常量中的单引号只起定界作用并不表示字符本身。在C51语言中,字符是按其对应的ASCII码值来存储的,1个字符占1个字节(4)字符串常量

字符串常量是指用一对双引号括起来的一串字符,双引号只起定界作用,如“China”、“123456”等。字符串常量在内存中存储时,系统自动在字符串的末尾加一个串结束标志,即ASCII码值中为0的字符NULL,常用\0表示。字符常量与字符串常量的区别:字符‘A’只占用1个字节字符串“A”占用2个字节(5)符号常量C51语言中允许将程序中的常量定义为一个标识符,称为符号常量。符号常量一般使用大写英文字母表示,以区别于一般用小写字母表示的变量。符号常量在使用前必须先定义,定义的形式是:

#define

标识符常量

#definePI3.1415926

注:符号常量一般使用大写英文字母表示,以区别一般用小写字母表示的变量。2.变量变量的定义:

数据类型变量名; inti,j,k; unsignedcharsi; unsignedintui; doublebalance,profit,loss;C51中常用的:bit、char、int(1)整型变量(int)16位数据有符号:

signedint-32768~32767无符号:

unsignedint0~65535C51语言将int型变量的高位存放在低字节如:0x1234存储形式(2)长整型变量(longint)

长整型变量长度是32位,占用4个字节(byte),其他方面和整型变量(int)相似。(3)实型变量分为单精度(float)型和双精度(double)型。其定义形式为:

floatx,y;//指定x,y为单精度实数

doublez;//指定z为双精度实数在一般系统中,一个float型数据在内存中占4个字节(32位),一个double型数据占8个字节(64位)。单精度实数提供7位有效数字,双精度实数提供15~16位有效数字。(5)字符变量char字符变量用来存放字符常量。注意只能存放1个字符。字符变量的定义形式如下:

char变量名;

例如:charc1,c2;它表示c1和c2为字符变量,各存放1个字符。可以用下面的语句对c1、c2赋值:

c1='a';c2='b';字符变量的长度是1字节(byte)即8位。这很适合于8051单片机,因为8051单片机每次可以处理8位数据。(6)位变量(bit)变量的类型是位,位变量的值可以是1(true)或0(false)与8051硬件特性操作有关的位变量必须定位在8051单片机片内存储区(RAM)的可位寻址空间中。注意:在编程时必须慎重地进行变量和数据类型的选择

3.有符号/无符号问题说明(1)尽量使用无符号变量,且尽可能地使用无符号字符变量、位变量(能被单片机更好地接受)(2)在编程时,为了书写方便,经常使用简化的缩写形式来定义变量的数据类型:

#defineucharunsignedchar#defineuintunsignedint4.1.3数据存储类型与51单片机的存储关系

数据时存放在51单片机的存储器中的,因此要规定数据的存储类型。

常用:data、pdata、code

另外:bdata1.数据存储类型彻底搞清STC89C52RC的存储器内部ROM8k(code)外部ROM最多64K(code)工作寄存器组位寻址区(bdata)普通RAM(data)SFRRAM高128B(idata)内部扩展RAM256B(pdata)外部RAM最多64Kxdata(1)data区data区的寻址是最快的,所以应该把经常使用的变量放在data区,但是data区的空间是有限的,data区除了包含程序变量外,还包含了堆栈和寄存器组。data区声明中的存储类型标式符为data,通常指片内RAM的低128字节的内部数据存储的变量,可直接寻址。声明举例如下:

unsignedchardatasystem_status=0;unsignedintdataunit_id[2];chardatainp_string[16];(2)bdatabdata实际是data中的位寻址区,在这个区中声明变量就可以进行位寻址。位变量的声明对状态寄存器来说是十分有用的,因为它可能仅仅需要某一位,而不是整个字节。bdata区声明中的存储类型标识符为bdata,指内部可位寻址的16字节存储区(20H到2FH),数据类型是可位寻址变量的数据类型。以下是在bdata区中声明的位变量和使用位变量的例子:

unsignedcharbdatastatus_byte;unsignedintbdatastatus_word;unsignedlongbdatastatus_dword;sbitstat_flag=status_byte^4;

if(status_word^15){ … }stat_flag=1;(3)idata区idata区也可以存放使用比较频繁的变量,使用寄存器作为指针进行寻址。idata区声明中的存储类型标识符为idata,指内部的256字节的存储区,但是只能间接寻址,速度比直接寻址慢。声明举例如下:

unsignedcharidatasystem_status=0;unsignedintidataunit_id[2];charidatainp_string[16];floatidataout_value;(4)pdata区和xdata区pdata区和xdata区属于外部数据存储区,外部数据区是可读可写的存储区,最多可以有64KB。在这两个区,变量的声明与在其他区的语法是一样的,但pdata区只有256字节而xdata区可达65536字节。对于STC89C52RC来说,pdata访问的也是片内拓展的存储器。声明举例如下:unsignedcharxdatasystem_status=0;unsignedintpdataunit_id[2];charxdatainp_string[16];floatpdataout_value;外部地址段中除了包含存储器地址外,还包含I/O器件的地址。对外部器件寻址可以通过指针或C51提供的宏,使用宏对外部器件I/O口进行寻址更具可读性。(5)程序存储区code程序存储区的数据是不可改变的,跳转向量和状态表对code段访问和对xdata区访问的时间是一样的。编译的时候要对程序存储区中的对象进行初始化,否则就会产生错误。程序存储区code声明的标识符为code,在C51语言编译器中可以用code存储区类型标识符来访问程序存储区。下面是程序存储区声明的例子:

unsignedcharcodea[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x10,0x11,0x12,0x13,0x14,0x15};单片机访问片内RAM比访问片外RAM相对快一些,

(1)应当将使用频繁的变量置于片内数据存储器,即采用data、bdata或idata存储类型;

(2)将容量较大的或使用不怎么频繁的变量置于片外RAM,即采用pdata或xdata存储类型。

(3)常量只能采用code存储类型。变量存储类型定义举例:

chardatavar1;bitbdataflags;floatidatax,y,z; unsignedintpdatadimension;unsignedcharxdatavector[10][4][4];SMALL模式所有变量都默认位于51单片机的内部的数据存储器,这与使用data指定存储器类型的方式一样。COMPACT模式所有变量都默认位于外部数据存储器的1页内,这与使用pdata指定存储器类型的方式一样。该存储器类型适用于变量不超过256字切的情况。与SMALL模式相比,该存储器模式的效率比较低,对变量访问的速度也慢一些,但比LARGE模式快。LARGE模式所有变量都默认位于外部数据存储器,并使用数据指针DPTR进行寻址,该模式要比SMALL和COMPACT模式产生更多的代码。2、存储模式4.2.1特殊功能寄存器及其C51定义方法21个特殊功能寄存器。两种方式:(1)使用关键字sfr定义

sfr特功器名字=特殊功能寄存器地址;

sfrSCON=0x98;

/*串口控制寄存器地址98H*/

sfrTMOD=0X89;

/*定时器/计数器方式控制寄存器地址89H*/4.2C51语言对单片机主要资源的控制(2)通过头文件访问SFR#include<reg52.h>

//使用的单片机为STC公司的STC89C52

voidmain(void){ TL0=0xb0; TH0=0x3c; TR0=1; //启动定时器0 ...}(3)SFR中位定义—3种方式(a)第1种方法

sbit位名=特殊功能寄存器名^位置;(b)第2种方法

sbit位名=字节地址^位置;(c)第3种方法

sbit位名=位地址;例:sfrPSW=0xD0;sbitOV=PSW^2;sbitOV=0xD0^2;sbitOV=0xD2;unsignedcharbdataflag;sbitflag0=flag^0;sfrP1=0x90;sbitP1_0=P1^0;sbitP1_1=P1^1;sbitP1_6=P1^6;sbitP1_7=P1^7;4.2.2绝对地址的访问包括:片内RAM、片外RAM及I/O口用#include<absacc.h>可使用其中声明的宏来访问绝对地址,

DBYTE以字节形式对data区寻址;

DWORD以字形式对data区寻址;

XBYTE以字节形式对xdata区寻址;XWORD以字形式对xdata区寻址;

CBYTE以字节形式对code区寻址;

CWORD以字形式对code区寻址;

PBYTE以字节形式对pdata区寻址;

PWORD以字形式对pdata区寻址。如:#include<absacc.h>#definePORTAXBYTE[0xFFC0]/*将PORT定义为外部I/O口,地址为0xFFC0,长度为8位*/#defineNRAMDBYTE[0x40]

/*将NRAM定义为片内RAM,地址为40H,长度为8位*/#include<absacc.h> #definePAXBYTE[0xffec]

//将PA定义为外部I/O口,地址为0xffec#defineNRAMDBYTE[0x40]

/*将NRAM定义为片内RAM,地址为40H,长度为8位*/voidmain(){ PA=0x3A; NRAM=0x01; }4.2.3位变量的C51语言定义1位变量的C51语言定义

C51通过“bit”关键字来定义位变量,一般格式为:bitbitName;例如:bitsFlag; /*将sFlag定义为位变量*/2C51程序函数的参数及返回值C51程序函数可包含类型为“bit”的参数,也可以将其作为返回值。例如:

bitfunc(bitb0,bitb1) /*位变量b0、b1作为函数的参数*/

{…… return(b1); /*变量b1作为函数的返回值*/

}4.2.3位变量的C51语言定义3.对位变量的限制

1)位变量不能说明为指针和数组。例如:bit*ptr; /*用位变量定义指针,错误*/

bitbArray[]; /*用位变量定义数组,错误*/

2)在定义位变量时,允许定义存储类型,位变量都被放入一个位段,此段总位于51系列单片机片内RAM中,因此其存储类型限制为data或bdata,如果将其定义成其他类型都将在编译时出错。4可位寻址对象对位变量的操作也可以采用先定义变量的数据类型和存储类型,其存储类型只能为bdata,然后采用“sbit”关键字来定义可独立寻址访问的对象位。例如:bdataintibase/*定义ibase为bdata存储类型的整型变量*/

bdatacharbary[4];/*定义bary[4]为bdata存储类型的字符型变量*/sbitibase0=ibase^0;/*定义ibase0为ibase变量的第0位*/

sbitibase15=ibase^15;/*定义ibase15为ibase变量的第15位*/4.2.3位变量的C51语言定义4.2.3位变量的C51语言定义sbitbary07=bary[0]^7;/*定义bary07为bary[0]数据元素的第7位*/sbitbary36=bary[3]^6;/*定义bary36为bary[3]数据元素的第6位*/对采用这种方式定义的位变量既可以位寻址又可以字节寻址。例如:bary36=1; /*位寻址,给bary[3]数据元素的第6位赋值为1*/

bary[3]=a;/*字节寻址,给bary[3]数据元素赋值为a*/ sbit定义要求基址对象的存储类型为bdata,只有这样其特殊位定义(sbit)是合法的。位置('^'操作符)后的最大值依赖于指定的基类型,对于char/uchar而言是0~7,对于int/uint而言是0~15,对于long/ulong而言是0~31。4.2.3位变量的C51语言定义4.3.1基本运算运算符是表示特定的算术或逻辑运算的符号,也称操作符。在C51语言中把需要进行运算的各个量通过运算符连接起来,便构成表达式。算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、特殊运算符4.3C51语言的基本运算与流程控制语句算术运算算术运算的操作符:+(加法运算符)、-

(减法运算符)*(乘法运算符)、/(除法运算符)%(模运算或取余运算符)++为自增运算符--为自减运算符注意:/:结果的整数部分%:结果的余数部分-:除进行减法外,还可以进行取负操作。++:自增。表示操作数加1。X++等同于X=X+1。

++X表示先加1,再取值

X++表示先取值,再加1。关系运算—成立或不成立主要用于比较操作数的大小关系。包括:<(小于)、<=

(小于等于)、>

(大于)、>=

(大于等于)、==

(等于)、!=

(不等于)看关系是否成立。结果:0或1逻辑运算—结果是真或假进行逻辑运算的操作符。包括:&&(逻辑与)、||(逻辑或)、!(逻辑非)看结果是否为真。结果:0或1。位运算将两个操作数按二进制数展开,然后对应位进行逻辑运算。包括:&(按位与)、|(按位或)、^(按位异或)、

~(按位取反)、<<(位左移)、>>(位右移)位运算的操作对象只能是整型和字符型数据。这些位运算和汇编语言中的位操作指令十分类似。位操作指令是单片机的重要特点,所以位运算在C51语言控制类程序设计中的应用比较普遍。赋值运算变量名=表达式;例如:a=(b=4)+(c=6);该表达式的值为10,变量a的值为10。复合赋值运算符:赋值符号前加上其他运算符构成复合运算符。C51语言提供以下10种复合运算符:+=,-=,*=,/=,%=,﹠=,︱=,^=,<<=,>>=例如:a+=b; //等价于a=(a+b)x*=a+b;//等价于x=(x*(a+b))a&=b; //等价于a=(a&b)a<<=4; //等价于a=(a<<4)算术运算符、逻辑运算符、关系运算符、赋值运算符的优先级4.3.2选择结构——if、switch语句

通过选择结构,可以使计算机具有决策能力,从而使计算机能够按照我们的意志在某个特定条件下完成相应的操作,能够“随机应变”。包括:

if语句、switch语句if语句

if语句用来判定所给定的条件是否满足,根据判定结果决定执行给出的两种操作之一。

if语句的基本结构如下:

if(表达式){语句;}

括号中的表达式成立时,程序执行大括号内的语句,否则程序跳过大括号中的语句部分而直接执行下面其他语句。C51语言提供3种形式的if语句:形式一:if(表达式){语句;}if(x>y){max=x;min=y;}形式二:if(表达式){语句1;}

else{语句2;}if(x>y){max=x;}else{min=y;}形式三:if(表达式1){语句1;}elseif(表达式2){语句2;}elseif(表达式3){语句3;}...elseif(表达式m){语句m;}else{语句n;}switch语句switch语句是多分支选择语句一般形式如下:switch(表达式){ case常量表达式1:{语句1;}break; case常量表达式2:{语句2;}break; ... case常量表达式n:{语句n;}break; default:{语句n+1;}}while

while(表达式){语句; }注意:先判断,后执行;如果循环体内只有一个语句,可以不用{}While循环体{}后无分号;4.3.3循环控制——while、for语句for语句for(表达式1;表达式2;表达式3){ 语句;}for(y=0;y<=99;y=y+3){ delay(33);px=~px;}注意:3个表达式都是可选项,可以任意省略,但“;”不能省。省1是不对循环变量赋初值;省2是不判断循环条件的真假;省3是不对循环变量操作。for(;;)表示无限循环。时间延时程序举例:voidmsec(unsignedintx){unsignedcharj; while(x--){for(j=0;j<125;j++);}}无限循环的实现:(1)for(;;){代码段;}

(2)while(1){代码段;}

(3)do{代码段;}while(1);4.3.4break语句、continue语句、return语句在循环语句执行过程中,如果需要在满足循环判定条件的情况下跳出代码段,可以使用break或continue语句;如果要从任意地方跳转到代码的某个地方,可以使用goto语句。1、breakbreak语句用于从循环代码中退出,然后执行循环语句之后的语句,不再进入循环。形式:

break;注意:一个break只能跳出一层循环2、continuecontinue语句用于退出当前循环,不再执行本轮循环,程序代码从下一轮循环开始执行,直到判断条件不满足为止。与break的区别是该语句不是退出整个循环。形式:

continue;3.return语句return语句一般放在函数的最后位置,用于终止函数的执行,并控制程序返回调用该函数时所处的位置。返回时还可以通过return语句带回返回值。return语句形式:return;return(表达式);如果return语句后面带有表达式,则要计算表达式的值,并将表达式的值作为函数的返回值。若不带表达式,则函数返回时将返回一个不确定的值。通常,我们用return语句把调用函数取得的值返回给主调函数。4.4C51语言的数组、函数数组

数组是同类型变量的一个有序集合。数组用一个名字来标识,称为数组名。

数组中的每个变量称为数组元素。

数组有一维、二维、三维和多维数组之分。C51语言中常用的一维、二维数组和字符数组。数组中各元素的顺序用下标表示,下标为n的元素可以表示为数组名[n]。改变[]中的下标就可以访问数组中所有的元素。1.一维数组类型说明符数组名[元素个数];intdemo1[10];初始化:

inta[5]={1,2,3,4,5};intb[6]={1,2,6};2.二维数组或多维数组类型说明符数组名[行数][列数];floatdemo2[3][4];//demo2数组有3行4列共12个实型元素

inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};//全部初始化3.字符数组若一个数组的元素是字符型的,则该数组就是一个字符数组。例如:

chara[12]={"ChongQing"}; //字符数组

charadd[3][6]={"weight","height","width"}; //字符串数组4.查表#defineucharunsignedcharucharcodetempt[]={32,34,36,37,39,41}; /*数组,设置在EPROM中,长度为实际输入的数值数*/ucharftoc(uchardegc){ returntempt[degc];} voidmain(){ ucharx;x=ftoc(5);/*得到与5℃相应的华氏温度值*/}共阴极LED的显示字符段码表

charcodeSEG[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};4.4.2函数的简单介绍函数是C51语言的重要组成部分,是从标准C语言中继承下来的。C51有一般函数、库函数和中断函数。1.函数的定义函数一般定义形式如下:返回值类型标志符函数名(形式参数列表){

函数体;}2.中断函数KeilC51编译器支持直接编写中断服务函数程序,从而减轻了采用汇编语言编写中断服务程序的繁琐程度。为了在C语言源程序中直接编写中断服务函数的需要,C51编译器对函数的定义进行了扩展,增加了一个扩展关键字interrupt,使用关键字interrupt可以将一个函数定义成中断服务函数。定义中断服务函数的一般形式为:void函数名(void)interruptn[usingn]

4.4.2函数的简单介绍4.4.2函数的简单介绍3.库函数C51语言的库函数包括:I/O库函数、标准函数库、字符函数库、字符串函数库、内部函数库、数学函数库、绝对地址访问函数库、变量参数函数库、全程跳转函数库、偏移量函数库等。在C51程序设计时常用的函数库进1)输入输出库函数4.4.2函数的简单介绍2)内部函数库4.4.2函数的简单介绍4.4.2函数的简单介绍3)绝对地址访问函数库4.5C51语言的预处理命令及汇编语句的嵌入

4.5.1文件包含、宏定义、条件编译1、文件包含

文件包含指令,即#include命令。文件包含是指一个程序文件将另一个指定的文件的全部内容包含进去。例如#include<stdio.h>就是将C51语言编译器提供的输入/输出库函数的说明文件stdio.h包含到自己的程序中。

文件包含的一般形式第1种形式:#include<文件名> 第2种形式:#include"文件名" /*系统会先在源程序当前目录下寻找,若找不到,再到操作系统的path路径中查找,最后才到C语言库函数头文件所在目录中查找*/4.5C51语言的预处理命令及汇编语句的嵌入2.宏定义指令不带参数的宏定义:#define宏替换名宏替换体带参数的宏定义:define宏替换名(形参)带形参的宏替换体注意:带参数的宏定义形参一定要带括号,因为实参可能是任何表达式,不加括号很可能导致意想不到的错误。3.条件编译1)#if型#if条件1代码1;#else代码2;#endif2)#ifdef型格式如下:#ifdef标识符代码1;#else代码2;#endif3)#ifndef型格式如下:#ifndef标识符代码1;#else代码2;#endif4.5C51语言的预处理命令及汇编语句的嵌入4.5.2C51中汇编语句的嵌入在C51源程序中调用汇编程序有两种方式:一种是嵌入式汇编,即在C51语言程序中嵌入一段汇编语言程序;另一种是汇编语言程序部分和C51程序部分为不同的模块或不同的文件,通常由C51程序调用汇编程序模块的变量和函数(也可称为子程序或过程)。4.5C51语言的预处理命令及汇编语句的嵌入对函数名等定义使用C语言,但是在函数的内部通过编译命令控制asm/endasm在C51源程序中插入汇编语言模块,具体结构如下:#pragmaasm汇编语句#pragmaendasm4.5C51语言的预处理命令及汇编语句的嵌入在项目(Project)窗口中包含汇编代码的C文件上右键,选择“Optionsfor...”,点击右边的“GenerateAssemblerSRCFile”和“AssembleSRCFile”,使检查框由灰色变成黑色(有效)状态;根据选择的编译模式,把相应的库文件(如Small模式时,是Keil\C51\Lib\C51S.Lib)加入工程中,该文件必须作为工程的最后文件;最后进行编译,即可生成目标代码。4.5C51语言的预处理命令及汇编语句的嵌入4.6.1单片机C51编程规范-总则单片机C51编程规范总则为:(1)格式清晰;(2)注释简明扼要;(3)命名规范易懂;(4)函数模块化设计;(5)程序易读易维护;(6)功能准确实现;(7)代码空间效率和时间效率高;(8)适度的可扩展性。4.6单片机C51编程规范编程时统一采用下述新类型名的方式定义数据类型。建立一个datatype.h文件,在该文件中进行如下定义:4.6.2数据类型定义1.命名基本原则命名要清晰明了,有明确含义,使用完整单词或约定俗成的缩写。通常,较短的单词可通过去掉元音字母形成缩写;较长的单词可取单词的头几个字母形成缩写,即“见名知意”。命名风格要自始至终保持一致。命名中若使用特殊约定或缩写,要有注释说明。除了编译开关/头文件等特殊应用,应避免使用以下划线开始或结尾的定义,如_EXAMPLE_TEST_之类。(P111)同一软件产品内模块之间接口部分的标识符名称之前加上模块标识。(看情况)4.6.3标识符命名2.宏和常量命名宏和常量用全部大写字母来命名,词与词之间用下划线分隔。对程序中用到的数字均应用有意义的枚举或宏来代替。3.变量命名变量名采用camel命名法,即骆驼式命名法,首字母小写,采用该命名法的名称看起来就像骆驼的驼峰一样高低起伏。如runningFlag。局部变量应简明扼要。局部循环体控制变量优先使用i、j、k等;局部长度变量优先使用len、num等;临时中间变量优先使用temp、tmp等。

4.6.3标识符命名4.函数命名函数名用Pascal命名法:首字母大写,与Camel命名法类似,每个词的第一个字母大写。

5.文件命名一个文件包含一类功能或一个模块的所有函数,文件名称应清楚表明其功能或性质。每个.c文件应该有一个同名的.h文件作为头文件。4.6.3标识符命名1.注释基本原则注释有助于对程序的阅读理解,说明程序在“做什么”,解释代码的目的、功能和采用的方法。一般情况源程序有效注释量在30%左右。注释语言必须准确、易懂、简洁。边写代码边注释,修改代码同时修改相应的注释,不再有用的注释要删除。

2.文件注释文件注释必须说明文件名、函数功能、创建人、创建日期、版本信息等相关信息。修改文件代码时,应在文件注释中记录修改日期、修改人员,并简要说明此次修改的目的。所有修改记录必须保持完整。4.6.4注释文件注释放在文件顶端,用"/*……*/"格式包含。注释文本每行缩进4个空格;每个注释文本分项名称应对齐。/*********************************************************文件名称:作者:版本:说明:修改记录:*********************************************************/

4.6.4注释3.函数注释(1)函数头部注释函数头部注释应包括函数名称、函数功能、入口参数、出口参数等内容。如有必要还可增加作者、创建日期、修改记录(备注)等相关项目。函数头部注释放在每个函数的顶端,用"/*……*/"的格式包含。其中函数名称应简写为FunctionName(),不加入、出口参数等信息。/*********************************************函数名称:函数功能:入口参数:出口参数:备注:*********************************************/(2)代码注释代码注释应与被注释的代码紧邻,放在其上方或右方,不可放在下面。如放于上方则需与其上面的代码用空行隔开。一般少量注释应该添加在被注释语句的行尾,一个函数内的多个注释左对齐;较多注释则应加在上方且注释行与被注释的语句左对齐。函数代码注释用"//…"的格式。4.变量、常量、宏的注释同一类型的标识符应集中定义,并在定义之前一行对其共性加以统一注释。对单个标识符的注释加在定义语句的行尾。全局变量一定要有详细的注释,包括其功能、取值范围、哪些函数或过程存取它以及存取时的注意事项等。注释用"//…"的格式。4.6.4注释1.设计原则(1)函数的基本要求:正确性:程序要实现设计要求的功能。稳定性和安全性:程序运行稳定、可靠、安全。可测试性:程序便于测试和评价。规范/可读性:程序书写风格、命名规则等符合规范。扩展性:代码为下一次升级扩展留有空间和接口。全局效率:软件系统的整体效率高。局部效率:某个模块/子模块/函数的本身效率高。4.6.5函数(2)编制函数的基本原则:

单个函数的规模尽量限制在200行以内(不包括注释和空行)。一个函数只完成一个功能。函数局部变量的数目一般不超过5~10个。函数内部局部变量定义区和功能实现区(包含变量初始化)之间空一行。函数名应准确描述函数的功能。通常使用动宾词组为执行某操作的函数命名。函数的返回值要清楚明了,尤其是出错返回值的意义要准确无误。不要把与函数返回值类型不同的变量,以编译系统默认的转换方式或强制的转换方式作为返回值返回。减少函数本身或函数间的递归调用。尽量不要将函数的参数作为工作变量。4.6.5函数2.函数定义函数若没有入口参数或者出口参数,应用void明确申明。函数名称与出口参数类型定义间应该空一格且只空一格。函数名称与括号()之间无空格。函数形参必须给出明确的类型定义。多个形参的函数,后一个形参与前一个形参的逗号分割符之间添加一个空格。函数体的前后花括号"{}"各独占一行。4.6.5函数3.局部变量定义同一行内不要定义过多变量。同一类的变量在同一行内定义,或者在相邻行定义。先定义data型变量,再定义idtata型变量,再定义xdata型变量.数组、指针等复杂类型的定义放在定义区的最后。变量定义区不做较复杂的变量赋值。4.6.5函数4.功能实现区规范

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论