资源描述
中断函数的使用:《单片机C语言编程与实例》
中断函数通过使用interrupt关键字和中断编号0-4来实现。
使用该扩展属性的函数声明语法如下:
返回值 函数名 interrupt n
N对应中断源的编号
中断编号告诉编译器中断程序的入口地址,它对应者IE寄存器中的使能位,即IE寄存器中的0位对应着的外部中断0,相应的外部中断0的中断编号是0。
中断编号
中断源
入口地址
0
外部中断0
0003H
1
定时器/计数器0溢出
000BH
2
外部中断1
0013H
3
定时器/计数器1溢出
001BH
4
串行口中断
0023H
当正在执行一个特定任务是,可能有更紧急的事情需要CPU处理,这就涉及到终端优先级,搞优先级的中断可以中断正在处理的底有限级中断程序,因而最好给每种优先级分配不同的寄存器组。在c51中可以使用using制定的寄存器组,using后的变量为0-3的长整数,分别表示51单片机内的四个寄存器组。
中断函数的完整语法及实例如下:
返回值 函数名(【参数】)【模式】【重入】interrupt n [using n]
Unsigned int interruptent;
Unsigned char second;
Void time0(void)interrupt 1 using 2
{
if(++interruptent==4000) %计数到4000
{second++; % 另一个计数器
Interruptent=0; %计数器清零
}
}
要是摸个中断源的申请得到相应,必须保证EA=1和相应的允许位为1
定义中断服务函数的一般形式为::
函数类型 函数名(形式参数表)[interrupt n][using n]
Interrupt 后面的n是中断号,n的取值范围为0-31,编译器从8n+3处产生中断向量。
11.111111
外部中断
例题:通过P1.7口电量发光二极管,然后外部输入一脉冲串,则发光二极管亮、暗交替
#include <REGX51.H>
Sbit P1_7=P1^7;
Void tnterrupt0()interrupt 0 using 2//定义定时器0
{ P1_7=!P1^7;}
Void main()
{
EA=1;//开启总中断
IT0=1;//外部中断0低电平触发
EX0=1; //外部中断0
P1_7=0;
Do()while(1);
}
2222相套中断
外部中断INT1触发后,启动计数器0,计数达到10次后停止计数,启动定时器1,由定时器1控制定时,由P1.7输出周期为200ms的方波性能号,接受2次中断后关闭方波发生器,P1.7置低。
#include <REGX51.H>
#define uchar unsigned char
Uchar data a,b,c;
Void tnterrupt0()interrupt 2using 1//定义外部中断1
{ a++;}
Void time0()interrupt 1using 2//定义计数器0
{
TL0=0Xff;
B++;
}
Void time1()interrupt 3using 3//定义计时器1
{
TH1=0x06;
c--;
}
Sbit P1_7=P1^7;
Void main()
{
P1_7=1; //初始化
TCON=0x01; //外部中断为低电平出触发方式
TMOD=0x27; //启动定时器1和计数器0,工作方式2
IE=0x8B; //开中断
a=0;
do{}while(a!=1); //等待外部中断
P1_7=!P1_7;//取反
TL0=0xFF;//初值
TH0=0x06;//初值
b=0;
TR0=0;
TR1=1;
Do
{
C=0xC8;
Do{}while(c!=0);
P1_7=!P1_7;
}while(a!=3);
TR1=0;
P1_7=0;
EA=0;//关闭总中断
EX0=0; //禁止外部中断
}
展开阅读全文