sdcc 中断使用中的一个问题
扫描二维码
随时随地手机看文章
在sdcc中,中断处理函数使用关键字__interrupt标识,后面跟上中断号,8051中断号列表如下:
Interrupt#DescriptionVectorAddress0External00x00031Timer00x000b2External10x00133Timer10x001b4Serial0x00235Timer2(8052)0x002b
虽然看上去很简单,但是在使用过程中还出现了一个小问题,由于我将程序分成了两个部分,main.c和timer.c,而在timer.c中的定时器中断处理函数timer0_isr始终是不能被执行,检查程序呢也未发现什么原因,通过查看sdcc中的源代码和上网查找timer部分代码,也未发现timer0初始化有任何问题,顿时就郁闷了。但是也发现两个一个不同之处,就是在main函数之前对中断处理函数做了一个声明,于是我就在我的程序中加上了这个声明,程序终于调用了中断处理函数,特此记录一下。完整的程序如下:
/*timer.c*/
#include
#defineOSC_FREQ12000000UL
#defineTIMER_MODE00x00
#defineTIMER_MODE10x01
#defineTIMER_MODE20x02
#defineTIMER_MODE30x03
volatileunsignedintcount=0;
voidtimer0_isr(void)__interrupt1
{
count++;
TH0=(65536-1000*(OSC_FREQ/12000000))>>8;
TL0=(65536-1000*(OSC_FREQ/12000000))&0x00FF;
}
voidtimer0_init(void)
{
TMOD&=0xF0;
TMOD|=TIMER_MODE1;/*Timer0workon16-bittimermode*/
TH0=(65536-1000*(OSC_FREQ/12000000))>>8;
TL0=(65536-1000*(OSC_FREQ/12000000))&0x00FF;
ET0=1;/*Enabletimer0interrupt*/
EA=1;
TR0=1;/*Turnontimer0*/
}
voiddelayms(unsignedintn)
{
while(count<=n);
count=0;
}
/*timer.h*/
#ifndef__TIMER_H
#define__TIMER_H
externvoidtimer0_init(void);
externvoiddelayms(unsignedintn);
#endif/*__TIMER_H*/
/*main.c*/
#include
#include"timer.h"
#defineled1P2_0
voidtimer0_isr(void)__interrupt1;
voidmain(void)
{
timer0_init();
while(1){
led1=0;
delayms(1000);
led1=1;
delayms(1000);
}
}
注:经验证,在Keil中未出现该问题。