標(biāo)題: 關(guān)于定時(shí)器中斷函數(shù)問(wèn)題求解 [打印本頁(yè)]

作者: 無(wú)尾熊    時(shí)間: 2016-7-15 23:51
標(biāo)題: 關(guān)于定時(shí)器中斷函數(shù)問(wèn)題求解
定時(shí)器時(shí)間溢出進(jìn)入中斷函數(shù),中斷函數(shù)內(nèi)是不是要先關(guān)閉定時(shí)器TR0=0,當(dāng)中斷函數(shù)內(nèi)程序運(yùn)行到最后,定時(shí)器啟動(dòng)TR0=1.中斷結(jié)束,定時(shí)器開(kāi)始工作。這樣寫(xiě)是不是正確?吹胶枚嗬樱谥袛嗪瘮(shù)內(nèi)都不管定時(shí)器,如果定時(shí)器的時(shí)間小于或者大于中斷函數(shù)時(shí)間,這樣的定時(shí)器進(jìn)入中斷函數(shù)的值會(huì)不會(huì)有變化。
下面是加定時(shí)器關(guān)閉的程序,關(guān)閉定時(shí)器與不關(guān)閉定時(shí)器有什么影響。求大神指導(dǎo)。
void InterruptTimer0()  interrupt 1               //中斷函數(shù)的特殊寫(xiě)法,數(shù)字’1’為中斷入口號(hào)
{
    static unsigned char j = 0;
    TR0=0;   //加入定時(shí)器關(guān)閉程序
    TH0 = 0xFC;    //溢出后進(jìn)入中斷重新賦值
     TL0 = 0x67;
    counter++;    //計(jì)數(shù)值counter加1
    P0 = 0xFF;    //消隱
     switch(j)
    {
         case 0: ADDR0=0; ADDR1=0; ADDR2=0; j++; P0=LedChar[LedNumber[0]]; break;
        case 1: ADDR0=1; ADDR1=0; ADDR2=0; j++; P0=LedChar[LedNumber[1]]; break;
         case 2:  ADDR0=0; ADDR1=1; ADDR2=0; j++; P0=LedChar[LedNumber[2]]; break;
         case 3:  ADDR0=1; ADDR1=1; ADDR2=0; j++; P0=LedChar[LedNumber[3]]; break;
        case 4:  ADDR0=0; ADDR1=0; ADDR2=1; j++; P0=LedChar[LedNumber[4]]; break;
         case 5:  ADDR0=1; ADDR1=0; ADDR2=1; j=0; P0=LedChar[LedNumber[5]]; break;
        default: break;
     }      //動(dòng)態(tài)刷新
    TR0=1;     //加入定時(shí)器打開(kāi)程序中斷結(jié)束開(kāi)始計(jì)時(shí)
}   
作者: 李志博32    時(shí)間: 2016-7-16 09:56
如果未關(guān)中斷而且中斷處理函數(shù)中處理數(shù)據(jù)過(guò)多;因?yàn)槎〞r(shí)器時(shí)間已到它就會(huì)又進(jìn)入下一個(gè)中斷處理函數(shù),也就是這個(gè)中斷處理函數(shù)還沒(méi)有處理完下一個(gè)中斷又來(lái)了。這樣會(huì)造成結(jié)果錯(cuò)誤或異常。
作者: 3154    時(shí)間: 2016-7-16 15:52
開(kāi)定時(shí)器中斷表示可以進(jìn)入定時(shí)器中斷函數(shù),執(zhí)行完中斷函數(shù)后,你想怎么操作就怎么操作看你的需求了。至于定時(shí)時(shí)間和函數(shù)執(zhí)行時(shí)間,最好的是不要在中斷函數(shù)中執(zhí)行太多的步驟,容易造成錯(cuò)誤。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1