欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7306|回復: 11
收起左側

請問51單片機的中斷函數能否放入for循環?

  [復制鏈接]
ID:482529 發表于 2019-3-1 09:24 | 顯示全部樓層 |閱讀模式
本帖最后由 51童小白 于 2019-3-1 09:57 編輯

/*************************************************
*實驗名:定時器實驗
*實驗效果:第一個led燈以1000ms一次的精確頻率閃爍
*************************************************/
#include<reg52.h>

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

void timer1_init()
{
        TMOD = 0x10; //定時器1選擇工作方式1
    TH1 = 0x4C;         //設置初始值,定時50ms
    TL1 = 0x00;
    EA = 1;                         //打開總中斷
    ET1 = 1;                 //打開定時器1中斷
    TR1 = 1;                 //啟動定時器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;         //設置初始值,定時50ms
    TL1 = 0x00;
        }
        
}

請問為何程序執行后,led燈常亮,并沒有閃爍,貌似中斷函數沒有參與主函數中的循環,這是為什么?
回復

使用道具 舉報

ID:94031 發表于 2019-3-1 11:44 | 顯示全部樓層
在中斷里只 i++,在 while(1)里根據 i 值操作,中斷里不要 for。
回復

使用道具 舉報

ID:213173 發表于 2019-3-1 12:54 | 顯示全部樓層
改這樣就可以了

/*************************************************
*實驗名:定時器實驗
*實驗效果:第一個led燈以1000ms一次的精確頻率閃爍
*************************************************/
#include<reg52.h>

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

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

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

void timer1() interrupt 3
{
          TH1 = 0x4C;         //設置初始值,定時50ms
        TL1 = 0x00;  
        i++;
}
回復

使用道具 舉報

ID:164602 發表于 2019-3-1 12:57 | 顯示全部樓層
中斷函數,是不能被調用的,只有中斷后,單片機自動調用。
從你的程序上看,中斷函數中的for是多余的——去掉吧,保留賦初值,加一語句i++。但主函數中的if有問題,應該為
if (i>=20)
回復

使用道具 舉報

ID:473159 發表于 2019-3-1 14:08 | 顯示全部樓層
中斷要分外部中斷與定時器中斷,兩種都能用for ,外部用一般延時for,定時用定時標志位for
這里有例程:http://m.raoushi.com/bbs/dpj-145685-1.html

評分

參與人數 1黑幣 +10 收起 理由
zhengchong60 + 10 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:482529 發表于 2019-3-1 14:32 | 顯示全部樓層
HC6800-ES-V2.0 發表于 2019-3-1 12:57
中斷函數,是不能被調用的,只有中斷后,單片機自動調用。
從你的程序上看,中斷函數中的for是多余的—— ...

你好,請問若一個主函數中的while(1)中若有多個語句A B C D...,CPU中斷返回后從此循環的哪一句開始執行?
回復

使用道具 舉報

ID:482783 發表于 2019-3-1 15:51 | 顯示全部樓層
中斷后會返回到進入中斷的地方繼續執行
回復

使用道具 舉報

ID:164602 發表于 2019-3-2 13:47 | 顯示全部樓層
51童小白 發表于 2019-3-1 14:32
你好,請問若一個主函數中的while(1)中若有多個語句A B C D...,CPU中斷返回后從此循環的哪一句開始執行 ...

樓下說了:中斷在什么地方,返回就從那個地方再開始。
這個是單片機自己完成,不需要你去設置的。
回復

使用道具 舉報

ID:276415 發表于 2019-3-2 14:52 | 顯示全部樓層
自己找一下中斷的位置,main函數也要看看
回復

使用道具 舉報

ID:483252 發表于 2019-3-2 15:26 | 顯示全部樓層
你的函數不需要for
回復

使用道具 舉報

ID:311744 發表于 2019-3-2 17:01 | 顯示全部樓層
大哥,中斷就是打斷這個mian里面的執行然后直接處理中斷,你程序那樣寫,定期器到了,i永遠是21,然后處理完出來,去main里面,i肯定不會翻轉。。。。失去任何意義
回復

使用道具 舉報

ID:483375 發表于 2019-3-2 19:08 | 顯示全部樓層
按理來說可以的循環結構本來就是順序結構的更優越表示方法...
回復

使用道具 舉報

13#
無效樓層,該帖已經被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表