您的位置 首页 硬件

如安在KEIL中编写模块化的C程序

模块化编程是C相对汇编的重大优势。看书看了半天,没能实现周立功的的那个复杂的代码。自己在网上百度了下,按步骤要求可以实现,即模块化

模块化编程是C相对汇编的严重优势。看书看了半响,没能完成周建功的的那个杂乱的代码。自己在网上百度了下,按过程要求能够完成,即模块化的代码在PROTUES仿真时成功的。在KEIL中的模块化程序写法在运用KEIL的时分,咱们习惯上在一个.c的文件中把自己要写的东西依照自己思路的次序进行次序书写。这样是很遍及的写法,当程序比较短的时分比方几十行或许一百多行,是没有什么问题的。可是当程序很长的时分,比方你要用到LCD显现数据,就有几个LCD相关的函数,然后你想在LCD上显现温度,那么就要有DS18B20相关的操作,这又有几个相关的函数,假如你还想加上去DS1302的时刻显现功用,那么又要多许多函数。这样的话一个程序下来几百行是很正常的工作,关于自己写的程序或许在自己的脑海中比较明晰,不会太乱,可是当把自己写的程序交给他人来看的时分,他人往往会看的云里雾里,常常会看着看着就不知道你写的是什么了。

假如咱们写过相似电子钟这样的比较长的程序的话,必定在网上下载过相关的程序看过,有没有觉得他人的程序看起来让自己觉得很抑郁呢?呵呵。现在咱们来介绍一种在KEIL中C言语的模块写法。这样的写法其实也是很好用的,一些稍长的程序中常常见到。结构如下图所示:
是不是看起来不生疏?这就对了。其实假如学过PC机的C言语的话,对多文件的编译比较了解那么这个就不是什么问题了,由于这基本上是相同的。假如您是高手对此很了解的话,那么请略过本文;假如您是对此不是很了解并对此有点爱好,那么本文或许对您有所协助。假如在本文中有讲的不对的地方请跟帖提出。或许在我的主页给我留言进行沟通。

因 为这个教程不大容易用文字的方式来讲清楚,假如用视频来做的话作用应该好的多,可是俺没这个条件(俺普通话欠好怕吓到咱们,哈哈)。或许一帖会写不完,其他打字是件很苦楚的工作,所以这个请见谅。下面正式开端。

咱们主的意图是学习模块化的写法,所以功用是非必须的,了解了这个写法今后功用是咱们自己操控的,咱们现在将以LED灯的操控为比如讲起。

这样,咱们先树立三个.c的文件,别离命名为main.c、delay.c和led_on.c,并将在树立文件的时分尽量做到看到文件名即能看出程序的功用,这样的话比较直观,不容易紊乱。然后将这三个文件都增加进工程。(这个不能不会吧?)

在delay.c中咱们参加如下代码:

void delay1s()
{

unsigned int m,n;
for(m=1000;m>0;m–)
for(n=20;n>0;n–);

}

当然这个延时函数的实践延时时刻并不是一秒,咱们暂时不必管它,知道他是起延时作用的就能够了。
在led_on.c这个文件中咱们参加如下代码:

void led_on()
{

P0=0x00;
delay1s();
P0=0xff;
delay1s();

}

然后在main.c函数中咱们增加如下代码:

void main()
{

led_on();

}

这个程序的功用简略的很,便是完成LED的闪耀。

下面问题来了,便是如何将这三个C文件相关起来。

其实在单个.c文件的程序中,咱们在写程序的时分榜首件事便是写上#include,假如你是一个好学者,你必定问过为什么要这样写一句话,要是你上过辅导班,教师必定跟你讲reg52.h是头文件,这句话的作用的把头文件包括进来。当然这是很正确的,你能够翻开reg52.h,看一下里边的内容,里边包括了关于51单片机的一些界说,假如在这个文件中遗失的东西能够运用指令sfr来在C文件中界说,如在STC89C52中有用扩展RAM的时分会用到一个寄存器你能够增加到这个文件中或许在C文件顶用sfr界说。进一步想一下,一个包括指令能够把一个文件包括进来,那么用不同的头文件包括不就能够把更多的文件包括进来了吗?是不是有点思路了?

先讲到这儿,下次看一下详细如何将三个文件相关起来。

咱们现在讨论一下如何将三个c文件相关起来,在单文档的程序中咱们运用#include这个指令将单片机的头文件与咱们的程序相关起来。同理咱们也将以头文件的方式把咱们树立的源程序相关起来。

首要,咱们需求一个新文档,这个文档的树立有两种办法(以delay1s函数为例)。榜首种,在工程目录下树立一个delay1s.txt然后将其改名为delay1s.h。由于都是同编码的所以不会呈现乱码,然后在工程中将其翻开。第二种办法是直接在工程中新建一个文档,然后保存的时分将姓名保存为delay1s.h即可。假如是需求增加许多文件的话主张运用榜首种办法,这是个人主张。其次,咱们需求编写delay1s.h这个文件的内容,其内容如下:
#ifndef _DELAY1S_H_
#define _DELAY1S_H_

void delay1s();//延时函数

#endif
这个是头文件的界说,作用是声明晰delay1s()函数,由于假如在其他函数中假如咱们需求用到delay1s()函数的话,若不事前声明则在编译的时分会犯错。关于#ifndef……#define……#endif;这个结构大约的意思便是说假如没有界说(宏界说)一个字符串,那么咱们就界说它,然后履行后边的句子,假如界说过了那么就越过不履行任何句子。

关于为什么要运用这么一个界说办法,比方在led_on()函数中咱们调用了delay1s()函数,然后在main()函数中咱们也调用了delay()函数,那么,在led_on()函数中我就就要包括头文件delay1s.h,然后在main()函数中也要包括delay1s.h,若主函数中咱们调用过led_on(),那么在编译的时分,遇到delay1s()和led_on()的时分就会对delay1s.h进行两次解说,那么就会呈现过错。若有以上预处理指令的话,那么在第2次的时分这个_DELAY1S_H_现已被界说过了,那么就不会呈现重复界说的问题。这便是它的作用。可是留意,在编译器进行编译的时分头文件不参加编译。

再次,咱们树立一个led_on.h,起代码内容如下:

#ifndef _LED_ON_H_
#define _LED_ON_H_

void led_on();//灯闪耀

#endif

作用同delay1s.h,不理解的话能够再看一下上面的解说。

最终,将咱们前次说的三个函数弥补完好。

在led_on()函数中,咱们用到了51单片机的一些寄存器的界说,所以咱们要包括reg52.h,并且咱们用到了delay1s()函数,所以咱们要包括delay1s.h,故led_on()函数的代码如下:

#include
#include “delay1s.h” //留意这儿没有分号

void led_on()
{
P0=0x00;

delay1s();

P0=0xff;

delay1s();
}

Main函数的代码如下:

#include
#include “delay1s.h”
void main()
{

led_on();

delay1s();//在这儿其实只要榜首句就能够了,这句是不必要的
led_on();//这也是不必要的
}

在这个函数中,为了再次阐明一下#ifndef……#define……#endif这个结构的界说,咱们能够把一切的.h文件中的这个结构去掉,然后编译一下看一下作用。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/yingjian/318064.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部