標(biāo)題: 51定時(shí)器中斷進(jìn)入不了的原因? [打印本頁]

作者: 哈啾SC    時(shí)間: 2019-4-7 10:07
標(biāo)題: 51定時(shí)器中斷進(jìn)入不了的原因?
#include  "stc12c5a60s2.h"

#define  uchar unsigned char
#define  uint  unsigned int

/*======================
      定時(shí)器初值定義
======================*/
#define TH0_Init  0xff
#define TL0_Init  0x8C
#define TMOD_Init 0x01
#define TCON_Init 0x10
/*======================
       變量定義
======================*/
uchar Cnt2ms;
uchar Cnt10ms;
uint  Cnt1s;

sbit LED1=P2^3;
/*======================
       函數(shù)聲明
======================*/
void T0_Init(void);

/*======================
       主函數(shù)
======================*/
void main()
{
    T0_Init();
        while(1);
}

/*======================
    定時(shí)器初始化函數(shù)
======================*/
void T0_Init(void)
{
        TMOD |=TMOD_Init;
        TL0=TL0_Init;
        TH0=TH0_Init;
        ET0=1;
        EA=1;
}
void T0_Start()
{
        TR0=1;
}
void T0_Stop()
{
        TR0=0;
}


void Timer0() interrupt 1
{
        T0_Stop();
        TL0=TL0_Init;
        TH0=TH0_Init;
        T0_Start();

        Cnt1s++;
        if(Cnt1s>=8000)
        {
                Cnt1s=0;
                LED1=~LED1;
        }
}  


作者: 飛云    時(shí)間: 2019-4-7 10:53
你初始化時(shí)TR0沒有置1,所以進(jìn)入不了T0的中斷!另外你為什么要在中斷里面清零TR0?
作者: 飛云    時(shí)間: 2019-4-7 10:54
你初始化時(shí)TR0沒有置1,所以定時(shí)器沒有開始運(yùn)行!
作者: wulin    時(shí)間: 2019-4-7 11:09
定時(shí)器TR0=1;在中斷函數(shù)里才能打開,這個(gè)中斷如何產(chǎn)生???悖論。!void T0_Start(),void T0_Stop()這兩個(gè)函數(shù)純屬蛇足。
void T0_Init(void)
{
        TMOD |=TMOD_Init;
        TL0=TL0_Init;
        TH0=TH0_Init;
        TR0=1;
       ET0=1;
        EA=1;
}
作者: saya0769    時(shí)間: 2019-4-7 12:33
stc的燒錄軟件中有源碼例子,封裝管腳等等的資料。很方便的。stc-isp-15xx-v6.86r.exe
作者: robinsonlin    時(shí)間: 2019-4-7 16:53
這個(gè)段代碼湊得還是蠻嚴(yán)謹(jǐn),應(yīng)該只是沒有搞懂定時(shí)器是什么原理而已。   很多初學(xué)者開始都會(huì)把定時(shí)器和中斷混為一堆,用到定時(shí)器就以為一定要發(fā)生中斷。  所以才會(huì)出現(xiàn)在定時(shí)器中斷里面去 操作TR的想法。  不妨從一下4個(gè)步驟去體會(huì)一下定時(shí)器的運(yùn)用。
第一步:設(shè)置特殊功能寄存器TMOD,配置定時(shí)器的工作模式。
第二步:設(shè)置計(jì)數(shù)寄存器TH 和TL 的初值。(溢出后也要重新設(shè)置,不然就要從0x0000開始重新計(jì)數(shù)了)
第三步:設(shè)置TCON,通過TR置1來讓定時(shí)器開始計(jì)數(shù)。
第四步:判斷TCON寄存器的TF位,監(jiān)測定時(shí)器溢出情況。(可以通過寄存器中斷機(jī)制,在這里給計(jì)數(shù)器付初值,而不是去開關(guān)計(jì)數(shù)器。)
作者: wxxl    時(shí)間: 2019-4-7 20:49
你程序里TR0=1;只有在中斷里才執(zhí)行,TR0沒開中斷就不開,不開開中斷更執(zhí)行不發(fā)TR0=1,你可以在中斷初始化函數(shù)里開下TR0=1
作者: 風(fēng)華絕代依琳    時(shí)間: 2019-4-7 20:59
設(shè)置
TR0=1;
作者: 12064010    時(shí)間: 2019-4-7 22:58
TR0=1;
作者: moqiyaa    時(shí)間: 2019-4-8 13:02
沒開中斷  TR0=1
作者: 764195618    時(shí)間: 2019-4-8 13:39
TRO=1; //中斷
作者: 暖色系GD_ALIU    時(shí)間: 2019-4-8 15:17
初始化未啟動(dòng)定時(shí)器。初始化的時(shí)候加上T0_Start()就可以了
作者: 哈啾SC    時(shí)間: 2019-4-8 15:28
飛云 發(fā)表于 2019-4-7 10:53
你初始化時(shí)TR0沒有置1,所以進(jìn)入不了T0的中斷!另外你為什么要在中斷里面清零TR0?

好的,謝謝你的回答
作者: 哈啾SC    時(shí)間: 2019-4-8 15:29
wulin 發(fā)表于 2019-4-7 11:09
定時(shí)器TR0=1;在中斷函數(shù)里才能打開,這個(gè)中斷如何產(chǎn)生???悖論!!void T0_Start(),void T0_Stop()這 ...

謝謝你的回答,我去修改修改
作者: 哈啾SC    時(shí)間: 2019-4-8 15:29
saya0769 發(fā)表于 2019-4-7 12:33
stc的燒錄軟件中有源碼例子,封裝管腳等等的資料。很方便的。stc-isp-15xx-v6.86r.exe

好的,謝謝你的回答
作者: 655644    時(shí)間: 2019-4-9 12:44
少了TRO=1




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