侵权投诉

单片机C语言编程的H文件与C文件到底有什么关系

2020-10-25 10:14 次阅读

  这个8*8按键程序的过程中,不管是在自己写还是参考别人程序的过程中,发现自己对C语言有些基本知识点和编程规范有很多不懂的地方,有些是自己以前的编程习惯不好,有些就是基础知识不扎实的表现,所以总结出来。

  一、.H文件与.C文件的关系:

  迄今为止,写过的程序都是一些很简单的程序,从来没有想到要自己写.H文件,也不知道.H文件到底什么用,与.C文件什么关系。只是最近写键盘程序,参考别人的程序时,发现别人写的严格的程序都带有一个“KEY.H”,里面定义了.C文件里用到的自己写的函数,如Keyhit()、Keyscan()等。

  经过查找资料得知,.H文件就是头文件,估计就是Head的意思吧,这是规范程序结构化设计的需要,既可以实现大型程序的模块化,又可以实现根各模块的连接调试。

  1、.H文件介绍:

  在单片机C程序设计中,项目一般按功能模块化进行结构化设计。将一个项目划分为多个功能,每个功能的相关程序放在一个C程序文档中,称之为一个模块,对应的文件名即为模块名。一个模块通常由两个文档组成,一个为头文件*.h,对模块中的数据结构和函数原型进行描述;另一个则为C文件*.c ,对数据实例或对象定义,以及函数算法具体实现。

  2、.H文件的作用

  作为项目设计,除了对项目总体功能进行详细描述外,就是对每个模块进行详细定义,也就是给出所有模块的头文件。通常H头文件要定义模块中各函数的功能,以及输入和输出参数的要求。模块的具体实现,由项目组成根据H文件进行设计、编程、调试完成。为了保密和安全,模块实现后以可连接文件OBJ、或库文件LIB的方式提供给项目其他成员使用。由于不用提供源程序文档,一方面可以公开发行,保证开发人员的所有权;另一方面可以防止别人有意或无意修改产生非一致性,造成版本混乱。所以H头文件是项目的详细设计和团队工作划分的依据,也是对模块进行测试的功能说明。要引用模块内的数据或算法,只要用包含include指定模块H头文件即可。

  3、.H文件的基本组成

  /*如下为键盘驱动的头文档*/#ifndef _KEY_H_ //防重复引用,如果没有定义过_KEY_H_,则编译下句#define _KEY_H_ //此符号唯一, 表示只要引用过一次,即#i nclude,则定义符号_KEY_H_/////////////////////////////////////////////////////////////////char keyhit( void ); //击键否unsigned char Keyscan( void ); //取键值/////////////////////////////////////////////////////////////////#endif

  二、尽量使用宏定义#define

  开始看别人的程序时,发现程序开头,在文件包含后面有很多#define语句,当时就想,搞这么多标示符替换来替换去的,麻不麻烦啊,完全没有理解这种写法的好处。原来,用一个标示符表示常数,有利于以后的修改和维护,修改时只要在程序开头改一下,程序中所有用到的地方就全部修改,节省时间。

  #define KEYNUM 65//按键数量,用于Keycode[KEYNUM]#define LINENUM 8//键盘行数#define ROWNUM 8//键盘列数

  注意的地方:

  1、宏名一般用大写

  2、宏定义不是C语句,结尾不加分号

  三、不要乱定义变量类型

  以前写程序,当需要一个新的变量时,不管函数内还是函数外的,直接在程序开头定义,虽然不是原则上的错误,但是很不可取的作法。

  下面说一下,C语言中变量类型的有关概念:

  从变量的作用范围来分,分为局部变量和全局变量:

  1、全局变量:是在函数外定义的变量,像我以前定义在程序开头的变量都是全局变量,这里我就犯了一个大忌,使用了过多的全局变量。

  带来的问题有两个:一是,全局变量在程序全部执行过程中都占用资源;二是,全局变量过多使程序的通用性变差,因为全局变量是模块间耦合的原因之一。

  2、局部变量:在函数内部定义的变量,只在函数内部有效。

  从变量的变量值存在的时间分为两种:

  1、静态存储变量:程序运行期间分配固定的存储空间。

  2、动态存储变量:程序运行期间根据需要动态地分配存储空间。

  具体又包括四种存储方式:auto static register extern

  1、局部变量,不加说明默认为auto型,即动态存储,如果不赋初值,将是一个不确定的值。而将局部变量定义为static型的话,则它的值在函数内是不变的,且初值默认为0。

  static unsigned char sts;//按键状态变量

  static unsigned char Nowkeycode;//此时的键码

  static unsigned char Prekeycode;//上一次的键码

  static unsigned char Keydowntime;//矩形键盘按下去抖时间变量

  static unsigned char Keyuptime;//矩形键盘释放去抖时间变量

  static unsigned char Onoffdowntime;//关机键按下去抖时间变量

  static unsigned char Onoffuptime;//关机键释放去抖时间变量

  static unsigned char onoff_10ms; //判断关机键中断次数变量,累计150次大约为3S,因为前后进了两个10ms中断

  2、全局变量,编译时分配为静态存储区,可以被本文件中的各个函数引用。如果是多个文件的话,如果在一个文件中引用另外文件中的变量,在此文件中要用extern说明。不过如果一个全局变量定义为static的话,就只能在此一个文件中使用。

  四、特殊关键字const volatile的使用

  1、const

  const用于声明一个只读的变量

  const unsigned char a=1;//定义a=1,编译器不允许修改a的值

  作用:保护不希望被修改的参数

  const unsigned char Key_code[KEYNUM]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,

  0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,

  0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,

  0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,

  0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,

  0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,

  0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,

  0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F,0x40,

  0x41

  };//键码

  const unsigned char Line_out[LINENUM]={0xFE,0xFD,0xFB,0xf7,0xEF,0xDF,0xBF,0x7F};//行输出编码

  const unsigned char Row_in[ROWNUM]={0xFE,0xFD,0xFB,0xf7,0xEF,0xDF,0xBF,0x7F};//列输入编码

  2、volatile

  一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。

  static int i=0;int main(void){。..while (1){if (i)dosomething();}}/* Interrupt service routine. */void ISR_2(void){i=1;}

  程序的本意是希望ISR_2中断产生时,在main当中调用dosomething函数,但是,由于编译器判断在main函数里面没有修改过i,因此可能只执行一次对从i到某寄存器的读操作,然后每次if判断都只使用这个寄存器里面的“i副本”,导致dosomething永远也不会被调用。如果将将变量加上volatile修饰,则编译器保证对此变量的读写操作都不会被优化(肯定执行)。

  一般说来,volatile用在如下的几个地方:

  1、中断服务程序中修改的供其它程序检测的变量需要加volatile;

  2、多任务环境下各任务间共享的标志应该加volatile;

  3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义。
责任编辑 LK

收藏 人收藏
分享:

评论

相关推荐

单片机上拉电阻有什么样的作用好使用原则详细说明

电子发烧友网站提供《单片机上拉电阻有什么样的作用好使用原则详细说明.pdf》资料免费下载
发表于 11-26 23:50 8次 阅读
单片机上拉电阻有什么样的作用好使用原则详细说明

如何让STC单片机接上电就可以开始工作

电子发烧友网站提供《如何让STC单片机接上电就可以开始工作.pdf》资料免费下载
发表于 11-26 23:48 3次 阅读
如何让STC单片机接上电就可以开始工作

使用单片机实现看门狗溢出测试的C语言程序免费下载

本文档的主要内容详细介绍的是使用单片机实现看门狗溢出测试的C语言程序免费下载。
发表于 11-26 17:31 5次 阅读
使用单片机实现看门狗溢出测试的C语言程序免费下载

使用单片机实现外部中断1电平触发的C语言程序免费下载

本文档的主要内容详细介绍的是使用单片机实现外部中断1电平触发的C语言程序免费下载。
发表于 11-26 17:31 8次 阅读
使用单片机实现外部中断1电平触发的C语言程序免费下载

使用单片机实现外部中断0电平触发的C语言程序免费下载

本文档的主要内容详细介绍的是使用单片机实现外部中断0电平触发的C语言程序免费下载。
发表于 11-26 17:31 5次 阅读
使用单片机实现外部中断0电平触发的C语言程序免费下载

使用单片机实现矩阵键盘简易计算器的C语言程序免费下载

本文档的主要内容详细介绍的是使用单片机实现矩阵键盘简易计算器的C语言程序免费下载。
发表于 11-26 17:31 6次 阅读
使用单片机实现矩阵键盘简易计算器的C语言程序免费下载

使用单片机实现按键长按短按效果的C语言程序免费下载

本文档的主要内容详细介绍的是使用单片机实现按键长按短按效果的C语言程序免费下载。
发表于 11-26 17:31 6次 阅读
使用单片机实现按键长按短按效果的C语言程序免费下载

单片机是如何构成的?

  单片机是这些电器动作的关键,是指挥硬件运行的。例如:接收按钮或按键的输入信号,按照事先编好的程序,指挥马达和LCD的...
发表于 11-26 17:12 7次 阅读
单片机是如何构成的?

stm8单片机的供电模块

  STM8 的MCU有四个供电单元:   1. VDD/VSS:主电源(3V~5.5V);   2. VDDIO/VSSIO: I/O口...
发表于 11-26 17:10 0次 阅读
stm8单片机的供电模块

常见的四种单片机常用开方根算法

  C语言中要求平方根,可以在头文件中加入#include 〈math.h》。然后调用sqrt(n);函数即可。但在单片机中调用此函数无疑会耗...
发表于 11-26 17:01 0次 阅读
常见的四种单片机常用开方根算法

单片机系统开发入门知识及基本条件

  1. 入门知识储备   想学习单片机系统的开发,必须先有以下几个方面的知识储备:   (一) 微机原理   (二) C语言...
发表于 11-26 16:57 0次 阅读
单片机系统开发入门知识及基本条件

单片机如何用一个IO口采集多个按键信号?

一般按键信号都是高低电平,对于每一个按键信号单片机都需要一个IO口进行采集,这种按键采集方式比较简单,但是占用的单片机I...
发表于 11-26 16:51 0次 阅读
单片机如何用一个IO口采集多个按键信号?

减轻单片机设计干扰的方法

现在的单片机一般在片内集成有RC振荡电路,可以产生MCU工作需要的时钟脉冲,使用片内时钟不仅可以简化外部电路设计,还可以...
发表于 11-26 16:47 0次 阅读
减轻单片机设计干扰的方法

STM8S003单片机最小系统的电路原理图

本文以ST公司的STM8S003单片机为例,给大家讲解一个单片机最小系统的电路原理图:通过单片机采集一个按键信号,点亮一颗L...
发表于 11-26 16:45 0次 阅读
STM8S003单片机最小系统的电路原理图

stm8单片机复位功能的一些特性

  对于stm8单片机的复位引脚NRST,有九种情况会触发复位:   通过外部电位作用于NRST引脚产生复位   上电复位(...
发表于 11-26 16:38 0次 阅读
stm8单片机复位功能的一些特性

STM8单片机中断的主要功能有哪些

  内部中断:一般是由硬件错误或者运算过程中出错引起的,一般是不可避免的;   外部中断:是处理器的外设发出的中断请求,如...
发表于 11-26 16:36 0次 阅读
STM8单片机中断的主要功能有哪些

学习51单片机的误区

  误区1:51单片机是学习的基础   “51单片机是学习的基础”这句话本身并没有错。在我读本科的时候,当时它无疑是学习的基础...
发表于 11-26 16:27 0次 阅读
学习51单片机的误区

在学习STM32时为什么要学习汇编?

不同的平台的汇编代码是不一样的,最早的汇编在50年代就发明了,比很多人的父母的年龄都大,老掉牙,不用....
的头像 嵌入式ARM 发表于 11-26 14:32 30次 阅读
在学习STM32时为什么要学习汇编?

基于AT89C55WD单片机和编程语言实现继电保护实验系统的设计

其中控制系统采用单片机控制,包含以下4个部分:数据处理单元,即微机主系统;数据采集单元,即模拟量输入....
的头像 电子设计 发表于 11-26 10:10 185次 阅读
基于AT89C55WD单片机和编程语言实现继电保护实验系统的设计

单片机上电复位后端口的状态详细概述

 在 MSP430 单片机的手册中,对于端口复位后的状态,是这样描述的:复位后,所有端口处于输入状态....
发表于 11-25 16:30 42次 阅读
单片机上电复位后端口的状态详细概述

单片机整体的CPU使用情况详细介绍

打开电脑的任务管理器,看着跳动的 CPU 使用率,发现很舒服。每一个线程占用了多少 CPU 清清楚楚....
发表于 11-25 15:58 40次 阅读
单片机整体的CPU使用情况详细介绍

为什么不能使用单片机取代PLC

单片机可以替代 PLC 吗? 这个问题如同面粉能代替面条一样,答案是否定的。第一次听到这个答案可能很....
发表于 11-25 10:58 97次 阅读
为什么不能使用单片机取代PLC

单片机到底有什么作用PDF文件讲解

1. uC/OS 是个什么鬼?在一些朋友的留言和大神的文章中多次提到了 uC/OS,相信很多朋友看到....
发表于 11-25 10:57 43次 阅读
单片机到底有什么作用PDF文件讲解

Python代码的性能分析的命令合集

当我们开始精通编程语言时,我们不仅希望实现最终的编程目标,而且还希望可以使我们的程序更高效。在本文中....
发表于 11-25 10:43 20次 阅读
Python代码的性能分析的命令合集

C语言预处理命令的分类和工作原理详细说明

C 语言编程过程中,经常会用到如 #include、#define 等指令,这些标识开头的指令被称为....
发表于 11-25 10:34 18次 阅读
C语言预处理命令的分类和工作原理详细说明

单片机实现按键触发设计的方案和电路图分析

在学习单片机的时候想必大家都接触过按键,按键是一个人机交互的接口设备,在刚开始接触的时候最简单也是最....
发表于 11-25 09:34 37次 阅读
单片机实现按键触发设计的方案和电路图分析

工业物联网的无线网络WiFi单片机的方案详细概述

正如 Microchip 所看到的一样,随着物联网从家庭自动化领域拓展到如供暖、通风与空调(HVAC....
发表于 11-25 08:20 24次 阅读
工业物联网的无线网络WiFi单片机的方案详细概述

51单片机的C语言编程基础及实例教程

基础知识:51单片机编程基础   单片机的外部结构:   1. DIP40双列直插; ....
发表于 11-24 18:08 62次 阅读
51单片机的C语言编程基础及实例教程

使用单片机实现独立按键依次输入数据的C语言程序免费下载

本文档的主要内容详细介绍的是使用单片机实现独立按键依次输入数据的C语言程序免费下载。
发表于 11-24 17:57 33次 阅读
使用单片机实现独立按键依次输入数据的C语言程序免费下载

使用单片机实现按键从右至左输入的C语言程序免费下载

本文档的主要内容详细介绍的是使用单片机实现按键从右至左输入的C语言程序免费下载。
发表于 11-24 17:57 37次 阅读
使用单片机实现按键从右至左输入的C语言程序免费下载

使用单片机实现抢答器的C语言程序免费下载

本文档的主要内容详细介绍的是使用单片机实现抢答器的C语言程序免费下载。
发表于 11-24 17:50 28次 阅读
使用单片机实现抢答器的C语言程序免费下载

使用单片机实现多位数按键加减不闪烁的C语言程序免费下载

本文档的主要内容详细介绍的是使用单片机实现多位数按键加减不闪烁的C语言程序免费下载。
发表于 11-24 17:50 25次 阅读
使用单片机实现多位数按键加减不闪烁的C语言程序免费下载

使用单片机实现多位数按键加减闪烁数码管显示的C语言程序免费下载

本文档的主要内容详细介绍的是使用单片机实现多位数按键加减闪烁数码管显示的C语言程序免费下载。
发表于 11-24 17:50 18次 阅读
使用单片机实现多位数按键加减闪烁数码管显示的C语言程序免费下载

MATLAB自相关编写及周期函数分析

正弦函数的自相关图像具有明显的周期性, 添加随机噪声后自相关图像的周期性下降, 可以看出在机械设备运....
发表于 11-24 17:24 15次 阅读
MATLAB自相关编写及周期函数分析

单片机C51程序设计的学习课件免费下载

本文档的主要内容详细介绍的是单片机C51程序设计的学习课件免费下载包括了:1、C51程序设计基础,2....
发表于 11-24 17:24 24次 阅读
单片机C51程序设计的学习课件免费下载

使用MATLAB实现有限域的基础知识介绍

令p 为一个素数。 则对任意的一个正整数n,存在一个特征为p,元素个数为pn 的有限域GF(pn)。....
发表于 11-24 17:24 24次 阅读
使用MATLAB实现有限域的基础知识介绍

FreeRTOS中相对延时和绝对延时的区别

嵌入式软件代码中延时是很常见的,只是延时种类有很多,看你用什么延时。 1 一个延时的问题 问题:周期....
的头像 璟琰乀 发表于 11-24 15:44 103次 阅读
FreeRTOS中相对延时和绝对延时的区别

基于单片机和热电阻Cu5实现烤烟温度自动控制系统的设计

烟叶初烤过程中,烤房内温度的准确测量和有效控制是烘烤的核心和烟叶质量的根本保证。
的头像 电子设计 发表于 11-24 10:13 224次 阅读
基于单片机和热电阻Cu5实现烤烟温度自动控制系统的设计

基于主动学习的半监督图神经网络模型来对分子性质进行预测方法

总体来讲,本文使用教师模型和学生模型来迭代训练。每个模型都是一个图神经网络。在教师模型中,使用半监督....
的头像 深度学习自然语言处理 发表于 11-24 09:59 67次 阅读
基于主动学习的半监督图神经网络模型来对分子性质进行预测方法

微软亚洲研究院的研究员们提出了一种模型压缩的新思路

近日,来自微软亚洲研究院自然语言计算组的研究员们提出了一种与显式地利用蒸馏损失函数来最小化教师模型与....
的头像 深度学习自然语言处理 发表于 11-24 09:48 160次 阅读
微软亚洲研究院的研究员们提出了一种模型压缩的新思路

常见的最优化方法介绍

从上面公式可以注意到,它得到的是一个全局最优解,但是每迭代一步,都要用到训练集所有的数据,如果m很大....
的头像 深度学习自然语言处理 发表于 11-24 09:23 78次 阅读
常见的最优化方法介绍

AT89S52单片机的中文资料说明

AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。使....
发表于 11-24 08:00 46次 阅读
AT89S52单片机的中文资料说明

实现蜂鸣器的程序和工程文件免费下载

本文档的主要内容详细介绍的是使用单片机实现蜂鸣器的程序和工程文件免费下载。
发表于 11-24 08:00 41次 阅读
实现蜂鸣器的程序和工程文件免费下载

使用光照鲁棒实现图像匹配的方法详细概述

针对现有的基于局部特征的图像匹配算法对光照变化敏感、匹配正确率低等问题,提出一种具有光照鲁棒性的图像....
发表于 11-23 17:46 20次 阅读
使用光照鲁棒实现图像匹配的方法详细概述

使用单片机实现1个独立按键控制LED状态转换的C语言程序免费下载

本文档的主要内容详细介绍的是使用单片机实现1个独立按键控制LED状态转换的C语言程序免费下载。 ....
发表于 11-23 17:45 53次 阅读
使用单片机实现1个独立按键控制LED状态转换的C语言程序免费下载

如何打造一套属于自己的嵌入式软件开发平台

在本次的项目中GUI采用了最新的TouchGFX,放弃了已经使用多年的emwin。一个原因是因为To....
的头像 电路设计技能 发表于 11-23 14:36 242次 阅读
如何打造一套属于自己的嵌入式软件开发平台

高质量C++和C语言编程指南的PDF电子书免费下载

 早期的编程语言如 Basic Fortran 没有头文件的概念 C++/C 语言的初学者虽然会用使....
发表于 11-23 08:00 36次 阅读
高质量C++和C语言编程指南的PDF电子书免费下载

域名系统DNS的概念和设施详细说明

本RFC是对域名系统(DNS)的介绍,它省略了许多可以在RFC中找到的细节,“域名-实现和规范”〔R....
发表于 11-23 08:00 42次 阅读
域名系统DNS的概念和设施详细说明

C语言的一些常用标准库分享

 有很多工程师喜欢自己封装一些标准库已有的函数,其实自己封装的函数,并不一定比标准库好,有时候反而代....
的头像 Wildesbeast 发表于 11-22 11:54 428次 阅读
C语言的一些常用标准库分享