有关C51的编程规范

发布者:吾道明亮最新更新时间:2021-04-07 来源: eefocus关键字:C51  编程规范 手机看文章 扫描二维码
随时随地手机看文章

简介:编程首要是要考虑程序的可行性,然后是可读性、可移植性、健壮性以及可测试性。这是总则。但是很多人忽略了可读性、可移植性和健壮性(可调试的方法可能歌不相同),这是不对的。 下面就来说说有关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.重要难懂的代码要写注释,每个函数要写注释,每个全局变量要写注释,一些局部变量也要写注释。注释写在代码的上方或者右方,千万不要写在下方(相信没有人写在左方吧:))。


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


二、命名:


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


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的编程规范

上一篇:总结单片机软件抗干扰的几种办法
下一篇:基于蓝牙技术的汽车驾驶盘控制系统

推荐阅读最新更新时间:2024-11-09 10:18

#C51按键处理(初阶基础)
前言 引入按键处理的思想过程 样例:按键处理系列,低配初阶最基本方法,按下有效 提示:以下是本篇文章正文内容,下面案例可供参考 一、单按键处理逻辑 1.等待按下 2.按键抖动 2.1 硬件消抖:R-S触发器、RC电路 2.2 软件消抖,延时消抖5-20ms 3.判断为有效按下 4.松开抖动 软件消抖 5.判断为松开按键 unsigned char key_num = 0;//充分考虑是否需要赋初始值0。任何局部变量建立后记得清0。标志法其它位置清0,或者每次进入函数体初始化清0。 if(!KeyIn1) { Delay_xms(10); //消抖。缺点:进程占用,复杂程序影响其它时基。后续采用中断定时
[单片机]
#<font color='red'>C51</font>按键处理(初阶基础)
C51填坑记:中断处理导致主程序函数参数改变
1.现象 平台:keil c51,中颖SH79F7019A 现象:在增加了一个中断处理逻辑后,发现主程序异常,断点调试发现某个函数的参数被改变了,程序使用了错误的数据导致逻辑出错。 2.排查 初步分析,可能原因如下: 1.参数寄存器(R0-R7)的值,被中断函数改变。 2.堆栈溢出。 2.1参数寄存器 首先排查参数寄存器(中断里面调用了函数,有参数传递)。通过仿真器观察中断函数汇编代码,发现在进入中断之前是对R0-R7进行了压栈操作的。进一步将中断有关的函数全部用“using”关键字知道不同的寄存器组,发现问题没有得到改善。到此可以排除参数寄存器原因。 2.2堆栈溢出 排除寄存器之后,进一步
[单片机]
<font color='red'>C51</font>填坑记:中断处理导致主程序函数参数改变
C51单片机学习笔记之中断系统
简介 什么是中断 在CPU 运行主程序时,暂停去处理别的程序,然后再回来处理主程序,这就是中断。 中断源 共8个,外部中断0、定时器0中断、外部中断1、定时器1中断、串口中断、定时器2中断、外部中断2、外部中断3。 中断寄存器 ps:优先级从高到低。 TCON寄存器 TF0(TF1)——计数溢出标志位,当计数器计数溢出时,该位置1。 TR0(TR1)——定时器运行控制位 当TR0(TR1)=0 停止定时器/计数器工作 当TR0(TR1)=1 启动定时器/计数器工作 IE0(IE1)——外部中断请求标志位 IT1(IT0)——外部中断触发方式选择位 IE寄存器 EA:中断的总开关,E
[单片机]
<font color='red'>C51</font>单片机学习笔记之中断系统
C51单片机学习笔记之串口通信
简介 串口通信就是单片机和pc之间的一种通信方式。 通信方式:并行,串行,同步,异步(最常用的) 传输方向:单工,半双工(不同时间),全双工 基本结构 相关寄存器 SCON串口控制寄存器(主要用方式1) TB8——在方式2和方式3中,TB8是要作为数据帧第9位被发送出去的,在多机通信中,可用于判断当前数据帧的数据是地址还是数据,TB8=0为数据,TB8=1为地址 RB8——当单片机已经接收一帧数据帧时,会把数据帧中的第9位放到 RB8中。方式0不使用RB8,在方式2和方式3中,RB8为接收到的数据帧的第9位数据位。 TI——方式1、2、3中。当发送数据完毕,硬件会将其置1,当 TI 被置1,会向C
[单片机]
<font color='red'>C51</font>单片机学习笔记之串口通信
基于C51单片机中的通信协议分享
一、基本格式: 通信头-》巴克码-》地址字-》长度字-》命令字-》信息位-》校准字 1.通信头:占1~8个字节,表通信开始(0x00、0xff不能用作通信头); 2.巴克码:占1字节,一般为0x72,表通信头结束; 3.地址字:表终端的地址,占1字节(0x00作为广播地址); 4.长度字:占1字节,表示从地址字到信息位之间的字节数; 5.命令字:占1字节,指示终端的不同操作; 6.信息位:不定长,从0~252字节; 7.校验位:两个字节,采用和校验及CRC校验。 二、应答 1.如果终端接收正确,则应答ACK;如果终端接收错误,则应答NAK; 2.发送方收到ACK,此次通信结束; 3.发送方收到NAK,重发刚才的命令字(最多7次
[单片机]
基于<font color='red'>C51</font>单片机中的通信协议分享
C51单片机学习笔记之矩阵键盘
简介 矩阵键盘一般为4×4或4×3的。矩阵键盘的判断方式分按行扫描和按列扫描。 简单说就是给全体一个高电平,然后给一个按键的一端附上低电平,再判断另一端是否为低电平。 原理图 代码部分 #include void delay()//延时函数 { unsigned int i; for(i=0;i 30000;i++); } unsigned char MatrixKey() { unsigned char KeyNumber;//定义一个返回值 P1=0xFF;//全体给高电平 P1_0=0;//一端给低电平 if(P1_4==0)//判断另一端是否为低电平 { delay(); while(P1
[单片机]
<font color='red'>C51</font>单片机学习笔记之矩阵键盘
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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