一、中断的概念
中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。
二、51单片机的三种中断
51单片机的三种中断:
- 外部中断(INT)
- 定时器中断(T)
- 串口中断(RXD TXD)
中断配置的流程如下:
三、中断配置的思路
四、外部中断和定时器中断的配置过程
1、外部中断(以INT0为例)
(1)寄存器配置:
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)配置代码
TMOD= 0x01;
ET0=1;
EA=1;
TR0=1;
TH0=..
TL0=...
(3)中断服务函数
void T0() interrupt 1
{
}
参考上面的表格