1.中断是什么就不多说了,中断有外部中断,定时器中断,串口中断;
2.中断寄存器:
中断允许寄存器IE与中断优先级寄存器IP
EA;总中断允许位 ; EA=1;才允许打开总中断,若EA=0,其它中断无效
EX0:外部中断0允许位; 置1允许外部中断 置0不允许外部中断
ET0:定时/计数器T0中断允许位 置1允许定时器\计数器中断 置0 不允许打开中断
ES;串口中断允许位 置1允许串行口中断 置0不允许串行口中断
中断控制系统结构:可见配置中断要依次打开(即置1)外设(定时器 T0/1,串口TX/RX,外部中断INT0/1)对应的中断标志位IE/TF——总中断位EA——对应优先级PT/PX(程序如果只有一个中断可以不配置)
如初始化外部中断INT0:
void int0_init()
{
EA=1;//打开总中断
ET0=1;//开启外部中断
PX0=1;//设置优先级
}
3.中断服务函数
格式:中断服务函数不带参数,中断号是下表中断源的序号
void 函数名()interrupt 中断号
{
执行语句;
}
不同外设的中断函数如下:
4.使用外部中断控制
举个简单的例子:用外部中断震动传感器实现点灯
#include <REGX52.H>
#include <INTRINS.H>
sbit led=P0^0;
sbit shake=P3^2; //p3^2是外部中断INT0引脚
void Delay500ms() //用stc软件生成的延时函数
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 22;
j = 3;
k = 227;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void init()
{
EA=1;//打开总中断;
EX0=1;//打开外部定时器INT0;
IT0=0;//设置外部低电平触发方式 IT0是定时器控制寄存器TCON的 IT0=0表示低电平有效
}
void main()
{
init();
}
void Int0_Routine(void) interrupt 0 //外部中断服务函数
{
led=1;
Delay500ms();
led=0;
Delay500ms();
}