打印
[其他ST产品]

请教大家51单片机一个中断问题

[复制链接]
1184|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tianlu200808|  楼主 | 2014-10-20 22:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void tim1_isr (void) interrupt 3 using 1//定时器1中断服务函数
{
  irtime++;
}
/*************************************************************/
//外部中断1解码程序
void ex1_isr (void) interrupt 2 using 2//外部中断1服务函数
{
    static uchar i,p,z;
    static bit startflag;
    TR1=1;                                          //定时器1开启
    if(startflag)
    {        
        if(irtime<100&&irtime>=53)//引导码 TC9012的头码
        {
            i=0;
            p=1;
            z=0;
            irdata[i]=irtime;
            irtime=0;
        }
        z++;
        if(z>=18)
        {
            irdata[p]=irtime;
            irtime=0;
            p++;
            if(p==17)
            {
                new_code=1;
                p=0;
                                TR1=0;
            }          
        }
        else
            irtime=0;         
        
    }   
    else
    {
        irtime=0;
        startflag=1;
    }
}
这是一个红外解码程序,,外部中断1是下降沿触发,
当进入中断1处理函数后,启动定时器1,startflag =0 执行else语句,irtime = 0; startflag = 1;
退出中断函数,下次再进入中断1函数,由于start是局部变量,startflag 是不是又重新分配存储空间,
startflag的值是不是又变为0了?
还有,如果进入if(startflag)语句,定时器计数,irtime =0,后面的if(irtime<100&&irtime>=53)与if(z>=18)都不执行,进入else  irtime=0; irtime=0,那岂不是if(irtime<100&&irtime>=53)与if(z>=18)永远都不执行了
irtime是全局变量,进外部中断后TR1=1启动定时器1后,程序是怎样运行的,,,
沙发
LOVE_ELEC| | 2014-10-21 10:03 | 只看该作者
本帖最后由 LOVE_ELEC 于 2014-10-21 10:05 编辑

首先,startflag不会重新被分配存储空间,其值就是最后一次执行时的值;
其次,进入中断后你启动了定时器中断,在你下次再次进入中断2时定时器可能已经运行了很长时间,这是irtime的值已经被重写了n次;
不知道是否表述清楚!

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
tianlu200808 + 2
板凳
dingsujie| | 2014-10-21 10:04 | 只看该作者
楼上正解

使用特权

评论回复
地板
tianlu200808|  楼主 | 2014-10-21 22:23 | 只看该作者
LOVE_ELEC 发表于 2014-10-21 10:03
首先,startflag不会重新被分配存储空间,其值就是最后一次执行时的值;
其次,进入中断后你启动了定时器中 ...

嗯 ,谢谢你,我明白了,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

30

帖子

2

粉丝