AVR c言语优异编程风格
文件结构
这个工程中有8个文件,一个阐明文件,如下图:下载程序比方avrvi.com/down.php?file=examples/motor_control.rar”>电机操控事例。
- 一切.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 //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 第一次包括本文件的时分正确编译,而且#define _UNIT_H__ 1,第2次包括本文件#ifndef _UNIT_H__就不再建立,越过文件。 预编译还有更多的用处,比方能够依据不同的值编译不同的句子,如下: //#pragma REGPARMS #if CPU_TYPE == M128 #include
#endif #if CPU_TYPE == M64 #include #endif #if CPU_TYPE == M32 #include #endif #if CPU_TYPE == M16 #include #endif #if CPU_TYPE == M8 #include #endif - #include
与 #include “filename” 的差异 :前者是包括体系目录include下 的文件,后者是包括程序目录下的文件。
- 好的:
Delay100us();
欠好的:Yanshi(); - 好的:
init_devices();
欠好的:Chengxuchushihua(); - 好的:
int temp;
欠好的:int dd;
- 首先在模块化程序的.h文件中界说extern
//端口初始化 extern void port_init(void); //T2初始化 void timer2_init(void); //各种参数初始化 extern void init_devices(void);
- 模块化程序的.c文件中界说函数,不要在模块化的程序中调用程序,及不要呈现向timer2_init();这样函数的运用,由于你今后不知道你究竟什么当地调用了函数,导致程序调试难度添加。能够在界说函数的过程中调用其他函数作为函数体。
// PWM频率 = 体系时钟频率/(分频系数*2*计数器上限值)) void timer2_init(void) { TCCR2 = 0x00; //stop TCNT2= 0x01; //set count OCR2 = 0x66; //set compare TCCR2 = (1<
- 在少量几个文件中调用函数,在main.c中调用大部分函数,在interupts.c中依据不同的中止调用服务函数。
void main(void) { //初始作业 init_devices(); while(1) { for_ward(0); //默许速度工作 正 Delay1s(5); //延时5s motor_stop(); //中止 Delay1s(5); //延时5s back_ward(0); //默许速度工作 反 Delay1s(5); //延时5s speed_add(20); //加快 Delay1s(5); //延时5s speed_subtract(20); //减速 Delay1s(5); //延时5s } }
- 一是用得十分多的指令或句子,运用宏将其简化。
#ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #ifndef NULL #define NULL 0 #endif #define MIN(a,b) ((ab)?(a):(b)) #define ABS(x) ((x>)?(x):(-x)) typedef unsigned char uint8; typedef signed char int8; typedef unsigned int uint16; typedef signed int int16; typedef unsigned long uint32; typedef signed long int32;
- 二是运用宏界说便利的进行硬件接口操作,再程序需求修正时,只需求修正宏界说即可,而不需求满篇去找指令行,进行修正。
//PD4,PD5 电机方向操控假如更改管脚操控电机方向,更改PORTD |= 0x10即可。#define moto_en1 PORTD |= 0x10 #define moto_en2 PORTD |= 0x20 #define moto_uen1 PORTD &=~ 0x10 #define moto_uen2 PORTD &=~ 0x20 //发动TC2守时比较和溢出 #define TC2_EN TIMSK |= (<<1OCIE2)|(1<
- 在比较特别的函数运用或许指令调用的当地加单行注释。运用办法为:
Tbuf_putchar(c,RTbuf); // 将数据加入到发送缓冲区并开中止 extern void Delay1s(uint16 n); // n <= 6 ,when n==7, it is 1.
- 在模块化的函数中运用具体阶段注释:
- 在文件头上加文件名,文件用处,作者,日期等信息。