专栏名称: Cy丶
目录
相关文章推荐
哲学园  ·  “政治正确”的政治正确:言论霸权的悖论 ·  4 小时前  
哲学王  ·  我们为什么会误判美国和特朗普? ·  3 天前  
51好读  ›  专栏  ›  Cy丶

Keil C51大工程建立,模块化编程

Cy丶  · CSDN  ·  · 2019-10-28 20:15

正文

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();
  }
}

最后点击编译
在这里插入图片描述