本文介绍中断(interrupt)的基本概念,并演示定时器中断、外部中断的使用方法。如果同学们对文章内容有疑问,或发现文中有任何不妥之处,请在页面末尾评论区留言,我会及时回复并订正。
中断
设想你在电脑上进行简单的 C 程序开发。你的程序只能按顺序运行,没有任何东西可以阻挡它。这看起来似乎没有什么问题,但是在单片机上,你有时会有一些特殊的需求。比如,你可能会需要快速响应外部的事件,或者你想定时执行某个任务。这时,你需要使用“中断”。
中断的含义
“中断”是指在内部 / 外部事件产生时,暂停主程序,转而执行用户定义的中断处理程序(Interrupt Service Routing,通常为一个函数)。当中断处理程序完毕后,返回继续主程序。中断产生时,单片机会将主程序的执行上下文保存到内存中,待中断处理程序结束后,单片机会恢复主程序的上下文,仿佛它从未被中断一样。
中断让单片机可以即时相应各类事件,而无需在主程序中一直检查事件是否发生。
中断事件的种类
在 51 单片机中,“内部事件”一般为定时器事件,“外部事件”一般为外部中断(引脚电平改变引起的中断)或串口中断(串口收到数据引起的中断)。
51 单片机只有 5 个中断,interrupt 0 – 4,它们的功能如下:
- interrupt 0:外部中断 0;
- interrupt 1:定时器中断 0;
- interrupt 2:外部中断 1;
- interrupt 3:定时器中断 1;
- interrupt 4:串行口中断;
其它种类的单片机平台可能存在种类更丰富的中断。
C51 语言中对中断的处理
在 C51 语言中, 可以通过 interrupt 关键字将某个函数声明为中断处理程序:
// 定时器中断 0 处理函数 void isr_timer_0(void) interrupt 1 { } // 外部中断 0 处理函数 void isr_ext_0(void) interrupt 0 { }
将函数声明为中断处理程序后,在中断被触发时,就会执行相应的函数。
C51 语言中还有 using 关键字,用于指定中断处理函数使用的寄存器组。一般无需使用这个关键字。
8051 定时器
在开发程序时,我们可能需要定期 / 延迟执行某项任务,或者需要计量时间间隔。这时,我们需要使用 8051 定时器。每个 8051 单片机都带有两个定时器(T0 和 T1),它们分别独立工作。
基本原理
每个 8051 单片机都有一个基准时钟(通常为 12MHz),在较新的 STC 系列单片机上,这个时钟是单片机内部产生的。将基准时钟 12 分频,就得到机器周期(1MHz)。
每个 8051 定时器都有大小可配置(8-bit / 13-bit / 16-bit)的数值寄存器。当其启用时,每经过一个机器周期,定时器会将其数值寄存器的数值增加 1。通过读取数值寄存器的值,就可以计算出经过的时间。
在非自装载模式下,数值寄存器的二进制位全为 1 时,其无法被递增,发生溢出,此时数值寄存器停止递增,系统设置溢出标志位。在自装载模式下,发生溢出时,系统会自动重置数值寄存器为设定值。
用户可以控制定时器中断开关。如果中断开关处于打开模式,则每次溢出时,相应定时器的中断处理程序会被触发。如果需要每间隔一个周期就执行某项任务,就可以使用定时器中断。
定时器还可被用作脉冲计数器。在脉冲计数器模式下,数值寄存器的递增不由机器周期控制,而由外部脉冲控制。外部的一次脉冲,寄存器的数值增加 1。
工作模式
8051 定时器有 4 种工作模式,其中两个定时器都可以使用前 3 个模式:
- 模式 0 13-bit 手动装载模式(M1 = 0,M0 = 0)
- 模式 1 16-bit 手动装载模式(M1 = 0,M0 = 1)
- 模式 2 8-bit 自动装载模式(M1 = 1,M0 = 0)
- 模式 3 独立定时器模式(M1 = 1,M0 = 1,仅 T0 能用这种模式,且当 T0 工作于这种模式时,T1 可工作于模式 0, 1, 2,但此时 T1 的中断标志被 T0 占用,T1 不能使用中断控制)
在模式 0 和模式 1 下,单片机分别采用 13-bit 的计数器(最大值 8191)和 16-bit 的计数器(最大值 65535),并且当计数器溢出时,它们不会重新装载。在模式 2 下,由于计数器太小,手动重新装载计数器会带来较大误差,所以系统会自动重新装载计数器。模式 3 的用途较少,此处暂时略过。
控制方式
TCON 寄存器
定时器的工作状态由 TCON 寄存器来判断 / 控制。其中 6、7 位控制定时器 1,4、5 位控制定时器 0。各位的含义如下:
- TF:溢出状态指示。在手动装载模式下,当定时器的数值寄存器溢出时,该位被置为 1,定时器暂停。
- TR:使能控制。TR = 1,定时器运行;TR = 0,定时器停止。
- IE:中断控制。IE = 1,在数值寄存器溢出时触发相应定时器中断;IE = 0,不会触发中断。
- IT:中断触发方式。此位仅对计数器模式有效,对定时器模式无效。IT = 0,使用电平触发方式;IT = 1,使用边沿触发方式。
TMOD 寄存器
定时器的工作模式由 TMOD 寄存器来控制,其中高 4 位控制定时器 1,低 4 位控制定时器 0。TMOD 每位(由高到低)的含义如下:
- Gate:定时器使能控制模式。Gate = 1 时,定时器使能由 TRx 和硬件引脚(INTx)共同控制,只有外部引脚为高且 TRx 为 1 时,定时器才会工作;Gate = 0 时,定时器使能仅由 TRx 控制,TRx 为 1 时,定时器工作。
- C / T (Counter / Timer):定时器 / 计数器模式选择。C / T = 0 时,工作在定时器模式,数值寄存器受机器周期控制;C / T = 1 时,工作在计数器模式,数值寄存器受外部引脚控制。
- M1、M0:工作模式选择,见“工作模式”节。
数值寄存器
每个定时器均有两个 8-bit 的数值寄存器(TLx 和 THx),通过读取这些寄存器,可以获得定时器。
- 模式 0 13-bit 的数值被存储在 TH 的 8 位和 TL 的较低 5 位中。
- 模式 1 16-bit 的数值被存储在 TH 和 TL 中。
- 模式 2 TL 作为 8 位数值寄存器,TH 存储计数初值。当计数溢出时,自动将 TH 中存储的数值送入 TL,使 TL 从这一初值开始重新计数。TH 的值始终不变。
代码解析
在实际项目中,我们一般使用定时器进行标志位重设及刷新数码管。
(未完待续)
本作品使用基于以下许可授权:Creative Commons Attribution-ShareAlike 4.0 International License.