当前位置:首页 > 单片机 > 单片机
[导读]文件结构模块化的程序应该是有一个很好的程序结构的。AVR C语言程序有两种用户文件,.c程序文件,.h头文件,程序中编写过程中需要在.c文件中包含.h头文件。初学者往往出现重复包含或者头文件包含错误的问题,我当时也

文件结构

模块化的程序应该是有一个很好的程序结构的。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//100usexternvoidDelay100us(uint8n);//1sexternvoidDelay1s(uint16n);//n<=6,whenn==7,itis1.//1msexternvoidDelay1ms(uint16n);#endif第一次包含本文件的时候正确编译,并且#define_UNIT_H__1,第二次包含本文件#ifndef_UNIT_H__就不再成立,跳过文件。预编译还有更多的用途,比如可以根据不同的值编译不同的语句,如下://#pragmaREGPARMS#ifCPU_TYPE==M128#include#endif#ifCPU_TYPE==M64#include#endif#ifCPU_TYPE==M32#include#endif#ifCPU_TYPE==M16#include#endif#ifCPU_TYPE==M8#include#endif

#include 与 #include "filename" 的区别 :前者是包含系统目录include下 的文件,后者是包含程序目录下的文件。

变量名与函数名

变量以及函数命名应该按照尽量短,按需长,具有实际意义。可以通过下划线或者大小写结合的方法组合动词和名词组成变量函数名。下面对比好的命名方法与不好的命名方法:

好的: Delay100us();
不好的: Yanshi();

好的: init_devices();
不好的: Chengxuchushihua();

好的: int temp;
不好的: int dd;

外部调用

首先在模块化程序的.h文件中定义extern

//端口初始化externvoidport_init(void);//T2初始化voidtimer2_init(void);//各种参数初始化externvoidinit_devices(void);

模块化程序的.c文件中定义函数,不要在模块化的程序中调用程序,及不要出现向timer2_init();这样函数的使用,因为你以后不知道你到底什么地方调用了函数,导致程序调试难度增加。可以在定义函数的过程中调用其他函数作为函数体。

//PWM频率=系统时钟频率/(分频系数*2*计数器上限值))voidtimer2_init(void){TCCR2=0x00;//stopTCNT2=0x01;//setcountOCR2=0x66;//setcompareTCCR2=(1<

在少数几个文件中调用函数,在main.c中调用大部分函数,在interupts.c中根据不同的中断调用服务函数。

voidmain(void){//初始工作init_devices();while(1){for_ward(0);//默认速度运转正Delay1s(5);//延时5smotor_stop();//停止Delay1s(5);//延时5sback_ward(0);//默认速度运转反Delay1s(5);//延时5sspeed_add(20);//加速Delay1s(5);//延时5sspeed_subtract(20);//减速Delay1s(5);//延时5s}}

宏定义

宏定义主要用于两个地方:

一是用得非常多的命令或语句,利用宏将其简化。

#ifndefTRUE#defineTRUE1#endif#ifndefFALSE#defineFALSE0#endif#ifndefNULL#defineNULL0#endif#defineMIN(a,b)((ab)?(a):(b))#defineABS(x)((x>)?(x):(-x))typedefunsignedcharuint8;typedefsignedcharint8;typedefunsignedintuint16;typedefsignedintint16;typedefunsignedlonguint32;typedefsignedlongint32;

二是利用宏定义方便的进行硬件接口操作,再程序需要修改时,只需要修改宏定义即可,而不需要满篇去找命令行,进行修改。

//PD4,PD5电机方向控制如果更改管脚控制电机方向,更改PORTD|=0x10即可。#definemoto_en1PORTD|=0x10#definemoto_en2PORTD|=0x20#definemoto_uen1PORTD&=~0x10#definemoto_uen2PORTD&=~0x20//启动TC2定时比较和溢出#defineTC2_ENTIMSK|=(<<1OCIE2)|(1<

关于注释

为了增加程序的可读性,方便合作者读动程序,或者程序作者在一段时间之后还能看懂程序,我们需要在程序中写 注释。

在比较特殊的函数使用或者命令调用的地方加单行注释。使用方法为:

Tbuf_putchar(c,RTbuf);//将数据加入到发送缓冲区并开中断externvoidDelay1s(uint16n);//n<=6,whenn==7,itis1.

在模块化的函数中使用详细段落注释:

在文件头上加文件名,文件用途,作者,日期等信息。

要清楚,注释是为了方便阅读,增强程序的可度性,不要本末倒置,不要给很简单大家都能看明白的程序加注释,不要让注释淹没了你的程序结构。对于函数,变量等尽量使用文件名自注释的方法,及通过文件名就可以知道意思。

本文结束了,新手教程也结束了,希望我们教程能让你轻松进入AVR的世界。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭