找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6965|回復(fù): 11
打印 上一主題 下一主題
收起左側(cè)

請問51單片機(jī)的中斷函數(shù)能否放入for循環(huán)?

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:482529 發(fā)表于 2019-3-1 09:24 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
本帖最后由 51童小白 于 2019-3-1 09:57 編輯

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

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

void timer1_init()
{
        TMOD = 0x10; //定時器1選擇工作方式1
    TH1 = 0x4C;         //設(shè)置初始值,定時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;         //設(shè)置初始值,定時50ms
    TL1 = 0x00;
        }
        
}

請問為何程序執(zhí)行后,led燈常亮,并沒有閃爍,貌似中斷函數(shù)沒有參與主函數(shù)中的循環(huán),這是為什么?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:94031 發(fā)表于 2019-3-1 11:44 | 只看該作者
在中斷里只 i++,在 while(1)里根據(jù) i 值操作,中斷里不要 for。
回復(fù)

使用道具 舉報

板凳
ID:213173 發(fā)表于 2019-3-1 12:54 | 只看該作者
改這樣就可以了

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

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

void timer1_init()
{
        TMOD = 0x10; //定時器1選擇工作方式1
        TH1 = 0x4C;  //設(shè)置初始值,定時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;         //設(shè)置初始值,定時50ms
        TL1 = 0x00;  
        i++;
}
回復(fù)

使用道具 舉報

地板
ID:164602 發(fā)表于 2019-3-1 12:57 | 只看該作者
中斷函數(shù),是不能被調(diào)用的,只有中斷后,單片機(jī)自動調(diào)用。
從你的程序上看,中斷函數(shù)中的for是多余的——去掉吧,保留賦初值,加一語句i++。但主函數(shù)中的if有問題,應(yīng)該為
if (i>=20)
回復(fù)

使用道具 舉報

5#
ID:473159 發(fā)表于 2019-3-1 14:08 | 只看該作者
中斷要分外部中斷與定時器中斷,兩種都能用for ,外部用一般延時for,定時用定時標(biāo)志位for
這里有例程:http://www.torrancerestoration.com/bbs/dpj-145685-1.html

評分

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

查看全部評分

回復(fù)

使用道具 舉報

6#
ID:482529 發(fā)表于 2019-3-1 14:32 | 只看該作者
HC6800-ES-V2.0 發(fā)表于 2019-3-1 12:57
中斷函數(shù),是不能被調(diào)用的,只有中斷后,單片機(jī)自動調(diào)用。
從你的程序上看,中斷函數(shù)中的for是多余的—— ...

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

使用道具 舉報

7#
ID:482783 發(fā)表于 2019-3-1 15:51 | 只看該作者
中斷后會返回到進(jìn)入中斷的地方繼續(xù)執(zhí)行
回復(fù)

使用道具 舉報

8#
ID:164602 發(fā)表于 2019-3-2 13:47 | 只看該作者
51童小白 發(fā)表于 2019-3-1 14:32
你好,請問若一個主函數(shù)中的while(1)中若有多個語句A B C D...,CPU中斷返回后從此循環(huán)的哪一句開始執(zhí)行 ...

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

使用道具 舉報

9#
ID:276415 發(fā)表于 2019-3-2 14:52 | 只看該作者
自己找一下中斷的位置,main函數(shù)也要看看
回復(fù)

使用道具 舉報

10#
ID:483252 發(fā)表于 2019-3-2 15:26 | 只看該作者
你的函數(shù)不需要for
回復(fù)

使用道具 舉報

11#
ID:311744 發(fā)表于 2019-3-2 17:01 | 只看該作者
大哥,中斷就是打斷這個mian里面的執(zhí)行然后直接處理中斷,你程序那樣寫,定期器到了,i永遠(yuǎn)是21,然后處理完出來,去main里面,i肯定不會翻轉(zhuǎn)。。。。失去任何意義
回復(fù)

使用道具 舉報

12#
ID:483375 發(fā)表于 2019-3-2 19:08 | 只看該作者
按理來說可以的循環(huán)結(jié)構(gòu)本來就是順序結(jié)構(gòu)的更優(yōu)越表示方法...
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表