haohouse 发表于 2012-5-23 08:15:05

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

本帖最后由 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 ()   interrupt1
{
        TR0=0;
        ET0=0;
}

/*CTC1中断服务程序,12.5us 中断一次,用于发射*/
void CTC1_INT ()   interrupt3
{
        VOLCK=~VOLCK;
        cshu++;
}

dosomething 发表于 2012-5-23 09:04:02

初始化开始前关中断

haohouse 发表于 2012-5-23 09:08:40

void main()
{
      TL1=234      TH1=234;
      TMOD = 0x21;      /*设CTC1工作于模式2 */
      ET0 = 0;          /* 不允许CTC0中断*/
      EX0 = 0;

谢谢楼上,可是这已经很靠前了吧

xiaobendan001 发表于 2012-5-23 11:06:40

看看脚上的波形啊

haohouse 发表于 2012-5-23 11:25:48

没示波器啊悲剧,虚拟示波器行不?接声卡的那种。

haohouse 发表于 2012-5-23 12:41:20

最新进展,问题基本解决了,现在可以做一些近距离探测(40CM以内),中间各种改程序和改电路,个人认为主要起作用的2个地方:
1. delay(100)放在开外部中断之后
2. 接收探头正极接的C104不要接地,直接串在正极和CX20106的1脚

但是现在干扰还是很大,而且要T, R 2个探头面对面才比较准,障碍物反射方式干扰很多,测出来的结果很乱,打算调一下CX20106增益看看效果如何。
页: [1]
查看完整版本: 为什么边沿触发的外部中断一打开就触发了?