关于中断程序的问题


正在学习中断,写了个程序,实现目的:
有外部中断P3.2时点亮P1.0
无中断时数码管一,循环显示0-F.
 不知道为什么我按下P3.2时,有中断,这时P1.0也点亮了,但是这时数码管还是循环显示,只是循环显示的延时明显加长了,松开按钮P1.0灭,循环正常.

请问我程序哪里有错?

INT.rar
(2008-07-16 13:14:25, Size: 35 KB, Downloads: 4)


我也来说两句 查看全部回复

最新回复

  • budhy (2008-7-16 14:26:50)

    QUOTE:

    原帖由 fzpxp 于 2008-7-16 13:14 发表
    正在学习中断,写了个程序,实现目的:
    有外部中断P3.2时点亮P1.0
    无中断时数码管一,循环显示0-F.
     不知道为什么我按下P3.2时,有中断,这时P1.0也点亮了,但是这时数码管还是循环显示,只是循环显示的延时明显加长了,松开按钮P1.0灭,循环正常.

    请问我程序哪里有错? ...
    哪儿也没错,就是你设计目标不明确。

    给你修改了,自己看看。

    EXT0-INT.rar
    (2008-07-16 14:26:50, Size: 21.5 KB, Downloads: 3)

  • fzpxp (2008-7-16 15:49:24)

    运行您的程序一点问题都没有,我对比了一下才发现中断程序中,有延时就一切正常
    void zhongduan() interrupt 0
    {D1=0;
       delay(200);

    }
    如果没有delay(200);这句就会象我第一次提的问题那样:
    虽然已经中断(D1亮了),但是数码管没有停止循环,他还在循环,只是比没中断前循环的慢了,还是想不明白,延时会影响到什么?
  • budhy (2008-7-18 18:32:25)

    QUOTE:

    原帖由 fzpxp 于 2008-7-16 15:49 发表
                                                                                                                                                                                                                                    运行您的程序一点问题都没有,我对比了一下才发现中断程序中,有延时就一切正常
    void zhongduan() interrupt 0
    {D1=0;
       delay(200);

    }
    如果没有delay(200);这句就会象我第一次提的问题那样:
    虽然已经中断(D1亮了),但是数码管没有停止循环,他还在循环,只是比没中断前循环的慢了,还是想不明白,延时会影响到什么?
    delay(200)是防止中断程序屡次运行。当中断程序屡次运行时就发生你原本的现象。
  • fzpxp (2008-7-26 09:45:51)

    能从原理上分析一下吗?delay(200)是怎么防止中断程序屡次运行的吗?中断源一直存在(按钮一直保持闭合),应该是不管有没有延时中断程序都在屡次执行啊,
  • liaoguobao00 (2008-8-02 12:51:37)

    你的意思是有外部中断P3.2时点亮P1.0,同时停止数码管显示,无中断时数码管循环显示0-F,同时灯灭吧.
            3楼说法不是问题的本质,应该在主程序中加一句IT=1;这句的意思是下降沿触发,所以当你按下开关不放时也只有一次下降沿,程序只中断一次,数码管保持显示不变,灯亮,当再点一次开关时,灯灭,数码管接着循环显示。
    程序如下,只改了很细微的地方,用心看哦!
    #include<reg52.h>
    #define uint unsigned int
    #define        uchar unsigned char
    uchar code seg[]=
    {0xC0,0xF9,0xA4,0xB0,
    0x99,0x92,0x82,0xF8,
    0x80,0x90,0x88,0x83,
    0xC6,0xA1,0x86,0x8E};
    sbit D1=P1^0;
                                   
    void delay(uint i)
    { uint j;
      for(i;i>0;i--)
         for(j=50;j>0;j--);
    }       
    bit j;
    void xunhuan()
    {     uint i;
         
              P2=0x01;
              for(i=0;i<16;i++)
                 {if(j==0){
                               P0=seg;
                             delay(500);}
                     }
    }                                                                                                                                                                       

    void zhongduan() interrupt 0
    {
               D1=~D1;
    j=~j;
    }

    void main()
    {  D1=1;
       EA=1;
       IT0=EX0=1;

       P0=0xFF;
       while(1)
       {
                       xunhuan();
                         
       }

    }
  • fzpxp (2008-8-12 11:13:04)

    谢谢6楼,您的程序是用脉冲中断实现的,如果IT0=0,保持信号应该也可以实现吧?
    另外每次中断出现j变一次位,也就是每隔一个中断周期,给数码管赋值一次,这样不对吧?