近期写了一些比较大的单片机程序,找了很多参考资料,看了大量别人的程序。我从中发现了自己对于C语言编程还只是知道如何实现功能,但对编程规范掌握的不好,编程习惯也没有很好的养成。
由此我将一些经验分享出来,供大家参考及修正。
说一说起因,为什么标题叫“几人不知头文件“。
当我在写一些代码量较大的程序时,因为没有合理的规划代码结构,导致代码顺序很混乱,当要查找一些功能函数时,只能打开Functions窗口。但我常常忘了有这么个工具,就使劲在一篇长长的代码中去翻阅。这让我很是头疼。
为啥会这样呢?
还不是因为学的不好,用四川话来说就是“二十九天的徒弟”。
只掌握了个皮毛。虽然有时候看着自己的代码很厉害,但仔细一看,烂的过分,偶尔都会想,这是我写的吗?虽然自己清楚的知道,这就是我写的,但始终不想承认。
当我在阅读别人的代码时,发现他们的代码调理清晰,功能明确。有时候看到功能一样的代码,为啥自己的就是很丑呢。
还不是因为没有使用头文件来分开功能代码,所有的功能代码都在一个.c文件下,能不丑吗?玩着玩着就几百行代码了。各种功能函数看的眼花缭乱。于是我决定痛改前非。做一下功能分类。相信自己一定可以。
于是我便开始去学习怎么使用头文件,怎么在文件外定义函数调用。
这里就要讲干货了
1、什么是头文件(.h)
在单片机C程序设计中,那些啥项目一般都按照功能进行结构化设计,将一个项目划分为多个功能,每一个功能的相关程序代码放在一个.c文件中,称之为一个模块,xxx.c的xxx就是功能名。但光有一个.c肯定是不够的,是不能被主函数所调用的。还需要一个.h文件,自然这个头文件就出来了。
一个模块由两个文件组成,一个*.h文件,对模块中的数据结构,函数原型,I/O端口进行描述和声明;另一个则是*.c文件,对数据实例或对象定义,以及函数算法具体实现。
咱还是举个例子,具体说明一下吧。
上代码:
DS1302.H
#ifndef __DS1302_H_#define __DS1302_H_//---包含头文件---//#include#include//---重定义关键词---//#ifndef uchar#define uchar unsigned char#endif#ifndef uint #define uint unsigned int#endif//---定义ds1302使用的IO口---//sbit DSIO=P3^4;sbit RST=P3^5;sbit SCLK=P3^6;//---定义全局函数---//void Ds1302Write(uchar addr, uchar dat);uchar Ds1302Read(uchar addr);void Ds1302Init();void Ds1302ReadTime();//---加入全局变量--//extern uchar TIME[7];//加入全局变量#endif
这里重新定义了关键字,定义了I/O端口,以及进行了函数声明。我们在主函数中只需要包含这个头文件就可以调用DS1302.c中的函数。这里未贴出代码,太长了呀。
2、.h文件的作用
作为项目设计,除了对项目总体功能进行详细描述外,激素hi对内阁模块进行详细定义,也就是给出所有模块的头文件。通常.h头文件要定义模块中个函数的功能,以及输入输出参数的要求。也可以在头文件中先规划一下相应的功能函数,再根据.h文件进行设计、编程、调试。我们个人编程最主要的作用还是进行模块化管理,方便自己进行开发和设计。
当然如果是企业开发,为了安全需要保密,模块实现后可以链接文件obj或库文件lib的方式提供给项目其他成员使用。因为不用提供源代码,就可以进行公开发行,保证我们程序员和公司的所有权。同时也可以防止别人有意无意修改产生非一致性,造成版本或功能混乱。
如果要引用模块内的数据或算法函数,只要用include包含指定模块的.h文件即可。
3、.h文件的基本组成
我们从上面的DS1302.h文件中可以看出.h文件有哪些组成吗?
仔细看,来分析一下。
#ifndef __DS1302_H_ // 这一句是防止重复引用,如果没有定义过__DS1302_H_这个 文件就编译下一句#define __DS1302_H_ // 此符号唯一,表示只要引用过一次,即#include,则定义符号__DS1302_H_#include // 这句没啥好说的,就是包含51单片机的特殊寄存器#ifndef uchar // 这一句还是和上面的是一样的,为了防止重复引用定义各种功能函数原型声明///#endif // 这句是整个文件的结束标志
最后写点
第一次尝试加入表情包,不知道效果怎么样。
对于头文件暂时就说这么多,以后想起来再补充吧。
对于大型项目的设计编写,模块化设计的这种思想很重要,使用头文件这种方式是比较方便的,让代码管理起来更加方便,设计起来更加方便。对于设计思路也有一定的帮助,只需要想我这个模块该怎么写。怎么样去设计。这也就是模块化程序设计的思想所在。
分享更多单片机编程方面的知识,用自己踩过的坑给大家展示如何躲避他们。
关注并私信我,发送“08”即可获取文中实例的完整程序及仿真文件。
关注+点赞+评论,在评论区说出你的想法,和我一起交流,你的支持是我创作的动力,一枚科技仔感谢您的阅读。