打印

为什么会进入中断

[复制链接]
1889|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
2001myp|  楼主 | 2009-5-11 11:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
se, AC, FOR, ui, TE
#include <REG51.H>    
#define uchar unsigned char
#define uint unsigned int
uchar code SEG7[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar ACT[4]={0xfe,0xfd,0xfb,0xf7}; 
uint ms,i;    
bit bdata bitflag;            
/**************************************************/
void delay(uint k)                
{                            
  uint data l,j;                    
    for(l=0;l<k;l++)            
    {                        
    for(j=0;j<121;j++){;}        
    }                        
}
/****************************/
void initial(void)        
{
  for(i=0;i<100;i++)        
   {
   P1=SEG7[ms/1000];    
   P2=ACT[0];
   delay(1);                            
   P1=SEG7[(ms%1000)/100];
   P2=ACT[1];
   delay(1);
   P1=SEG7[((ms%1000)%100)/10];
   P2=ACT[2];
   delay(1);
   P1=SEG7[((ms%1000)%100)%10];
   P2=ACT[3];
   delay(1);
             }                        
    TMOD=0x02;            
    TH0=0x77;            
    TL0=0x77;            
    IE=0x00;                
    TR0=1;                    
    EX0=1;                    
    IT0=1;                    
    EA=1;    
    bitflag=0;                
}

/*************************************************/    
void main(void)            
{ ms=0;      
  initial(); 
    for(;;)                                
  { while(!TF0);    
     ms++; 
     TF0=0; 
     if(ms>9999) 
     {
      ms=0;
           }                            
      }            
}    
/************************************************/
void extern_int0(void) interrupt 0 using 0    
{                                
   for(;;)
  {
   P1=SEG7[ms/1000];    
   P2=ACT[0];                            
   P1=SEG7[(ms%1000)/100];
   P2=ACT[1];
   P1=SEG7[((ms%1000)%100)/10];
   P2=ACT[2];
   P1=SEG7[((ms%1000)%100)%10];
   P2=ACT[3];
    }        
}    


上面这个小程序,我本意是让它初始化显示个1秒 0000,然后显示0保持不变。
我在INT0脚接了个1K的下拉电阻,平时是低的,一旦外面给了个脉冲,则下降沿有效,进入中断,并且实时显示此时的MS值。
但现在的问题是,一打开就进入中断。。。为什么我知道呢,因为我把中断的那段去掉就可以正常初始化,但一加上中断就无条件进入中断。我测量12脚INT0也是低电平啊,为什么呢。

相关帖子

沙发
lyjian| | 2009-5-11 12:40 | 只看该作者

允许中断前先把中断标志清零

使用特权

评论回复
板凳
2001myp|  楼主 | 2009-5-11 13:58 | 只看该作者

谢谢楼上高手,不过我试过了

谢谢指点,不过我试过了,我把INT0脚初状态置零,依然不行

使用特权

评论回复
地板
2001myp|  楼主 | 2009-5-11 16:21 | 只看该作者

自己顶一下,希望高手看到

使用特权

评论回复
5
emailli| | 2009-5-11 16:36 | 只看该作者

你允许了多个中断源,而只有一个中断处理程序。

这个原因导致的

具体可以给出分析,不过时间有限,先自己分析一下

为什么使能了多个中断源,仅仅给出一个中断处理程序,会导致不停的进入中断。

使用特权

评论回复
6
twz8858877| | 2009-5-11 16:56 | 只看该作者

RE

插一句清中断标志位IE0=0; ,而且要放在IT0=1后面,51上电默认低电平触发中断,由于外部下拉,此时中断标志位IE会被置起,在IT0=1之前是清不掉的
    

使用特权

评论回复
7
孤星119| | 2009-5-11 17:09 | 只看该作者

同意楼上

使用特权

评论回复
8
2001myp|  楼主 | 2009-5-12 07:37 | 只看该作者

谢谢楼上,我试下子

谢谢楼上,另外回一下5楼前辈我只开了定时0中断和外中断,另外定时0中断我用的工作方式是自动载入预置数据的,不需要重新装载,所以中断程序只有外部0中断一个

使用特权

评论回复
9
2001myp|  楼主 | 2009-5-12 08:02 | 只看该作者

再有问题送上

照楼上两位前辈的意见,我加了句IE0=0;,结果进不去中断程序了啊,我希望的结果是进入中断后就可以了,不用再跳回主程序。
呵呵惭愧,期待解释。

使用特权

评论回复
10
twz8858877| | 2009-5-12 08:55 | 只看该作者

下降沿触发

加触发信号才能进

使用特权

评论回复
11
孤星119| | 2009-5-12 09:16 | 只看该作者

LZ调的这么辛苦,就因为INT0是外接下拉电阻,

换成上拉把,什么问题都省了.

使用特权

评论回复
12
2001myp|  楼主 | 2009-5-12 09:40 | 只看该作者

回复一下

10楼前辈,我就是给的下降沿,结果进不去了,11楼前辈,能解释下么,为什么上拉电阻就可以了,下拉电阻我给个高电平一样可以拉高啊

使用特权

评论回复
13
twz8858877| | 2009-5-12 10:40 | 只看该作者

RE

“我把INT0脚初状态置零”,如果有这一句,把它干掉,P3=0XFF,然后外加高电平,再移开高电平,直接加高电平得到的是上升沿

使用特权

评论回复
14
emailli| | 2009-5-12 10:41 | 只看该作者

不需要重装定时器的值。

但是你使能了其中断

那么,还是需要中断处理程序的

哪怕你的中断处理程序什么都不做(C语言不做事情,不等于没有用)

也是有用的,至少在汇编里面有一个叫做RETI的会用到

没有这个RETI,你使能了定时器中断,那么就会继续执行到,然后遇到RETI位置

也就意味着你的程序会不停的进入 外部中断了

不知道你是否理解了。

如果还不理解,我再发帖详细回复

使用特权

评论回复
15
2001myp|  楼主 | 2009-5-12 14:58 | 只看该作者

回楼上前辈

看来现在问题的关键处就在下面
TMOD=0x02;            
    TH0=0x77;            
    TL0=0x77;            
    IE=0x00;                
    TR0=1;                    
    EX0=1;                    
    IT0=1;                    
    EA=1;    
在中断开放初始化这段程序中,我把标志位清零。导致的结果就是正常初始化,但初始化完成后怎么都进入不了外中断0了。我试过给高电平了,我把电源脚和INT0脚短路后在放开,总该有个下降沿了啊,不明白为什么不进入中断呢,明明设的中断有效
另外回emailli,您说的中断我只用了两个,一个定时0中断,一个外部中断,而我直接用,我觉得不需要写中断处理程序。还请指点。

使用特权

评论回复
16
emailli| | 2009-5-12 22:57 | 只看该作者

你难道就不能写一个定时器0的中断处理程序吗?

哪怕啥都不做也行啊。

一旦你使能了一个中断,就必须有配套的中断程序,这个是有原因的。

我想你先用两天时间自己思考一下为什么吧。

这个应当从汇编的角度来考虑。

仔细看看汇编里面对于中断的处理过程,你就能明白我所说的是什么了。

两天以后,如果你还不明白,再问我为什么把。

使用特权

评论回复
17
2001myp|  楼主 | 2009-5-13 14:49 | 只看该作者

谢谢楼上前辈

我去试试,那我就执行个空语句,看看行不行,谢谢EMAIL

使用特权

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

本版积分规则

59

主题

210

帖子

0

粉丝