c51编程规范

合集下载

c51程序的基本结构

c51程序的基本结构

c51程序的基本结构一、简介c51程序是指在C语言编写的基于8051单片机的程序。

c51程序的基本结构是指程序的框架和组成部分。

在本文中,我们将深入探讨c51程序的基本结构,包括程序的主要组成部分、编译和连接过程、初始化和中断处理等方面。

二、程序的主要组成部分c51程序的主要组成部分包括以下几个部分:1. 头文件包含在c51程序的开头,需要包含一些常用的头文件,以便在程序中使用一些常用的函数和宏定义。

常见的头文件包括reg51.h、intrins.h等。

2. 函数声明在程序的主体之前,需要进行函数的声明。

函数的声明包括函数的返回类型、函数名和参数列表。

通过函数声明,我们可以通过函数名在程序中调用相应的函数。

3. 全局变量定义在程序的主体之前,可以定义一些全局变量。

全局变量可以在程序的任意位置访问,因此非常适合用来存储一些需要在不同函数间共享的数据。

4. 主函数在c51程序中,主函数是程序的入口。

主函数中包含程序的主要执行逻辑。

在主函数中,可以调用其他函数、执行一些初始化操作以及进行一些逻辑判断和循环等操作。

5. 其他函数除了主函数外,c51程序中还可以定义其他函数。

这些函数可以在主函数中调用,也可以在其他函数中调用。

通过将程序的不同功能模块封装成独立的函数,可以提高程序的可读性和易维护性。

三、编译和连接过程c51程序的编译和连接过程主要包括以下几个步骤:1. 预处理在预处理阶段,编译器将对程序进行宏替换和文件包含操作。

通过宏替换,程序中的宏定义将被替换为相应的代码;通过文件包含,程序中包含的头文件将被插入到相应的位置。

2. 编译在编译阶段,编译器将把预处理后的代码转换成汇编语言。

在这个阶段,编译器将对代码进行词法分析和语法分析,生成汇编语言代码。

3. 汇编在汇编阶段,汇编器将把汇编语言代码转换成机器语言代码。

这个阶段主要涉及符号和地址的分配,以及生成可重定位的目标文件。

4. 链接在链接阶段,链接器将把多个目标文件和库文件合并成一个可执行文件。

第五章C51程序设计

第五章C51程序设计

七、C51构造数据类型
前面讲的字符型(char)、整型(int)、浮点型 (float)、位型(bit)等数据类型,都属于C51 的基本数据类型。C语言还提供了一些扩展数据 类型,它们是由基本数据类型按一定的规则组合 成的数据类型,称之为构造数据类型。
以指针类型说明
1、基于存储器的指针
基于存储器的指针以存储器类型为参量,它在编 译时才被确定。因此,为指针选择存储器的方法 可以省掉,以便这些指针的长度为一个字节 (idata*,data*,pdata*)或2个字节 (code*,xdata*)。
} }
任务二、简易数字钟
/*数码管静态显示0~9的演示程 序,P2口作为段码驱动*/
#include<reg51.h> #define uchar unsigned char uchar dispcode[10]={0x3f, 0x06,0x5b,0x4f,0x66,0x6d, 0x7d,0x07,0x7f,0x6f}; void delay05s(void) {unsigned char i,j,k;
五、MCS-51并行接口的C51定义
sfr P0=0x80; sfr P1=0x90; #include<absacc.h> #define PORTA XBYTE[0xFFC0] absacc.h是C51中绝对地址访问函数的头文件。
六、位变量的C51定义
除了C的数据类型外,C51编译器支持“bit”数据类型
}
任务一 点亮彩灯
/*依次点亮发光二极管的程序*/ #include”reg51.h” #define uchar unsigned char void delay05s(void)//延时0.5S {

单片机C51语言及程序设计

单片机C51语言及程序设计
1)将SFR的绝对位地址定义为位变量名



C51编译器在头文件“REG51.H”中定义了全部sfr/sfr16和sbit变量。 用一条预处理命令#include <REG51.H>把这个头文件包含到C51程序中,无需重新定义即可直接使用它们的名称。
应用举例:
片内数据存储器,片外数据存储器和程序存储器。
通常下划线开头的标识符是编译系统专用的,因此在编写C语言源程序时一般不使用以下划线开头的标识符,而将下划线用作分段符。C51编译器规定标识符最长可达255个字符,但只有前32个字符在编译时有效,因此标识符的长度一般不要超过32个字符。
关键字是一种已被系统使用过的具有特定含义的标识符。用户不得再用关键字给变量等命名。C语言关键字较少,ANSI C标准一共规定了32个关键字,见表
变量名具有字母大小写的敏感性,如SUM和sum代表不同的变量。
【存储类别】 数据类型 【存储器类型】 变量名
变量名不得使用标准C语言和C51语言的关键字。
unsigned char data system_status = 0;
//定义system_status为无符号字符型自动变量,该变量位于data区中且初值为0。
sfr或sfr16型 51MCU中有21个SFR,如何定义与这些单元相关的变量?
例如,sfr P0 = 0x80; //定义P0口地址80H sfr PCON = 0x87; //定义PCON地址87H sfr16 DPTR=0x82; //定义DPTR的低端地址82H
单精度浮点数
for
程序语句
构成for循环结构
goto
程序语句
构成goto转移结构
if
程序语句

c51汇编语言16进制书写规则

c51汇编语言16进制书写规则

C51汇编语言16进制书写规则1. 概述C51汇编语言是一种常用于嵌入式系统开发的低级语言,它通过对CPU 的指令进行底层控制,可以实现对硬件设备的高效操作。

在编写C51汇编程序时,经常会用到16进制数值,因此了解16进制数值的书写规则对于正确编写程序至关重要。

本文将对C51汇编语言16进制书写规则进行详细介绍。

2. 16进制数值的表示方式16进制数值由0-9和A-F共16个字符组成,分别对应10-15的十进制数值。

在C51汇编语言中,16进制数值可以使用0x或者#前缀进行表示,例如0x1A或者#1F表示16进制数值1A和1F。

3. 16进制数值的书写规则在C51汇编语言中,16进制数值的书写规则如下:3.1 小写字母表示在书写16进制数值时,C51汇编语言允许使用小写字母a-f来表示十六进制的A-F,也就是说,整个16进制数值可以使用小写字母来表示,例如:0x1a3b。

3.2 数值前缀在表示16进制数值时,一般会在数值前面加上0x或者#前缀,这样可以明确表示这是一个16进制数值而不是10进制数值。

3.3 数值范围在C51汇编语言中,16进制数值的范围通常是0x00到0xFF,表示的是一个字节范围内的数值。

4. 16进制数值的应用在C51汇编语言程序中,16进制数值经常用于表示寄存器的位置区域、控制寄存器的位操作、设置定时器的初值等。

使用16进制数值可以有效地减少程序的长度,提高程序的执行效率。

5. 总结了解C51汇编语言16进制数值的书写规则对于编写高质量、高效率的程序至关重要。

通过掌握16进制数值的表示方式和书写规则,开发人员可以更加灵活地利用C51汇编语言来实现对嵌入式系统的底层控制,从而更好地满足项目的需求。

在C51汇编语言程序中,16进制数值的合理使用可以提高程序的可读性和可维护性,减少程序的长度,提高程序的执行效率。

对C51汇编语言16进制数值的书写规则进行了解和掌握对于程序开发人员至关重要。

单片机C51语言及程序设计

单片机C51语言及程序设计

单片机C51语言及程序设计单片机是一种微型计算机芯片,通常用于控制和执行各种电子设备中的任务。

单片机C51语言是一种基于C语言的编程语言,它在单片机开发中被广泛应用。

本文将对单片机C51语言及程序设计进行介绍。

一、单片机C51语言简介单片机C51语言是一种基于C语言的嵌入式编程语言,它是Intel公司为其8051系列单片机提供的编程语言。

C51语言与C语言的语法相似,但是在一些底层操作和特殊功能上有所区别。

使用C51语言编写的程序可以在8051系列单片机上直接运行,实现各种控制和功能。

C51语言的特点包括高效的编译器、丰富的库函数、快速的速度和较小的存储空间占用。

它可以利用C语言的各种高级特性进行程序设计,同时也支持直接对单片机的硬件进行底层操作。

二、单片机C51语言程序编写1.编译与烧录环境2.基本语法和数据类型C51语言的基本语法与C语言相似。

它支持各种数据类型,包括整数、浮点数、字符等。

同时,C51语言还定义了一些特殊的数据类型和关键字,如sfr(特殊功能寄存器)、xdata(扩展数据存储器)等。

3.控制语句和函数C51语言支持各种控制语句和函数,如条件语句(if-else、switch-case)、循环语句(for、while)、函数定义等。

通过这些语句和函数,我们可以实现复杂的控制逻辑和算法。

4.寄存器和端口操作单片机的核心是CPU和各种寄存器。

C51语言提供了一些特殊的语法和关键字,可以直接访问和操作寄存器。

通过这些操作,我们可以实现对单片机硬件的底层控制。

例如,下面的代码演示了如何使用C51语言对LED灯进行控制:sfr P0 = 0x80; // 特殊功能寄存器,用于控制P0口#define LED_PIN P0_0 // 使用宏定义定义LED的引脚void maiLED_PIN=0;//将LED引脚电平设为低电平while(1)LED_PIN=1;//将LED引脚电平设为高电平delay(1000); // 延时1秒LED_PIN=0;//将LED引脚电平设为低电平delay(1000); // 延时1秒}在上面的代码中,我们通过特殊功能寄存器P0和宏定义LED_PIN,定义了与LED相关的引脚和寄存器。

单片机c51的编程习惯PPT课件

单片机c51的编程习惯PPT课件
• switch语句 每个case和其判据条件独占一行。 每个 case程序块需用break结束。特殊情况下需要从一个case 块顺序执行到下一个case块的时候除外,但需要在交界处 明确注释如此操作的原因,以防止出错。 case程序块之 间空一行,且只空一行。 每个case程序块的执行语句保 持4个空格的缩进。一般情况下都应该包含default分支。
有且只有一行空行。 相邻函数之间应该有且只有
一行空行。 函数体内相对独立的程序块之间可以
用一行空行 或注释来 函数注释和对应的函数体
之间不应该有空行。文件末尾有且只有一行空行

-
15
• 空格 函数语句尾部或者注释之后不能有空格。 括号内侧 (即左括号后面和右括号前面)不加空格,多重括号间不 加空格。函数形参之间应该有且只有一个空格(形参逗号 后面加空格)。同一行中定义的多个变量间应该有且只有 一个空格(变量逗号后面加空格)。表达式中,若有多个 操作符连写的情况,应使用空格对它们分隔: 在两个以 上的关键字、变量、常量进行对等操作时,它们之间的操 作符前后均加一个空格;在两个以上的关键字、变量、常 量进行非对等操作时,其前后均不应加空格; 逗号只在 后面加空格; 双目操作符,如比较操作符, 赋值操作符"="、 "+=",算术操作符"+"、"%",逻辑操作符"&&"、"&",位操 作符"<<"、"^"等,前后均加一个空格; 单目操作符,如 "!"、"~"、"++"、"-"、"&"(地址运算符)等,前后不加空 格; "->"、"."前后不加空格; if、for、while、switch等关 键字与后面的括号间加一个空格;

C51程序设计(完整)

C51程序设计(完整)

第1章C51数据类型与运算1.1C51数据类型C51的数据类型如下所示:C51编译器支持的数据类型、长度和值域如下表1-1所示。

与面向数学运算的计算机相比,51单片机对变量类型或数据类型的选择更具有关键性意义。

如果在程序设计中使用大量而不必要的变量类型,这会导致C编译器调用库函数的数量,以处理大量的变量类型和数据类型。

所以必须特别慎重地进行变量和数据类型的选择。

1.2C51数据存储类型C51编译器还可以通过将变量、常量定义成不同的存储类型(data,bdata,idata,pdata,xdata,code)的方法,将它们定义在不同的存储区中。

存储类型与51单片机实际存储空间的对应关系如表1-2所示。

储区中。

片内RAM是存放临时性传递变量或使用频率较高变量的理想场所。

访问片内数据存储器(data、bdata、idata)比访问片外数据存储器(xdata、pdata)相对快一些,因此可将经常使用的变量置于片内数据存储器,而将规模较大的或不常使用的数据置于片外数据存储器中。

C51存储类型及其大小和值域如表1-3所示。

例如:表1-3 C51存储类型及其大小和值域char data var1; /*字符变量var1被定义为data存储类型,定位在片内RAM中*/bit bdata flags; /*位变量flags被定义为data存储类型,定位在片内RAM中的位寻址区*//*(20H~2FH)*/float idata x,y,z; /*浮点变量x,y,z被定义为idata存储类型,定位在片内RAM中,并只能用间接寻址的方法进行访问*/unsigned int pdata dimension; /*无符号整型变量dimension被定义为pdata存储类型,定位在片外RAM中,并用MOVX @Ri访问*/ unsigned char xdata vector[10][4][4]; /*无符号字符三维数组变量vector[10][4][4]被定义为xdata存储类型,定位在片外RAM中,占据10×4×4=160个字节空间*/如果在变量定义时省略存储类型标志符,编译器会自动默认存储类型。

C51语言程序设计基础

C51语言程序设计基础

C51语言程序设计基础C51语言的编程步骤与C语言类似,可以分为预处理、编译、汇编和链接四个阶段。

预处理阶段通过宏替换、文件包含等操作,将源代码转化为C语言代码。

编译阶段将C语言代码转化为汇编代码。

汇编阶段将汇编代码转化为机器码,并生成目标文件。

链接阶段将多个目标文件组合在一起,生成最终的可执行文件。

C51语言中的程序结构与C语言类似,有全局变量、函数声明、函数定义等部分。

全局变量声明必须在函数之外,可以使用关键字data定义变量的数据类型。

函数声明和定义使用关键字code,表示函数会被编译为汇编代码。

1. mov命令:用于将一个值从一个寄存器或内存地址复制到另一个寄存器或内存地址。

语法为mov dest, src,其中dest为目标操作数,src为源操作数。

2. add命令:用于将源操作数的值加到目标操作数中。

语法为add dest, src。

3. sub命令:用于将源操作数的值从目标操作数中减去。

语法为sub dest, src。

4. inc命令:用于将目标操作数的值加1、语法为inc dest。

5. dec命令:用于将目标操作数的值减1、语法为dec dest。

除了上述命令外,C51语言还提供了一些控制流语句,如if语句、for循环、while循环等。

这些控制流语句的语法与C语言相似,使用关键字if、for、while等。

与C语言不同的是,C51语言没有布尔类型,通常使用条件判断命令(如cjne、djnz等)来实现条件控制。

综上所述,C51语言是一种用于嵌入式系统开发的编程语言,语法和C语言相似,但也存在一些差异。

了解C51语言的基础知识对于进行单片机编程是非常重要的。

希望本文能够帮助读者快速入门C51语言,并在实际项目中得到应用。

51单片机C语言编程规范

51单片机C语言编程规范
(2)C51中的数据类型与标准C的数据类型也有 一定的区别,在C51中还增加了几种针对89C51单片 机特有的数据类型;
C51程序结构
原码工作室
(3)C51变量的存储模式与标准C中变量的存储模 式不一样,C51中变量的存储模式是与89C51单片机 的存储器紧密相关;
(4)C51与标准C的输入输出处理不一样,C51中 的输入输出是通过89C51串行口来完成的,输入输出 指令执行前必须要对串行口进行初始化;
Int a ;
部变量。在一个函数体 内,要使用一个已在该函数体外或别的程序中定义过的 外部变量时,该变量在该函数体内要用extern说明。外部 变量被定义后分配固定的内存空间,在程序整个执行时 间内都有效,直到程序结束才释放。
3.static:
本章主要以KEIL编译器介绍89C51单片机C语言 程序设计。
C51程序结构
原码工作室
C51的语法规定、程序结构及程序设计方法都与 标准的C语言程序设计相同,但C51程序与标准的C 程序在以下几个方面不一样:
(1)C51中定义的库函数和标准C语言定义的库 函数不同。标准的C语言定义的库函数是按通用微型 计算机来定义的,而C51中的库函数是按89C51单片 机相应情况来定义的;
源码工作室
原码工作室
学习单片机C语言的必要性
随着单片机性能的不断提高,C语言编译调 试工具的不断完善,以及现在对单片机产品辅助 功能的要求、对开发周期不断缩短的要求,使得 越来越多的单片机编程人员转向使用C语言,因 此有必要在单片机课程中讲授“单片机C语言”。
C语言编程的优势
原码工作室
1.语言简洁、紧凑,使用方便、灵活。
signed int数据用补码表示。
原码工作室

谈谈C51的编程规范

谈谈C51的编程规范

谈谈C51的编程规范
:模块名及文件名, 内部函数,只要注释其定义文件名;
三、编辑风格
1、缩进:缩进以Tab 为单位,一个Tab 为四个空格大小。

预处理语句、全局数据、函数原型、标题、附加说明、函数说明、标号等均顶格书写。

语句块的“{”“}”配对对齐,并与其前一行对齐;
2、空格:数据和函数在其类型,修饰名称之间适当空格并据情况对齐。


键字原则上空一格,如:if ( ... ) 等,运算符的空格规定如下:“-”、“[”、“]”、“++”、“--”、“~”、“!”、“+”、“-”(指正负号),“”(取址或引用)、“*”(指使用指针时)
等几个运算符两边不空格(其中单目运算符系指与操作数相连的一边),其它
运算符(包括大多数二目运算符和三目运算符“?:”两边均空一格,“(”、“)”运算符在其内侧空一格,在作函数定义时还可据情况多空或不空格来对齐,但在函数实现时可以不用。

“,”运算符只在其后空一格,需对齐时也可不空或多空格,对语句行后加的注释应用适当空格与语句隔开并尽可能对齐。

3、对齐:原则上关系密切的行应对齐,对齐包括类型、修饰、名称、参数
等各部分对齐。

另每一行的长度不应超过屏幕太多,必要时适当换行,换行时尽可能在“,”处或运算符处,换行后最好以运算符打头,并且以下各行均以该语句首行缩进,但该语句仍以首行的缩进为准,即如其下一行为“{”应与首行对齐。

4、空行:程序文件结构各部分之间空两行,若不必要也可只空一行,各函
数实现之间一般空两行5、修改:版本封存以后的修改一定要将老语句用封闭,不能自行删除或修改,并要在文件及函数的修改记录中加以记录。

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

C51编程规范

C51编程规范

C51 编码规范1. 排版风格<规则1>程序块采用缩进风格编写,缩进为4个空格位。

排版不混合使用空格和TAB键。

<规则2>在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符后不应加空格。

采用这种松散方式编写代码的目的是使代码更加清晰。

例如:(1) 逗号、分号只在后面加空格printf("%d %d %d" , a, b, c);(2)比较操作符, 赋值操作符"="、"+=",算术操作符"+"、"%",逻辑操作符"&&"、"&",位域操作符"<<"、"^"等双目操作符的前后加空格if(lCurrentTime >= MAX_TIME_V ALUE)a =b + c;a *= 2;a =b ^ 2;(3)"!"、"~"、"++"、"--"、"&"(地址运算符)等单目操作符前后不加空格*pApple = 'a'; // 内容操作"*"与内容之间flag = !bIsEmpty; // 非操作"!"与内容之间p = &cMem; // 地址操作"&" 与内容之间i++; // "++","--"与内容之间(4)"->"、"."前后不加空格p->id = pId; // "->"指针前后不加空格最后,即使留空格,也不要连续留两个以上空格(为了保证缩进和排比留空除外)。

C语言编程规范C51

C语言编程规范C51
w WORD
x,y 坐标
Char或者TCHAR类型 与Windows API有直接联系的用szAppName[10]形式否则用
FileName[10]形式,单个字符也可用小写字母表示;
Int类型 nCmdShow;
LONG类型 lParam;
3.9 不要轻易用条件分支去替换逻辑表达式。
4. 正确性与容错性要求
4.1 程序首先是正确,其次是优美
4.2 无法证明你的程序没有错误,因此在编写完一段程序后,应先回头检查。
4.3 改一个错误时可能产生新的错误,因此在修改前首先考虑对其它程序的影响。
4.4 所有变量在调用前必须被初始化。
所有非正统的人会非难这种不一致性,但是,所有思维正常的人明白: (第一) K&R是___对___的,(第二)如果K&R不对,请参见第一条. (:-))......另外,函数也是特殊的,不一定非得一致.
需要注意的是结束的括号在它所占的那一行是空的,__除了__它跟随着同一条语句的继续符号.如while在do-while循环中,或者else在if语句中.如下:
2.13 空行和空白字符也是一种特殊注释。
2.14 一目了然的语句不加注释。
2.15 注释的作用范围可以为:定义、引用、条件分支以及一段代码。
2.16 注释行数(不包括程序头和函数头说明部份)应占总行数的 1/5 到 1/3 。
3. 结构化要求
3.1 禁止出现两条等价的支路。
块名及文件名, 如是内部函数,只要注释其定义文件名;
第一个字母必须使用大写字母,要求用大小写字母组合规范函数命名,必要时可用下划线
间隔,示例如下:
void UpdateDB_Tfgd (TRACK_NAME); file://Module Name :r01/sdw.c

C51程序设计

C51程序设计

C51程序设计C51程序设计是指通过C语言编写的用于C51单片机的程序。

C51单片机是一种基于8051架构的单片机,具有广泛的应用领域,如电子产品、嵌入式系统等。

在本文中,我将讲述C51程序设计的完整内容,并且给出1200多字的详细说明。

首先,C51单片机具有的特点主要有:易于学习和使用、低功耗、功能强大、扩展性好、体积小、性能稳定等。

C51单片机的硬件结构包括中央处理器(CPU)、存储器、输入输出(I/O)端口等。

中央处理器是C51单片机的核心部件,负责执行指令和控制系统的运行。

存储器用于存储数据和程序,包括随机存储器(RAM)和只读存储器(ROM)。

输入输出端口用于与外部设备进行数据交互,如LED灯、数码管、键盘等。

其次,C语言是一种高级程序设计语言,被广泛应用于嵌入式系统和各种应用程序的开发。

C语言的基本语法包括数据类型、变量、运算符、控制语句、函数等。

数据类型用于定义变量的类型,如整型、字符型、浮点型等。

变量是用于存储数据的标识符,可以在程序中进行赋值、读取和修改。

运算符用于进行各种算术、逻辑和位运算操作。

控制语句用于控制程序的执行流程,如条件语句、循环语句等。

函数是程序的基本模块,用于封装可重用的代码块。

在C51程序设计中,需要安装C51编译器,常用的有Keil C51、Keil C51是一种功能强大、易于使用的C51编译器,提供了丰富的库函数和调试工具,可以大大简化程序的开发和调试过程。

安装完编译器后,可以使用C语言编写C51程序,通过编译、烧写和运行等步骤,将程序加载到C51单片机中执行。

C51程序的设计步骤主要包括需求分析、程序设计、编码实现、编译和烧写、调试和测试等。

需求分析是明确程序的功能和性能要求,根据需求进行程序设计。

程序设计是将需求转化为具体的算法和数据结构,设计程序的模块和接口。

编码实现是根据设计的程序,使用C语言实现具体的功能和操作。

编译和烧写是将C源代码编译为可执行文件,并将可执行文件加载到C51单片机中执行。

c51程序设计方法

c51程序设计方法

c51程序设计方法C51程序设计方法C51程序设计是指使用C语言来进行51系列单片机的程序开发和编程。

在C51程序设计中,我们可以通过编写C语言代码来实现对单片机的控制和操作,包括输入输出、中断处理、时钟控制等功能。

在C51程序设计中,首先需要了解单片机的硬件结构和功能。

单片机是一种集成电路,内部包含了CPU、存储器、输入输出接口、定时器、中断控制器等功能模块。

了解这些硬件模块的特点和使用方法,对于进行C51程序设计至关重要。

在C51程序设计中,我们首先需要选择合适的开发环境和编译工具。

常用的C51开发环境有Keil C51、SDCC等,这些工具提供了编译、调试和下载等功能,方便我们进行程序开发和调试。

在C51程序设计中,我们可以通过编写C语言代码来实现对单片机的控制。

C语言是一种高级语言,具有结构化、模块化和可移植等特点,可以方便地实现复杂的功能。

在编写C51程序时,我们可以使用C语言的各种语法和函数库,如变量声明、条件语句、循环语句、函数调用等,来实现对单片机的各种操作。

在C51程序设计中,我们可以利用单片机的输入输出接口来实现与外部设备的通信。

单片机的输入输出接口可以连接各种传感器、开关、显示器、驱动器等外部设备,通过编写相应的C语言代码,可以实现与这些外部设备的数据交换和控制。

在C51程序设计中,我们还可以利用单片机的中断功能来处理各种事件和异常。

中断是一种特殊的事件,当某个条件满足时,单片机会自动跳转到相应的中断服务程序进行处理。

通过编写中断服务程序,我们可以实现对各种事件的即时响应,提高程序的实时性和可靠性。

在C51程序设计中,我们还可以利用单片机的定时器功能来实现各种定时和计时的功能。

定时器可以产生一定时间间隔的中断信号,通过编写相应的中断服务程序,我们可以实现定时和计时的功能,例如定时采样、定时发送数据等。

在C51程序设计中,我们还可以利用单片机的通信接口来实现与其他设备的数据交换。

C51编程规范

C51编程规范

C51编程规范(总5页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--单片机C51编程规范1单片机C51编程规范-前言为了提高源程序的质量和可维护性,从而最终提高软件产品生产力,特编写此规范。

2 单片机C51编程规范-范围本标准规定了程序设计人员进行程序设计时必须遵循的规范。

本规范主要针对C51编程语言和keil编译器而言,包括排版、注释、命名、变量使用、代码可测性、程序效率、质量保证等内容。

3 单片机C51编程规范-总则格式清晰注释简明扼要命名规范易懂函数模块化程序易读易维护功能准确实现代码空间效率和时间效率高适度的可扩展性4 单片机C51编程规范-数据类型定义编程时统一采用下述新类型名的方式定义数据类型。

建立一个文件,在该文件中进行如下定义:typedef bit BOOL; 全局变量另加前缀g_。

局部变量应简明扼要。

局部循环体控制变量优先使用i、j、k等;局部长度变量优先使用len、num等;临时中间变量优先使用temp、tmp等。

函数命名函数名用小写字母命名,每个词的第一个字母大写,并将模块标识加在最前面。

文件命名一个文件包含一类功能或一个模块的所有函数,文件名称应清楚表明其功能或性质。

每个.c文件应该有一个同名的.h文件作为头文件。

6 单片机C51编程规范-注释注释基本原则l 有助于对程序的阅读理解,说明程序在"做什么",解释代码的目的、功能和采用的方法。

l 一般情况源程序有效注释量在30%左右。

l 注释语言必须准确、易懂、简洁。

l 边写代码边注释,修改代码同时修改相应的注释,不再有用的注释要删除。

文件注释文件注释必须说明文件名、函数功能、创建人、创建日期、版本信息等相关信息。

修改文件代码时,应在文件注释中记录修改日期、修改人员,并简要说明此次修改的目的。

所有修改记录必须保持完整。

文件注释放在文件顶端,用"/*……*/"格式包含。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

引言今天人们越来越明白软件设计更多地是一种工程,而不是一种个人艺术。

由于大型产品的开发通常由很多的人协同作战,如果不统一编程规范,最终合到一起的程序,其可读性将较差,这不仅给代码的理解带来障碍,增加维护阶段的工作量,同时不规范的代码隐含错误的可能性也比较大。

BELL实验室的研究资料表明,软件错误中18%左右产生于概要设计阶段,15%左右产生于详细设计阶段,而编码阶段产生的错误占的比例则接近50%;分析表明,编码阶段产生的错误当中,语法错误大概占20%左右,而由于未严格检查软件逻辑导致的错误、函数(模块)之间接口错误及由于代码可理解度低导致优化维护阶段对代码的错误修改引起的错误则占了一半以上。

可见,提高软件质量必须降低编码阶段的错误率。

如何有效降低编码阶段的错误呢?BELL实验室的研究人员制定了详细的软件编程规范,并培训每一位程序员,最终的结果把编码阶段的错误降至10%左右,同时也降低了程序的测试费用,效果相当显著。

本文从代码的可维护性(可读、可理解性、可修改性)、代码逻辑与效率、函数(模块)接口、可测试性四个方面阐述了软件编程规范,规范分成规则和建议两种,其中规则部分为强制执行项目,而建议部分则不作强制,可根据习惯取舍。

2. 编码规范2.1. 排版风格<规则 1> 程序块采用缩进风格编写,缩进为4个空格位。

排版不混合使用空格和TAB键。

<规则2> 在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符(如->),后不应加空格。

采用这种松散方式编写代码的目的是使代码更加清晰。

例如:(1) 逗号、分号只在后面加空格printf("%d %d %d" , a, b, c);(2)比较操作符, 赋值操作符"="、 "+=",算术操作符"+"、"%",逻辑操作符"&&"、"&",位域操作符"<<"、"^"等双目操作符的前后加空格if(lCurrentTime >= MAX_TIME_value)a =b + c;a *= 2;a =b ^ 2;(3)"!"、"~"、"++"、"--"、"&"(地址运算符)等单目操作符前后不加空格*pApple = 'a'; // 内容操作"*"与内容之间flag = !bIsEmpty; // 非操作"!"与内容之间p = &cMem; // 地址操作"&" 与内容之间i++; // "++","--"与内容之间(4)"->"、"."前后不加空格p->id = pId; // "->"指针前后不加空格由于留空格所产生的清晰性是相对的,所以,在已经非常清晰的语句中没有必要再留空格,如最内层的括号内侧(即左括号后面和右括号前面)不要加空格,因为在C/C++语言中括号已经是最清晰的标志了。

另外,在长语句中,如果需要加的空格非常多,那么应该保持整体清晰,而在局部不加空格。

最后,即使留空格,也不要连续留两个以上空格(为了保证缩进和排比留空除外)。

<规则3> 函数体的开始,类的定义,结构的定义,if、for、do、while、switch及case语句中的程序都应采用缩进方式,憑捄蛻}捰禀独占一行并且位于同一列,同时与引用它们的语句左对齐例如下例不符合规范。

for ( ... ) {... // 程序代码}if ( ... ){... // 程序代码}void DoExam( void ){... // 程序代码}应如下书写。

for ( ... ){... // 程序代码}if ( ... ){... // 程序代码}void DoExam( void ){... // 程序代码}<规则4> 功能相对独立的程序块之间或for、if、do、while、switch等语句前后应加一空行。

例如以下例子不符合规范。

例一:if ( ! ValidNi( ni ) ){... // 程序代码}nRepssnInd = SsnData[ index ].nRepssnIndex ;nRepssnNi = SsnData[ index ].ni ;例二:char *pContext;int nIndex;long lCounter;pContext = new (CString);if(pContext == NULL){return FALSE;}应如下书写例一:if ( ! ValidNi( ni ) ){... // 程序代码}nRepssnInd = SsnData[ index ].nRepssnIndex ;nRepssnNi = SsnData[ index ].ni ;例二:char *pContext;int nIndex;long lCounter;pContext = new (CString);if(pContext == NULL){return FALSE;}<规则5> if、while、for、case、default、do等语句自占一行。

示例:如下例子不符合规范。

if(pUserCR == NULL) return;应如下书写:if( pUserCR == NULL ){return;}<规则6> 若语句较长(多于80字符),可分成多行写,划分出的新行要进行适应的缩进,使排版整齐,语句可读。

memset(pData->pData + pData->nCount, 0,(m_nMax - pData->nCount) * sizeof(LPVOID));CNoTrackObject* pvalue =(CNoTrackObject*)_afxThreadData->GetThreadvalue(m_nSlot);for ( i = 0, j = 0 ; ( i < BufferKeyword[ WordIndex ].nWordLength )&& ( j < NewKeyword.nWordLength ) ; i ++ , j ++ ){... // 程序代码}<规则7> 一行最多写一条语句。

示例:如下例子不符合规范。

rect.length = 0 ; rect.width = 0 ;rect.length = width = 0;都应书写成:rect.length = 0 ;rect.width = 0 ;<规则8> 对结构成员赋值,等号对齐。

示例:rect.top = 0;rect.left = 0;rect.right = 300;rect.bottom = 200;<规则9> #define的各个字段对齐以下示例不符合规范#define MAX_TASK_NUMBER 100#define LEFT_X 10#define BOTTOM_Y 400应书写成:#define MAX_TASK_NUMBER 100#define LEFT_X 10#define BOTTOM_Y 400<规则10> 不同类型的操作符混合使用时,使用括号给出优先级。

如本来是正确的代码:if( year % 4 == 0 || year % 100 != 0 && year % 400 == 0 )如果加上括号,则更清晰。

if((year % 4) == 0 || ((year % 100) != 0 && (year % 400) == 0))2.2. 可理解性2.2.1.注释注释的原则是有助于对程序的阅读理解,注释不宜太多也不能太少,太少不利于代码理解,太多则会对阅读产生干扰,因此只在必要的地方才加注释,而且注释要准确、易懂、尽可能简洁。

注释量一般控制在30%到50%之间。

<规则1> 程序在必要的地方必须有注释,注释要准确、易懂、简洁。

例如如下注释意义不大。

/* 如果bReceiveFlag 为 TRUE */if ( bReceiveFlag == TRUE)而如下的注释则给出了额外有用的信息。

/* 如果mtp 从连接处获得一个消息*/if ( bReceiveFlag == TURE)<规则2> 注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。

示例:如下例子不符合规范。

例子1/* 获得系统指针和网络指针的副本 */nRepssnInd = SsnData[ index ].nRepssnIndex ;nRepssnNi = SsnData[ index ].ni ;例子2nRepssnInd = SsnData[ index ].nRepssnIndex ;nRepssnNi = SsnData[ index ].ni ;/*获得系统指针和网络指针的副本 */应如下书写/*获得系统指针和网络指针的副本 */nRepssnInd = SsnData[ index ].nRepssnIndex ;nRepssnNi = SsnData[ index ].ni ;<规则3> 对于所有的常量,变量,数据结构声明(包括数组、结构、类、枚举等),如果其命名不是充分自注释的,在声明时都必须加以注释,说明其含义。

示例:/* 活动任务的数量 */#define MAX_ACT_TASK_NUMBER 1000#define MAX_ACT_TASK_NUMBER 1000 /*活动任务的数量 *//* 带原始用户信息的SCCP接口 */enum SCCP_USER_PRIMITIVE{N_UNITDATA_IND , /* 向SCCP用户报告单元数据已经到达 */N_UNITDATA_REQ , /* SCCP用户的单元数据发送请求 */} ;<规则4> 头文件、源文件的头部,应进行注释。

相关文档
最新文档