您的位置 首页 系统

单片机C言语模块化规划

keil中实现C语言模块化编程.doc在使用KEIL的时候,我们习惯上在一个.c的文件中把自己要写的东西按照自己思路的顺序进行顺序书写。这样…

keil中完成C言语模块化编程.doc

在运用 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 文件中的这个结构去掉,然后编译一下看一下
作用。
到这儿信任咱们关于这种模块化的写法就有大约的了解了, 假如咱们想添加
新功用的时分,比方咱们要添加一个流水灯的功用,那么,咱们只需求添加一个
led_circle.c 和 led_circle.h,然后依照上述过程添加进工程即可,程序的其
他部分不需求任何改动。明显这是很便利的。其实函数的声明能够运用 extern
关键字,C 言语中默许都是这个类型的,所以能够不必写。
假如还有说的不清楚的请提出来,咱们一同评论。我们这些东西都是手动输
入的所以不免会有过错,假如各位朋友在看这个教程的时分发现有哪里表达过错
或许是不稳当的当地,欢迎指出,我会及时改正,避免误导他人,。

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部