锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

关于单片机 C中断函数

时间:2024-05-22 18:07:10

定义中断服务函数

函数类型 函数名 (形式参数) interrupt n [using n] 中断号 中断源 中断向量 0 外部中断0 0003H 1 定时器/ 0 000BH 2 外部中断1 0013H 3 定时器/计数器1 001BH 4 串行口 0023H interrupt 关键字是不可缺少的,由它告诉编译器该函数是中断服务函数,并由后面的 n 指明所使用的中断号。n 的取值范围为0-31,但具体的中断号要取决于芯片的型号,像 AT89C51 实际上就使用0-4 号中断。每个中断号都对应一个中断向量,具体地址为8n+3, 中断源响应后处理器会跳转到中断向量所处的地址执行程序,编译器会在这地址上产生一个 无条件跳转语句,转到中断服务函数所在的地址执行程序。下表是51 芯片的中断向量和中 断号。

楼上qmt已经大致给你介绍清楚了中断函数的定义,值得提出的是,中断函数类型void,说明中断函数是不能有返回值的,这点要明确,所以不要企图让中断函数给你个返回值。还有,函数名后面括弧内是没有参数的。。。这点也需要注意,中断函数不能传递参数。
interrupt 后面的点是中断号。重点我给你解释下using。
这是C51编译器扩展的关键字。用来选择80c51单片机中不同的寄存器组,你也知道R0-R7总共有4组,那么using 后面的数字也就是0-3范围里的一个数了。如果不需要using的话,编译器会自动选择一组寄存器作为绝对寄存器访问的。 using对代码是有一定的影响的。 给你说个简单的例子,你可以想下, 如果定义 void time0() interrupt 1 using 1 假设,我们又在中断里调用了一个delay();这个delay是起延时作用。 那么,我们就需要确保我们使用的寄存器组是同一组,否则,就会出现混乱。 这样说你能明白么?
所以,我建议你,不必要时不要使用using。不过,你可以试下这个关键字。
祝你学习顺利。
LX efenwu: 简单来说,51有4组通用寄存器,R0~R7,我们在使用的时候,从来就没有指明用的是哪个R0,编译器就会自动选一组通用寄存器作为绝对地址访问。在c语言中,我们写一个函数,例如延时函数,里面用的变量,反汇编之后就是在使用R0-R7,那么你能确定你使用的是哪一组寄存器吗? 所以说,使用using能选择使用的寄存器组,但同时在“切换”时要特别小心。你在中断程序里调用别的程序就会出现寄存器组切换问题。。 其实using还有其他的注意地方,因为使用麻烦,我从来不用这个关键字。这也就是我为什么不推荐楼主用using。编译器会自己选择一组嘛。
所以只要这样定义一个中断函数就行了: void FuncName() interrupt lvl 其中lvl就是中断的优先级序号。

-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章