C51 的编程规范

发布者:JoyfulHearted最新更新时间:2016-12-26 来源: eefocus关键字:C51  编程规范 手机看文章 扫描二维码
随时随地手机看文章

编程首要是要考虑程序的可行性,然后是可读性、可移植性、健壮性以及可测试性。这是总则。但是很多人忽略了可读性、可移植性和健壮性(可调试的方法可能歌不相同),这是不对的。

1.当项目比较大时,最好分模块编程,一个模块一个程序,很方便修改,也便于重用和便于阅读。

2.每个文件的开头应该写明这个文件是哪个项目里的哪个模块,是在什么编译环境下编译的,编程者(/修改者)和编程日期,值得注意的是一定不要忘了编程日期,因为以后你再看文件时,会知道大概是什么时候编写的,有些什么功能,并且可能知道类似模块之间的差异(有时同一模块所用的资源不同,和单片机相连的方法也不同,或者只是在原有的模块上加以改进)。

3.一个C源文件配置一个h头文件或者整个项目的C文件配置一个h头文件,我自己采用整个项目的C文件配置一个h头文件的方法,并且使用#ifndef/#define/#endif的宏来防止重复定义,方便各模块之间相互调用。

4.一些常量(如圆周率PI)或者常需要在调试时修改的参数最好用#define定义,但要注意宏定义只是简单的替换,因此有些括号不可少。

5.不要轻易调用某些库函数,因为有些库函数代码很长(我是反对使用printf之类的库函数的,但是是一家之言,并不勉强各位)。

6.书写代码时要注意括号对齐,固定缩进,一个{}各占一行,我本人采用采用所进4个字符,应该还是比较合适的,if/for/while/do等语句各占一行,执行语句不得紧跟其后,无论执行语句多少都要加{},千万不要写成如下格式:

复制代码

for(i=0;i<100;i++){fun1();fun2();}for(i=0;i<100;i++){
    fun1();
    fun2();
}

复制代码

而应该写成:

复制代码

for(i=0;i<100;i++)
{
    fun1();
    fun2();
}

复制代码

7.一行只实现一个功能,比如:

a=2;b=3;c=4;宜改成:

a=2;

b=3;

c=4;

8.重要难懂的代码要写注释,每个函数要写注释,每个全局变量要写注释,一些局部变量也要写注释。注释写在代码的上方或者右方,千万不要写在下方(相信没有人写在左方吧screen.width-300)this.width=screen.width-300" border=0>)。

9.对各运算符的优先级右所了解,记不得没关系,加括号就是,千万不要自作聪明说自己记得很牢。

10.不管有没有无效分支,switch函数一定要defaut这个分支。一来让阅读者知道程序员并没有遗忘default,并且防止程序运行过程中出现的意外(健壮性)。

11.变量和函数的命名最好能做到望文生义。不要命名什么x,y,z,a,sdrf之类的名字。

12.函数的参数和返回值没有的话最好使用void。

13.goto语句:从汇编转型成C的人很喜欢用goto,但goto是C语言的大忌,但是老实说,程序出错是程序员自己造成的,不是goto的过错;本人只推荐一种情况下使用goto语句,即从多层循环体中跳出。

14.指针是C语言的精华,但是在C51中我个人认为少用为妙,一来有时反而要花费多的空间,还有在对片外数据进行操作时会出错(可能是时序的问题)。

15.一些常数和表格之类的应该放到code去中以节省RAM。

16.程序编完编译看有多少code多少data,注意不要使堆栈为难。

17.程序应该要能方便的进行测试,其实这也与编程的思维有关;一般有三种:一种是自上而下先整体再局部;一种是自下而上先局部再整体;还有一种是结合两者往中间凑。我的做法是现大概规划一下整个编程,然后一个模块模块独立编程,每个模块调试成功再拼凑在一块调试。我建议:如果程序不大,可以直接用一个文件直接编,如果程序很大,宜采用自上而下的方式,但更多的是那种处在中间的情况,宜采用自下而上或者结合的方式。

 

 

//以下是《模块》或《文件》注释内容:

复制代码

///////////////////////////////////////////////////////////////////////公司名称://模 块 名://创 建 者://修 改 者://功能描述://其他说明://版 本:///////////////////////////////////////////////////////////////////////以下是《函数》注释内容:///////////////////////////////////////////////////////////////////////函 数 名://功能描述://函数说明://调用函数://全局变量://输 入://返 回://设 计 者://修 改 者://版 本://///////////////////////////////////////////////////////////////////

复制代码

 

作为一门工具,最终的目的就是实现功能。在满足这个前提条件下,我们希望我们的程序能很
容易地被别人读懂,或者能够很容易地读懂别人的程序,在团体合作开 发中就能起到事半功倍之效。
在网上请求帮助时,如能以规范的写法贴出程序,网友会比较容易地明白你的问题,则会比较快的得
到网友的帮助,否则让人看上半天 也不明所以然,这样就达不到预期的效果了。因此,为了便于源
程序的交流,减少合作开发中的障碍,希望大家能够探讨一下 C51 的编程规范。把各人认为好的建 议
提出来,然后做一个总结,作为一种大家一致认同的规范,我认为将会是一件很有意义的事。我先提
出一些自已的想法,以此抛砖引玉。
一、注释
1,采用中文;
2,开始的注释:
文件(模块)注释内容:
公司名称、版权、作者名称、修改时间、模块功能、背景介绍等,复杂的算法需要加上流程说明;
比如:

复制代码

/*********************************************************************//*公司名称: *//*模 块 名: LCD 模块 LCD 型号:HD44780 *//*创 建 人:zhaojunjie 日期:2001-06-08 *//*修 改 人: 日期:2001-06-08 *//*功能描述: *//*其他说明: *//*版 本:
/**********************************************************************/

复制代码

 

函数开头的注释内容:
函数名称、功能、说明 输入、返回、函数描述、流程处理、全局变量、调用样例等,复杂的函数
需要加上变量用途说明;

复制代码

/*********************************************************************
*
* 函 数 名: v_LcdInit
* 功能描述: LCD 初始化
* 函数说明: 初始化命令:0x3c, 0x08, 0x01, 0x06, 0x10, 0x0c
* 调用函数: v_Delaymsec(),v_LcdCmd()
* 全局变量:
* 输 入: 无
* 返 回: 无
* 设 计 者:zhao 日期:2001-12-09
* 修 改 者:zhao 日期:2001-12-09
* 版 本:
***********************************************************************/

复制代码

 

3、程序中的注释内容:
修改时间和作者、方便理解的注释等。注释内容应简炼、清楚、明了,一目了然的语句不加注释。

 

 

二、命名:

命名必须具有一定的实际意义。

1、常量的命名:全部用大写。

2、变量的命名:

变量名加前缀,前缀反映变量的数据类型,用小写,反映变量意义的第一个字母大写,其他小写。

其中变量数据类型:

unsigned char 前缀 uc signed char 前缀 sc

unsigned int 前缀 ui signed int 前缀 si

unsigned long 前缀 ul signed long 前缀 sl

bit 前缀 b 指针 前缀 p

例:ucReceivData 接收数据

3、结构体命名:

4、函数的命名:

函数名首字大写,若包含有两个单词的每个单词首字母大写。

函数原型说明包括:引用外来函数及内部函数,外部引用必须在右侧注明函数来源: 模块名及文件名, 内部函数,只要注释其定义文件名;

三、编辑风格

1、缩进:缩进以 Tab 为单位,一个 Tab 为四个空格大小。预处理语句、全局数据、函数原型、标题、附加说明、函数说明、标号等均顶格书写。语句块的“{”“}”配对对齐,并与其前一行对齐;

2、空格:数据和函数在其类型,修饰名称之间适当空格并据情况对齐。关键字原则上空一格,如:

if ( ... ) 等,运算符的空格规定如下:“->”、“[”、“]”、“++”、“--”、“~”、“!”、“+”、“-”(指正负号),“&”(取址或引用)、“*”(指使用指针时)等几个运算符两边不空格(其中单目运算符系指与操作数相连的一边),其它运算符(包括大多数二目运算符和三目运算符“?:”两边均空一格,“(”、“)”运算符在其内侧空一格,在作函数定义时还可据情况多空或不空格来对齐,但在函数实现时可以不用。“,”运算符只在其后空一格,需对齐时也可不空或多空格,对语句行后加的注释应用适当空格与语句隔开并尽可能对齐。

3、对齐:原则上关系密切的行应对齐,对齐包括类型、修饰、名称、参数等各部分对齐。另每一行的长度不应超过屏幕太多,必要时适当换行,换行时尽可能在“,”处或运算符处,换行后最好以运算符打头,并且以下各行均以该语句首行缩进,但该语句仍以首行的缩进为准,即如其下一行为“{”应与首行对齐。

4、空行:程序文件结构各部分之间空两行,若不必要也可只空一行,各函数实现之间一般空两行

5、修改:版本封存以后的修改一定要将老语句用/* */ 封闭,不能自行删除或修改,并要在文件及函数的修改记录中加以记录。

6、形参:在定义函数时,在函数名后面括号中直接进行形式参数说明,不再另行说明


关键字:C51  编程规范 引用地址:C51 的编程规范

上一篇:在KEIL中的模块化程序写法
下一篇:Silicon C8051F340之GPIO口配置与使用

推荐阅读最新更新时间:2024-03-16 15:27

C51---8 串口
串口介绍✨ 串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。 单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各 式各样的模块互相通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力。 51单片机内部自带UART(Universal Asynchronous ReceiverTransmitter,通用异步收发器)可实现单片机的串口通信。 硬件电路 简单双向串口通信有两根通信线(发送端TXD和接收端RXD) TXD与RXD要交叉连接 当只需单向的数据传输时,可以直接一根通信线 当电平标准不一致时,需要加电平转换芯片 电平标准 电平标准是数据1和数据0的表达方
[单片机]
C51---8 串口
一篇详细的KEIL C51 UV2使用教程
《一篇详细的KEIL C51 UV2使用教程》 (这篇文章在2001年由w78713发表在C51新闻组,很古老但也很实用!) 这里我大致说说怎么开始keil vision2,因为我刚开始用它,不当之处请莫见笑!希望可以互相交流,共同促进。 1、首先是新建一个*.c文件(file new),写入你的程序,保存; 2、由(project new project)建立新工程,按程序要求输入工程名(默认后缀是.uv2),确定后弹出对话框提示你选单片机,比如我是选atmel的89c52,然后确定; 3、由(view project window)打开project window,在工程管理区显示有一个target1的文件夹,单击其前面的+
[单片机]
C51--DS18B20数字温度计--C语言
#include reg52.h #include intrins.h #define uint unsigned int #define uchar unsigned char sbit DQ=P2^6; sbit lcdrs=P1^0; sbit lcdrw=P1^1; sbit lcden=P1^2; void disp(uint a); void init(void); void delay(uint i); uchar ds18b20_init(void); void write_byte(uchar byte); uchar read_byte(void); uint read_ds18b
[单片机]
单片机入门教程第22课-串行口应用编程实例
1. 串口方式0应用编程 8051单片机串行口方式0为移位寄存器方式,外接一个串入并出的移位寄存器,就可以扩展一个并行口。 例:用8051串行口外接CD4094扩展8位并行输出口,如图所示,8位并行口的各位都接一个发光二极管,要求发光管呈流水灯状态。 串行口方式0的数据传送可采用中断方式,也可采用查询方式,无论哪种方式,都要借助于TI或RI标志。串行发送时,可以靠TI置位(发完一帧数据后)引起中断申请,在中断服务程序中发送下一帧数据,或者通过查询TI的状态,只要TI为0就继续查询,TI为1就结束查询,发送下一帧数据。在串行接收时,则由RI引起中断或对RI查询来确定何时接收下一帧数据。无论采用什么方式,在开始通讯之前,都要先对控制
[单片机]
单片机入门教程第22课-串行口应用编程实例
Keil C51对C语言的关键词扩展之十七: sbit
sbit用来定义一个特殊功能寄存器的某一位。 sbit name = sfr-name ^ bit-position; sbit name = sfr-address ^ bit-position; sbit name = sbit-address; name 特殊功能寄存器某一位的名称 sfr-name 已定义的特殊功能寄存器名称 bit-position 特殊功能寄存器比特位置 sfr-address 特殊功能寄存器的地址 sbit-address 特殊功能寄存器的比特地址 sbit提供了访问可位寻址特殊功能寄存器以及其他可位寻址对象的方法。 sbit EA = 0
[单片机]
51单片机驱动ADC0808电路图C51及汇编程序
这两天刚刚完成了一个用C编写的程序,这是我第一个用C语言编写的程序,并且调试成功。 第一个C程序,值得纪念,也值得以后参考。 本程序的功能是: 1.ADC0808转换功能;    2.数据16进制显示; 3.串行通信数据。 C51程序:工程文件下载: http://www.51hei.com/f/0808_c.rar #include absacc.h # inc lude reg51.h #define uchar unsigned char #define uint unsigned int sbit START=P3^6; //启动转换 sbit OE=P3^
[单片机]
51单片机驱动ADC0808电路图<font color='red'>C51</font>及汇编程序
C51函数定义的一般形式是什么?
C51函数定义的一般形式是什么?如何定义中断处理程序?如何选择工作寄存器组? 答:返回类型 函数名(形参表) { 局部变量定义 执行语句 } 字段中的m定义中断处理程序的中断号 字段中的n选择工作寄存器组
[单片机]
Keil C51中变量的使用
引言 8051内核单片机是一种通用单片机,在国内占有较大的市场份额。在将C语言用于51内核单片机的研究方面,Keil公司做得最为成功。由于51内核单片机的存储结构的特殊性,Keil C51中变量的使用与标准C有所不同。正确地使用变量,有利于获得高效的目标代码。下面详细介绍Keil C51中变量的使用方法。 1 CPU存储结构与变量的关系 变量都需要有存储空间,存储空间的不同使得变量使用时的工作效率也不同。 标准C的典型运行环境是8086(含IA-32系列)内核,其存储结构是CPU内部有寄存器,外部有存储器,寄存器的访问速度大大高于存储器的访问速度。在标准C中,不加特别定义的变量是放在存储器中的,使用register可以
[单片机]
Keil <font color='red'>C51</font>中变量的使用
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved