什么是中断?对于初学者来说,中断这个概念比较抽象,其实单片机的处理系统与人的一般思维有着许多相似之处,在日常生活和工作中有很多类似的情况。中断是为使单片机能够对外部或内部随机发生的事件实时应对处理而设置的,中断功能的存在,很大程度上提高了单片机处理外部或内部事件的能力。它也是单片机最重要的功能之一,是学习单片机必须掌握的。
为了让读者更好地理解中断概念,现举例说明:你在家看电视,突然听见门铃响了,此时,你应该中止看电视,去开门,是收电费的,付钱完了之后,回来继续看电视。这个简单的过程实际上就是一次中断。
中断是指单片机在执行当前的操作时,由于外部或内部种种原因,使得单片机不得不停止当前的操作,转而去执行相应的处理程序,等处理完后,再回来继续执行被中止的原程序的过程。
我们再来看刚才的事例,与51单片机结合起来分析:你的任务是看电视,门铃响是中断申请,这一时刻相当于断点处,你响应中断去开门,然后付钱,这实际上就是处理中断程序,付钱完成后再回来继续看电视,相当于处理完中断程序后再返回主程序继续执行主程序。需要注意的是,门铃响是随机的,但是一旦响了,你就要立即去处理,处理完后继续接着看电视。单片机在执行程序时,中断也随时可能发生,只要发生,单片机将立即中止当前的程序,马上处理中断程序,处理完中断程序后再返回刚才被中止处继续执行原来的程序。
中断源是指引起单片机中断的根源。中断源向CPU提出中断请求,CPU暂时中断原来的程序,转去处理中断程序,处理完后,再回到原来被中断的地方(断点),为中断返回。
在实际的单片机系统中,可能存在多个中断源,而且中断申请也是随机的,有时可能会有多个中断源同时提出中断申请,但是CPU一次只能响应一个中断源发出的中断申请,那么CPU到底要响应哪个中断申请?这就需要用软件或硬件按中断源的轻重缓急来处理,给它们编顺序,也就是优先级。中断优先级越高,则响应优先权越高。当CPU正在执行中断服务程序时,又有中断优先级更高的中断申请产生,那么CPU就会暂停当前的中断服务程序转而去处理高级中断申请,等高级中断程序处理完毕再返回原中断程序断点处继续执行,这一过程称为嵌套。
中断优先级是根据中断优先级寄存器来决定的,当两个中断同时出现时,如果没有人为操作优先级寄存器,单片机会按照默认的优先级自动处理。
51单片机一共有5个中断源,它们的符号、名称及产生的条件分别解释如下:
0—外部中断0,由P3.2端口引入,下降沿或低电平触发。
1—外部中断1,由P3.3端口引入,下降沿或低电平触发。
T0—定时器/计数器0中断,由T0计数器计满后溢出引起。
T1—定时器/计数器1中断,由T1计数器计满后溢出引起。
串行口—串行口中断,当发送/接收一帧数据后引起。
单片机是如何判断哪个中断源引起的中断呢?因为单片机只能认识地址,根据地址来判断,每个中断源的入口地址是不一样的,采用C语言编写程序,给每个中断源分配一个序号就能知道是哪个中断源。中断源序号见表2.1。
表2.1 中断源序号
中断允许寄存器用来设定各个中断源的打开和关闭,特殊功能寄存器IE的地址为A8H,该寄存器可以位寻址,如表2.2所示。
表2.2
EA—总中断开关。EA=1,打开总中断;EA=0,禁止总中断。
ET2—定时器/计数器2允许中断。ET2=1,定时器/计数器2允许中断;ET2=0,禁止中断。
ES—串行口允许中断。ES=1,允许串行口中断;ES=0,禁止中断。
ET1—定时器/计数器1允许中断。ET1=1,定时器/计数器1允许中断;ET1=0,禁止中断。
EX1—外部中断1允许中断。EX1=1,允许中断;EX1=0,禁止中断。
ET0—定时器/计数器0允许中断。ET0=1,定时器/计数器0允许中断;ET 0=0,禁止中断。
EX0—外部中断0允许中断。EX0=1,允许中断;EX0=0,禁止中断。
中断优先级寄存器IP的地址为D8H,也可以位寻址。定义如表2.3所示。
表2.3
PT2—定时器/计数器2中断优先级控制位。
PT2=1,定时器/计数器2中断定义为高优先级中断。
PT2=0,定时器/计数器2中断定义为低优先级中断。
PS—串行口中断优先级控制位。
PS=1,串行口中断定义为高优先级中断。
PS=0,串行口中断定义为低优先级中断。
PT1—定时器/计数器1中断优先级控制位。
PT1=1,定时器/计数器1中断定义为高优先级中断。
PT1=0,定时器/计数器1中断定义为低优先级中断。
PX1—外部中断1中断优先级控制位。
PX1=1,外部中断1中断定义为高优先级中断。
PX1=0,外部中断1中断定义为低优先级中断。
PT0—定时器/计数器0中断优先级控制位。
PT0=1,定时器/计数器0中断定义为高优先级中断。
PT1=0,定时器/计数器0中断定义为低优先级中断。
PX0—外部中断0中断优先级控制位。
PX0=1,外部中断0中断定义为高优先级中断。
PX0=0,外部中断0中断定义为低优先级中断。