C51编程规范
单片机高级语言C51程序设计
2020/5/6
59
7.3 C51编译练习程序TEXT.C
2020/5/6
60
八.C51的应用
2020/5/6
61
按钮判断(1)
2020/5/6
62
按钮判断(2)
org 0000h start:mov p1,#00h mov p0,#0ffh stl:jb p0.0,$
jnb p0.0,$ cpl p1.0 sjmp stl end
78
ADC0809应用举例
2020/5/6
79
ADC0809应用C51程序(1)
2020/5/6
80
ADC0809应用C51程序(2)
2020/5/6
81
中断服务软件设计
2020/5/6
82
九.课本例题选介
2020/5/6
83
例8-2
2020/5/6
84
例8-5
2020/5/6
85
例8-7(1)
#INCLUDE所包含的所有文件)。 – C)、保存项目。在打开的窗口中输入项目名称(
名称可自定,扩展名.PRJ可不加,软件会自动添加 )。
• 编译调试。(其它的设置同汇编程序)
2020/5/6
56
7.2. uVision3集成开发环境
2020/5/6
57
uVision3集成开发环境操作步骤
• 运行KEIL 51软件 ;
2020/5/6
3
六.函数
本章目录3
1.函数格式
2.重入函数
3.中断服务函数
七.C51程序设计举例
1.例1---求数学式
2.例2---简单控制
3.例3---延时
第3章_C51语言编程基础
.
3
2、Keil C51语言简介
对于51单片机,目前广泛使用的是Keil C51语言,简称C51语言。
Keil C51语言是在标准C的基础上,针对51单片机的硬件特点进行 扩展,并向51单片机上移植的高效、简洁的实用高级语言。
与汇编语言相比的特点: (1)可读性好。 (2)可模块化开发。 (3)可移植性好。 (4)生成的代码效率较低。
unsigned char j ;
for(j=0; j<8; j++) {
buffer[j]=0; }
}
.
8
33
3、C51的基本运算 C51语言的基本运算与标准C类似,主要包括算术运算、关系运算、 逻辑运算、位运算和赋值运算及其表达式等。
1)算术运算符
.
34
2)关系运算符
关系表达式
int x=3; int y=6; int R;
bit的值可以是1(true),或0(false)。
格式: bit 变量名;
例如:
bit
flag;
flag = 0;
.
8
(2)特殊功能寄存器sfr 地址单元80H——FFH之间的片内数据存储区; “sfr” 数据类型占用一个内存单元; 利用它可以访问51单片机内部的所有特殊功能寄存器。 格式: sfr 寄存器变量名 = 字节地址常数;
01000000 | 11111111
00001000 << 3
.
38
【例】以字节操作方式对I/O口P1的P1.5清0 ,P1.1置为1, 其他位保持不变。
例如:
sfr
PSW = 0xd0;
//定义PSW寄存器地址为0xd0
单片机C51语言及程序设计
贰
壹
叁
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编程规范
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 边写代码边注释,修改代码同时修改相应的注释,不再有用的注释要删除。
文件注释文件注释必须说明文件名、函数功能、创建人、创建日期、版本信息等相关信息。
修改文件代码时,应在文件注释中记录修改日期、修改人员,并简要说明此次修改的目的。
所有修改记录必须保持完整。
文件注释放在文件顶端,用"/*……*/"格式包含。
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的编程习惯PPT课件
有且只有一行空行。 相邻函数之间应该有且只有
一行空行。 函数体内相对独立的程序块之间可以
用一行空行 或注释来 函数注释和对应的函数体
之间不应该有空行。文件末尾有且只有一行空行
。
-
15
• 空格 函数语句尾部或者注释之后不能有空格。 括号内侧 (即左括号后面和右括号前面)不加空格,多重括号间不 加空格。函数形参之间应该有且只有一个空格(形参逗号 后面加空格)。同一行中定义的多个变量间应该有且只有 一个空格(变量逗号后面加空格)。表达式中,若有多个 操作符连写的情况,应使用空格对它们分隔: 在两个以 上的关键字、变量、常量进行对等操作时,它们之间的操 作符前后均加一个空格;在两个以上的关键字、变量、常 量进行非对等操作时,其前后均不应加空格; 逗号只在 后面加空格; 双目操作符,如比较操作符, 赋值操作符"="、 "+=",算术操作符"+"、"%",逻辑操作符"&&"、"&",位操 作符"<<"、"^"等,前后均加一个空格; 单目操作符,如 "!"、"~"、"++"、"-"、"&"(地址运算符)等,前后不加空 格; "->"、"."前后不加空格; if、for、while、switch等关 键字与后面的括号间加一个空格;
第3章-C51语言编程基础-图文.
(3)IDATA区。该区使用寄存器作为指针来进行间接寻址,
常用来存放使用比较频繁的变量。与外部存储器寻址相比,它
的指令执行周期和代码长度相对较短。IDATA区声明
19
中的存储类型标识符为idata,指的是片内RAM的256字节的 存储区,只能间接寻址,速度比直接寻址慢。
Keil C51支持的基本数据类型见表3-1。针对8051的硬件特 点,C51在标准C基础上,扩展了4种数据类型(见表3-1中最后 4行)。
注意,扩展的4种数据类型,不能使用指针来对它们存取。
10
2.C51的扩展数据类型 下面对扩展的4种数据类型说明。
(1)位变量bit的值可以是1(true),也可是0(false) 。
5
C51语言与标准C语言一些差别如下。 (1)库函数不同。标准C中不适合于嵌入式控制器系统的库
函数,被排除在C51语言之外,如字符屏幕和图形函数。有些 库函数必须针对8051的硬件特点来做出相应的开发。例如,在 标准C中,库函数printf和scanf,常用于屏幕打印和接收字符 ,而在C51语言中,主要用于串行口数据的收发。
为20H~2FH)中的128个位。下面是在BDATA区中声明的位变量
和使用位变量的例子:
unsigned char bdata status_byte; unsigned int bdata status_word; sbit stat_flag=status_byte^4; if(status_word^15) { …… } stat_flag=1;
(4)生成的代码效率高。当前较好的C51语言编译系统编译 出来的代码效率只比直接使用汇编语言低20%左右,如果使 用优化编译选项,最高可达到90%左右。
单片机的C51编程
以写若干条语句,一个语句也可以写成几行,不
管一行写几个语句,每个语句须以“;”结尾。
2.程序由一个主函数和若干个其他函数组
成,主函数的名字必须为main。程序的执行总是
从main函数开始的,其位置无特殊规定。
3.C语言程序通过函数调用去执行指定的工
作。源程序文件需要包含其他源程序文件的内容
时,则要在本程序文件头部用包含命令#include
目前针对8051系列单片机开发出来的编译器有 多种,包括Franklin C51、Keil C51 for windows等
3
第二节 程序的格式
先从几个实例,了解C语言的程序格式。
例9-1 能输出“Welcome to use C51”的C语言程序 #include“stdio.h” main() { printf(“Welcome to use C51 \n”); }
其中main( )为主函数,printf为输出函数,stdio.h 为头文件,执行这个程序的目的,是在屏幕上输出以下 一行信息:
Welcome to use C51
4
例9-2 求三个数a、b、c的和。 #include“stdio.h”
main( )
/*主函数*/
{
int a,b,c,sum;
/*定义变量*/
m=max(a,b);
/*调用max函数,将返回值m*/
printf(“max=%d”,m); /*输出m的值*/
}
程序执行结果是在输入a,b值后,可求出较大的数并
赋予变量m 。如输入a=3,b=5,则执行结果可显示出 m=5。
7
从三个例子可看出C语言或C51源程序的基
本格式有如下特点:
1. C语言程序的书写格式比较自由,一行可
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个字节空间*/如果在变量定义时省略存储类型标志符,编译器会自动默认存储类型。
No.5C51程序设计
– 指定存储区的指针
• 指定存储区的指针在指针的声明中经常包含一个 存储类型标识符指向一个确定的存储区。 • 例如: char data *str; int xdata *ptr; long code *tab;
• 指定存储区指针存放时不再像通用指针那样需 要保存存储类型,指向idata、data 、bdata 和pdata存储区的指针只需要一个字节存放, 而code和xdata指针也才需要两字节。从而减 少了指针长度,节省了存储空间。
– 如:sfr16 TL0=0x8A;
– 特殊功能寄存器中特定位的定义
• 在C51中可以利用关键字sbit定义可独立寻址访问 的位变量
• 对一般位变量的定义
– 当位变量位于内部RAM的可位寻址区(20H~2FH 单元)时,可以利用C51编译器提供的bdata存储器 类型进行访问 – 带有bdata类型的变量可以进行字节或位寻址,用 sbit指定bdata变量的相应位后就可以进行位寻址。
– 考虑存储器结构 – 正确使用片内外RAM、特殊功能寄存器 – 正确处理接口芯片收发数据 – 不需要具体组织和分配存储器资源 – 结构模块化,思路与思维相同 – 但要与单片机结构相关联,否则不能正确映射
• C程序:
• C51:
– – – –
自动完成存储单元分配(内定义) 可编制常见接口芯片通用驱动函数 可采用模块化设计应用程序 加快开发速度
var=XBYTE[0x8000]; 头文件内定义的函数 XBYTE[0x8000]=0x21;
P71
– 例如:unchared xdta xram[0x8000]_at_0x1000; //在外部RAM1000H开始定义了一个一维数组
51单片机C语言编程规范
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的编程规范
:模块名及文件名, 内部函数,只要注释其定义文件名;
三、编辑风格
1、缩进:缩进以Tab 为单位,一个Tab 为四个空格大小。
预处理语句、全局数据、函数原型、标题、附加说明、函数说明、标号等均顶格书写。
语句块的“{”“}”配对对齐,并与其前一行对齐;
2、空格:数据和函数在其类型,修饰名称之间适当空格并据情况对齐。
关
键字原则上空一格,如:if ( ... ) 等,运算符的空格规定如下:“-”、“[”、“]”、“++”、“--”、“~”、“!”、“+”、“-”(指正负号),“”(取址或引用)、“*”(指使用指针时)
等几个运算符两边不空格(其中单目运算符系指与操作数相连的一边),其它
运算符(包括大多数二目运算符和三目运算符“?:”两边均空一格,“(”、“)”运算符在其内侧空一格,在作函数定义时还可据情况多空或不空格来对齐,但在函数实现时可以不用。
“,”运算符只在其后空一格,需对齐时也可不空或多空格,对语句行后加的注释应用适当空格与语句隔开并尽可能对齐。
3、对齐:原则上关系密切的行应对齐,对齐包括类型、修饰、名称、参数
等各部分对齐。
另每一行的长度不应超过屏幕太多,必要时适当换行,换行时尽可能在“,”处或运算符处,换行后最好以运算符打头,并且以下各行均以该语句首行缩进,但该语句仍以首行的缩进为准,即如其下一行为“{”应与首行对齐。
4、空行:程序文件结构各部分之间空两行,若不必要也可只空一行,各函
数实现之间一般空两行5、修改:版本封存以后的修改一定要将老语句用封闭,不能自行删除或修改,并要在文件及函数的修改记录中加以记录。
6、形参:在定义函数时,在函数名后面括号中直接进行形式参数说明,不。
单片机c51编程PPT课件
• 由于8051单片机的应用程序用的是C51 编译器,了解应注意在存储类型、对片 内硬件资源的定义等方面与标准C语言的 区别。
2021/3/12
2
第一节 概述
随着开发工具及集成电路技术的发展, 单片机开始使用高级语言。
26
第五节 指针与函数
一、指针与指针变量 变量名对应于内存单元的地址,变量值
则是放在内存单元中的数据。同时把存放变 量x的地址称为指针,使用指针前也必须定 义。
指针的定义:
char xdata *data xp
也可以写成
data char xdata *xp
2021/3/12
27
指针与指针变量的使用
2返021回/3/本12 章首页
7
第三节 数据类型和存储类型
一、数据类型
不同类型的数据占用的存储长度不同 数据分为常量和变量
1.常量和符号常量
常量指程序运行时其值不能被改变的量 符号常量是代表一个常量的标识符
常量类型:
整型、实型、字符、字符串
2021/3/12
8
2.变量类型
变量名称
符号
位型量
字符型
整型实型字符字符串变量类型变量名称符号类型数据长度值域范围01字符型有符号signedchar128127无符号unsignedchar3276832767整数型有符号signedint16位0255无符号unsignedint16位065535长整型有符号signedlong32位231321无符号unsignedlong32位321浮点型float32位34e3834e38指针型指针824对象地址特殊位型sbit8位特殊功能寄存器型sfr025516位特殊功能寄存器型sfr1616065535表c51变量类型10二存储类型存储类型不存储空间癿对应关系data直接寻址片内数据存储区访问速度快128字节bdata可位寻址片内数据存储区允许位不字节混合访问16字节idata间接寻址片内数据存储区可访问片内全部ram地址空间256字节pdata分页寻址片外数据存储区256字节由movxr0a指令访问xdata片外数据存储区64k由movxdptra指令访问code代码存储区64k由movcaadptr指令访问表c51存储类型c51存储类型及其大小存储类型长度长度字节值域范围datao2558bit即ooh0ffhbdatao2558bit即ooh0ffhpdatao2558bit即ooh0ffhxdata16o6553516bit即0000h0ffffhcode1606553516bit即0000h0ffffh12c51中定义变量除了定义数据类型外还应定义存储类型例
单片机c51程序设计
单片机c51程序设计单片机C51程序设计是一门结合了硬件知识和软件编程技能的学科,它广泛应用于自动化控制、智能设备、嵌入式系统等领域。
C51单片机是指使用C语言进行编程的8051系列单片机,它具备丰富的指令集和灵活的编程方式。
下面将从单片机的基本概念、C51编程基础、程序设计步骤以及实例分析等方面进行介绍。
单片机的基本概念单片机,又称微控制器,是一种集成了处理器核心、存储器、输入/输出接口等的微型计算机系统。
它具有体积小、功耗低、成本低、可靠性高等特点。
C51单片机是基于Intel 8051微控制器架构的,具有8位数据总线和16位地址总线,支持多种外设接口。
C51编程基础1. C语言基础:熟悉C语言的基本语法,如变量声明、条件语句、循环语句、函数等。
2. 数据类型:了解C51单片机支持的数据类型,包括特有寄存器位操作。
3. 内存结构:掌握C51单片机的内存结构,包括内部RAM、外部RAM、程序存储器等。
4. 中断系统:理解中断的概念和中断服务程序的编写。
5. 定时器/计数器:了解如何使用单片机的定时器/计数器进行时间控制和事件计数。
程序设计步骤1. 需求分析:明确程序设计的目标和功能需求。
2. 系统设计:设计系统的整体架构,包括硬件连接和软件模块划分。
3. 编写代码:根据设计编写C51程序代码,包括初始化代码、主函数、中断服务程序等。
4. 调试:使用仿真软件或实际硬件对程序进行调试,确保程序正确运行。
5. 优化:根据调试结果对程序进行优化,提高效率和稳定性。
6. 测试:进行全面的测试,确保程序在各种条件下都能稳定运行。
实例分析以一个简单的LED闪烁程序为例,介绍C51程序设计的基本流程:```c#include <reg51.h>// 定义LED连接的端口#define LED_PORT P1void delay(unsigned int ms) {unsigned int i, j;for (i = ms; i > 0; i--)for (j = 110; j > 0; j--);}void main() {while (1) {LED_PORT = 0xFF; // 关闭所有LED灯delay(500); // 延时500msLED_PORT = 0x00; // 打开所有LED灯delay(500); // 延时500ms}}```在这个例子中,我们首先包含了8051单片机的寄存器定义文件`reg51.h`,定义了LED灯连接的端口为P1。
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
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单片机编程基本知识全文选段:该控制指令将C文件编译生成汇编文件(.SRC),该汇编文件可改名后,生成汇编.ASM文件,再用A51进行编译。
第三节 Keil C51软件包中的通用文件在C51\LiB目录下有几个C源文件,这几个C源文件有非常重要的作用,对它们稍事修改,就可以用在自己的专用系统中。
1. 动态内存分配init_mem.C:此文件是初始化动态内存区的程序源代码。
它可以指定动态内存的位置及大小,只有使用了init_mem( )才可以调回其它函数,诸如malloc calloc,realloc等。
calloc.c:此文件是给数组分配内存的源代码,它可以指定单位数据类型及该单元数目。
malloc.c:此文件是malloc的源代码,分配一段固定大小的内存。
realloc.c:此文件是realloc.c源代码,其功能是调整当前分配动态内存的大小。
全文内容:本章讨论以下内容:l 绝对地址访问l C与汇编的接口l C51软件包中的通用文件l 段名转换与程序优化第一节绝对地址访问C51提供了三种访问绝对地址的方法:1. 绝对宏:在程序中,用“#include〈absacc.h〉”即可使用其中定义的宏来访问绝对地址,包括:CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD具体使用可看一看absacc.h便知例如:rval=CBYTE[0x0002];指向程序存贮器的0002h地址rval=XWORD [0x0002];指向外RAM的0004h地址2. _at_关键字直接在数据定义后加上_at_ const即可,但是注意:(1)绝对变量不能被初使化;(2)bit型函数及变量不能用_at_指定。
例如:idata struct link list _at_ 0x40;指定list结构从40h开始。
xdata char text[25b] _at_0xE000;指定text数组从0E000H开始提示:如果外部绝对变量是I/O端口等可自行变化数据,需要使用volatile关键字进行描述,请参考absacc.h。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机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 边写代码边注释,修改代码同时修改相应的注释,不再有用的注释要删除。
文件注释
文件注释必须说明文件名、函数功能、创建人、创建日期、版本信息等相关信息。
修改文件代码时,应在文件注释中记录修改日期、修改人员,并简要说明此次修改的目的。
所有修改记录必须保持完
整。
文件注释放在文件顶端,用"/*……*/"格式包含。
注释文本每行缩进4个空格;每个注释文本分项名称应对齐。
/***********************************************************
文件名称:
作者:
版本:
说明:
修改记录:
***********************************************************/
函数注释
6.3.1 函数头部注释
函数头部注释应包括函数名称、函数功能、入口参数、出口参数等内容。
如有必要还可增加作者、创建日期、修改记
录(备注)等相关项目。
函数头部注释放在每个函数的顶端,用"/*……*/"的格式包含。
其中函数名称应简写为FunctionName(),不加入、出
口参数等信息。
/***********************************************************
函数名称:
函数功能:
入口参数:
出口参数:
备注:
***********************************************************/
6.3.2 代码注释
代码注释应与被注释的代码紧邻,放在其上方或右方,不可放在下面。
如放于上方则需与其上面的代码用空行隔开。
一般少量注释应该添加在被注释语句的行尾,一个函数内的多个注释左对齐;较多注释则应加在上方且注释行与被注
释的语句左对齐。
函数代码注释用"
l 数组、指针等复杂类型的定义放在定义区的最后。
l 变量定义区不做较复杂的变量赋值。
功能实现区规范
l 一行只写一条语句。
l 注意运算符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级。
l 各程序段之间使用一个空行分隔,加以必要的注释。
程序段指能完一个较具体的功能的一行或多行代码。
程序段内
的各行代码之间相互依赖性较强。
l 不要使用难懂的技巧性很高的语句。
l 源程序中关系较为紧密的代码应尽可能相邻。
l 完成简单功能、关系非常密切的一条或几条语句可编写为函数或定义为宏。
8 单片机C51编程规范-排版
缩进
代码的每一级均往右缩进4个空格的位置。
分行
过长的语句(超过80个字符)要分成多行书写;长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划
分出的新行要进适当的缩进,使排版整齐,语句可读。
避免把注释插入分行中。
空行
l 文件注释区、头文件引用区、函数间应该有且只有一行空行。
l 相邻函数之间应该有且只有一行空行。
l 函数体内相对独立的程序块之间可以用一行空行或注释来分隔。
l 函数注释和对应的函数体之间不应该有空行。
l 文件末尾有且只有一行空行。
空格
l 函数语句尾部或者注释之后不能有空格。
l 括号内侧(即左括号后面和右括号前面)不加空格,多重括号间不加空格。
l 函数形参之间应该有且只有一个空格(形参逗号后面加空格)。
l 同一行中定义的多个变量间应该有且只有一个空格(变量逗号后面加空格)。
l 表达式中,若有多个操作符连写的情况,应使用空格对它们分隔:
在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符前后均加一个空格;在两个以上的关键字、变
量、常量进行非对等操作时,其前后均不应加空格;
逗号只在后面加空格;
双目操作符,如比较操作符, 赋值操作符"="、"+=",算术操作符"+"、"%",逻辑操作符"&&"、"&",位操作符"<<"、
"^"等,前后均加一个空格;
单目操作符,如"!"、"~"、"++"、"-"、"&"(地址运算符)等,前后不加空格;"->"、"."前后不加空格;
if、for、while、switch等关键字与后面的括号间加一个空格;
花括号
l if、else if、else、for、while语句无论其执行体是一条语句还是多条语句都必须加花括号,且左右花括号各独
占一行。
l do{}while()结构中,"do"和"{"均各占一行,"}"和"while();"共同占用一行。
if ( ) do
{ {
} }while( );
else
{
}
switch语句
l 每个case和其判据条件独占一行。
l 每个case程序块需用break结束。
特殊情况下需要从一个case块顺序执行到下一个case 块的时候除外,但需要在交
界处明确注释如此操作的原因,以防止出错。
l case程序块之间空一行,且只空一行。
l 每个case程序块的执行语句保持4个空格的缩进。
l 一般情况下都应该包含default分支。
Switch ( )
{
case x:
break;
case x:
break;
default:
break;
}
9 单片机C51编程规范-程序结构
基本要求
l 有main()函数的.c文件应将main()放在最前面,并明确用void声明参数和返回值。
l 对由多个.c文件组成的模块程序或完整监控程序,建立公共引用头文件,将需要引用的库头文件、标准寄存器定义
头文件、自定义的头文件、全局变量等均包含在内,供每个文件引用。
通常,标准函数库头文件采用尖角号< >标志
文件名,自定义头文件采用双撇号″″标志文件名。
l 每个.c文件有一个对应的.h文件,.c文件的注释之后首先定义一个唯一的文件标志宏,并在对应的.h文件中解析该
标志。
在.c文件中:
#define FILE_FLAG
在.h文件中:
#ifdef FILE_FLAG
#define XXX
#else
#define XXX extern
#endif
l 对于确定只被某个.c文件调用的定义可以单独列在一个头文件中、单独调用。
可重入函数
可重入函数中若使用了全局变量,应通过关中断、信号量等操作手段对其加以保护。
函数的形参
l 由函数调用者负责检查形参的合法性。
l 尽量避免将形参作为工作变量使用。
循环
l 尽量减少循环嵌套层数
l 在多重循环中,应将最忙的循环放在最内层
l 循环体内工作量最小
l 尽量避免循环体内含有判断语句。