单片机中断函数C语言的问题? 51单片机中断函数

2889℃ DUANE

单片机中断函数C语言的问题?51单片机中断函数

在单片机中断中void time0() interrupt 1 using 1

楼上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就是中断的优先级序号。

要是还有什么地方不明白的地方,请指出来,共同学习嘛。

写8051单片机C语言中断程序的时候应该注意什么问题?

楼主你的程序没有错,你用中断0让P3.3取反,然后不执行IF里面的语句,思路是对的,,只是你的"中断程序不能根据输入中断"是什么意思?.根据你的程序,外部中断源应该是一个开关接P3.2口吧,由开关来引发中断0,不能根据输入引发中断,应该是中断源的问题,有可以中断源没有规律,所以P3_3没有规律的自动中断.

c51中断函数如何定义在使用时应注意哪些问题?

C51编译器允许用C51创建中断服务程序。仅仅需要关心中断号和寄存器组的选择就能够了。编译器自动产生中断向量和程序的入栈及出栈代码。在函数声明时包括interrupt,将把所声明的函数定义为1个中断服务程序。另外,可以用using定义此中断服务程序所使用的寄存器组。 中断函数定义的格式为:函数类型 函数名 interrupt n using n 其中:interrupt后面的n是中断号;关键字using后面的n是所选择的寄存器组,取值范围是0—3。中断号 中断源 0 外部中断0 1 定时器0溢出 2 外部中断1 3 定时器1溢出 4 串行口中断 5 定时器2溢出

几种单片机C语言的中断程序写法

外部中断0:void ext0() interrupt 0

定时器0:void timer0() interrupt 1

外部中断1:void ext1() interrupt 2

定时器1:void timer1() interrupt 3

串口; void uart() interupt 4