中断:
1.(P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志IE0(TCON.1)置1,向CPU申请中断
2.(P3.3)可由IT1(TCON.2)选择其为低电平有效还是下降沿有效。当CPU检测到P3.3引脚上出现有效的中断信号时,中断标志IE1(TCON.3)置1,向CPU申请中断
3.TF0(TCON.5),片内定时/计数器T0溢出中断请求标志。当定时/计数器T0发生溢出时,置位TF0,并向CPU申请中断
4.TF1(TCON.7),片内定时/计数器T1溢出中断请求标志。当定时/计数器T1发生溢出时,置位TF1,并向CPU申请中断
5.RI(SCON.0)或TI(SCON.1),串行口中断请求标志。当串行口接收完一帧串行数据时置位RI或当串行口发送完一帧串行数据时置位TI,向CPU申请中断。
6.CPU同时接收到几个中断时,首先响应优先级别最高的中断请求。正在进行的中断过程不能被新的同级或低优先级的中断请求所中断。正在进行的低优先级中断服务,能被高优先级中断请求所中断
为了实现上述后两条原则,中断系统内部设有两个用户不能寻址的优先级状态触发器。其中一个置1,表示正在响应高优先级的中断,它将阻断后来所有的中断请求;另一个置1,表示正在响应低优先级中断,它将阻断后来所有的低优先级中断请求
7.中断响应条件
中断源有中断请求;
此中断源的中断允许位为1;
CPU开中断(即EA=1)。
以上三条同时满足时,CPU才有可能响应中断
8.以外部中断0为例:
主程序中需要有以下代码:
EA=1;//打开总中断开关
EX0=1;//打开外部中断0
IT0=0/1;//设置外部中断的触发方式
中断服务函数:
void int0() interrupt 0
{
do anything that you want
}
9.中断中有两个很重要的寄存器:TCON 和 IE
int_0举例程序:K3每点击一次LED状态发生一次反转
#include <reg52.h>
sbit K3 = P3^2;
sbit LED0 = P2^0;
typedef unsigned char uint8_t;
void int0_init(void)
{
IT0 = 1; //配置下降沿触发中断,先配置中断的触发条件,然后再打开中断,最后开启CPU中断允许
EX0 = 1; //打开外部中断0
EA = 1; //CPU中断允许,总允许,允许CPU在运行的时候被中断打断
}
void delay(uint8_t i)
{
while (i--);
}
void int0_isr(void) interrupt 0
{
delay(1000);
if (0 == K3)
{
LED0 = ~LED0;
}
}
int main(void)
{
int0_init();
while (1);
return 0;
}
int0 和 int1同时工作的代码:
#include <reg52.h>
sbit K3 = P3^2;
sbit LED0 = P2^0;
sbit K4 = P3^3;
sbit LED1 = P2^1;
typedef unsigned char uint8_t;
void int0_init(void)
{
IT0 = 1; //配置下降沿触发中断,先配置中断的触发条件,然后再打开中断,最后开启CPU中断允许
EX0 = 1; //打开外部中断0
}
void ini1_init(void)
{
IT1 = 1;
EX1 = 1;
EA = 1; //CPU中断允许,总允许,允许CPU在运行的时候被中断打断
}
void delay(uint8_t i)
{
while (i--);
}
void int0_isr(void) interrupt 0
{
delay(1000);
if (0 == K3)
{
LED0 = ~LED0;
}
}
void int1_isr(void) interrupt 2
{
delay(1000);
if (0 == K4)
{
LED1 = ~LED1;
}
}
int main(void)
{
int0_init();
ini1_init();
while (1);
return 0;
}