模块化编程是什么?就是可以吧你学的程序分成一个个模块,方便修改和移植。从事单片机和嵌入式这方面,编程具有强大移植性可以说是重中之重,如果你写一些LED数码管之类的小程序,
用模块化编程有些小题大做。但是在团队做项目中,需要不同的人负责不同的一段程序,这时候就需要模块化编程了,在个人编大程序时也要用,因为好修改,想想你的代码几十行还好,如果
几百几千行呢?所以说到这里,可见模块化编程几乎是所有大程序要做的,不然怎么修改?尤其是单片机这种灵活的语言。(建议有C语言基础的同学看)
先提前说说与模块化编程有关的关键字加上英文意思;
static(静止的)
extern(外部的)
typedef(类型定义)
#define(定义)
**********************************
#ifndef __**_H_ //如果有**.h文件,就。。。
#define __**_H_ //如果没有就寻找**.h文件
#endif //否则就结束
呵呵,先看看热热身 ,我们知道C语言有.c文件和.h文件,.c文件就是我们写的程序。.h文件呢是库文件,在写C语言程序的时候, #include“***.h”或include<***.h>,就是寻找库文件路径的意思,只是开始寻找的起点不同,
比如printf输出函数在stdio库里就有这个函数,我们只不过是拿来用而已,我想表达的是,库文件里面存了方便我们去写程序的函数(也是程序,不过以函数的形式打包来让我们用)
顺便说说code这个关键字吧,比如 int code arr[]={};意思是把这个 i 变量的所占用的空间放在ROM中,也就是只读存储器,这样动态数据就可以拥有更多的空间速度也快了CPU也轻松了。单片机的内存是很宝贵的,RAM的容量运比ROM的小,而RAM又与CPU挂钩,其实我们手机的性能好不好与RAM有很大关系,我们说的运行内存就是RAM,太专业的小编也不会,我们知道code可以节省单片机内存就知道了。
关键字这些与内存挂钩,C语言难也是难在内存上,我们掌握基本的用法来编C51就行不是吗,我这里是浅谈,
想深入了解static的点这个链接 https://blog.csdn.net/keyeagle/article/details/6708077
static 在程序中的作用是,当你在变量或函数面前加static后,表示该函数或变量就只能在这个C文件里用了,相当于一把锁来锁住它们。
想深入了解extern的点这个链接 https://www.cnblogs.com/Lunais/p/5991135.html
typedef和#define在两个宏定义很常用,以后还会专门为typedef搞个库方便调用,
比如现在要定义数据类型
可以这样 typedef int P;(加分号)
#define P int(不允许加任何符号)
在后面要用到int来定义变量时可以直接,P i=0(int i=0); 我们用宏定义给这个数据可惜起了一个新名字P;C51的大程序里用的很多;
typedef unsigned int uInt8; typedef unsigned char uChar16; 表示用uInt8新名字来代替unsigned int的类型
接下来开始模块化编程,想按照步骤试试一遍,首先建立一个文件夹
在里面
建立四个文件夹,c文件夹放.c文件,h文件夹放.h文件,main文件夹放main.c主函数文件,project文件夹放一些项目文件;
这样可能有点晕是吧,没事下面就懂了;打开keil软件新建项目
放在project文件夹里;取名pro,当然名字随便取的
之后开始建立才C和H文件,一个C文件对应一个H文件,
分别命名为delay.c delay.h led.h led.c main.c 存到之前建立的c和h main文件夹中。
main.c主C文件单独放在main文件夹中
全部保存效果是这样的
一个C文件对应一个h文件,名字一样,这样好找。现在可以先在C文件里编程,也可以先提前设置好一些东西,这个前后顺序是没关系的,我先设置吧
点这个;弹出
可以吧标号1看做是大的以个文件夹,标号2是子文件,编号3是子文件夹对应的C文件;名字随便取,这里我取的是这些名字,接下来是到入C文件
蓝底宽表示选中的目录下 导入,
接下来是同样的步骤导入对应的C文件,完成后点击OK
完成之后就是这样的以个布局效果;
问题来了,这么多的C文件,我们要把编译的路径告诉给软件,不然找不到H也就是库文件,之前不是模块化编程我们不用理路径,是应为软件自带了#include"reg52.h"这些了,而现在我们是要自己
造出#include“”这些,所以要给路径,
第三是设置晶振频率,和编写的程序的晶振频率一样,第四是勾选生存HEX文件
第五是搞路径的如图
在这个框点6,
点7建立 ×是删除
点7后有框出来点8添加文件夹上的H文件夹就可以了;然后一直OK;
编译后有两个警告是因为两个H文件夹没用,接下来编程;
还有就是特别注意,#include" **.h"这里的名字一定是和H文件夹的名字一样。
是的delayh文件书写格式是这样的;把函数名搞都里面;其实还要在void前面加extern的,但是keil5软件是默认前面已经加了,所以可加可不加;还有就是#ifndef后面加的这些__DELAY_H_ 红色部分是可以以随便起不与其它重复的名称的,但是不管起什么名都得和下面#define一样,
LED的C程序,引用了Delay_Ms函数;
所以接下来
在LED的H中包delay的库包含进来,那么现在#include“led.h中有几个库呢?有52的耶有delay的,
那写个主程序main编译后就直观了。
零错误警告
看到了吗,箭头的地方是那些h文件,是不是层层叠起来的,所以现在有点明白了这些格式的含义和模块化编程的强大了吗,
都练习几次,加深理解,还有学到这里读者可以去网上看看别的模块化程序,还有很多技巧笔者就不多说了,有了基础可以慢慢理解别人的的知识,然后
会做,最后形成自己的编程风格。
原文地址:https://www.cnblogs.com/hongjuedong/p/9214594.html