找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6420|回复: 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://www.51hei.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 | 显示全部楼层
按理来说可以的循环结构本来就是顺序结构的更优越表示方法...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表