侵权投诉

收藏!我的单片机C语言编程心得都在这里了

玩转单片机 2018-03-30 13:50 次阅读

一、.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说明,因为每次对它的读写都可能由不同意义;

原文标题:我的单片机C语言编程心得都在这里了...

文章出处:【微信号:mcu168,微信公众号:玩转单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
分享:

评论

相关推荐

多电源供电电路的布局设计需要满足什么原则

做过电路设计的人都知道,当一个电路存在多组电源供电的时候,需要考虑的问题会很多,最基本的,每一个电源....
发表于 07-12 11:38 47次 阅读
多电源供电电路的布局设计需要满足什么原则

plc和单片机的差异

PLC能够改动程序。如今大有些的单片机(内部带有FLASH ROM)都能够在线烧录程序,更改程序,所....
发表于 07-12 09:49 34次 阅读
plc和单片机的差异

单片机接连照应时刻核算办法

接连照应时刻:从外部接连恳求有用(外部接连恳求象征置1)到转向接连进口地址所需求的照应时刻。每个机器....
发表于 07-12 09:45 14次 阅读
单片机接连照应时刻核算办法

单片机矩阵式键盘的构造原理及编程方法

矩阵式键盘由行线和列线构成,按键坐落行、列线的穿插点上,其构造如图所示。
发表于 07-12 09:40 17次 阅读
单片机矩阵式键盘的构造原理及编程方法

adc0809与单片机联接电路

ADC0809与MCS-51单片机的联接如图9.10所示。电路联接首要触及两个疑问。一是8路仿照信号....
发表于 07-12 09:32 14次 阅读
adc0809与单片机联接电路

51单片机入门点亮LED

51单片机入门点亮发光二极管
发表于 07-12 09:24 33次 阅读
51单片机入门点亮LED

单片机按键复位电路的原理

51单片机要复位只需求在第9引脚接个高电平继续2us就能够完结,那这个进程是怎样完结的呢?在单片机体....
发表于 07-12 09:17 22次 阅读
单片机按键复位电路的原理

单片机最小体系电路原理及封装说明

单片机最小体系,也叫做单片机最小运用体系,是指用起码的原件构成单片机能够作业的体系。单片机最小体系的....
发表于 07-12 09:14 25次 阅读
单片机最小体系电路原理及封装说明

51单片机概述

单片机的指令按字节可分为单字节(1个机器周期)、双字节(2个机器周期)、三字节指令(3个机器周期),....
发表于 07-10 17:44 67次 阅读
51单片机概述

基于LabVIEW和MCS-51单片机实现数据采集与信息分析系统的设计

LabVIEW提供了功能强大的VISA库。VISA(Virtual Instrument Softw....
发表于 07-10 17:31 50次 阅读
基于LabVIEW和MCS-51单片机实现数据采集与信息分析系统的设计

接口芯片Webchip PS200的结构与原理

如今,各类MCU已经广泛地应用于家用电器中。由于嵌入式微控制器MCU(或称之为单片机)都嵌入在有关的....
的头像 我快闭嘴 发表于 07-10 17:29 204次 阅读
接口芯片Webchip PS200的结构与原理

利用LabVIEW开发平台和单片机实现集成芯片测试仪的设计

根据多年数字电路教学和实验方面的经验,学生在不熟悉芯片性能,缺乏对芯片逻辑和时序关系的感性认识的前提....
发表于 07-10 16:59 43次 阅读
利用LabVIEW开发平台和单片机实现集成芯片测试仪的设计

以HT单片机为控制核心的步进电机驱动方案

  1、概述:本文描述了一种以HT单片机为控制核心的步进电机驱动方案。可以控制步进电机的转速及转向。   2、简介:   ...
发表于 07-10 16:40 118次 阅读
以HT单片机为控制核心的步进电机驱动方案

IPUS SQPI PSRAM为STM32单片机提供RAM扩展方案

IoT设备的增长引发了对内存技术的新兴趣,IPUS 自成立以来,已向市场推出了具有SPI和/或QSPI(Quad SPI)存储器...
发表于 07-10 16:11 644次 阅读
IPUS SQPI PSRAM为STM32单片机提供RAM扩展方案

关于ARM的三种中断调试方法介绍

在整个流程中,用户首先需要建立工程并对工程做初步的配置,包括配置处理器和配置调试设备。编辑工程文件,....
发表于 07-10 16:01 31次 阅读
关于ARM的三种中断调试方法介绍

基于单片机的高效率数字电源设计资料(方案、原理图)

使用RX62T单片机设计的高效率数字电源 采用瑞萨高性能32-bit MCU RX62T ( 100MHz主频,165DMIPS)实现软件PF...
发表于 07-10 15:47 545次 阅读
基于单片机的高效率数字电源设计资料(方案、原理图)

MCU单片机通过SPI可实现数据的快速存取

随着MCU单片机主频越来越高,处理能力越来越强大,需要的RAM资源相应增加,单片上SRAM采用6T结....
发表于 07-10 14:35 48次 阅读
MCU单片机通过SPI可实现数据的快速存取

单键实现单片机开关机设计案例

单片机工作后,将最先进行IO口初始化,IO1设为输入状态,启用内部上拉;IO2设为输出状态,输出高电....
发表于 07-10 11:42 164次 阅读
单键实现单片机开关机设计案例

关于单片机的复位电路方案

单片机在牢靠的复位往后,才会从0000H地址初步有序的施行运用程序。一同,复位电路也是简略遭到外部噪....
发表于 07-10 10:46 43次 阅读
关于单片机的复位电路方案

单片机的作业进程说明

单片机主动结束赋予它的使命的进程,也便是单片机施行程序的进程,即一条条施行的指令的进程,所谓指令便是....
发表于 07-10 10:37 42次 阅读
单片机的作业进程说明

如何看懂单片机的时序图

 先说“次第疑问”,这个相对简略一些。咱们在学 UART 串口通讯的时分,先 1 位开端位,再 8 ....
发表于 07-10 10:28 56次 阅读
如何看懂单片机的时序图

单片机在按键实习运用中碰到的疑问及处理

 单片机在工业操控中运用十分的广泛,如单片机化的电气传动及操控体系中,单片机恰当于体系中的一个零部件....
发表于 07-10 10:26 41次 阅读
单片机在按键实习运用中碰到的疑问及处理

单片机操控直流电流的的正回转程序

本程序能经过按键操控直流电流的的正回转,按键的端口界说直接看程序的界说有些。
发表于 07-10 10:23 27次 阅读
单片机操控直流电流的的正回转程序

STC单片机开发的注意事项

程序无法下载进MCU,或许犯错的本地有:假定预备条件充沛(驱动程序设备成功STC_ISP.EXE设备....
发表于 07-10 10:21 45次 阅读
STC单片机开发的注意事项

单片机学习笔记,三个步骤教你学

作为一名电子技术从业人员,你学过单片机吗?你会运用单片机吗?我想你一定学过,但不一定会运用。因为学习单片机比学习其他学科...
发表于 07-10 10:20 565次 阅读
单片机学习笔记,三个步骤教你学

单片机如何接收编码器发送的信号

旋转编码器是用来测量角度的装置,其分为单路输出和双路输出两种,通过这两种脉冲输出可以测量转速及判断旋....
发表于 07-10 10:19 34次 阅读
单片机如何接收编码器发送的信号

单片机部队扫描键盘程序说明

在键盘中按键数量较多时,为了削减I/O口的占用,一般将按键摆放成矩阵方法,如图1所示。在矩阵式键盘中....
发表于 07-10 10:12 28次 阅读
单片机部队扫描键盘程序说明

单片机烧录程序的方法步骤

怎么给单片机烧录程序?单片机keil程序烧录教程
发表于 07-10 10:06 41次 阅读
单片机烧录程序的方法步骤

单片机静态办法点亮数码管电路图解

电路只驱动一个数码管,该数码管为共阴管,公共端接地,段管直连到单片机的P2口,所用单片机为AT89C....
发表于 07-10 10:02 34次 阅读
单片机静态办法点亮数码管电路图解

如何构建单片机的最小体系

在了解原理之前, 首要让咱们考虑一个疑问,啥是单片机, 单片机有啥用? 这是一个有意思的疑问,因为任....
发表于 07-10 09:57 24次 阅读
如何构建单片机的最小体系

单片机串行口中止程序说明

当单片机接纳到一帧数据后,RI会置1,向CPU恳求中止,若之前有中止容许,则发作了中止,进入中止效劳....
发表于 07-10 09:51 25次 阅读
单片机串行口中止程序说明

单片机常用的调试接口有哪些

搞嵌入式开发和ARM开发搞了半辈子了,调试程序是不可避免的。接触了那么多的调试规范、调试工具、调试手....
发表于 07-10 09:12 49次 阅读
单片机常用的调试接口有哪些

怎么样才能使用单片机和NRF24L01实现多路温度检测和显示系统的设计

多路温度检测与显示系统,是实现多通道温度的检测,同时通过可视化的界面显示出目前待测物体或环境的温度。....
发表于 07-10 08:00 18次 阅读
怎么样才能使用单片机和NRF24L01实现多路温度检测和显示系统的设计

使用单片机实现篮球比赛计时计分系统的设计论文免费下载

整个篮球比赛计时计分设计系统由硬件和软件组成。其中硬件主要由最小系统、显示部分电路和按键部分电路三个....
发表于 07-10 08:00 16次 阅读
使用单片机实现篮球比赛计时计分系统的设计论文免费下载

LabVIEW编程详解PDF电子书免费下载

本书系统、全面地讲解了LabVIEW的编程技术,主要内容包括LabVIEW开发环境介绍、数据结构、程....
发表于 07-10 08:00 61次 阅读
LabVIEW编程详解PDF电子书免费下载

使用C语言写出的九九乘法表

本文档的主要内容详细介绍的是使用C语言写出的九九乘法表资料合集免费下载。
发表于 07-10 08:00 20次 阅读
使用C语言写出的九九乘法表

如何使用SPCE061A单片机实现射频读写器信号分析系统设计

射频识别RFID技术是一种基于射频原理实现的非接触式自动识别技术。它的基本原理是信号通过空间耦合(交....
发表于 07-09 18:56 20次 阅读
如何使用SPCE061A单片机实现射频读写器信号分析系统设计

FPGA是什么?FPGA与单片机有什么区别

二者最大的区别:单片机(无论哈佛总线结构或者冯诺依曼结构)均为取出指令-》执行,指令是顺序执行的(即....
发表于 07-09 18:17 123次 阅读
FPGA是什么?FPGA与单片机有什么区别

单片机的基本结构分支与循环结构程序设计教程说明

进一步学习Keil μVision程序设计平台使用,在此平台下如何新建工程,输入源程序,工程详细设置....
发表于 07-09 18:17 22次 阅读
单片机的基本结构分支与循环结构程序设计教程说明

国产MCU推出性价比王,世界第一颗32位MCU且价格低于1元RMB

通过采访得知该公司在MCU/SOC领域有很多重量级产品量产推出,相信未来在国产MCU/SOC领域中航....
发表于 07-09 17:02 427次 阅读
国产MCU推出性价比王,世界第一颗32位MCU且价格低于1元RMB

求助!求单片机循迹小车程序 和仿真图proteus

假期网上实习 两天时间老师要求做出一个简单的循迹小车 并实现转向时变速 实在不会请求帮助 ...
发表于 07-09 15:48 224次 阅读
求助!求单片机循迹小车程序 和仿真图proteus

单片机、ARM、DSP与CPU它们之间的区别是什么

你知道吗其实单片机、ARM、DSP都是属于CPU吗?它们之间到底有什么区别呢?就这个问题下面就让成都....
发表于 07-09 15:25 83次 阅读
单片机、ARM、DSP与CPU它们之间的区别是什么

了解I2C总线的功能和特点

读操作有三种基本操作:当前地址读、随机读和顺序读。三种操作方法类似,只是读的数据个数不同,可连续读8....
发表于 07-09 14:50 60次 阅读
了解I2C总线的功能和特点

单端口SRAM与双端口SRAM电路结构

SRAM是随机存取存储器的一种。所谓的静态是指这种存储器只要保持通电,里面储存的数据就可以恒常保持。SRAM不需要刷新电...
发表于 07-09 14:38 993次 阅读
单端口SRAM与双端口SRAM电路结构

ADC支持采样频率受供电电压影响

STM32 ADC:STM32 12位ADC是逐次逼近型的模数转换器。它有多达19个多路复用通道,允....
发表于 07-09 14:32 39次 阅读
ADC支持采样频率受供电电压影响

C语言之结构体的声明与定义

我们刚刚申请了一个名叫Info的结构体类型,那么理论上我们可以像声明其他变量的操作一样,去声明我们的....
的头像 玩转单片机 发表于 07-09 09:06 157次 阅读
C语言之结构体的声明与定义

如何把C++的源程序改写成C语言

由于C++解释器比C语言解释器占用的存储空间要大500k左右。为了节省有限的存储空间,降低成本,同时也为了提高效率,将用C+...
发表于 07-08 20:51 214次 阅读
如何把C++的源程序改写成C语言

单片机死机原因分析

图中P07为单片机控制mos管的io口,供电5V/2A适配器,单片机松翰570210。 单片机运行正常,但是负载电流到1.7A左右时,单片机...
发表于 07-08 15:09 221次 阅读
单片机死机原因分析

8031单片机时钟实验的设计方案

为了设计此系统,我们采用了8031单片机作为控制芯片,在前向通道中是一个非电信号的电量采集过程。它由....
发表于 07-08 11:45 42次 阅读
8031单片机时钟实验的设计方案

单片机篮球赛计时计分器的设计方案

随着微电子技术的不断发展与进步,微处理器芯片的集成程度越来越高,单片机已可以在一块芯片上同时集成CP....
发表于 07-08 11:43 47次 阅读
单片机篮球赛计时计分器的设计方案

多个单片机硬件系统的案例分析

  本章首先从单片机的概念入手,简单介绍了单片机实验系统的基本组成及功能,以最简单的信号灯控制应用实....
发表于 07-08 11:26 33次 阅读
多个单片机硬件系统的案例分析

单片机开发串口是应用最为广泛的通信接口

通用同步收发器(USART)是一种串行接口设备,可以对其进行编程以进行异步或同步通信。
发表于 07-08 11:21 84次 阅读
单片机开发串口是应用最为广泛的通信接口

概述单片机Proteus仿真及案例分析

Proteus软件是英国LCE公司研制的EDA工具软件,可实现电路原理设计,电路分析与仿真。Prot....
发表于 07-08 11:17 52次 阅读
概述单片机Proteus仿真及案例分析

数字滤波算法克服随机干扰的误差具有哪些优点?

由上式可以看出,本次滤波的输出值主要取决于上次滤波的输出值(注意不是上次的采样值,这和加权平均滤波是....
发表于 07-08 11:13 102次 阅读
数字滤波算法克服随机干扰的误差具有哪些优点?

单片机和PLC之间有什么区别?

单片机的特点是编程、维护相对复杂,编程方式常用C语言或者汇编语言,成本较低,I/O接口相对有限。
发表于 07-08 11:00 197次 阅读
单片机和PLC之间有什么区别?

关于单片机系统EMC测试

它包括电磁干扰(EMI)和电磁敏感性(EMS)两部分。由于电器产品在使用时对其它电器有电磁干扰,或受....
发表于 07-08 10:56 105次 阅读
关于单片机系统EMC测试

单片机和数字电路怎么抗干扰?

LED电源的工程师经常提及“恒流”驱动,其实,在很多电子设备中,有许多用电设备要求供给的电流(而不是....
发表于 07-08 08:43 126次 阅读
单片机和数字电路怎么抗干扰?

多个单片机用nRF24l01模块做发射,一个做接收,如何实现的?

准备做一个简易的家庭温度测量仪,每个房间都放置一个单片机加发射模块,在客厅里放置一个单片机加接收模块,不知道多个发射模块...
发表于 07-08 07:45 49次 阅读
多个单片机用nRF24l01模块做发射,一个做接收,如何实现的?

概述51单片机芯片的不同引脚

首先我们来认识一下51 单片机芯片的引脚图,具体功能在下面介绍。
发表于 07-07 15:42 69次 阅读
概述51单片机芯片的不同引脚

手把手教程:各类数字电源设计实例(程序+原理图)

本资料分享了数字电源设计实例,包含程序、原理图等资料,手把手带你独立设计属于自己的数字电源。 ...
发表于 07-07 15:13 759次 阅读
手把手教程:各类数字电源设计实例(程序+原理图)