一般来说,51单片机有5个中断源(忽略定时/计数器2),分2个优先级,这个5个中断源按照自然优先级从高到低依次为:
外部中断0:INT0 ——中断号:0
定时/计数器0:TF0 ——中断号:1
外部中断1:INT1 ——中断号:2
定时/计数器1:TF1 ——中断号:3
串口中断:RI/TI ——中断号:4
在CT107D单片机综合训练平台,使用独立按键,由原理图可知,S5按键接到P32/INT0,S4按键接到P33/INT1。
编程实现,函数working()使L1闪烁,使用外部中断功能,按键S5按下会点亮L8并闪烁,一段时间过后熄灭,L1继续闪烁。
#include <STC15F2K60S2.H>
#include <intrins.h>
void Delay1000ms();
void RINT0();
void selectHC(unsigned char select);
void working();
void service();
sbit beer=P0^6;
sbit L1=P0^0;
sbit L8=P0^7;
int bag=0; //中断标志位,中断响应时候置1,再有相应的函数去执行
void main()
{
selectHC(5);
beer=0; P2=P2&0x1f;P0=0xff;
RINT0();
while(1)
{
working();
service();
}
}
//L1闪烁工作函数
void working()
{
selectHC(4);
L1=0;
Delay1000ms();
L1=1;
Delay1000ms();
}
//外部中断0初始化函数
void RINT0()
{
IT0=0;
EX0=1;
EA=1;
}
//中断服务函数
void serviceINT0() interrupt 0
{
bag=1; //外部中断尽量让里面指向的内容少一点,优化代码
}
void service()
{
if(bag==1)
{
L8=0;
Delay1000ms();
L8=1;
Delay1000ms();
}
}
//寄存器选择函数
void selectHC(unsigned char select)
{
switch(select)
{
case 4:P2=(P2&0x1f)|0x80; break; //选择LED灯 寄存器
case 5:P2=(P2&0x1f)|0xA0; break; //选择蜂鸣器,继电器
case 6:P2=(P2&0x1f)|0xC0; break; //选择数码管位选
case 7:P2=(P2&0x1f)|0xE0; break; //选择数码管段选
}
}
//延时函数
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 43;
j = 6;
k = 203;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}