05节-51单片机-模块化编程

1.两种编程方式的对比

传统方式编程:

所有的函数均放在main.c里,若使用的模块比较多,则一个文件内会有很多的代码,不利于代码的组织和管理,而且很影响编程者的思路

模块化编程:

把各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数的声明,其它.c文件想使用其中的代码时,只需要#include "XXX.h"文件即可。使用模块化编程可极大的提高代码的可阅读性、可维护性、可移植性等

2.模块化程序结构

要将Delay延时函数进行模块化,我们需要建立一个.c文件和.h文件,分别用于存放函数原型和函数声明。

注意事项:

.c文件:函数、变量的定义

.h文件:可被外部调用的函数、变量的声明

任何自定义的变量、函数在调用前必须有定义或声明(同一个.c)

使用到的自定义函数的.c文件必须添加到工程参与编译

使用到的.h文件必须要放在编译器可寻找到的地方(工程文件夹根目录、安装目录、自定义)

.h文件的存放位置:

情况1:和工程文件不在同一目录,则需要如图中所示位置,进行配置.h文件的路径:

情况2:和工程文件在同一目录,使用即可,为了方便查看,可以添加显示到keil中,如不添加也无妨。

这样我们在该处可以看到创建好的.h文件了,并在可方便的打开进行编辑

3.C预编译

C语言的预编译以#开头,作用是在真正的编译开始之前,对代码做一些处理(预编译)
此外还有#ifdef,#if,#else,#elif,#undef等

4.实战

将上一节中的数码管显示,进行模块化

首先,新建Delay.c文件

Delay.c

c 复制代码
void Delay(int ms)	//@12.000MHz
{
	unsigned char data i, j;
	while(ms--){
	i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i);
}
}

然后,使用同样的方式建立Delay.h文件,并将.h文件添加到该处,

并编写如下代码:

Delay.h

c 复制代码
#ifndef __DELAY_H__
#define __DELAY_H__
unsigned char Delay(int ms);
#endif

同理处理Nixie函数,模块化为Nixie.c和Nixie.h

Nixie.c

c 复制代码
#include <REGX52.H>  //该文件中需要用到P2,P0,所以需要包含

void Nixie(unsigned char Location,unsigned char Number)
{
	unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77F,0x7C,0x39,0x5E,0x79,0x71,0x00};
	switch(Location)
	{
		case 1:  P2_2=1;P2_3=1;P2_4=1;break;
		case 2:  P2_2=0;P2_3=1;P2_4=1;break;
		case 3:  P2_2=1;P2_3=0;P2_4=1;break;
		case 4:  P2_2=0;P2_3=0;P2_4=1;break;
		case 5:  P2_2=1;P2_3=1;P2_4=0;break;
		case 6:  P2_2=0;P2_3=1;P2_4=0;break;
		case 7:  P2_2=1;P2_3=0;P2_4=0;break;
		case 8:  P2_2=0;P2_3=0;P2_4=0;break;
	}
	P0=NixieTable[Number];
}

Nixie.h

c 复制代码
#ifndef __NIXIE_H__
#define __NIXIE_H__
void Nixie(unsigned char Location,unsigned char Number);
#endif

main.c

其中< >的表示从keil安装目录寻找.h

" "则表示从当前目录寻找

使用<>:这种方式用于包含标准库文件或者编译器提供的头文件,编译器会在标准库路径或者编译器指定的路径下查找这些头文件。

例如:#include <REGX52.H>,REGX52.H应该是一个标准库或者编译器提供的头文件,编译器会在标准库路径或者编译器指定的路径下查找并包含该文件。

使用"":这种方式用于包含用户自定义的头文件或者当前目录下的头文件,编译器会首先在当前目录下查找这些头文件,如果找不到才会到标准库路径或者编译器指定的路径下查找。

c 复制代码
#include <REGX52.H>
#include "Delay.h"
#include "Nixie.h"
void main()
{
	while(1)
	{
		Nixie(1,1);
		Delay(1000); //
		Nixie(2,2);
		Delay(1000);
		Nixie(3,3);
		Delay(1000);
		Nixie(4,4);
		Delay(1000);
		Nixie(5,5);
		Delay(1000);
		Nixie(6,6);
		Delay(1000);
		Nixie(7,7);
		Delay(1000);
		Nixie(8,8);
		Delay(1000);
	}
}

补充:字体问题

在keil中编写代码,可能出现中文乱码等问题,因此需要改变编码格式:

通常采用的是UTF-8编码方式。

相关推荐
想放学的刺客8 分钟前
单片机嵌入式试题(第25)嵌入式系统可靠性设计与外设驱动异常处理
stm32·单片机·嵌入式硬件·mcu·物联网
wotaifuzao10 分钟前
STM32+FreeRTOS 长期可维护架构设计(事件驱动篇)-- 告别“屎山”代码
c语言·stm32·嵌入式硬件·freertos·状态机·事件驱动·嵌入式架构
淘晶驰AK14 分钟前
大学如何自学嵌入式开发?
单片机·嵌入式硬件
yantaohk22 分钟前
【2025亲测】中兴B860AV3.2M完美刷机包ATV版本安卓9-解决1G运存BUG,开ADB已ROOT
android·嵌入式硬件·adb·云计算
一路往蓝-Anbo1 小时前
第 1 篇:对象池模式 (Object Pool) —— 裸机下的动态内存革命
jvm·数据库·stm32·单片机·嵌入式硬件·网络协议·tcp/ip
飞凌嵌入式1 小时前
1块集成了4核Cortex-A7高性能CPU、1颗RISC-V MCU、多种高速总线、还兼容树莓派的T153低成本开发板
linux·arm开发·嵌入式硬件·risc-v
大神与小汪2 小时前
STM32WB55蓝牙广播数据
stm32·单片机·嵌入式硬件
Funing74 小时前
BUCK降压电路如何同时兼顾效率和纹波?——12V 转 3.3V 供电的工程解法
嵌入式硬件·电路·开关电源·buck降压
秋深枫叶红4 小时前
嵌入式第五十一篇——IMX6ULL中断和EPIT定时器
单片机·嵌入式硬件
麦托团子4 小时前
51单片机学习笔记13-AT24C02(I2C)
51单片机