为什么边沿触发的外部中断一打开就触发了?

2020-02-05 09:17发布

本帖最后由 haohouse 于 2012-5-23 08:16 编辑

传统的非门+CX20106A做超声测距,CX20106A第7脚接STC89C52外部中断0,边沿触发方式,为什么每次一打开外部中断就会触发呢?
网上有人说IE0要清零我也做了啊。

电路图按照经典方法接的,就不贴了。

主要程序如下,22.1184M的晶振,T0用于测距计时,T1用于发射40KHZ方波,外部中断用于检测CX20106A的下降沿输出
void main()
{
        TL1=234        TH1=234;
        TMOD = 0x21;      /*  设CTC1工作于模式2 */
        ET0 = 0;          /* 不允许CTC0中断  */
        EX0 = 0;
        IP=0x01;        /*  置外部中断INT0优先级为高   */
        TCON=0;                /*  设置外部中断0的中断方式为电平触发  */
        IT0 = 1;        //         设置为边沿触发
        CLflag=1;                         /*    测量标志    */
        cshu=0;                          /*  传数 */
        delay(200);             /*延时*/
        IE=0x80;                           /* 开中断  */
        ET1=1;       ET0=1;
        TR1=0;       TR0=0;

        while(1)
        {
                CLflag=0;
                cshu=0;
                EX0=0;
                TL1=234;
                TH1=234;
                TL0 = 0;
                TH0 = 0;                                        /*  定时器0的初始时间 */
                VOLCK=0;  // 发射端置低电平
                TR1=1;                                        /*  启动定时器1,发送信号  */
                while(cshu<8);                        // 发射4个周期,占空比50%                        
                TR1=0;
                TR0=1;                                   /*  启动定时器0,开始记时  */
                delay(100);  // 等待一段时间再开外部中断0,结果EX0一开就触发了,测到的时间就是这个等待时间,求解啊                               
                IE0 = 0;  //标志清零了再开中断,也没用
                EX0 = 1;
        }
}

void serve_INT0( ) interrupt 0
{
        /*  外部中断0,用于检测接收信号  */
        TR0=0;       /*  关闭定时器0 */
        EX0=0;       /* 关中断  */
       
        time=(long)TL0;
        time+=(long)TH0*256;
        CLflag=1;
        TH0=0;
        TL0=0;
}

void CTC0_INT (  )   interrupt  1
{
        TR0=0;
        ET0=0;
}

/*  CTC1中断服务程序,12.5us 中断一次,用于发射  */
void CTC1_INT (  )   interrupt  3
{
        VOLCK=~VOLCK;
        cshu++;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。