中断系统与按键中断

如何实时检测随机事情的发生?

通常有查询和中断两种方法。因为无论事件是否发生,都必须去查询,所以使用查询的方式会很浪费资源。而中断是当事情发生时,如果允许中断发生,则打断正在执行的程序,因此中断能快速响应。

中断系统结构

STC89C52具有6个中断源,可实现两级中断嵌套。
中断系统与按键中断_第1张图片

符号 名称 触发条件 说明
INT0 外部中断0 低电平或下降沿触发 P3.2口
INT1 外部中断1 低电平或下降沿触发 P3.3口
T0 定时器/计数器0中断 计数器0溢出回0引起 中断请求标志:TF0
T1 定时器/计数器1中断 计数器1溢出回0引起 中断请求标志:TF1
T2 定时器/计数器2中断 计数器2溢出回0引起 中断请求标志:TF2 ;捕捉中断
TI/RI 串行口中断 发送/接收完一个串行数据 标志位:TI、RI

中断请求标志寄存器

6个中断请求标志分别锁存在TCON 、SCON和T2CON中;

TCON寄存器

中断系统与按键中断_第2张图片

名称 说明
IT0 当IT0=0时,外部中断0为电平触发方式;IT0=1时,为边沿触发方式(下降沿有效)。
IE0 当外部中断0 触发时,置1;转入中断服务程序时,由硬件清0
IT1 当IT1=0时,外部中断1为电平触发方式;IT1=1时,为边沿触发方式(下降沿有效)。
IE1 当外部中断1 触发时,置1;转入中断服务程序时,由硬件清0
TF0 定时器/计数器T0的溢出中断时,由硬件使TF0置“1” ;转入中断服务程序时,由硬件清0
TF1 定时器/计数器T1的溢出中断时,由硬件使TF1置“1” ;转入中断服务程序时,由硬件清0
TR0 定时器/计数器T0的控制运行位;
TR1 定时器/计数器T1的控制运行位;

中断允许寄存器IE

中断系统与按键中断_第3张图片

  • EA=0时,所有的中断请求被屏蔽;
  • EA=1时,允许中断,相当于总开关打开;
  • ET2=0,禁止定时器/计数器T2溢出中断。
  • ET2=1,允许定时器/计数器T2溢出中断。
  • ES=0,禁止串行口中断。
  • ES=1,允许串行口中断。
  • ET1=0,禁止定时器/计数器T1溢出中断。
  • ET1=1,允许定时器/计数器T1溢出中断。
  • EX1=0,禁止外部中断1中断。
  • EX1=1,允许外部中断1中断。
  • ET0=0,禁止定时器/计数器T0溢出中断。
  • ET0=1,允许定时器/计数器T0溢出中断。
  • EX0=0,禁止外部中断0中断。
  • EX0=1,允许外部中断0中断。

总结:在EA=1时,某位设置为1,则允许该中断发生。

中断优先级寄存器IP

中断系统与按键中断_第4张图片

  1. PT2—定时器T2中断优先级控制位
  2. PS—串行口中断优先级控制位
  3. PT1—定时器T1中断优先级控制位
  4. PX1—外部中断1中断优先级控制位
  5. PT0—定时器T0中断优先级控制位
  6. PX0—外部中断0中断优先级控制位

1:高优先级; 0:低优先级

  1. 低优先级可被高优先级中断,高优先级不能被低优先级中断
  2. 任何一种中断一旦得到响应,不会再被它的同级中断源所中断
  3. 在同时收到几个同优先级的中断请求时,哪一个中断请求能优先得到响应,取决于内部的查询顺序。同级中,外部中断0的优先级最高中断系统与按键中断_第5张图片

如何配置外部中断

1.设置TCON,确定触发方式,电平触发or下降沿
2. IE寄存器中的中断总允许位EA=1,并配置IE确定中断源
3. 设置中断优先级寄存器IP,可以没有这步
4. 编写中断服务子程序,处理中断请求

外部中断0服务函数
void INT0()interrupt 0 using 1
{
xxx
}

名称 说明
interrupt 0 外部中断0
interrupt 1 定时器中断0
interrupt 2 外部中断1
interrupt 3 定时器中断1
interrupt 4 串行口中断
interrupt 5 定时器中断2

using 0 是第0组寄存器;
using 1 是第1组寄存器;
using 2 是第2组寄存器;
using 3 是第3组寄存器;
这个的作用不太明白,但是一般情况下不需要考虑这个,也不需要写上

外部中断0程序

  • 程序现象:按键控制LED灯状态取反
  • 程序说明:LED连接在P2^0;按键连接在P3.2口且按键按下为低电平;
#include 

sbit Led0=P2^0;
sbit Key=P3^2;

typedef unsigned int u16;


void delay(unsigned int del) 	//10ms * del
{
	unsigned int i,j;
	for(i=0; i

你可能感兴趣的:(51单片机)