单片机 c语言优秀编程风格
- 格式:doc
- 大小:52.50 KB
- 文档页数:5
C语言的代码风格与重构技巧一、简介C语言是一种常用的编程语言,代码风格和重构技巧在C语言程序设计中起着重要的作用。
良好的代码风格可以使代码更易读、易维护,而重构技巧可以提高代码的可维护性和可重用性。
本文将介绍C语言中常用的代码风格和重构技巧,以帮助程序员写出高质量的C语言代码。
二、代码风格1. 缩进和对齐在C语言中,缩进和对齐是代码风格中非常重要的一部分。
它可以使代码更易读,更清晰地显示代码的结构。
通常情况下,使用4个空格进行缩进,减少使用制表符进行缩进,可以避免在不同编辑器中显示不一致的问题。
对于代码块中的语句,可以使用适当的对齐方式,以增加代码的可读性。
2. 变量命名和注释良好的变量命名和注释可以使代码更易读、易懂。
变量和函数名应该具有一定的描述性,能够清楚地表达其用途。
注释应该清晰明了,解释代码的意图、功能和实现方法。
在编写代码时,应该适当地添加注释,以提高代码的可维护性。
3. 函数和模块的设计在C语言中,函数和模块的设计也是代码风格中的重要部分。
一个函数应该尽量做到单一职责,完成一个具体的功能。
如果一个函数的代码过长,可以考虑将其拆分成多个小函数,以提高代码的可读性和可维护性。
同时,模块的设计也应该合理,模块之间的功能应该清晰分离,模块之间的接口应该简单明了。
三、重构技巧1. 提取函数当一个函数的代码过长或过于复杂时,可以考虑将其拆分成多个小函数。
通过提取函数,可以使代码更易读、易懂。
提取函数时,可以根据代码的逻辑结构和功能,将代码块提取到一个独立的函数中。
提取函数不仅可以提高代码的可读性,还可以提高代码的复用性。
2. 合并重复代码在代码中,经常会出现相同或类似的代码片段。
这些重复的代码可以使用函数、宏或循环等方式进行合并,以减少代码冗余,提高代码的可维护性和可读性。
合并重复代码时,需要注意代码的逻辑和功能,确保合并后的代码与原始代码的功能一致。
3. 消除魔术数字魔术数字是指在代码中直接使用的具体数值。
c语言的编程风格不同的源代码的美观程度和编程风格都不尽一样,有些代码,都令人看起来赏心悦目,而其它有些程序员写的程序则让人看起来直皱眉头,写作干净美观的代码,不仅仅使得代码更容易阅读,还使得代码能够成为一件艺术品。
第一章:缩进格式Tab是8个字符,于是缩进也是8个字符.有很多怪异的风格,他们将缩进格式定义为4个字符(设置为2个字符!)的深度,这就象试图将PI定义为3一样让人难以接受.理由是:缩进的大小是为了清楚的定义一个块的开始和结束.特别是当你已经在计算机前面呆了20多个小时了以后,你会发现一个大的缩进格式使得你对程序的理解更容易.现在,有一些人说,使用8个字符的缩进使得代码离右边很近,在80个字符宽度的终端屏幕上看程序很难受.回答是,但你的程序有3个以上的缩进的时候,你就应该修改你的程序.总之,8个字符的缩进使得程序易读,还有一个附加的好处,就是它能在你将程序变得嵌套层数太多的时候给你警告.这个时候,你应该修改你的程序.第二章:大符号的位置另外一个C程序编程风格的问题是对大括号的处理.同缩进大小不同,几乎没有什么理由去选择一种而不选择另外一种风格,但有一种推荐的风格,它是Kernighan和Ritchie的经典的那本书带来的,它将开始的大括号放在一行的最后,而将结束大括号放在一行的第一位,如下所示:if (x is true) {we do y}然而,还有一种特殊的情况:命名函数:开始的括号是放在下一行的第一位,如下:int function(int x){body of function}所有非正统的人会非难这种不一致性,但是,所有思维正常的人明白: (第一) K&R是对的,(第二)如果K&R不对,请参见第一条. (:-))......另外,函数也是特殊的,不一定非得一致.需要注意的是结束的括号在它所占的那一行是空的,除了它跟随着同一条语句的继续符号.如while在do-while循环中,或者else在if语句中.如下:do {body of do-loop} while (condition);以及if (x == y) {..}else if (x > y) {...}else {....}理由: K&R.另外,注意到这种大括号的放置方法减小了空行的数量,但却没有减少可读性.于是,在屏幕大小受到限制的时候,你就可以有更多的空行来写些注释了.第三章:命名系统C是一种简洁的语言,那么,命名也应该是简洁的.同MODULE-2以及PASCAL语言不同的是,C程序员不使用诸如ThisVariableIsATemporaryCounter之类的命名方式.一个C语言的程序员会将之命名为tmp,这很容易书写,且并不是那么难以去理解.然而,当混合类型的名字不得不出现的时候,描述性名字对全局变量来说是必要的了.调用一个名为foo 全局的函数是很让人恼火的.全局变量(只有你必须使用的时候才使用它) ,就象全局函数一样,需要描述性的命名方式.假如你有一个函数用来计算活动用户的数量,你应该这样命名--count_active_users()--或另外的相近的形式,你不应命名为cntusr().有一种称为Hungarian命名方式,它将函数的类型编码写入变量名中,这种方式是脑子有毛病的一种表现---编译器知道这个类型而且会去检查它,而这样只会迷惑程序员. --知道为什么Micro$oft为什么会生产这么多臭虫程序了把!!.局部变量的命名应该短小精悍.假如你有一个随机的整数循环计数器,它有可能有i,如果没有任何可能使得它能被误解的话,将其写作loop_counter是效率低下的.同样的,tmp可以是任何临时数值的函数变量.第四章:函数函数应该短小而迷人,而且它只作一件事情.它应只覆盖一到两个屏幕(80*24一屏),并且只作一件事情,而且将它做好.(这不就是UNIX的风格吗,译者注).一个函数的最大长度和函数的复杂程度以及缩进大小成反比.于是,如果你已经写了简单但长度较长的的函数,而且你已经对不同的情况做了很多很小的事情,写一个更长一点的函数也是无所谓的.然而,假如你要写一个很复杂的函数,而且你已经估计到假如一般人读这个函数,他可能都不知道这个函数在说些什么,这个时候,使用具有描述性名字的有帮助的函数.另外一个需要考虑的是局部变量的数量.他们不应该超过5-10个,否则你有可能会出错.重新考虑这个函数,将他们分割成更小的函数.人的大脑通常可以很容易的记住7件不同的事情,超过这个数量会引起混乱.你知道你很聪明,但是你可能仍想去明白2周以前的做的事情.第5章:注释注释是一件很好的事情,但是过多的注释也是危险的,不要试图区解释你的代码是注释如何如何的好:你应该将代码写得更好,而不是花费大量的时间去解释那些糟糕的代码.通常情况下,你的注释是说明你的代码做些什么,而不是怎么做的.而且,要试图避免将注释插在一个函数体里:假如这个函数确实很复杂,你需要在其中有部分的注释,你应该回到第四章看看.你可以写些简短的注释来注明或警告那些你认为特别聪明(或极其丑陋)的部分,但是你必须要避免过多.取而代之的是,将注释写在函数前,告诉别人它做些什么事情,和可能为什么要这样做.GNU编程风格下面几条是基于GNU开放源代码方面的要求:在任何情况下都不要引用有版权的源代码。
C语言编程规范与代码风格在C语言编程过程中,遵循一定的编程规范和代码风格是非常重要的。
这不仅可以提高代码的可读性和可维护性,还有利于团队协作和代码质量的保证。
下面将介绍一些常用的C语言编程规范与代码风格。
1. 缩进与对齐:在C语言中,缩进和对齐是非常重要的,可以通过统一的缩进方式使代码更加清晰易读。
通常情况下,我们建议使用4个空格进行缩进,并且在代码块开始和结束处进行对齐,以增强代码结构的可读性。
2. 命名规范:良好的命名规范可以使代码更易于理解和维护。
变量名、函数名、常量名等应该具有描述性,体现其功能和用途。
通常采用驼峰命名法或下划线分隔命名法,避免使用拼音或缩写。
3. 注释:注释是代码文档化和功能解释的重要手段,应该充分利用注释来解释代码的作用、原理和设计思路,以方便他人理解和维护代码。
建议在函数开头添加注释说明函数的功能、参数意义和返回值等信息。
4. 函数封装:在进行函数设计时,应该遵循单一职责原则,保持函数的功能单一性,每个函数只实现一个功能。
同时尽量避免函数过长,可以根据需要进行适当的分解和封装,以便于代码的复用和维护。
5. 错误处理:在编写C语言程序时,要充分考虑错误处理机制,避免出现未处理的异常情况。
可以通过返回值、错误码或异常处理等方式来处理各种可能的错误,以保证程序的稳定性和可靠性。
6. 模块化设计:模块化是提高代码复用性和可维护性的有效手段,可以将功能相似的代码封装成独立的模块,提供统一的接口供其他模块调用。
通过模块化设计,可以降低程序的耦合度,提高代码的灵活性和可扩展性。
7. 代码风格:统一的代码风格可以使代码更加整洁和规范,方便团队开发和代码审查。
应遵循一定的代码书写规范,包括变量命名、函数封装、代码结构等方面,以确保代码风格的一致性和统一性。
总之,遵循良好的C语言编程规范与代码风格对于提高代码质量和开发效率至关重要。
通过统一的编程规范和代码风格,可以使代码更易于理解、维护和扩展,同时也有利于团队协作和代码质量的保证。
C语言编程规范与风格C语言是一种广泛使用的编程语言,它的编程规范与风格对于保证代码的可读性、可维护性和可扩展性至关重要。
本文将介绍一些关键的C语言编程规范与风格,并提供一些实践建议。
1. 代码缩进代码缩进是C语言中非常重要的一个方面,它可以使代码结构清晰,易于阅读。
推荐使用4个空格或者制表符来进行代码缩进。
2. 命名规范为了让代码更易读和理解,命名规范应具有一定的规则性和描述性。
变量、函数和常量的命名应具有一定的规范,比如使用驼峰命名法(camelCase)或者下划线法(underscore_case)。
3. 注释注释是代码中的重要组成部分,可以使代码更易读和理解。
应该在代码中适当地使用注释,解释代码的功能、用途和注意事项。
注释应该清晰、简洁且易于理解。
4. 函数设计函数是C语言中重要的组织单元,应该遵循一定的设计原则来编写函数。
函数应该具有良好的命名,功能单一且高内聚。
函数的参数应该明确且合理,避免过多的参数传递。
函数的返回值应该清晰地说明其含义。
5. 条件语句和循环语句条件语句和循环语句是C语言中常用的流程控制语句,应该遵循一定的格式和风格。
条件语句的括号应该与关键字紧挨着,条件表达式应该适当地加上括号,以增加代码的可读性。
循环语句的条件表达式应该明确且易于理解,循环体应该具有合适的缩进。
6. 数据类型和变量声明在C语言中,数据类型和变量声明是非常重要的。
应该根据需要选择合适的数据类型,尽量避免使用过长或过短的数据类型。
变量声明应该在函数开头或者合适的位置进行,尽量避免使用全局变量。
7. 引入头文件C语言中的头文件对代码的模块化和可维护性非常重要。
在代码中应该适当引入所需要的头文件,避免使用过多的全局引入。
头文件应该具有合适的宏定义和条件编译,以提高代码的可复用性。
8. 错误处理在编程过程中,错误处理是非常重要的一部分。
应该养成检查错误和处理错误的习惯,合理运用条件语句和错误码,以便更好地调试和修复代码。
单片机c语言单片机C语言是一种利用C语言编程的指令集,它能够让程序员们在单片机系统里编写并实现C程序。
单片机C语言也可以称为MCU C语言,它是使用最广泛的微控制器控制器编程语言之一,可以将复杂的系统或功能封装为一个单片机芯片,从而实现低成本高性能的计算机控制系统。
单片机C语言的特点1.洁:C语言是程序员们编写单片机程序的首选语言,因为它的语法简洁易懂,也比较容易掌握,让程序员们在开发单片机系统时可以快速理解和编写程序。
2.容:C语言是能够在不同硬件平台上编写程序的语言,它可以编写经过编译后可以在不同的硬件和操作系统上运行的程序,这大大节约了程序员们的时间,让程序员们能够更关注软件设计本身,而不是硬件的工作。
3.用:C语言提供了许多易用的函数,可以让程序员们在编写单片机程序时可以有效的利用这些函数,让程序的编写、调试和实现变得更加快捷。
单片机C语言的应用1.子设备:单片机C语言可以用在汽车、电梯、家电等电子设备的控制和管理系统中,它可以将复杂的功能封装成一个芯片,以节省空间和成本,同时实现更加高效的控制。
2.子玩具:单片机C语言可以用在电子玩具中,它能够实现电子玩具的动态功能,从而让玩具更加有趣和生动。
3.能家居:单片机C语言可以用在智能家居系统中,让家居系统更智能,能够拥有更加丰富的功能,从而满足人们的生活和工作需求。
单片机C语言的开发1.言准备:首先,程序员要掌握C语言,以及单片机C语言的语法,仅通过这些,才能开发出准确高效的程序。
2.入系统:其次,程序员要根据硬件系统的特性对程序进行调整,并将程序移植到嵌入式系统,以便于程序能够在最小的资源消耗下得到最大的效益。
3.序测试:最后,程序员要进行代码测试,在调试程序时,要进行反馈和指出问题,以便能够快速找出问题,并及时解决。
总之,单片机C语言是一种非常实用的编程语言,它可以让程序员们在单片机系统上实现复杂的功能,能够大大节省程序员们编写程序的时间,帮助程序员们尽快完成软件开发工作。
C语言技术中的代码风格规范与最佳实践在软件开发领域,代码的可读性和可维护性是非常重要的。
而在C语言中,代码风格规范和最佳实践则是保证代码质量的关键因素之一。
本文将探讨C语言技术中的代码风格规范与最佳实践,帮助读者写出高质量的C代码。
1. 命名规范在C语言中,良好的命名规范是保证代码可读性的重要因素。
变量、函数和结构体的命名应该具有描述性,并且使用有意义的单词或者缩写。
变量和函数的命名应该使用小写字母,并且可以使用下划线来分隔单词,例如:student_name。
结构体的命名应该使用驼峰命名法,例如:StudentInfo。
2. 缩进和空格良好的缩进可以使代码结构更加清晰,易于阅读。
在C语言中,通常使用四个空格进行缩进。
另外,运算符和操作数之间应该添加适当的空格,这样可以增加代码的可读性。
例如:int result = a + b;3. 注释注释是代码中重要的组成部分,可以帮助其他开发人员理解代码的意图。
在C 语言中,注释可以使用//或者/* */来表示。
注释应该清晰明了,解释代码的目的和逻辑。
对于复杂的算法或者函数,应该提供详细的注释,以便其他人能够理解和维护代码。
4. 函数的设计与实现在C语言中,函数的设计和实现是代码最重要的部分之一。
一个好的函数应该具有良好的封装性和可重用性。
函数应该只完成一个具体的任务,并且应该尽量避免使用全局变量。
函数的输入参数和返回值应该明确,以便于其他开发人员使用和理解。
5. 错误处理在C语言中,错误处理是非常重要的。
在编写代码时,应该考虑到可能出现的错误情况,并且编写相应的错误处理代码。
可以使用错误码或者异常处理机制来处理错误。
另外,应该避免使用错误的返回值来表示正常的执行结果。
6. 内存管理在C语言中,内存管理是非常重要的。
在使用动态内存分配函数(如malloc和free)时,应该注意及时释放内存,避免内存泄漏。
另外,应该避免使用未初始化的指针,以及使用已经释放的内存。
C语言编写程序的优点有哪些C语言编写程序的优点有哪些C语言能够存在并发展至今,其生命力之强可见一斑。
这其中一定是有着某些不可替代的优点,那么C语言编写程序的优点都有哪些呢?为了方便读者理解,下面对C语言的每条特点进行详细的解说。
(1)程序结构简洁、紧凑、规整,表达式简练、使用灵活。
(2)编写的程序可读性强,编译效率高。
(3)具有丰富的运算符,多达34种。
丰富的数据类型与丰富的运算符相结合,使C语言具有表达灵活和效率高等特点。
(4)数据类型种类繁多。
C语言具有5种基本的数据类型和多种构造数据类型以及复合的导出类型,同时还提供了与地址密切相关的指针机器运算符。
指针可以指向各种类型的简单变量、数组、结构和联合,乃至函数等。
此外,C语言还允许用户自己定义数据类型。
(5)是一种结构化程序设计语言,特别适合大型程序的模块化设计。
C语言具有编写结构化程序所必需的基本流程控制语句,C语言程序是由函数集合构成的,函数各自独立,并且作为模块化设计的基本单位。
说明:C语言的源文件,可以分割成多个源程序,分别进行编译,然后连接起来构成可知性的目标文件,为开发大型软件提供了极大的方便。
C语言还提供了多种存储属性,使数据可以按其需要在相应的作用域起作用,从而提高了程序的可靠性。
(6)语法限制不太严格,程序设计自由度大。
例如,对数组下标越界不作检查,由程序编写者自己保证程序的正确。
一般的高级语言语法检查比较严,能检测出几乎所有的语法错误,而C语言允许程序编写者有较大的自由度,因此放宽了语法的.检查。
程序员应当仔细检查程序,保证其正确,而不要过分依赖C语言编译程序去查错。
(7)允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作。
因此,C语言既具有高级语言的功能,又兼容低级语言的许多功能,可用来编写系统软件。
(8)生成的目标代码质量高,程序执行效率高。
它一般只比汇编程序生成的目标代码率低10%~20%。
随着单片机开发技术的不断发展,目前已有越来越多的人从普遍使用汇编语言到逐渐使用高级语言进行开发,其中以C语言为主,而且市场上几种常见的单片机均有C语言开发环境。
C51是针对8051系列单片机开发的高级语言。
它与标准的C语言基本一致,但根据8051单片机的硬件特点作了少量的扩展和重新定义。
例如,C51支持位变量,printf函数由串行口输出而不是屏幕输出,以及不同厂家的单片机为描述其硬件的差异需要使用特定的头文件等。
C51主要有以下特点:(1)语言简洁、紧凑,使用方便、灵活。
(2)运算符及其丰富。
(3)生产的目标代码质量高,程序执行效率高(与汇编语言相比)。
(4)可移植性好(与汇编语言相比)。
(5)可以直接操作硬件。
下面我们通过任务一中的C51程序(片机控制一个LED发光二极管发光)认识C51的基本结构。
源程序如下:01 #include<reg51.h>02 sbit led=P1^0;03 void main()04 {05 while(1)06 {07 led=0;08 }09 }上述程序中,第1行:#include<reg51.h>是文件包含语句,表示把语句中指定文件的全部内容复制到此处,与当前的源程序文件链接成一个源文件。
该语句中指定的文件reg51.h 是Keil C51编译器提供的头文件,保存在文件夹“keil\c51\inc”下,该文件包含了51单片机特殊功能寄存器SFR和位名称的定义。
在reg51.h文件中定义了下面的语句:sfr P0=0x80;该语句定义了符号P0与51单片机内部P0口的地址0x80对应。
上述程序中包含文件reg51.h的目的,是为了通知C51编译器,程序中所用的符号P0是指51单片机的P0口。
在C51程序设计中,我们可以把reg51.h头文件包含在自己的程序中,直接使用已定义的SFR名称和位名称。
例如符号P0表示并行P0口;也可以直接在程序中自行利用关键字sfr和sbit来定义这些特殊功能寄存器和特殊位名称。
单片机 c语言优秀编程风格作为一个初学者如何具有良好的程序设计风格呢?我想引用一个关于初学者请教编程大师的故事让读者自己去领悟。
有一位编程大师,他写非结构化的程序,一位初学者刻意模仿他,也写非结构化的程序。
当他让大师看他的进步时,大师批评了他的非结构化程序:“对一位编程大师合适的东西未必对一个初学者同样合适,在超越结构化之前,你必须理解编程之道。
” 我个人认为作为一个初学者应该踏踏实实的打好程序设计的基础,不要急功近利,舍本逐末。
我走过不少弯路,希望大家能和我一样能牢记编程大师的忠告:“对编程大师合适的东西未必对一个初学者同样合适”。
本文所描述的优秀编程风格适合于大部分语言,文章中可能提到你不是很了解的概念,没有关系,你放心的读下去,当你使用AVR一个月之后,你什么都明白了。
文件结构模块化的程序应该是有一个很好的程序结构的。
AVR C语言程序有两种用户文件,.c程序文件,.h 头文件,程序中编写过程中需要在.c文件中包含.h头文件。
初学者往往出现重复包含或者头文件包含错误的问题,我当时也时常为这种错误而发愁。
下面我以我写的电机驱动例程来给大家说明一下,优秀的编程文件结构。
这个工程中有8个文件,一个说明文件,如下图:我写的成型的程序的文件个数基本上都是偶数,因为每一个结构化的函数定义.c文件都会对应一个.h文件。
main.c对应config.h。
我们来看看各文件的包含关系。
下面我们看看这些文件的包含关系与内容:[推荐的文件包含顺序与关系]所有.c文件都包含了config.h文件。
如: #include "config.h"在config.h 中有如下代码:#include "delay.h"#include "device_init.h"#include "motor.h"这样做就不容易出现错误的包含关系,为了预防万一,我们还引入了宏定义与预编译。
如下:#ifndef _UNIT_H__#define _UNIT_H__ 1//100usextern void Delay100us(uint8 n);//1sextern void Delay1s(uint16 n); // n <= 6 ,when n==7, it is 1.//1msextern void Delay1ms(uint16 n);#endif第一次包含本文件的时候正确编译,并且#define _UNIT_H__ 1,第二次包含本文件#ifndef_UNIT_H__就不再成立,跳过文件。
预编译还有更多的用途,比如可以根据不同的值编译不同的语句,如下://#pragma REGPARMS#if CPU_TYPE == M128#include <iom128v.h>#endif#if CPU_TYPE == M64#include <iom64v.h>#endif#if CPU_TYPE == M32#include <iom32v.h>#endif#if CPU_TYPE == M16#include <iom16v.h>#endif#if CPU_TYPE == M8#include <iom8v.h>#endif#include<filename> 与 #include "filename" 的区别:前者是包含系统目录include下的文件,后者是包含程序目录下的文件。
变量名与函数名变量以及函数命名应该按照尽量短,按需长,具有实际意义。
可以通过下划线或者大小写结合的方法组合动词和名词组成变量函数名。
下面对比好的命名方法与不好的命名方法:1. 好的: Delay100us();不好的: Yanshi();2. 好的: init_devices();不好的: Chengxuchushihua();3. 好的: int temp;不好的: int dd;外部调用1. 首先在模块化程序的.h文件中定义extern2. //端口初始化3. extern void port_init(void);4.5. //T2初始化6. void timer2_init(void);7.8. //各种参数初始化9. extern void init_devices(void);10. 模块化程序的.c文件中定义函数,不要在模块化的程序中调用程序,及不要出现向timer2_init();这样函数的使用,因为你以后不知道你到底什么地方调用了函数,导致程序调试难度增加。
可以在定义函数的过程中调用其他函数作为函数体。
11. /**************************采用timer2 产生波形***********************/12. // PWM频率 = 系统时钟频率/(分频系数*2*计数器上限值))13. void timer2_init(void)14. {15. TCCR2 = 0x00; //stop16. TCNT2= 0x01; //set count17. OCR2 = 0x66; //set compare18. TCCR2 = (1<<WGM20)|(1<<WGM21)|(1<<COM21)|0x06; // start timer 快速pwm模式,匹配清零,溢出置位 256分频19. //占空比=高比低为:(OCR2-0X01)/(0XFF-OCR2) OX01++++++(OCR2)__________OXFF (+表示输出高,_表示输出低)20. //即OCR2越大,输出越大21. }22. 在少数几个文件中调用函数,在main.c中调用大部分函数,在interupts.c中根据不同的中断调用服务函数。
23. void main(void)24. {25.26. /******************************************************************************/27. //初始工作28. /******************************************************************************/29. init_devices();30.31. while(1)32. {33. for_ward(0); //默认速度运转正34. Delay1s(5); //延时5s35. motor_stop(); //停止36. Delay1s(5); //延时5s37. back_ward(0); //默认速度运转反38. Delay1s(5); //延时5s39. speed_add(20); //加速40. Delay1s(5); //延时5s41. speed_subtract(20); //减速42. Delay1s(5); //延时5s43. }44. }宏定义宏定义主要用于两个地方:一是用得非常多的命令或语句,利用宏将其简化。
1. #ifndef TRUE2. #define TRUE 13. #endif4. #ifndef FALSE5. #define FALSE 06. #endif7. #ifndef NULL8. #define NULL 09. #endif10. #define MIN(a,b) ((a<b)(a):(b))11. #define MAX(a,b) ((a>b)(a):(b))12. #define ABS(x) ((x>)(x):(-x))13. typedef unsigned char uint8; /* 定义可移植的无符号8位整数关键字 */14. typedef signed char int8; /* 定义可移植的有符号8位整数关键字 */15. typedef unsigned int uint16; /* 定义可移植的无符号16位整数关键字*/16. typedef signed int int16; /* 定义可移植的有符号16位整数关键字*/17. typedef unsigned long uint32; /* 定义可移植的无符号32位整数关键字*/18. typedef signed long int32; /* 定义可移植的有符号32位整数关键字 */ 二是利用宏定义方便的进行硬件接口操作,再程序需要修改时,只需要修改宏定义即可,而不需要满篇去找命令行,进行修改。
19. //PD4,PD5 电机方向控制如果更改管脚控制电机方向,更改PORTD |= 0x10即可。
20. #define moto_en1 PORTD |= 0x1021. #define moto_en2 PORTD |= 0x2022. #define moto_uen1 PORTD &=~ 0x1023. #define moto_uen2 PORTD &=~ 0x2024. //启动TC2定时比较和溢出25. #define TC2_EN TIMSK |= (<<1OCIE2)|(1<<TOIE2)26. //禁止TC2再定时比较和溢出27. #define TC2_DIS TIMSK &=~ (1<<OCIE2)|(1<<TOIE2)关于注释为了增加程序的可读性,方便合作者读动程序,或者程序作者在一段时间之后还能看懂程序,我们需要在程序中写注释。
在比较特殊的函数使用或者命令调用的地方加单行注释。
使用方法为:Tbuf_putchar(c,RTbuf); // 将数据加入到发送缓冲区并开中断extern void Delay1s(uint16 n); // n <= 6 ,when n==7, it is 1.在模块化的函数中使用详细段落注释:/************************* 函数名称: Com_putchar** 功能描述: 从串行口输出一个字符c** 输入: c:输出字符** 输出 : 0:失败 1:成功** 全局变量: 无** 调用模块:** 说明:** 注意:********************/在文件头上加文件名,文件用途,作者,日期等信息。
/********************************************************************************** ************************* serial driver** (c) Copyright 2005-2006, limaokui** All Rights Reserved**** V1.1.0******--------------文件信息-------------------------------------------------------------------------------- **文件名:sio.c**创建人: 李茂奎**最后修改日期: 2005年7月13日**描述: serial driver****--------------历史版本信息----------------------------------------------------------------------------30. ** 创建人: 李茂奎31. ** 版本: V1.0032. ** 日期: 2005年7月13日33. ** 描述: 原始版本34. **35.*********************************************************************************** **********************/。