SCI论文(www.lunwensci.com):
摘 要: 中断功能是 51 系列单片机实现多任务的技术基础,模块化编程是实际复杂单片机系统编程中经常采用的方法。 本文介绍和演示了单片机 C 语言模块化编程方式下中断响应函数的处理方法。
关键词:单片机;模块化编程; 中断响应
Modular Programming Method of Single Chip Microcomputer with Interrupt Response
CAO Dean
(The Open University of Guangdong(Guangdong Polytechnic Institute), Guangzhou Guangdong 510091)
【Abstract】: The interrupt function is the technical basis for the 51 series single-chip microcomputer to achieve multitasking. Modular programming is a method often used in the programming of actual complex single-chip microcomputer systems. This article introduces and demonstrates the processing method of interrupt response function under the C language modular programming mode of single-chip microcomputer.
【Key words】: microcontroller;modular programming;interrupt response
0 引言
模块化编程是指在进行程序设计时, 按照“高内聚、 低耦合”的原则,将一个大程序按照功能划分为若干小 程序模块,每个小程序模块由一个 .c 文件和一个 .h 文 件的组成。主函数(main() 函数)若要调用某个模块 中的函数,只需将对应 .c 文件添加到工程中,并在主 程序文件(包含 main() 函数的 .c 文件) 中包含这些模 块的头文件。在模块化编程方法中,主函数文件比较简 洁,可读性强。模块化编程可以非常方便的使用一些程 序模块来组建自己的具体程序, 如 I2C 协议函数、矩阵 键盘扫描函数、1602 液晶驱动函数、DS18B20 温度传感 器驱动函数等,模块化编程提高了代码的重用率。如果 不用模块化编程方式,而是把这些函数及相关代码都写 到主函数文件中,将会降低程序文件的可读性和可维护性。在程序设计中,当程序比较小或者功能比较简单的 时候,一般没必要采用模块化编程,但是,当程序功能 复杂、涉及的资源较多、代码比较长的时候,模块化编 程就能体现它的优越性了。
文献 [1-3] 介绍了模块化编程方法及操作细节,文献 [4]主要介绍了单片机模块化编程的优点。至于单片机模块 化编程方法中,中断函数的处理问题以上文献都没有提 到。一般教材中 [5] ,如果涉及到模块化编程内容的介绍, 对于中断响应函数的处理也仅仅只是放在主函数文件 中。本文将通过简单实例,介绍和演示单片机 c 语言模 块化编程方式下中断响应函数的处理方法。

1 含中断响应的单片机模块化编程方法
中断指的是允许正常运行的程序被某些紧急事件 所打断的机制,有了中断, CPU 可以专心运行主程序, 同时又不会错过某些重要事件。51 单片机的中断源有 外部中断、定时器中断、串口中断。当单片机开启了中 断允许,并且检测到了相关的中断请求标志位被置位, 单片机将自动跳转到对应的地址开始执行程序代码,或 者说是自动去执行对应的中断响应函数,这就是中断响应函数不需要 main() 函数调用的原因。因此,我们看 到中断响应函数是写在 main() 函数之外,也没有被任 何其他函数调用。
由于中断响应函数主要用来处理一些简单的任务, 如改变某个变量的值,因此代码一般不太长,这种情况下,即使将中断响应函数放在主函数文件中,对其可读性也没什么影响。尽管如此,但是中断响应函数是否能象其他普通函数一样保存在别的 .c 文件中从而使得主函数文件更加简洁? 我们通过实验发现, keil 集成开发环境下确实是可以这样处理的。中断响应函数可以单独放在某个 .c 文件中,或者作为某个 .c 文件的一部分。对于多个中断响应的情况,除了上述特点外,多个中断响应函数还可以同时放在一个 .c 文件中。因此,模块化编程方式中,中断响应函数保存在哪个文件文件完全是由用户确定的,并不是一定要放在主程序文件中。
2 含中断响应的单片机模块化编程实例
2.1 单个中断响应函数情况
单个中断响应案例:在 proteus 中的仿真电路如下图 1 所示, 发光二极管 D1 正端连接电源, 负端通过电阻 R1 接到 51 单片机的 P3.0 引脚。通过编程使 D1 亮1 秒,熄灭 1 秒…,不断闪烁。程序设计思路:采用定时计数器 0 工作方式 1,计时时长 1ms。定时计数器计满溢出,进入中断服务程序,若计满 1s,则将 P3.0 引脚电平取反。图 2,图 3 分别是 keil c 中对应的主函数文件,以及中断响应函数的 .c 文件。这里中断响应函数单独占一个文件,该文件中除了中断响应函数,没有别的自定义函数。

从以上 keil 开发环境的截图可以看到,中断响应函 数所在的 T0_interrupt.c 文件要添加到工程当中,主 函数文件不需要对中断响应函数 void T0_interrupt() interrupt 1 声明。另外,这里中断函数后面省略了using n 修饰符,增加的话结果也一样是正确的。
为了测试中断服务程序可以保存在其他 .c 文件中, 这里将定时器计数器 0 中断初始化相关的代码组成一 个无参函数 initial(), 并将这个函数保存在 interrupt. c 中, 定时计数器 0 的中断响应函数也保存在这个文件 中。图 4,图 5 分别为对应的主函数文件及包含中断响 应函数的文件。
为了节省篇幅,图 5 中将中断初始化函数、中断 响应函数“折叠”了。从以上 keil 开发环境的截图可 以看到,中断响应函数既可以象前面介绍的单独作为一 个 .c 文件存放,也可以放在某个 .c 文件的中,单片机系统总是能找到这个中断响应函数,与存放的 .c 文件的名称无关, 只与中断响应函数名称 void T0_interrupt()interrupt 1 相关。从这里也可以看到,如果把中断初始化及中断响应函数保存在同一 .c 文件中,更能体现模块化编程思想中的“高内聚、低耦合”的原则和特点。
2.2 多个中断响应函数情况
这里以两个中断响应函数情况进行实验: 仿真电 路如图 6,该图是在图 1 的基础上增加了单片机 P3.1, P3.2 引脚的连接电路。通过编程使 D1 亮 1 秒,熄灭 1 秒…,不断闪烁;D2 的亮灭由开关 S1 控制,即每按一次 S1, D2 的状态改变一次。程序设计思路:D1 亮 灭的控制与图 1 中相同;开关 S1 状态的检测采用外部 中断 0 的方式, 当按键被按下引起外部中断 0 的中断请 求,在中断响应程序中改变 P3.1 引脚电平状态,从而 改变 D2 亮灭状态。
这里给出两个中断响应函数和一个其他函数保存在 一个 .c 文件的情况,如图 7 所示,其中 delay.c 是考虑 按键抖动的延时子程序。图中将两个中断响应函数以及delay() 函数“折叠”了。至于每个中断服务程序单独 占一个 .c 文件或者保存在其他文件 .c 文件中等情况都 进行了测试,其结果也都是正确的。
3 结论
通过以上实验可以看出,在单片机的模块化编程方 式中,不管是单个还是多个中断响应函数,中断响应函 数可以写在主函数文件中,也可以保存在其他 .c 文件 中。中断响应函数不写在主函数文件中,而是根据实际 需要放在其他某个 .c 文件中,能使模块化更彻底,主 函数文件更加简洁。
参考文献
[1] 华玉明.51单片机C语言模块化多文件编程方法探讨[J].吉林 广播电视大学学报,2014(10):11-12.
[2] 曹琼.单片机编程模块化设计[J].安徽电子信息职业技术学 院学报,2017(3):51-53+63.
[3] 李宗瑛,陈晓娥,罗康.基于51单片机的老人防跌倒报警器的 模块化编程方法[J].科学技术创新,2019(5):94-95.
[4] 周彦明,齐保谦,覃溪.论模块化编程技术在单片机实训中的 应用[J].数字技术与应用,2016(8):3+6.
[5] 宋雪松,李冬明,崔长胜.手把手教你学51单片机C语言版[M]. 北京:清华大学出版社,2014.
关注SCI论文创作发表,寻求SCI论文修改润色、SCI论文代发表等服务支撑,请锁定SCI论文网!
文章出自SCI论文网转载请注明出处:https://www.lunwensci.com/jisuanjilunwen/34285.html