定時(shí)器1工作在模式1,計(jì)時(shí)不中斷,INT1下降沿中斷,實(shí)驗(yàn)證明運(yùn)行正常。
初始化及中斷代碼如下:
void initime() { TMOD=0x10; EA=1; IT1=1; EX1=1; TH1=0;TL1=0; TR1=1;
}
//===================================================== void Time1() interrupt 2 //外部中斷解碼程序 { Tc=TH1*256+TL1; //提取中斷時(shí)間間隔時(shí)長(zhǎng) TH1=0; TL1=0; //定時(shí)中斷重新置零 if(Imin<Tc&&Tc<Imax){m=0; f=1; return;} //找到啟始碼 if(f){ if(Inum1<Tc&&Tc<Inum3){Im[m/8]=Im[m/8]>>1|0x80; m++;}//取1碼 if(Inum2<Tc&&Tc<Inum1){Im[m/8]=Im[m/8]>>1; m++;}//取0碼 if(m==32){m=0;f=0; if((Im[2]==~Im[3])&&(Im[0]==~Im[1])) {IrOK=1;laba=0;delay(1000);laba=1;}//取碼完成后判斷讀碼是否正確 else IrOK=0;} } }
定時(shí)器0工作在模式1,100微秒定時(shí)中斷,實(shí)驗(yàn)證明運(yùn)行正常。
初始化及中斷代碼如下:
//=================================== void Timer0_Init() //定時(shí)0.1ms(100um), { TMOD=0x01; IE=0x82; TH0=0xff;//65436/256;11.0592晶振 TL0=0x9c;//65436%256 TR0=1; } //====================================== void Time0() interrupt 1 //中斷程序 { TH0=0xff; TL0=0x9c; if(m1>jd1) pwm1=1; else pwm1=0;
if(m2>jd2) pwm2=1; else pwm2=0; if(m3>jd3) pwm3=1; else pwm3=0; m1++; m1%=m; m2++; m2%=m; m3++; m3%=m; // 根據(jù)io口及pwm需要情況可加m3,jd3,m4,jd4,m5,jd5…… }
現(xiàn)在我想實(shí)現(xiàn)用紅外遙控調(diào)節(jié)三路LED亮度(定時(shí)器1工作在模式1,計(jì)時(shí)不中斷,定時(shí)器0也工作在模式1,100微秒定時(shí)中斷,INT1下降沿中斷,)為啥不能同時(shí)工作呢?求指點(diǎn)。搞了幾天了,找不到原因。
初始化及中斷代碼如下:
//======================== void initime() { TMOD=0x11; EA=1; IT1=1; EX1=1; TH1=0;TL1=0; TR1=1;
TR0=1; IE=0x82; TH0=0xff;//65436/256;11.0592晶振 TL0=0x9c;//65436%256 }
//====================================== void Time0() interrupt 1 //中斷程序 { TH0=0xff; TL0=0x9c; if(m1>jd1) pwm1=1; else pwm1=0;
if(m2>jd2) pwm2=1; else pwm2=0; if(m3>jd3) pwm3=1; else pwm3=0; m1++; m1%=m; m2++; m2%=m; m3++; m3%=m; // 根據(jù)io口及pwm需要情況可加m3,jd3,m4,jd4,m5,jd5…… }
//===================================================== void Time1() interrupt 2 //外部中斷解碼程序 { Tc=TH1*256+TL1; //提取中斷時(shí)間間隔時(shí)長(zhǎng) TH1=0; TL1=0; //定時(shí)中斷重新置零 if(Imin<Tc&&Tc<Imax){m=0; f=1; return;} //找到啟始碼 if(f){ if(Inum1<Tc&&Tc<Inum3){Im[m/8]=Im[m/8]>>1|0x80; m++;}//取1碼 if(Inum2<Tc&&Tc<Inum1){Im[m/8]=Im[m/8]>>1; m++;}//取0碼 if(m==32){m=0;f=0; if((Im[2]==~Im[3])&&(Im[0]==~Im[1])) {IrOK=1;laba=0;delay(1000);laba=1;}//取碼完成后判斷讀碼是否正確 else IrOK=0;} } }
[此貼子已經(jīng)被作者于2013-4-21 15:53:42編輯過(guò)]
|