51单片机自定义头文件教程

51单片机自定义头文件教程

一、概念解释

1. 头文件是什么

你可以把写代码想象成建造一座大房子。代码里的各种函数和变量就像是房子里的不同部件,比如门窗、家具等。而头文件呢,就像是一份房子的设计图纸,它告诉我们这些部件都放在哪里,长什么样,该怎么用。在单片机编程里,头文件能帮我们快速找到和使用一些函数和变量,避免重复编写相同的代码。

2. 自定义头文件的作用

有时候,我们在建造房子的时候,会有一些特殊的部件,是通用的设计图纸里没有的。这时候,我们就需要自己画一份专门的图纸,这就是自定义头文件。在单片机编程中,当我们有一些常用的函数,想要在不同的代码文件里都能方便地使用时,就可以把这些函数的声明写在自定义头文件里。这样,我们在其他代码文件里只需要“引用”这个头文件,就可以使用里面声明的函数了,就像拿着自己画的特殊图纸,在不同的房子里都能安装特殊部件一样。

3. 防止头文件重复包含

在建造房子的时候,如果我们不小心把同一份图纸用了好几次,可能会导致房子里出现重复的部件,造成混乱。在编程里,如果同一个头文件被重复包含,也会出现问题,比如函数重复定义等错误。为了避免这种情况,我们会在头文件里加上一些特殊的“标记”,就像在图纸上做个记号,告诉我们这张图纸已经用过了,不要再重复用。在代码里,就是用 #ifndef#define#endif 这些指令来实现的。

二、程序功能概述

这次我们要实现的程序就像是一场灯光秀,有 LED 的跑马灯和数码管的跑马灯。想象有一排 LED 灯和一排数码管,它们就像两排小士兵,会按照一定的顺序依次点亮,就像小士兵们依次向前踏步,这就是跑马灯效果。

三、代码详细解释

1. main.c 文件

#include "reg52.h"
#include "absacc.h"
#include "LMDELAY.h"

int i=0;

void main()
{
    XBYTE[0xa000]=0x00;
    while(1)
    {
        for(i=0;i<8;i++)
        {
            Delay10ms();
            Delay10ms();
            Delay10ms();
            Delay10ms();
            XBYTE[0x8000]=(0x01<<i); 
        } 

        for(i=0;i<8;i++)
        {
            Delay10ms();
            Delay10ms();
            Delay10ms();
            Delay10ms();
            XBYTE[0xc000]=0x01<<i; 
            XBYTE[0xe000]=0x00;
        } 
    }
}
  • #include "reg52.h"#include "absacc.h"#include "LMDELAY.h":这就像是我们在建造房子的时候,从不同的地方拿来设计图纸。reg52.habsacc.h 是单片机自带的图纸,里面有单片机一些基本功能和特殊访问方式的说明。而 LMDELAY.h 是我们自己画的图纸,里面有一个叫 Delay10ms 的函数的说明。
  • int i=0;:这里的 i 就像是我们的小助手,它会帮助我们记录一些信息,在后面的循环里,它会从 0 变到 7,就像小助手在依次报数。
  • XBYTE[0xa000]=0x00;:这就像是我们在房子里的一个特定位置放了一个东西,XBYTE 可以让我们访问一些特殊的地址,就像用特殊的钥匙打开房子里一些隐藏的房间。
  • while(1):这是一个无限循环,就像一个永不停歇的旋转木马,程序会一直在这个循环里运行,不断实现跑马灯效果。
  • 第一个 for 循环:在这个循环里,我们多次调用 Delay10ms 函数,这个函数就像一个小闹钟,会让程序暂停一段时间。然后通过 XBYTE[0x8000]=(0x01< 来控制 LED 灯的亮灭,实现 LED 跑马灯效果。
  • 第二个 for 循环:同样多次调用 Delay10ms 函数,XBYTE[0xc000]=0x01< 控制数码管的显示,让数码管依次点亮,XBYTE[0xe000]=0x00; 可能是对数码管的一些其他控制,比如消隐等。

2. LMDELAY.h 文件

#ifndef LMDELAY
#define LMDELAY

void Delay10ms();

#endif
  • #ifndef LMDELAY:这就像是我们在检查图纸上有没有做过“这张图纸已经用过”的记号。如果没有这个记号,就继续往下看。
  • #define LMDELAY:这就是我们在图纸上做的记号,表示这张图纸已经用过了。
  • void Delay10ms();:这是我们在图纸上写下的一个特殊部件的说明,告诉我们有一个叫 Delay10ms 的函数,但具体怎么实现没有写在这里。
  • #endif:这表示记号的范围结束了。

3. LMDEALAY.c 文件

void Delay10ms()        //@11.0592MHz
{
    unsigned char i, j;

    i = 108;
    j = 145;
    do
    {
        while (--j);
    } while (--i);
}

这个文件就像是我们按照图纸上的说明,把特殊部件真正做出来的地方。Delay10ms 函数在这里实现了具体的功能,它会让程序暂停一段时间,就像小闹钟一样。

四、逻辑图

开始
|
|-- 包含头文件:reg52.h、absacc.h、LMDELAY.h
|
|-- 定义变量 i = 0
|
|-- 初始化:XBYTE[0xa000]=0x00
|
|-- 进入无限循环 while(1)
|   |
|   |-- LED 跑马灯循环 for(i=0;i<8;i++)
|   |   |
|   |   |-- 多次调用延时函数 Delay10ms()
|   |   |
|   |   |-- 设置 XBYTE[0x8000]=(0x01<

通过以上的解释,相信你对 51 单片机自定义头文件和这个跑马灯程序有了更清晰的理解,快去试试让你的 LED 灯和数码管动起来吧!

你可能感兴趣的:(51单片机,嵌入式硬件,单片机,蓝桥杯)