標(biāo)題: 請(qǐng)問(wèn)51單片機(jī)的中斷函數(shù)能否放入for循環(huán)? [打印本頁(yè)]

作者: 51童小白    時(shí)間: 2019-3-1 09:24
標(biāo)題: 請(qǐng)問(wèn)51單片機(jī)的中斷函數(shù)能否放入for循環(huán)?
本帖最后由 51童小白 于 2019-3-1 09:57 編輯

/*************************************************
*實(shí)驗(yàn)名:定時(shí)器實(shí)驗(yàn)
*實(shí)驗(yàn)效果:第一個(gè)led燈以1000ms一次的精確頻率閃爍
*************************************************/
#include<reg52.h>

sbit led = P1^0;
int i = 1;

void timer1_init()
{
        TMOD = 0x10; //定時(shí)器1選擇工作方式1
    TH1 = 0x4C;         //設(shè)置初始值,定時(shí)50ms
    TL1 = 0x00;
    EA = 1;                         //打開(kāi)總中斷
    ET1 = 1;                 //打開(kāi)定時(shí)器1中斷
    TR1 = 1;                 //啟動(dòng)定時(shí)器1
}

void main()
{
        led = 1;
        timer1_init();
        while(1)
        {
                if(i==20)
                {
                  led = ~led;
                  i=1;
                }
        }


}

void timer1() interrupt 3
{
    for(i=1;i<21;i++)
        {
        TH1 = 0x4C;         //設(shè)置初始值,定時(shí)50ms
    TL1 = 0x00;
        }
        
}

請(qǐng)問(wèn)為何程序執(zhí)行后,led燈常亮,并沒(méi)有閃爍,貌似中斷函數(shù)沒(méi)有參與主函數(shù)中的循環(huán),這是為什么?

作者: xuyaqi    時(shí)間: 2019-3-1 11:44
在中斷里只 i++,在 while(1)里根據(jù) i 值操作,中斷里不要 for。
作者: wulin    時(shí)間: 2019-3-1 12:54
改這樣就可以了

/*************************************************
*實(shí)驗(yàn)名:定時(shí)器實(shí)驗(yàn)
*實(shí)驗(yàn)效果:第一個(gè)led燈以1000ms一次的精確頻率閃爍
*************************************************/
#include<reg52.h>

sbit led = P1^0;
int i = 1;

void timer1_init()
{
        TMOD = 0x10; //定時(shí)器1選擇工作方式1
        TH1 = 0x4C;  //設(shè)置初始值,定時(shí)50ms
        TL1 = 0x00;
        EA = 1;      //打開(kāi)總中斷
        ET1 = 1;     //打開(kāi)定時(shí)器1中斷
        TR1 = 1;     //啟動(dòng)定時(shí)器1
}

void main()
{
        led = 1;
        timer1_init();
        while(1)
        {
                if(i>=20)
                {
                        i=0;
                        led = ~led;
                }
        }
}

void timer1() interrupt 3
{
          TH1 = 0x4C;         //設(shè)置初始值,定時(shí)50ms
        TL1 = 0x00;  
        i++;
}
作者: HC6800-ES-V2.0    時(shí)間: 2019-3-1 12:57
中斷函數(shù),是不能被調(diào)用的,只有中斷后,單片機(jī)自動(dòng)調(diào)用。
從你的程序上看,中斷函數(shù)中的for是多余的——去掉吧,保留賦初值,加一語(yǔ)句i++。但主函數(shù)中的if有問(wèn)題,應(yīng)該為
if (i>=20)

作者: yoxi    時(shí)間: 2019-3-1 14:08
中斷要分外部中斷與定時(shí)器中斷,兩種都能用for ,外部用一般延時(shí)for,定時(shí)用定時(shí)標(biāo)志位for
這里有例程:http://www.torrancerestoration.com/bbs/dpj-145685-1.html
作者: 51童小白    時(shí)間: 2019-3-1 14:32
HC6800-ES-V2.0 發(fā)表于 2019-3-1 12:57
中斷函數(shù),是不能被調(diào)用的,只有中斷后,單片機(jī)自動(dòng)調(diào)用。
從你的程序上看,中斷函數(shù)中的for是多余的—— ...

你好,請(qǐng)問(wèn)若一個(gè)主函數(shù)中的while(1)中若有多個(gè)語(yǔ)句A B C D...,CPU中斷返回后從此循環(huán)的哪一句開(kāi)始執(zhí)行?
作者: mwj1983    時(shí)間: 2019-3-1 15:51
中斷后會(huì)返回到進(jìn)入中斷的地方繼續(xù)執(zhí)行
作者: HC6800-ES-V2.0    時(shí)間: 2019-3-2 13:47
51童小白 發(fā)表于 2019-3-1 14:32
你好,請(qǐng)問(wèn)若一個(gè)主函數(shù)中的while(1)中若有多個(gè)語(yǔ)句A B C D...,CPU中斷返回后從此循環(huán)的哪一句開(kāi)始執(zhí)行 ...

樓下說(shuō)了:中斷在什么地方,返回就從那個(gè)地方再開(kāi)始。
這個(gè)是單片機(jī)自己完成,不需要你去設(shè)置的。
作者: 福爾兔兔    時(shí)間: 2019-3-2 14:52
自己找一下中斷的位置,main函數(shù)也要看看
作者: cassie0802    時(shí)間: 2019-3-2 15:26
你的函數(shù)不需要for
作者: ap1005223    時(shí)間: 2019-3-2 17:01
大哥,中斷就是打斷這個(gè)mian里面的執(zhí)行然后直接處理中斷,你程序那樣寫,定期器到了,i永遠(yuǎn)是21,然后處理完出來(lái),去main里面,i肯定不會(huì)翻轉(zhuǎn)。。。。失去任何意義
作者: lihanting    時(shí)間: 2019-3-2 19:08
按理來(lái)說(shuō)可以的循環(huán)結(jié)構(gòu)本來(lái)就是順序結(jié)構(gòu)的更優(yōu)越表示方法...




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