一、中断的概念

中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。

二、51单片机的三种中断

51单片机的三种中断:

  • 外部中断(INT)
  • 定时器中断(T)
  • 串口中断(RXD TXD)

中断配置的流程如下:

三、中断配置的思路

四、外部中断和定时器中断的配置过程

1、外部中断(以INT0为例)

(1)寄存器配置:

1
2
3
IT0=0;//配置外部中断的触发方式。0-低电平触发,1-下降沿触发
EX0=1;//开启外部中断0
EA=1;//开启cpu中断

(2)中断服务函数编写

每个中断都有其中断名与中断号,参考下图


所以外部中断0的中断服务函数为:

void int0() interrupt 0
{

}

2、定时器中断

(1)寄存器配置

TMOD

选择定时器0的不同工作模式,不同的工作模式下定时器的位数不同。详细的请查阅数据手册。特别注意的是8位定时器的那个模式下还有自动重载功能,这意味着不需要在程序里编写中断对定时器的值进行重载,比较方便。定时器的位数决定了对定时的精度,位数越高,定时精度也就越高。

  • ET:定时器 T中断允许

  • EA:CPU中断允许

  • TR:定时器开启

TH、TL(定时器初值配置) :

假设定时器工作在方式1(TMOD=0x01), 则位数是16位,最大值就是65536。 定时器一旦启动, 便在原来的数值上开始加1计数.。如果程序开始时, 我们没有设置THn和TLn, 则它们的默认值为0。 假设时钟频率为12MHz, 因为定时器设定在1T模式下,所以1个时钟周期为一个机器周期, 那么此时机器周期就是十二分之一us,一个毫秒就需要12000个脉冲。计数如果要满THn和TLn 就需要:计数最大值-1; 再来一个脉冲, 计数器就会溢出, 随即向CPU申请中断.。因此溢出共需要5461.33us, 约等5.46ms

例如要定时1ms, 那么就要先给THn和TLn装初值. THn和TLn中应该装入的总数是65536 – 12000= 53536; THn = 53536 / 256 =209 ; TLn = 53536 % 256 = 32,然后各自转化为16进制即可。 在这个初值的基础上计数12000个数(1ms)后就溢出, 此时刚好就是1ms中断一次。即1Khz。这仅仅是PCA时钟源频率,换算为PWM频率为:

特别要注意的是,溢出后定时器值就清零了,所以要在中断中重载定时器的初值。

上面的两条计算公式归纳起来计算如下:


定时器配置还可以用STC公司的软件进行快速配置:

AUXR

(2)配置代码

1
2
3
4
5
6
TMOD= 0x01;
ET0=1;
EA=1;
TR0=1;
TH0=..
TL0=...

(3)中断服务函数

1
2
3
4
void T0() interrupt 1
{

}

参考上面的表格