概念:
CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断 。
(P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时,中断标志IE0(TCON.1)置1,向CPU申请中断。
低电平有效:P3.2=0时中断;
下降沿有效:从高电平跳变为低电平时中断;
优先级:
中断源:
中断源符号 | 名称 | 中断引起原因 | 中断号 |
/INT0 | 外部中断0 | P3.2引脚低电平或下降沿信号 | 0 |
T0 | 定时器0中断 | 定时/计数器0计数回0溢出 | 1 |
/INT1 | 外部中断1 | P3.3引脚低电平或下降沿信号 | 2 |
T1 | 定时器1中断 | 定时/计数器1计数回0溢出 | 3 |
TI/RI | 串行口中断 | 串行通信完成一帧数据发送或接收引起中断 | 4 |
中断响应条件:1、中断源有中断请求;2、此中断源的中断允许位为1;3、CPU开中断(即EA=1)。
外部中断0程序:
EA=1;//打开总中断开关
EX0=1;//开外部中断0
IT0=0/1;//设置外部中断的触发方式
void int0 () interrupt 0 using 1
{
}
void:中断是无返回值得;
int0是命名随便写(只要不是关键词);
interrupt:表示现在用的是中断函数(必须加上);0 :中断号;
using:寄存器(可不加);1:哪个寄存器;
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit led0=P0^0;
unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
unsigned char code smg_we[]={0x08,0x18,0x28,0x38,0x48,0x58,0x68,0x78};
//************************************************
//延时函数,在12MHz的晶振频率下
//大约50us的延时
//************************************************
void delay_50us(uint t)
{
uchar j;
for(;t>0;t--)
for(j=19;j>0;j--);
}
//************************************************
//延时函数,在12MHz的晶振频率下
//大约50ms的延时
//************************************************
void delay_50ms(uint t)
{
uint j;
for(;t>0;t--)
for(j=6245;j>0;j--);
}
void main()
{
uchar i;
EA=1; //开总中断开关
EX0=1; //打开外部中断0开关
IT0=1; //触发方式设置(下降沿)
while(1)
{
for(i=0;i<10;i++)
{
P1=smg_du[i];
delay_50ms(10);
}
}
}
void int0 () interrupt 0
{
led0=0;
delay_50ms(20);
led0=1;
}