为了直接使用C51语言编写申断服务程序,C51讲言中定义了中断函数。
由于C51编译器在编译时对声明为中断服务程序的函数自动添加了相应的现场保护、阻断其他中断、返回时自动恢复现场等处理的程序段,因而在编写中断函数时可不必考虑这些问题,减小了用户编写中断函数的烦琐程度。
一般形式
中断服务函数的一般形式为:
函数类型函数名( 形式参数表)interrupt n using n
关键字interrupt 后面的n是中断号,对于AT89S52单片机,n的取值为0-5,编译器从8xn+3处产生中断向量。
单一外中断
下面介绍单一外中断的应用
【例】 在单片机的P1口上接有8只LED。 在外部中断0输人引脚(P3.2)接有一只按钮开关K1。要求将外部中断O设置为电平触发。程序启动时,PI口上的8只LED全亮。每按一次按钮开关 K1,使引脚接地,产生一个低电平触发的外中断请求,在中断函数中,让低4位的LED与高4位的LED交替闪烁5次。然后从中断返回,控制8只LED再次全亮。原理电路及仿真结果如下。
下面我们就一步一步的完成我们的代码。
头文件
实现头文件必不可少。
#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++) //晶振为12 MHz,j 的选择与晶振频 //率有关 { 1; } //空函数 }
中断函数
接下来就加入我们的中断函数。可以相比之下,中断函数的区别。
void int0( ) interupt 0 using 0 //外中断0的中断函数 { uchar m; EX0=0; //禁止外部中断0中断 for(m=0;m<5;m++) //交替闪烁5次 { P1 =0xOf; //低4位LED灭,高4位//LED亮 Delay(400) ; //延时 P1= 0xf0; //高4位LED灭,低4位//LED亮 Delay( 400); //延时 EX0= 1 ; //中断返回前,允许外部//中断0中断 } }
主函数
void main( ) //主函数 { EA=1: //总中断允许 EX0=1: //允许外部中断0中断 IT0=l; //选择外部中断0为跳//沿触发方式 while(1) //循环 { P1=0; //PI口的8只LED全亮 } }
本例包含两部分,一部分是主程序段,完成了中断系统的初始化,并把8只LED全部点亮。另一部分是中断函数,控制8只LED分两组交替闪烁5次,然后从中断返回。