c语言中的中断函数 c语言中的中断函数是什么

单片机c语言的各个中断函数模型c51中断函数的介绍
C51编译器允许用c51创建中断服务程序 , 大家仅仅需要关心中断号和寄存器组的选择就可以了 。编译器自动产生中断向量和程序的入栈及出栈代码 。在函数声明时包括interrupt,将把所声明的函数定义为一个中断服务程序 。另外,可以用using定义此中断服务程序所使用的寄存器组 。
一、中断函数的定义
1、中断函数定义的格式为:
函数类型函数名 interruptnusingn
其中:
Interrupt后面的n是中断号 。
关键字using后面的n是所选择的寄存器组,取值范围是0-3.
定义中断函数时,using是一个选项,可以省略不用 。如果不用则由编译器选择一个寄存器组作为绝对寄存器组 。
2、8051的中断过程通过使用interrupt关键字和中断号来实现,中断号告诉编译器中断程序的入口地址 。中断号对应着IE寄存器中的使能位 , 换句话说,IE寄存器中的0位对应着外部中断0,相应的外部中断0的中断号是0.
IE寄存器中的使能位与外部中断对应关系:
中断号中断源
0外部中断0
1定时器0
【c语言中的中断函数 c语言中的中断函数是什么】2外部中断1
3定时器1中断
4串行口中断
5定时器2中断
二、使用中断函数时要注意的问题:
1.在设计中断时,要注意的是哪些功能应该放在中断程序中,哪些功能应该放在主程序中 。一般来说中断服务程序应该做最少量的工作,这样做有很多好处 。首先系统对中断的反应面更宽了,有些系统如果丢失中断或对中断反应太慢将产生十分严重的后果,这时有充足的时间等待中断是十分重要的 。其次它可使中断服务程序的结构简单,不容易出错 。
中断程序中放入的东西越多,他们之间越容易起冲突 。简化中断服务程序意味着软件中将有更多的代码段,但可把这些都放入主程序中 。中断服务程序的设计对系统的成败有至关重要的作用 , 要仔细考虑各中断之间的关系和每个中断执行的时间,特别要注意那些对同一个数据进行操作的ISR.
2.中断函数不能传递参数 。
3.中断函数没有返回值 。
4.中断函数调用其他函数,则要保证使用相同的寄存器组,否则出错 。
5.中断函数使用浮点运算要保存浮点寄存器的状态 。
怎样在C语言中使用中断函数首先你要写中断函数
然后在主程序中像调用子函数一样调用就可以了
举个例子吧
#define uchar unsigned char
#define uchar unsigned char
sbit D1=P1^0;
uchar aa;
void init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%6;
EA=1;
ET0=1;
TR0=1;
}
void main()
{
init();
while(1)
{
if(aa==20)
{
D1=~D1;
aa=0;
}
}
}
void T0time()interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%6;
aa;
}
C语言中的interrupt是怎么回事二楼的说得很对 。它是一个中断处理函数,与一般的函数的区别在于他被调用的方式 。一般的函数是由其上一层函数调用而得到执行 。而中断函数是是外围设备触发它执行的 。比如说:spi接收到一字节的数据、adc采样完成、定时器发生溢出等等 。一旦这些事件发生了,只要中断处于使能状态 , 就会触发对应的中断 。
不管主程序执行到什么地方,cpu都会暂停它并立即执行这种中断处理函数 。中断处理函数执行完成后又恢复之前的程序位置继续执行 。
中断的产生,不是由调用引起的 , 是由外界触发的 。就像,有人敲门 , 你就要去开门,这不等于你去开门了 , 就一定有人敲门 。
另,中断函数不能被直接调用,否则会出错 。
c语言如何中断函数控制脉冲外部中断的常用功能
外部中断经常用来记录外部脉冲的个数 , 也就是当我们使用外部中断1时,如果想记录自身单片机的某个引脚的下降沿个数 , 只需用杜邦线把这个引脚和P3.3连接即可 。
比如P2.3引脚产生这样的电平无规律跳转,则下降沿的个数为5
所以我们就用外部中断1来实现记录K4按键从按下到松手的抖动过程中经历了多少个下降沿,把下降沿的个数显示在数码管上 。
2.程序思路
我们定义一个16位的全局变量pulse用来记录P2.3下降沿的个数,在中断函数中的任务就是简单的pulse自加 , 因为引脚遇到下降沿就会进入中断函数 。
在主函数里就是负责数码管显示即可 。
3.代码#include
#include //详见第六章第8讲
u16 pulse=0;
void main()
{
u16 x,PULSE_buf;
IT1 = 1;//下降沿触发模式
EX1 = 1;
EA= 1;
LED_Init();//初始化LED硬件模块
KEY_Init();//初始化按键功能模块
ShowNumber(pulse);
while(1)
{
SEG_Scan();
if(PULSE_buf!=pulse)ShowNumber(pulse);//pulse不再是前一次的值,也就是pulse数值更新了,所以数码管缓存区也要更新pulse的数值以便显示出来
x;
if(x=50)//隔一段时间过来记录此时的pulse数值
{
x=0;
PULSE_buf=pulse;
}
}
}
//请把P3.3和P2.3用杜邦线连接起来
void EXTI1_IRQHandler() interrupt 2
{
pulse;
}
大家多按几次K4 , 发现按下后松手的一个动作里有时pulse就自加了几次,显示在数码管上的数加了好几下 。
c语言中的中断函数的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c语言中的中断函数是什么、c语言中的中断函数的信息别忘了在本站进行查找喔 。

    推荐阅读