to2010 发表于 2010-3-27 20:01:48

stc89c51-诡异-自动进入外部中断

程序如下,本来打算的是外部中断0被触发后执行read_one_word()函数,目前的问题是,中断触发后可以执行read_one_word(),但是中断没有被触发的时候也可以执行read_one_word(),或者说进入不进入中断不受控。目前感觉问题似乎和P2.0引脚有关系,如果将P2.0引脚用导线引出,导线接触开关电源的外壳就能引发中断,但是直接将P2.0接地就不会触发中断。 所以想不通啊,到底为什么呢?


#include <reg52.h>
#include<intrins.h>

sbit TRY    = P1^6;

sbit SCLK= P2^0;
sbit MISO= P2^1;
sbit CS    = P3^2;

bit FINT0;
void int_0();       //外部中断0

unsigned int read_one_word(void);
void DelayMs(unsigned int MS);

void initial();   

void DelayMs(unsigned int MS)
{
unsigned int i;
while(MS--)
{
    for(i = 1000;i!=0;i--);
}
}


void main(){
initial();
while(1){
      TRY=0;         
      
               
      if(FINT0){      //中断0来到要做什么事情
   
   unsigned int SetValue;
   FINT0=0;
   TRY=1;       
   SetValue=read_one_word();

       
}       

      
}       
}
//-------------------------------------------------------------------
void initial(){
EA=1;               // CPU所有中断开(IE最高位MSB)
EX0=1;            // INT0中断开
IT0=0;            // INT0低电平触发(为1则为下降沿触发)
EX1=1;            // INT1中断开
IT1=0;            // INT1低电平触发(为1则为下降沿触发)
return;
}

void int_0() interrupt 0 using 0
{
    FINT0=1;
}

unsigned int read_one_word(void)                              
{                                             
    unsigned int temp=0;
    unsigned int temp1=0;
    unsigned int BitCount=16;
   
    do{
      SCLK=0;
      DelayMs(10);
      SCLK=1;
      DelayMs(10);
      if(MISO)
            temp=temp|0x0001;
      else
            temp=temp&0xfffe;
      if (BitCount-1)
   {
            temp1=temp<<1;
            temp=temp1;
   }
      BitCount--;
    }
    while(BitCount);
    return temp;
}

avr-qq 发表于 2010-3-27 20:46:32

判断一下,是否干扰引起的

to2010 发表于 2010-3-27 23:21:45

没什么干扰啊

而且感觉和那个read_one_word()有关,如果将read_one_word()屏蔽掉,只剩下一个TRY=1(led灯灭),就不会自动进入中断。实在想不通
页: [1]
查看完整版本: stc89c51-诡异-自动进入外部中断