多文件编程可以大大提高程序代码移植率,避免程序看起来臃肿复杂
以流水灯为例
我们需要创建三个文件 led.c led.h main.c
led.c文件编写
#include "led.h" // 这里包含 led.h 这个头文件
sbit ADDR0 = P2^0;
sbit ADDR1 = P2^1;
sbit ADDR2 = P2^2;
sbit ENLED = P1^1;
unsigned char cnt = 0; //定义计数变量 cnt,用于移位控制
void delay690ms() //@12.000MHz,延时约0.5s
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 32;
j = 119;
k = 85;
do
{
do
{
while (--k);
}
while (--j);
}
while (--i);
}
void led_move()
{
ENLED = 0;
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;
P0 = ~(0x01 << cnt); //P0 等于 1 左移 cnt 位,控制 8 个 LED
delay690ms(); //软件延时,约0.5s
cnt++; //移位计数变量自加 1
if (cnt > 7) //移位计数超过 7 后,再重新从 0 开始
{
cnt = 0;
}
}
led.h文件编写
#ifndef LED_H //理解为 if not define led.h
#define LED_H //如果没有定义 led.h ,这里就定义一个 led.h
#include "reg52.h" //由于 led,c 里面要用到 51单片机寄存器 P1,
// 所以这里包含 51 单片机的头文件
#include "intrins.h" // 循环移位用到
#define uchar unsigned char
#define uint unsigned int // 这些宏定义都可以在头文件 .h 里定义
void delay690ms();
void led_move(); // 将led.c 里的函数在led.h 里面申明
#endif // 定义结束
main.c文件编写
#include "led.h" //在 main.c 里现在包含的也是 led.h 而不是 reg52.h了
void main()
{
while (1) //主循环,程序无限循环执行该循环体语句
{
led_move();
}
}
注意一点
1、此时void led_move(); 是可以调用void delay690ms();函数的
2、cnt变量必须定义在led_move外,不然程序每次进入led_move就会重新定义为0,无法实现以为循环功能