c++头文件_51单片机C语言编程知多少:几人不知头文件,你要的干货在这里了

近期写了一些比较大的单片机程序,找了很多参考资料,看了大量别人的程序。我从中发现了自己对于C语言编程还只是知道如何实现功能,但对编程规范掌握的不好,编程习惯也没有很好的养成。

4edb816033554a5c931bf9ce40381d9e.png

学了这么久的单片机,还真是挺难为情的

由此我将一些经验分享出来,供大家参考及修正。

说一说起因,为什么标题叫“几人不知头文件“。

当我在写一些代码量较大的程序时,因为没有合理的规划代码结构,导致代码顺序很混乱,当要查找一些功能函数时,只能打开Functions窗口。但我常常忘了有这么个工具,就使劲在一篇长长的代码中去翻阅。这让我很是头疼。

56e1f0cb7e458c6fd439f7bac2a55a91.png

一阵头疼

为啥会这样呢?

还不是因为学的不好,用四川话来说就是“二十九天的徒弟”。

8903b95a9c932f0bb687109f3aeded54.png

超级难受

只掌握了个皮毛。虽然有时候看着自己的代码很厉害,但仔细一看,烂的过分,偶尔都会想,这是我写的吗?虽然自己清楚的知道,这就是我写的,但始终不想承认。

c608cfb2822d23d31098f2669b9bff30.png

还是要承认才行

当我在阅读别人的代码时,发现他们的代码调理清晰,功能明确。有时候看到功能一样的代码,为啥自己的就是很丑呢。

db95c4dec4e5c8583ea404157542e39e.gif

拒绝接受

还不是因为没有使用头文件来分开功能代码,所有的功能代码都在一个.c文件下,能不丑吗?玩着玩着就几百行代码了。各种功能函数看的眼花缭乱。于是我决定痛改前非。做一下功能分类。相信自己一定可以。

4777ddb82ead918a5d760b8cf3775d13.png

不敢相信啊,我居然会痛改前非

于是我便开始去学习怎么使用头文件,怎么在文件外定义函数调用。

4eb9a84ed6dad40c7508b06294ae3b17.gif

感觉自己好厉害

这里就要讲干货了

1、什么是头文件(.h)

在单片机C程序设计中,那些啥项目一般都按照功能进行结构化设计,将一个项目划分为多个功能,每一个功能的相关程序代码放在一个.c文件中,称之为一个模块,xxx.c的xxx就是功能名。但光有一个.c肯定是不够的,是不能被主函数所调用的。还需要一个.h文件,自然这个头文件就出来了。

一个模块由两个文件组成,一个*.h文件,对模块中的数据结构,函数原型,I/O端口进行描述和声明;另一个则是*.c文件,对数据实例或对象定义,以及函数算法具体实现。

咱还是举个例子,具体说明一下吧。

c8a70c68923a146f864dbde9b0d711c7.gif

举个栗子实际说明一下啥是.h文件

上代码:

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文件即可。

42e1f78ad21a7ecb8e376e4c2e04de25.png

下一个:继续

3、.h文件的基本组成

我们从上面的DS1302.h文件中可以看出.h文件有哪些组成吗?

61e4c6af5e07cfdfaebc597971a69a33.png

我觉得可以

仔细看,来分析一下。

#ifndef __DS1302_H_ // 这一句是防止重复引用,如果没有定义过__DS1302_H_这个 文件就编译下一句#define __DS1302_H_ // 此符号唯一,表示只要引用过一次,即#include,则定义符号__DS1302_H_#include // 这句没啥好说的,就是包含51单片机的特殊寄存器#ifndef uchar // 这一句还是和上面的是一样的,为了防止重复引用定义各种功能函数原型声明///#endif // 这句是整个文件的结束标志
d348cab3928d9e849770de3c06e062ef.png

那怎么可能嘛

最后写点

第一次尝试加入表情包,不知道效果怎么样。

对于头文件暂时就说这么多,以后想起来再补充吧。

对于大型项目的设计编写,模块化设计的这种思想很重要,使用头文件这种方式是比较方便的,让代码管理起来更加方便,设计起来更加方便。对于设计思路也有一定的帮助,只需要想我这个模块该怎么写。怎么样去设计。这也就是模块化程序设计的思想所在。

50a7f7cfe07d106a9cf665ccbc11ad5b.png

我觉得下面的更重要

分享更多单片机编程方面的知识,用自己踩过的坑给大家展示如何躲避他们。

关注并私信我,发送“08”即可获取文中实例的完整程序及仿真文件。

关注+点赞+评论,在评论区说出你的想法,和我一起交流,你的支持是我创作的动力,一枚科技仔感谢您的阅读。

49188f9b4db66bbe77be5fc6af5c7096.png

期待你的评论哟

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/271478.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最常问的MySQL面试题集合

除了基础题部分,本文还收集整理的MySQL面试题还包括如下知识点或题型:MySQL高性能索引SQL语句MySQL查询优化MySQL高扩展高可用MySQL安全性问题1:char、varchar的区别是什么?varchar是变长而char的长度是固定的。如果你的内容是固定…

计算机打印机共享失败,局域网共享打印机连接失败怎么办

在局域网中由于办公需要,经常要连接网络打印机,但是有时候就无法连接,提示各种连接失败,下面是学习啦小编给大家整理的一些有关局域网共享打印机连接失败的解决方法,希望对大家有帮助!局域网共享打印机连接失败的解决方…

idea 中代码大小写切换快捷键

idea用使用 CTRL SHIFT U 使用前: 使用后:

nginx做服务器入口_Nginx实现http反向代理

什么是反向代理?反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器…

操作系统基础:进程知识笔记(二)

一、管程 1、管道概念概念 管道是用于连接一个读进程和一个写进程。用来实现它们之间通信的共享文件。 2、管程的概念 管程是由一些共享数据、一组能为并发进程所执行的作用在共享数据上的操作集合、初始代码、以及存取权组成。管程提供了一种可以允许多线程安全、有效地共享抽…

怎样保护计算机连接线,一根网线把电脑烧了:雷雨天如何保护家电?

记得在小时候,每逢遇到雷雨天气,爸妈总会让我们关掉电视机、电脑等家电,虽然很不情愿,但为了避免电器遭受雷击造成损坏,我们还是会照做。现在长大了,除了知其然,还更要知其所以然,那…

HDU5697 刷题计划 dp+最小乘积生成树

分析:就是不断递归寻找靠近边界的最优解 学习博客(必须先看这个): 1:http://www.cnblogs.com/autsky-jadek/p/3959446.html 2:http://blog.csdn.net/u013849646/article/details/51524748 注:这…

分享我常用的5个免费的在线 SQL 数据库环境,简直太方便了!

大今天给大家分享几个在线的免费 SQL 运行环境,也就是在线数据库。这些网站可以帮助我们快速运行一些 SQL 语句的测试或者验证,同时还可以在网络上进行分享,关键不需要自己安装数据库。SQL FiddleSQL Fiddle 提供了 MySQL、Oracle、PostgreSQ…

r语言 面板数据回归_R语言_018回归

回归分析是统计学的核心。它其实是一个广义的概念,指那些用一个或多个预测变量来预测响应变量的方法。通常,回归分析可以用来挑选与响应变量相关的解释变量,可以描述两者的关系,也可以生成一个等式,通过解释变量来预测…

Integer对象范围(-128-127)之间(Integer. valueOf()方法)

1.Integer. valueOf()方法的作用 Integer. valueOf()可以将基本类型int转换为包装类型Integer,或者将String转换成Integer,String如果为Null或“”都会报错 看下面代码示例 取值为127时 取值为128时 为什么会是这样呢? 首先,我们…

操作系统基础:进程知识笔记(三)

1、死锁概念知识 计算机中存在许多互斥资源(打印机)、软件资源(进程表、临界区)如果两个进程同时调用打印机,或同时进入临界区必然会出现问题。 死锁:指两个以上的进程互相要求对方已经占有的资源导致无法继…

垂直梯形校正画质损失多少_梯形校正功能是怎么实现的?其中可大有学问

梯形校正这个概念,想必大部分投影仪用户早已耳熟能详。所谓的梯形校正,指的是当我们的投影仪位置摆放不正时,投射出来的画面会是一个梯形,这时候需要通过投影仪的梯形校正功能将画面调整为可以正常观看的矩形。虽然目前市场上的大…

操作系统基础:存储管理知识笔记(一)

1、存储器基础知识 存储器管理的对象是主存或内存,存储器是计算机系统中非常关键的资源,用来存放各种信息的主要场所。存 储器管理功能主要包括:主存空间的分配和回收、提供主存利用率、扩充主存、主存信息的保护。 2、存储器结构 存储器结构…

asp点击按钮sql列求和_助你2020晋级互联网大数据阵营(一):轻轻松松学SQL

毫不负责任的说,你和数据科学家最大的鸿沟,就差一个SQL语言:)入门后,后面的事情就简单了为了帮大家尽快入门Hive SQL、学会提数和分析,实现在大数据领域大干一场的愿望,帮你准备好了数据,准备好…

幂等和高并发在电商系统中的使用

在Java web项目开发中,经常会听到在做订单系统中生成订单的时候,要做幂等性控制和并发控制,特对此部分内容作出总结,在高并发场景下,代码层面需要实现并发控制;但是幂等性,其实更多的是系统的接…

@transactional注解失效情况

先来了解一下Transactional注解事务的特性吧,可以更好排查问题 1、service类标签(一般不建议在接口上)上添加Transactional,可以将整个类纳入spring事务管理,在每个业务方法执行时都会开启一个事务,不过这些事务采用相同的管理方…

计算机c盘隐藏了怎么办,win7怎么隐藏c盘 win7c盘被隐藏了怎么解除

很多的电脑用户担心其他用户在使用电脑时修改c盘中的重要文件,所以会将c盘设置为隐藏,那么大家知道在win7系统中怎么隐藏c盘吗?方法很简单,下面小编为大家带来win7隐藏c盘的详细教程,不知道怎么隐藏的朋友可以查看下面的教程学习…

操作系统基础:存储管理知识笔记(二)

一、分页存储管理 1、分页存储管理介绍 1.1 分页原理 页:将一个进程的地址空间划分为若干个大小相等的区域称为页。 块、页框:主存空间划分成与页相同的若干个物理块。 1.2 地址结构 分页系统地址结构:前一部分为页号;后一部分为页…

人工智能 信道估计 深度学习_DEMO演示|基于IVP02D 人工智能工作站的深度学习引擎,实现人群热力估计...

近年来,随着深度学习在计算机视觉领域获得广泛应用,算法框架也日渐成熟,例如基于深度神经网络的人群密度分析,通过自动学习能获得更有效的人群特征,相较于传统方法取得了一定的提高。AI小知识人群密度分析(…

vscode kite插件_微软发布 VS Code Python 插件 7 月更新

微软发布了 7 月的 Visual Studio Code Python 扩展更新,此版本总共修复了 51 个问题,其中包括:支持新的语言服务器:PylanceGather 扩展将 Notebook 导出为 HTML 和 PDF调试器的反向连接支持新的语言服务器:PylancePyl…