在sdcc中,中斷處理函數(shù)使用關(guān)鍵字__interrupt標(biāo)識,后面跟上中斷號,8051中斷號列表如下:
Interrupt#DescriptionVectorAddress0External00x00031Timer00x000b2External10x00133Timer10x001b4Serial0x00235Timer2(8052)0x002b
雖然看上去很簡單,但是在使用過程中還出現(xiàn)了一個小問題,由于我將程序分成了兩個部分,main.c和timer.c,而在timer.c中的定時器中斷處理函數(shù)timer0_isr始終是不能被執(zhí)行,檢查程序呢也未發(fā)現(xiàn)什么原因,通過查看sdcc中的源代碼和上網(wǎng)查找timer部分代碼,也未發(fā)現(xiàn)timer0初始化有任何問題,頓時就郁悶了。但是也發(fā)現(xiàn)兩個一個不同之處,就是在main函數(shù)之前對中斷處理函數(shù)做了一個聲明,于是我就在我的程序中加上了這個聲明,程序終于調(diào)用了中斷處理函數(shù),特此記錄一下。完整的程序如下:
/*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);
}
}
注:經(jīng)驗證,在Keil中未出現(xiàn)該問題。