《2022年AVR单片机c语言编程风格 .pdf》由会员分享,可在线阅读,更多相关《2022年AVR单片机c语言编程风格 .pdf(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、AVR单片机 c 语言编程风格作为一个初学者如何具有良好的程序设计风格呢?我想引用一个关于初学者请教编程大师的故事让读者自己去领悟。有一位编程大师, 他写非结构化的程序,一位初学者刻意模仿他,也写非结构化的程序。当他让大师看他的进步时,大师批评了他的非结构化程序:“ 对一位编程大师合适的东西未必对一个初学者同样合适,在超越结构化之前,你必须理解编程之道。”我个人认为作为一个初学者应该踏踏实实的打好程序设计的基础,不要急功近利, 舍本逐末。 我走过不少弯路,希望大家能和我一样能牢记编程大师的忠告:“对编程大师合适的东西未必对一个初学者同样合适”。AVR c语言优秀编程风格1 文件结构模块化的程序
2、应该是有一个很好的程序结构的。AVR C 语言程序有两种用户文件,.c程序文件, .h 头文件,程序中编写过程中需要在.c 文件中包含 .h 头文件。初学者往往出现重复包含或者头文件包含错误的问题,我当时也时常为这种错误而发愁。下面以电机驱动例程来给大家说明一下,优秀的编程文件结构。成型的程序的文件个数基本上都是偶数,因为每一个结构化的函数定义.c文件都会对应一个 .h 文件。 main.c 对应 config.h。我们来看看各文件的包含关系。下面我们看看这些文件的包含关系与内容: 推荐的文件包含顺序与关系 所有 .c 文件都包含了config.h文件。如: #include config.h
3、 在 config.h 中有如下代码:#include delay.h #include device_init.h #include motor.h 这样做就不容易出现错误的包含关系,为了预防万一,我们还引入了宏定义与预编译。如下:#ifndef _UNIT_H_ #define _UNIT_H_ 1 /100us extern void Delay100us(uint8 n); /1s extern void Delay1s(uint16 n); / n = 6 ,when n=7, it is 1. /1ms extern void Delay1ms(uint16 n); #endif
4、第一次包含本文件的时候正确编译,并且#define _UNIT_H_ 1,第二次包含本文件#ifndef _UNIT_H_就不再成立,跳过文件。预编译还有更多的用途,比如可以根据不同的值编译不同的语句,如下:/#pragma REGPARMS #if CPU_TYPE = M128 #include #endif #if CPU_TYPE = M64 #include 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 5 页 - - - - - - - - - #endif
5、 #if CPU_TYPE = M32 #include #endif #if CPU_TYPE = M16 #include #endif #if CPU_TYPE = M8 #include #endif #include 与 #include filename 的区别:前者是包含系统目录include下的文件,后者是包含程序目录下的文件。2. 变量名与函数名变量以及函数命名应该按照尽量短,按需长, 具有实际意义。 可以通过下划线或者大小写结合的方法组合动词和名词组成变量函数名。下面对比好的命名方法与不好的命名方法:好的: Delay100us(); 不好的: Yanshi(); 好的:
6、init_devices(); 不好的: Chengxuchushihua(); 好的: int temp; 不好的: int dd; 3. 外部调用首先在模块化程序的.h 文件中定义extern / 端口初始化extern void port_init(void); /T2初始化void timer2_init(void); / 各种参数初始化extern void init_devices(void);模块化程序的.c 文件中定义函数,不要在模块化的程序中调用程序,及不要出现向timer2_init();这样函数的使用,因为你以后不知道你到底什么地方调用了函数,导致程序调试难度增加。可以在
7、定义函数的过程中调用其他函数作为函数体。/*采用 timer2 产生波形 */ / PWM 频率 = 系统时钟频率/(分频系数 *2* 计数器上限值)void timer2_init(void) TCCR2 = 0 x00; /stop TCNT2= 0 x01; /set count OCR2 = 0 x66; /set compare TCCR2 = (1WGM20)|(1WGM21)|(1COM21)|0 x06; / start timer 快速pwm模式,匹配清零,溢出置位 256 分频/ 占空比高比低为:(OCR2-0X01)/(0XFF-OCR2) OX01+(OCR2)_OXF
8、F (+表示输出高,_表示输出低 ) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 5 页 - - - - - - - - - / 即 OCR2 越大,输出越大 在少数几个文件中调用函数,在main.c 中调用大部分函数,在interupts.c中根据不同的中断调用服务函数。void main(void) /* / 初始工作/* init_devices(); while(1) for_ward(0); /默认速度运转正 Delay1s(5); /延时 5s motor
9、_stop(); /停止 Delay1s(5); /延时 5s back_ward(0); /默认速度运转反 Delay1s(5); /延时 5s speed_add(20); /加速 Delay1s(5); /延时 5s speed_subtract(20); /减速 Delay1s(5); /延时 5s 4. 宏定义宏定义主要用于两个地方:一是用得非常多的命令或语句,利用宏将其简化。#ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #ifndef NULL #define NULL 0 #endi
10、f #define MIN(a,b) (ab)?(a):(b) #define ABS(x) (x)?(x):(-x) typedef unsigned char uint8; /* 定义可移植的无符号8 位整数关键字 */ typedef signed char int8;/* 定义可移植的有符号8 位整数关键字*/ typedef unsigned int uint16;/* 定义可移植的无符号16 位整数关键字*/ typedef signed int int16;/* 定义可移植的有符号16 位整数关键字*/ typedef unsigned long uint32;/* 定义可移植的
11、无符号32 位整数关键字*/ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 5 页 - - - - - - - - - typedef signed long int32;/* 定义可移植的有符号32 位整数关键字*/ 二是利用宏定义方便的进行硬件接口操作,再程序需要修改时,只需要修改宏定义即可,而不需要满篇去找命令行,进行修改。/PD4,PD5 电机方向控制如果更改管脚控制电机方向,更改PORTD |= 0 x10 即可。#define moto_en1 PORTD
12、|= 0 x10 #define moto_en2 PORTD |= 0 x20 #define moto_uen1 PORTD &= 0 x10 #define moto_uen2 PORTD &= 0 x20 / 启动 TC2定时比较和溢出#define TC2_EN TIMSK |= (1OCIE2)|(1TOIE2) / 禁止 TC2再定时比较和溢出#define TC2_DIS TIMSK &= (1OCIE2)|(1TOIE2) 5. 关于注释为了增加程序的可读性,方便合作者读动程序,或者程序作者在一段时间之后还能看懂程序,我们需要在程序中写注释。在比较特殊的函数使用或者命令调用的
13、地方加单行注释。使用方法为: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
14、 * (c) Copyright 2008-2009, liwenkui * All Rights Reserved * * V1.1.0 * * *-文件信息- * 文件名 :sio.c * 创建人 : 李文奎* 最后修改日期: 2008年 5 月 13 日* 描述: serial driver 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 5 页 - - - - - - - - - * *-历史版本信息- * 创建人 : 李文奎* 版 本: V1.00 * 日期: 2008年 5 月 13 日* 描述: 原始版本* */要清楚,注释是为了方便阅读,增强程序的可度性,不要本末倒置, 不要给很简单大家都能看明白的程序加注释,不要让注释淹没了你的程序结构。对于函数,变量等尽量使用文件名自注释的方法,及通过文件名就可以知道意思。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 5 页 - - - - - - - - -