单片机模块化编程的原则

时间:2023-03-04作者:佚名
目前我们在学习和开发单片机时广泛采用 c 语言进行编程,当我们开发的单片机项目较小时,或者我们所写的练习程序很小时,我们总是习惯于将所有代码编写在同一个 c 文件下,由于程序代码量较少,通常为几十行或者上百行, 此时这种操作是可行方便的, 也没有什么问题。但如果要开发的项目较大,代码量上千行或者上万行甚至更大,如果你还继续将所有代码全部编写在仅有的一个 c 文件下, 这种方式的弊病会凸显出来, 它会给代码调试、更改及后期维护都会带来极大的不便。试想一下,当你尝试着从几千几万行代码中定位到某一位置或者去寻找某一错误点,上下拉动巨长的滚动条慢慢地、一点点地浏览整个 c 文件, 是件多么令人眼花缭乱,头昏脑胀的事。 模块化编程可解决这个问题,我们只要根据实际需要使用模块化编程的思维将具有不同功能的程序封装在不同模块中,将各个不同模块存放在不同的 c 文件中。 模块化编程后的程序不但使整体的程序功能结构清晰明了,同时也提高程序代码的利用率,有些模块代码我们可以直接进行移植或者经简单修改就可另作他用,好比封装好的函数。
那么什么是模块化呢?首先我们来简单来聊聊模块概念,我们可能听说过电源模块,通信模块,这些是硬件模块,它们都提供一些接口,譬如电源模块会有输出额定电压电流的接口,通信模块可能提供了RS232、 USB等接口。那么对软件来说模块是怎样的呢?软件里的模块跟硬件模块类似,抽象地说就像一个黑盒子,盒子内部细节我们可以不予理会,我们只关心盒子给我们提供什么东西,即提供了什么接口,利用这些接口我们能实现什么功能。
我们把相对独立,具有独立功能用代码编写在一个 c 文件下,把需要对外的函数或变量进行声明供外部使用, 把不需要的细节尽可能对外部屏蔽起来,这就是软件模块化编程的思维。
这样不同的模块占用不同 c 文件,一个个 c 文件将整个项目串接起来实现所有的功能。

单片机模块化编程的原则
1. 模块化编程的原则:
模块化编程通常要遵循以下几个原则:
每一个 c 文件对应一个同名的 h 头文件
一个 h 文件伴随相应 c 文件存在, 头文件是为了声明对外公开的接口。如果一个 c 文件不需要对外公布任何接口,则其就不应当存在,除非它是程序的入口,如 main 函数所在的文件,同时 main 函数所在文件可以没有对应的头文件。 如有一个 LED.c,那应该同时制作一个 led.h 头文件。 ? 头文件中适合放置接口的声明,不适合放置实现
头文件是模块的对外的接口,供外部程序调用。头文件中应放置对外部的声明,如对外提供的函数声明、宏定义、变量类型声明等。 函数的实现、变量的赋值、语句的操作等决不能放在头文件中。因为头文件的功能是向外提供接口,譬如函数,变量,具体如何实现是在 c 文件中进行,头文件仅是进行了描述声明。
任意一个 c 文件只要使用了其他 c 文件提供的接口, 都要同时包含其对应的头文件,每个 c 文件应该头文件自包含
任意一个 c 文件只要使用了其他 c 文件提供的接口, 都要将其对应的头文件包含到该 c文件中,没有使用到其他 c 文件的接口就不应该将其匹配的头文件包含,并且每个 c 文件都应该包含自己的头文件。
防止头文件被重复包含
避免一个头文件被重复包含,通常使用条件编译命令#ifndef--#endif,如下示例:
示例 1:
#ifndefTIME_H#defineTIME_H……#endif
示例 2:
#ifndefLED_H#defineLED_H……#endif
其中#define FILENAME_H 为基本格式, FILENAME_H 为头文件名称,但要全部使用大写形式,使用单下划线后紧跟一个 H 表明是头文件。 不要在宏名最前面加上“ _“或“ __” ,即使用 FILENAME_H 代替_FILENAME_H_, 因为一般以”_“和” __”开头的标识符为系统保留或者标准库使用。
2. 模块化编程实例
我们使用 AT89C52 单片机,在编程软件 keil 环境下实施一个工程,来说明模块化编程具体操作的方法和步骤。例子要实现的功能:和 P1 相连的 8 个 LED 灯每 500ms 亮灭交替闪烁,通过串口将数字 0-9 发送给单片机并显示在一个数码管上。 LED 闪烁的时间使用定时器 0 中断方式来控制, T0 每 50ms 溢出产生中断,定义一个计数器,每次 T0 中断就计数一次,累计计数 10 次,那么时长为 500ms,作为 LED 闪烁时间间隔。 单片机的时钟为11.0592MHz。那么使用模块化编程的方法, 整个项目将会有如下表中的文件。
表 1 工程文件清单
C 文件H 头文件描述main.c无Main 文件可以没有对应的头文件TImer0.cTImer0.h定时器 0 定时 50ms 中断led.cled.hLed 闪烁实现uart.cuart.h串口通信配置实现digitron.cdigitron.h数码管显示
2.1创建工程步骤
2.1.1新建工程文件目录
新建工程文件目录(如 test),在工程目录下创建 Project、 Source、 Output、 LisTIng 和Readme 这 5 个文件夹,并在文件夹 Readme 下创建 Readme.txt 文件。 这样做的目的是为
了增强工程文件的可读性及结构化,便于维护和管理。
? Project 存放工程文件
? Source 存放用户编写的 c 文件及 h 头文件
? Output 存放各种输出文件,如 hex 文件
? Listing 存放编译过程中产生的各种中间文件
? Readme 存放工程项目的说明文件
2.1.2创建keil工程
( 1) 启动软件 Keil μVision, 点击工具栏上的 Project,选择 NewμVision Project,新建 test工程到目录 Project 下。
( 2) 选择目标器件,点击“ OK”确认。
( 3) 出现是否添加启动文件到工程中对话框,选择否。
( 4) 目标选项设置, 点击 target option 工具进入选项配置界面。
( 5) 选中 Target 项,根据实际情况设置晶振频率。本例子频率为 11.0592MHz。
( 6) 选中 output 选项,点击“ Select Folder for Objects…”选择工程目录下的 Output 文件夹, 将“ Create HEX File”勾选中。
( 7) 选中 Listing 选项,点击“ Select Folder for Listings…”选择工程目录下的 Listing 文件夹。
( 8) 最后点击“ OK”保存各选项的设置,至此完成 Target Option 的配置。
( 9)新建 5 个文件,以 c 为后缀名保存到工程目录的 Source 文件下,并分别命名为 main.c、led.c、 uart.c、 timer0.c 和 digitron.c。右击“ Source Group1”选择“ Add Existing Flies to Group‘Source Group1’”,将以上新建的 5 个文件添加到工程中。
(10) 至此,就完成整个 keil 工程的创建。

相关阅读

为什么模拟量输入信号采用4-20mA而不是0-20mA电流信号

使用4-20mA电流信号而不是0-20mA电流信号的原因有以下几点: 零点偏移和故障检测:使用4-20mA信号可以提供一个可以检测和纠正零点偏移的参考点,即当传感器输出为0时,电流信号应该...
2023-04-04
为什么模拟量输入信号采用4-20mA而不是0-20mA电流信号

三相异步电动机的转动原理图

有关三相异步电动机的转动原理,介绍了旋转磁场的产生、旋转磁场的旋转方向、旋转磁场的极对数、旋转磁场的转速,电动机的转动原理与转差率等知识,有需要的朋友参考下。 三相...
2023-06-26
三相异步电动机的转动原理图

零地电压过高的形成和解决办法(零地电压多少为正常)

常用的TN-S系统(也就是原来的已相五线是把工作零线N和地线P严格分开的排电杂统,用户零统在一般情况下是不分年再次祖的。,而电将出的远近决定了零线的长锤在零线都面钚不变的情...
2023-05-16
零地电压过高的形成和解决办法(零地电压多少为正常)

三极管推挽电路的基础知识

推挽电路,有人也叫图腾柱电路。图腾柱我没理解这个名字是怎么来的,但是“推挽”就比较形象了。 英文里叫push-push。这里先说这里 推和挽 针对的是电流,而不是电压。 电路由NP...
2023-04-29
三极管推挽电路的基础知识

伺服电机的调试步骤

1、初始化参数 在接线之前,先初始化参数。 在控制卡上:选好控制方式;将PID参数清零;让控制卡上电时默认使能信号关闭;将此状态保存,确保控制卡再次上电时即为此状态。 在伺...
2023-03-21

热销商品

连发瓦斯枪通用瓦斯射钉钢钉枪瓦斯气体高强度瓦斯射钉枪165气罐

连发瓦斯枪是一款专为高强度瓦斯射钉设计的工具,其特点在于能够连续发射瓦斯气体,适用于多种需要快速穿透和固定材料的场景。这款瓦斯枪配备了165气罐,容量足够满足...
4.5

黄铜镀镍金属电缆防水接头EWM密封格兰头HSM电线固定填料函M20M16

黄铜镀镍金属电缆防水接头EWM密封格兰头(HSM型)是一款高性能电线固定与密封装置,适用于M16和M20螺纹规格。采用优质黄铜材质并表面镀镍处理,具备优异的防腐蚀性、机械...
1.14

消防配件二氧化碳灭火器2 3 5 7KG弯头喷管24Kg干冰CO2外喷头喷嘴

二氧化碳灭火器配件中的2357KG弯头喷管与24Kg干冰CO₂外喷头喷嘴,是专业消防设备的重要组成部分。该弯头喷管采用高强度耐腐蚀材料制造,连接灵活,适用于高压CO₂灭火...
4.5

雷士照明led筒灯孔灯客厅吊顶天花灯嵌入式过道筒灯射灯桶灯家用

雷士照明LED筒灯是一款专为现代家居设计的嵌入式照明产品,适用于客厅、吊顶、过道、卧室等空间。采用高品质LED光源,光线柔和均匀,显色指数高,有效还原真实色彩,营造舒...
5.78

雷士照明嵌入式防眩筒灯射灯窄边过道灯深杯客厅无主灯天花灯米雪

雷士照明嵌入式防眩筒灯射灯——“米雪”系列,专为现代无主灯设计打造。采用窄边深杯结构,有效控制杂散光,实现精准防眩,营造舒适柔和的光环境。适用于客厅、过道、天...
25.67

网站栏目