中断源:是指引起中断的原因或者设备。
MCS-51单片机设置了5个中断源,其中内部有3个中断源,包括定时/计数器T0、T1和片内串口,外部有两个中断请求输入,当系统产生中断时,5个中断源的中断请求标志分别由特殊功能寄存器TCON和SCON的相应位来锁存。
既能控制定时计数器T0、T1,又能锁存外部中断请求标志和定时计数器T0、T1的溢出中断标志,具有双重功能,相关位的定义如下:
TF0:定时计数器T0溢出标志。
TF1:定时计数器T1溢出标志。
定时计数器T0、T1启动后,当计数产生溢出时,硬件自动置位TF0、TF1标志,并请求中断,CPU响应中断后,这两个标志位既可通过软件清除,也可通过硬件自动清除。
IE1:外部中断1请求标志。
IE0:外部中断0请求标志。
由CPU检测外部中断请求,当输入信号有效触发后,硬件自动置位IE0,IE1标志,并请求中断,CPU响应中断后,这两个标志位被硬件自动清除。
IT0:外部中断0触发方式选择位。
IT1:外部中断1触发方式选择位。
可用程序控制为0或1,当该位为0,外部中断为电平触发方式,即低电平有效;当该位为1,外部中断为边沿触发方式,即下降沿有效。
既是串行口控制寄存器,当串行口发生中断请求时,SCON低两位又能锁存其发送中断和接收中断,具有双重功能,其相关位的定义如下:
T1:串行口发送中断标志。
当CPU向串行口的发送数据缓冲器SBUF写入一个数据或字符时,发送器就开始发送,当发完一帧数据后,硬件自动置位TI标志,表示串口正在向CPU发送中断请求,请求发送下一帧数据,该标志必须由软件进行清0.
RI:串行口接收中断标志
若串行口接收器允许接收,当接收器接收到一帧数据后,硬件自动置位RI标志,表示串口接收器正在向CPU发送中断请求,使CPU读取接收数据缓冲器中的数据,该标志必须由软件进行清0。
中断系统:单片机中用于管理各类中断的逻辑。
中断的优点:
1、分时操作:中断系统解决了CPU的快速运行与慢速外设、定时计数器及串口之间的“定时”矛盾,这样CPU在运行主程序的同时可以令定时器、串口及其他外设同时工作,当出现中断后,CPU响应中断,停止主程序的运行,转入执行中断服务程序,使CPU高效而有序的工作。
2、实时处理:中断系统使CPU能及时处理实时控制系统中的许多随机参数和信息,它们能在任何时候向CPU发出中断请求,要求转向中断程序,CPU会对变化的现场信息进行及时响应,使CPU具有随机应变和实时处理能力。
3、故障处理:中断系统还可以使CPU处理系统中出现的故障,从而不必进行人工干预或停机,提高了系统的稳定性和可靠性。
中断系统的功能主要包括以下几点:
1、中断的打开与关闭:
2、中断响应(有一个中断优先级的问题)
中断优先级:
简单点说就是当同时来了多个中断的时候,CPU必须判断哪些中断的优先级比较高,因为一些中断会导致系统功能无法实现甚至故障,自然优先级就高,CPU必须先处理。
所以我们需要对特殊功能寄存器IE编程,用来选择允许或禁止哪些中断,然后可以通过中断优先级寄存器IP进行编程,定义被允许中断的优先级。
EA: CPU总中断允许位,为0时,禁止所有中断;为1时允许中断。
*ET2:MCS-52系列单片机中T2中断允许位,为0禁止中断;
ES:串行口中断允许位,为0时,禁止串行口中断;
ET1:定时/计数器T1中断允许位,为0时,禁止中断;
EX1: 外部中断1中断允许位,为0时,禁止中断;
ET0: 定时/计数器T0中断允许位,为0时,禁止中断;
EX0:外部中断0中断允许位,为0时,禁止中断。
PT2:定时/计数器T2优先级设定,为0时,T2设定为低优先级;为1时,T2设定为高优先级。
PS:串行口优先级设定,为0时,串行口设定为低优先级;为1时,串行口设定为高优先;
PT1:定时/计数器T1优先级设定,为0时,T1设定为低优先级
PX1:外部中断1优先级设定,为0时,外部中断1设定为低优先级;
PT0:定时/计数器T0优先级设定,为0时,设为低优先级;
PX0:外部中断0优先级设定,为0时,设为低优先级。
1、对于一个正在执行的低级中断服务程序,可以被高级中断请求所打断,但不能被同等优先级的中断请求所中断。
2、一个正在执行的高级中断服务程序,不能被任何中断请求所中断,只有在执行完此高级中断服务程序后,返回主程序再执行一条指令才能响应新的中断请求。
MCS-51单片机中只设置有两个优先级,必然会出现几个中断源处于同等的优先级状态,当CPU同时接收到几个同等优先级中断请求时,按照内部硬件查询逻辑,按照自然优先顺序来查询,优先顺序由高到低为:外部中断0->定时/计数器0->外部中断1->定时计数器1->串行口->定时计数器2.
51单片机在每个机器周期都顺序查询每一个中断源,若接收到中断请求,将在紧跟着的下一个机器周期执行该中断,但是在遇到一些情况时中断会暂时受阻。
1、外部中断源端口引脚:外部中断0,端口引脚为12(P3^2),引脚符号为INTO^
外部中断1:端口引脚13(P3^3),引脚符号为INT1^
2、外部中断请求方式:负边沿触发,使控制位IT0=1即可;
低电平触发,使控制位IT1=0即可
#include
typedef unsigned int u16;
typedef unsigned char u8;
sbit key = P3^2;
sbit led = P1^0;
void delay(u16 num)
{
u16 x ,y;
for(x=num; x>0; --x)
for(y=110; y>0; --y)
{
; // 延时1ms
}
}
int main(void)
{
TCON |= 0x01; //设置外部中断0触发方式为边沿触发方式
IE = 0X81; //开放总中断并且外部中断0允许中断
while(1)
{
;
}
}
void ext_int0(void) interrupt 0
{
delay(10);
if(key == 0)
{
led =~led;
}
while(!key);
}