正文
Keil C51大工程建立,模块化编程
刚学习单片机的时候,接触的一般都是些简单的例子,只有一个
.c
文件和一个
.h
,所有的函数都写在
.c
文件里,但是往往实际中遇到的都是比较大的工程项目,在建立大工程的时候为了能够更方便清晰的去写代码、修改代码,通常会使代码模块化,即将实现不同功能的函数独立出来,单独写在一个文件中。下面开始讲解怎么去模块化编程。
假设,我们做一个按键流水灯实验,按下K1键流水灯从右往左依次亮灭,按下K2流水灯从左往右依次亮灭。
在不使用模块化编程的情况下,程序全部都写在
main.c
这个C文件里:
#include <reg52.h>
#include <intrins.h>
#define LED P2
sbit k1=P3^0;
sbit k2=P3^1;
typedef unsigned int u16;
typedef unsigned char u8;
void delay(int i)
{
while(i--);
}
void ledr()
{
u16 n;
LED=0x7f;
delay(50000);
for(n=0;n<8;n++)
{
LED=_cror_(LED,1);
delay(50000);
}
}
void ledl()
{
u16 n;
LED=0xfe;
delay(50000);
for(n=0;n<8;n++)
{
LED=_crol_(LED,1);
delay(50000);
}
}
void key()
{
if(k1==0)
{
delay(1000);
if(k1==0)
{
ledr();
}
}
if(k2==0)
{
delay(1000);
if(k2==0)
{
ledl();
}
}
}
void main()
{
while(1)
{
key();
}
}
从上面可以看出如果所有程序都写在
main.c
文件里的话遇到代码量大,复杂的系统时,可读性就会变差。而模块化编程可以解决这个问题,我们可以把上述的例子分别独立成
led.c
,
key.c
,
main.c
三个文件,然后通过在
main.c
中包含
led
和
key
所对应的头文件
.h
文件,就可以在
main.c
中调用两个模块中的函数,使整个工程看起来更加的明了。
下面我们介绍如何模块化编程。
首先我们新建两个文件夹,
User
跟
HARDWARE
,在
HARDWARE
文件夹目录下创建两个子文件夹
LED
和
KEY
然后,我们新建一个Keil工程
保存到文件夹
User
中。接着新建四个文本,并分别保存为
led.c
,
led.h
和
key.c
,
key.h
另存到
HARDWARE
文件夹下的子文件夹
LED
和
KEY
文件夹中
同理,新建一个文本保存为
main.c
另存到
User
文件夹中
然后,我们在KEIL工程下面新建一个源组,命名为
HARDWARE
,另一个源组命名为
User
.
源组建立完,我们把3个
.c
文件文本分别添加到源组当中
然后我们要进行很重要的一步操作
要把
led.c
跟
key.c
文件所在的
文件夹
添加到路径当中。
点开魔术棒
点开C51目录下的包含文件路径。
注意
添加文件夹时,是添加 .c 文件所在的文件夹即可.如下所示
点击确定即可。
然后我们就可以开始模块化的程序编写了。
首先,我们写一个led流水灯模块的程序。我们先编写
led.h
这个头文件,在头文件中声明我们所需要用到的延时函数,左流水灯函数跟右流水灯函数,程序如下:
#ifndef __LED_H_
#define __LED_H_
#define LED P2
typedef unsigned char u8;
typedef unsigned int u16;
void ledr();
void ledl();
void delay(int i);
#endif
然后我们编写
led.c
在文件中,我们要包含
led.h
这个头文件。
#include <reg52.h>
#include <led.h>
#include <intrins.h>
void delay(int i)
{
while(i--);
}
void ledr()
{
u16 n;
LED=0x7f;
delay(50000);
for(n=0;n<8;n++)
{
LED=_cror_(LED,1);
delay(50000);
}
}
void ledl()
{
u16 n;
LED=0xfe;
delay(50000);
for(n=0;n<8;n++)
{
LED=_crol_(LED,1);
delay(50000);
}
}
同理,我们编写
key.h
跟
key.c
#ifndef __KEY_H_
#define __KEY_H_
sbit k1=P3^0;
sbit k2=P3^1;
void key();
#endif
***注意,因为我们要在 key.c 文件中调用 led.c 中的函数 ledr 跟 ledl,因此我们要在 key.c 的头文件中包含 led.h ***
#include <reg52.h>
#include <key.h>
#include <led.h>
void key()
{
if(k1==0)
{
delay(1000);
if(k1==0)
{
ledr();
}
}
if(k2==0)
{
delay(1000);
if(k2==0)
{
ledl();
}
}
}
这样,我们将两个模块的程序已经编写完成了。最后,我们只需要要在
main.c
中调用两个模块中的函数就可以方便的完成主程序的编写了。
与上一步相同的是,我们也要在头文件中包含
led.h
跟
key.h
#include <reg52.h>
#include <led.h>
#include <key.h>
#include <intrins.h>
void main()
{
while(1)
{
key();
}
}
最后点击编译