扯会儿单片机开发:中断

前言

读到这篇,你最好已经有了一些基础知识单片机入门编程能力,接下来聊聊中断(Interrupt)。
用程序员的角度说,单片机的中断机制有点像面向对象中的事件,只不过单片机中的这些“事件”是由其他的部件引发。


什么是中断

简而言之,就是打断处理器且让其处理那个打断它的事件。就好像你在玩电脑,然后家里的暖壶响了,这时你会放下眼前的事,去厨房关火。水开了、壶响了就是中断的触发,关掉煤气灶就是中断要处理时的程序。当你关了火就可以继续回来做眼下的事情。中断也是这个道理。

操作系统中断

操作系统的发展过程,大体上就是一个想方设法不断提高资源利用率的过程,而提高资源利用率就需要在程序并未使用某种资源的时候,把它对那种资源的占有权释放掉,而这个行为,就需要通过中断实现。

从上述引段中可以看出,操作系统中的中断机制引入的初衷就是为了提高多道程序设计的资源利用率的。

单片机中断

在单片机中,换汤不换药,也主要是为了处理发生的中断事件而设定的


单片机开始运行后,会开始执行主程序中的代码,当遇到中断时,单片机就会暂停读取主程序代码,转而读取中断代码,当执行完中断代码后,继续手下的主程序代码。
大部分单片机并没有操作系统,比如笔者最近把玩的51系列。所以也谈不上他们会有多道程序设计,更不用说进程那些概念。因为单片机的大部分用途都是只运行单一一个程序就够了。


52单片机

说回到52单片机,也就是stc89c52或at89c52之类的。

类别

它有三种中断类型

类型 说明
外部中断 比较通用,外部中断引脚收到信号后发生中断
串口中断 串口RXD引脚收到信号后发生中断,往往是接受够一个字节后触发
定时器中断 每当定时器计数溢出后触发

共6个中断源,其中2个外部中断源,3个定时器中断源,1个串口中断源。这里仅仅讨论52单片机内的中断设置。

相关寄存器

中断涉及到两个寄存器,一个是中断允许寄存器(IE,Interrupt Enablement),另一个是中断优先级寄存器(IP,Interrupt Priority)。
中断允许寄存器(IE)
各中断源的开关,字节地址:A8H(reg52.h中已定义sfr IE = 0xA8;),可以位寻址(A8H~AFH),复位时全部清零。

位序号 位地址 位符号 说明
D7 AFH EA 全局中断允许位,就像电闸上总闸,是所有开启任何中断的前提,若关闭,则关闭所有中断。
D6 这一位为空,无用。
D5 ADH ET2 定时器2中断允许位,若打开则允许定时器2溢出后引发中断。
D4 ACH ES 串口中断允许位,若打开则允许RXD引脚接受到1个字节的信息后引发中断。
D3 ABH ET1 定时器1中断允许位,若打开则允许定时器1溢出后引发中断。
D2 AAH EX1 外部中断1中断允许位,若打开则允许外部中断引脚接收信号后引发中断。
D1 A9H ET0 定时器0中断允许位,若打开则允许定时器0溢出后引发中断。
D0 A8H EX0 外部中断0中断允许位,若打开则允许外部中断引脚接收信号后引发中断。

以上全部位的值为1是打开,0是关。
中断优先寄存器(IP)
用于设定各中断源的优先级,字节地址B8H(reg52.h中已定义sfr IP = 0xB8;),可以位寻址(B8H~BFH),复位时全部清零。

位序号 位地址 位符号 说明
D7 这一位为空,无用。
D6 这一位为空,无用。
D5 这一位为空,无用。
D4 BCH PS 串口中断优先级控制位。
D3 BBH PT1 定时器1中断优先级控制位。
D2 BAH PX1 外部中断1优先级控制位。
D1 B9H PT0 定时器0中断优先级控制位。
D0 B8H PX0 外部中断0优先级控制位。

以上各位值为1时为高优先级,0位低优先级。
52单片机中,供用户设置的有两种优先级,高与低。他们遵循以下三条规则:

1.低优先级中断源可被高优先级中断源中断,高优先级中断源不能被任何中断源中断。
2.一种不论高低的中断源一旦得到响应,与之同级的中断源不可中断它。
3.当同时收到几个同优先级的中断源时,响应优先级按其默认中断级别执行。

各中断源默认中断级别及中断序号

中断源 默认中断级别 序号(C语言)
外部中断0 1st 0
定时器0中断 2nd 1
外部中断2 3rd 2
定时器1中断 4th 3
串口中断 5th 4
定时器2中断 6th 5

参考文献

1.《51单片机C语言教程》,郭天祥 著,电子工业出版社
2.《操作系统联考复习指导》,王道论坛 组编,电子工业出版社
3.《现代操作系统》,Andrew S. Tanenbaum 著,机械工业出版社
4.单片机中断的IE和IP寄存器,电工学习网