基本功能:使L1指示灯不断闪烁,将P32引脚定义成外部中断功能,按下S5按键就会点亮L8指示灯,延时一段较长的时间后熄灭
以上为我们需要用到的模块,我们使用独立按键,需要用盖帽将J5的2,3短接,即连接中间和右边的排针
1.51单片机的中断系统
一般来说,51单片机有5个中断源(忽略定时/计数器2),分2个优先级,这个5个中断源按照自然优先级从高到低依次为:
外部中断0:INT0 interrupt 0
定时/计数器0:TF0 interrupt 1
外部中断1:INT1 interrupt 2
定时/计数器1:TF1 interrupt 3
串口中断:RI/TI interrupt 4
2.中断相关的寄存器
中断相关的寄存器有4个,每个寄存器都是可以位寻址的,这该编程带来了方便。 其中2个为控制寄存器:IE寄存器与IP寄存器:
如果比作我们的房子,EA相当于总电闸,其他ES,ET1,EX1,ET0,EX0相当于每个房间的电闸。我们把EX0当作我们自己的房间,如果要使用我们自己房间的电,那么既需要打开总电闸,又需要打开自己房间的电闸EX0,即
EA=1;
EX0=1;
另外2个为中断请求标志:TCON寄存器与SCON寄存器:
3.关于中断服务函数程序的编写
一般情况下,中断的处理函数有两个,其一为中断初始化函数,其二为中断服务函数。初始化函数就是一个普通的函数,而中断服务函数却有特殊的格式要求:
<1> 中断函数没有返回值,也不能带参数。
<2> 函数名后面要跟一个关键字interrupt,说明这是一个中断服务函数。
<3> 在关键字interrupt后面要跟上中断号,说明这个中断服务函数是为那个中断服务的。
中断服务函数的格式为:
void 函数名() interrupt 中断号
{ ----函数体---- }
我们要利用定时器0来进行间隔定时,中断程序架构我们C语言可以这样写:
了解了51单片机的中断系统,那么我们可以开始编写基本功能
首先我们需要将P32引脚定义成外部中断功能,根据原理图,我们看到P32连接的是INT0,即外部中断0,我们要使用外部中断0,就要使用初始化函数和中断服务函数。
void Init_INT0()
{
IT0 = 1;//下降沿触发
EX0 = 1;//打开外部中断0
EA = 1;//打开总中断
}
void ServiceINT0() interrupt 0
{
//当触发外部中断0,会执行此函数
}
明白以上的代码之后,我们就能很轻松地完成基本功能了,以下是代码
#include "reg52.h"
sbit L1 = P0^0;
sbit L8 = P0^7;
void Delay(unsigned int t)
{
while(t--);
while(t--);
while(t--);
}
void SelectHC573()
{
P2 = (P2 & 0x1f) | 0x80;
}
void Working()
{
SelectHC573();
L1 = 0;
Delay(60000);
L1 = 1;
Delay(60000);
}
//================================
void Init_INT0()
{
IT0 = 1;
EX0 = 1;
EA = 1;
}
unsigned char stat_int = 0;
void ServiceINT0() interrupt 0
{
stat_int = 1;
}
void LEDINT()
{
if(stat_int == 1)
{
L8 = 0;
Delay(60000);
Delay(60000);
Delay(60000);
Delay(60000);
Delay(60000);
Delay(60000);
L8 = 1;
}
stat_int = 0;
}
//================================
void main()
{
Init_INT0();
while(1)
{
Working();
LEDINT();
}
}