一、通过两个实验介绍有关中断应用程序的编写。
1. 单一外中断的应用
例题:在单片机P1口上接有8只LED。在外部中断0输入引脚(P3.2)接一只按钮开关K1。
要求将外部中断0设置为电平触发。程序启动时,P1口上的8只LED全亮。每按一次按钮开关K1,使引脚接地,产生一个低电平触发的外中断请求,在中断服务程序中,让低4位的LED与高4位的LED交替闪烁5次。然后从中断返回,控制8只LED再次全亮。
利用中断控制8只LED交替闪烁1次的电路如下所示
file:///C:/Users/zyt/AppData/Local/Temp/msohtmlclip1/01/clip_image002.png
参考程序如下:
#include <reg51.h>
#define uchar unsigned char
void Delay(unsigned int i) //延时函数Delay( ),i形式参数,不能赋初值
{
unsigned int j;
for(;i > 0;i--)
for(j=0;j<333;j++) //晶振为12MHz,j选择与晶振频率有关
{;} //空函数
}
void main( ) //主函数
{
EA=1; //总中断允许
EX0=1; //允许外部中断0中断
IT0=1; //选择外部中断0为跳沿触发方式
while(1) //循环
{ P1=0;} // P1口的8只LED全亮
}
void int0( ) interrupt 0 using 0 //外中断0的中断服务函数
{
uchar m;
EX0=0; //禁止外部中断0中断
for(m=0;m<5;m++) //交替闪烁5次
{
P1=0x0f; //低4位LED灭,高4位LED亮
Delay(400) ; //延时
P1=0xf0; //高4位LED灭,低4位LED亮
Delay(400); //延时
EX0=1; //中断返回前,打开外部中断0中断
}
本例程包含两部分,一部分是主程序段,完成中断系统初始化,并把8个LED全部点亮。另一部分是中断函数部分,控制4个LED交替闪烁1次,然后从中断返回。
2、两个外中断的应用
当需要多个中断源时,只需增加相应的中断服务函数即可。
例题:在单片机P1口上接有8只LED。在外部中断0输入引脚(P3.2)接有一只按钮开关K1。在外部中断1输入引脚(P3.3)接有一只按钮开关K2。要求K1和K2都未按下时,P1口的8只LED呈流水灯显示,仅K1(P3.2)按下再松开时,上下各4只LED交替闪烁10次,然后再回到流水灯显示。如果按下再松开K2(P3.3)时,P1口的8只LED全部闪烁10次,然后再回到流水灯显示。设置两个外中断的优先级相同。
电路图如下:
file:///C:/Users/zyt/AppData/Local/Temp/msohtmlclip1/01/clip_image004.png
参考程序如下:
#include <reg51.h>
#define uchar unsigned char
void Delay(unsigned int i)//延时函数Delay( ),i为形式参数,不能 // 赋初值
{
uchar j;
for(;i>0;i--)
for(j=0;j<125;j++)
{;} //空函数
}
void main( ) //主函数
{
uchar display[9]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,
0x7f};//流水灯显示数据数组
unsigned int a;
for(;;)
{
EA=1; //总中断允许
EX0=1; //允许外部中断0中断
EX1=1; //允许外部中断1中断
IT0=1; //选择外部中断0为跳沿触发方式
IT1=1; //选择外部中断1为跳沿触发方式
IP=0; //两个外部中断均为低优先级
for(a=0;a<9;a++)
{
Delay(500); //延时
P1=display[a]; //将已经定义的流水灯显示数据送到P1口
}
}
}
void int0_isr(void) interrupt 0 using 1//外中断0的中断服务函数
{
uchar n;
for(n=0;n<10;n++) //高、低4位显示10次
{
P1=0x0f; //低4位LED灭,高4位LED亮
Delay(500); //延时
P1=0xf0; //高4位LED灭,低4位LED亮
Delay(500); //延时
}
}
void int1_isr (void) interrupt 2 using 2//外中断1中断服务函数
{
uchar m;
for(m=0;m<10;m++) //闪烁显示10次
{
P1=0xff; //全灭
Delay(500); //延时
P1=0; //全亮
Delay(500); //延时
}
}