历史上的今天
返回首页

历史上的今天

今天是:2025年04月07日(星期一)

正在发生

2021年04月07日 | 有关C51的编程规范

2021-04-07 来源: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.重要难懂的代码要写注释,每个函数要写注释,每个全局变量要写注释,一些局部变量也要写注释。注释写在代码的上方或者右方,千万不要写在下方(相信没有人写在左方吧:))。


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、形参:在定义函数时,在函数名后面括号中直接进行形式参数说明,不再另行说明。


推荐阅读

史海拾趣

国兴(GOODSKY)公司的发展小趣事

对于带有1HZ低通滤波器的电桥放大器电路,网友可能的问题及回答如下:

问题一:1HZ低通滤波器在电桥放大器电路中的作用是什么?

回答:1HZ低通滤波器在电桥放大器电路中的主要作用是滤除高于1Hz频率的信号,只允许低于或等于1Hz的信号通过。这对于需要从复杂信号中提取低频分量或去除高频噪声的场合尤为重要。在电桥放大器中,由于传感器输出信号可能包含多种频率成分,通过1HZ低通滤波器可以有效减少高频噪声的干扰,提高测量信号的信噪比和精度。

问题二:如何设计带有1HZ低通滤波器的电桥放大器电路?

回答:设计带有1HZ低通滤波器的电桥放大器电路时,需要综合考虑电桥电路的设计、放大器的选择以及滤波器的设计。以下是大致的设计步骤:

  1. 电桥电路设计:首先,根据被测物理量的特性选择合适的电阻传感器,并设计相应的电桥电路。电桥电路应能准确地将非电量转换为电压或电流信号,并具有一定的抗干扰能力。

  2. 放大器选择:选择合适的运算放大器(运放)作为放大元件。运放应具有低噪声、高精度和适当的增益带宽积,以满足信号放大的需求。

  3. 滤波器设计:设计1HZ低通滤波器时,可以选择一阶或更高阶的有源滤波器。一阶有源低通滤波器由电阻、电容和运放组成,具有简单的电路结构和较好的滤波效果。设计时,需要根据所需的截止频率(本例为1HZ)选择合适的电阻和电容值。

  4. 电路整合与调试:将电桥电路、放大器和滤波器整合在一起,形成完整的电桥放大器电路。然后,对电路进行调试,确保电路工作正常,并满足预期的滤波和放大效果。

问题三:带有1HZ低通滤波器的电桥放大器电路在实际应用中有哪些注意事项?

回答:在实际应用中,带有1HZ低通滤波器的电桥放大器电路需要注意以下几点:

  1. 元件选择:应选择精度高、稳定性好的元件,如精密电阻、低噪声运放等,以确保电路的测量精度和稳定性。

  2. 布局与布线:合理的电路布局和布线可以减少电磁干扰和噪声耦合,提高电路的抗干扰能力。

  3. 温度补偿:由于温度变化可能影响电阻的阻值,进而影响电桥的输出电压,因此需要考虑温度补偿措施,以提高电路的温度稳定性。

  4. 校准与标定:定期对电路进行校准和标定,以确保测量结果的准确性和可靠性。

  5. 安全保护:在电路设计中应加入必要的保护措施,如过流保护、过压保护等,以防止电路在异常情况下损坏。

C-MAC Automotive公司的发展小趣事

随着公司实力的不断增强,C-MAC Automotive公司开始实施全球化战略。公司先后在欧美和亚洲等地设立研发中心和生产基地,以便更好地满足当地市场需求。通过全球化布局,C-MAC不仅拓宽了市场渠道,还降低了生产成本,提升了整体竞争力。此外,公司还积极参与国际技术交流和合作,不断提升自身的技术水平和创新能力。

EasySync公司的发展小趣事

为了进一步提升竞争力,EasySync公司积极寻求与行业领先企业的战略合作。通过与这些企业的合作,公司不仅获得了更多的技术支持和市场资源,还共同研发出了一系列创新产品。这些产品不仅丰富了公司的产品线,还进一步巩固了公司在同步技术领域的领先地位。

德力康(DLK)公司的发展小趣事

德力康(DLK)公司自1985年成立以来,最初专注于电视机用CRT插座的生产。凭借其卓越的产品质量和稳定的性能,逐渐在市场中树立了良好的口碑。随着电子行业的快速发展,DLK公司敏锐地捕捉到了连接器市场的巨大潜力,并开始逐步扩大产品线,涵盖D-SUB、DVI、HDMI、USB等多种连接器类型。通过不断的技术创新和市场拓展,DLK逐渐成为了国内连接器行业的重要供应商之一。

GSI Technology公司的发展小趣事

面对电子行业日益激烈的市场竞争和快速变化的市场需求,GSI Technology不断调整战略方向,积极应对挑战。公司加大在研发方面的投入,不断优化产品结构和生产工艺,提高产品质量和竞争力。同时,GSI还积极推动企业转型升级,向更加智能化、绿色化的方向发展。通过一系列的努力,GSI成功克服了行业内的诸多挑战,保持了持续稳定的发展态势。

兆易创新(GigaDevice)公司的发展小趣事

从财务表现来看,GSI Technology在过去几年中取得了不俗的成绩。尽管在某些季度受到宏观经济环境和市场需求波动的影响,但公司整体营收和净利润均保持了稳定增长。特别是在2023年Q3财报中,尽管营收略低于市场预期,但公司依然展现出了强劲的发展潜力和市场竞争力。展望未来,GSI Technology将继续秉承创新、务实、高效的发展理念,不断推出更多高性能、高品质的存储器产品,为全球电子行业的发展贡献自己的力量。

问答坊 | AI 解惑

短距离无线数据低功耗传输协议研究

针对短距离无线数据传输设备因高功耗而限制了工业应用这一问题,本文基于Freescale公司的MC13213硬件平台,对其低功耗的数据传输协议进行了研究,采用信标同步机制极大地降低了无线数据传输设备的功耗。   短距离无线数据传输是一种线缆替代技术 ...…

查看全部问答>

请教关于CreateFile的入门级问题

// 打开 驱动 hFlashFile = CreateFile(TEXT(\"COM1:\"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0); 我想请问我如何在com驱动中知道我打开的是COM1,还是其他COM,比如COM2/3 我想在驱动中获得打开了什么,然后我好根据这 ...…

查看全部问答>

【【【急问】】】BDA驱动和USB驱动如何通信??

请问DVB中BDA驱动如何与USB驱动进行通信? 比如我在应用层调频,BDA如何把调频信息通过USB传给硬件?数据又是如何从硬件传输的? 谢谢!…

查看全部问答>

请教中文字库的问题。

    升级原来单片机的手持设备,用ARM7替换。原来字库存放在一片AM29F040 FLASH里。 现在用ARM跑,我觉得字不是很多,字比较少,大概200种。想用程序来写。请教思路。 前提是字模提取的方法不变,只是把存放到FLASH的字库用 程序来替换。 ...…

查看全部问答>

求助:一道Intel笔试题

题目:给出至少两种方法实现存储器管理,比如虚存。 题目中提到了虚存,那么答案应该不能再列举它。…

查看全部问答>

1602

诸位帮个忙我的液晶程序 对第一排第一个写一个字符  但是整个屏幕都显示了!!看看!!…

查看全部问答>

【设计工具】FPGA 白皮书之浮点DSP算法实现

          浮点运算一直是通用CPU、DSP和GPU的专长,现在却越来越多的被FPGA实现,这主要是受医疗成像、无线或者国防设备等需要大动态范围同时又需要简化设计的新兴应用所拉动,本文介绍了用FPGA实现 ...…

查看全部问答>