搜索
bottom↓
回复: 5

超声波距离探测器发射完12个40KHz的波之后延时2微秒,然后一开中断就被触发,显示的数值

[复制链接]

出0入0汤圆

发表于 2008-10-29 02:20:42 | 显示全部楼层 |阅读模式
我买了一个超声波距离探测器的成品。想自己用C编程测距,现在遇到以下问题:

1,发射完12个40KHz的波之后延时2微秒,然后一开中断就被触发,显示的数值和我设定延时的时间有关。

2,我发的波结束时有震荡,而原版的没有。

3,我发射12个20KHz的波,结束时没震荡,而且可以测距30厘米左右。

因为硬件肯定没有问题,所以肯定是我软件的问题。

还请指教!!

 #include "reg51.h"

#include<absacc.h>

#include<stdio.h>

#include<intrins.h>



#define uchar unsigned char

#define uint  unsigned int

#define ulong unsigned long

#define c 344







sbit port_ex0=P3^2;

sbit p33=P3^3;

sbit p34=P3^4;



uchar T[6]=0x00;

ulong  s=0;

uint   time=0;

uchar emitter;

uchar overtop;

uchar m=0;

uchar d=0;

uchar receiver;







void DelayMs(uchar dlyms)

{

    uchar  i;

        uint j=50;



        for(i=0; i<dlyms; i++)

        {

           j=107;

       while(j--) ;  

        }

}





void Delay1(uint j)//延时100US

{

uint m;

for(;j>0;j--)

{

for(m=0;m<=76;m++)

{;}

} 

} 





void Delay(uint j)//延时

{

uint m;

for(;j>0;j--)

{

for(m=0;m<=124;m++)

{;}

}

}



void Senddata(uchar Data)

{

SBUF=Data;

while(TI==0);

TI=0;

}















Distance_detect(void) interrupt 2 //受到中断后的测距处理

{    

     

    uchar i=0;

    TR0=0;EX1=0;

     receiver=1;

     Senddata(0xbb);//发个BB这样在显示器上好把每次显示的值分开

         

     time=((uint)TH0<<8)|((uint)TL0);

     s=(ulong)time ;

     s*=17;

     s=s/1000;

     s=s-4;//误差修正

     T[0]=(s%1000)/100;

     T[1]=(s%100)/10;

     T[2]=s%10;



     for(i=0;i<3;i++)

      Senddata(T);

      TH0=0x00;

      TL0=0x00;

      receiver=1;

         

        

     

    

   

}







void send_40()//发射超声波12个,这里TH1=0xf3;所以每半个周期是12微秒,加上for语句的时间,周期约为40KHz。接收是CX20106A,发射是中周。

{

 uchar i;

 

 ES=0;

 

 for(i=0;i<24;i++)

 {

  do{ } while(!TF1);//查询等待TF1置位

  port_ex0=!port_ex0;  //定时反向

  

  TF1=0;   //软件清TF1

 

 }

 TH1=0xf3; 

 ES=1;

 

}







 

serial(void)  interrupt 4  

{

if(RI)

{ 

   RI=0;

   m=SBUF;

   

}

}



void instate()//初始化

{



port_ex0 = 1;

receiver=0;

emitter=0;

overtop=1;



TMOD=0x21;



TH0=0x00;

TL0=0x00;



TH1=0xf3;   //波特率4800

PCON=0x80;        //SMOD=1



SCON=0x40;        //串口工作方式1

REN=1;//允许串口接收

TR0=0;

TR1=1;

IT1=1;//负跳变触发   

EA=1;//cpu开放总中断

EX1=0;//禁止允许外部中断1

ES=1;//允许串口中断







}



       

             

          











void main()

{

uchar j;

instate();

  for(;;)

  {

     // m=0x01;Delay(800);

     

     if(m==0x01)

          {receiver=0;m=0x00;

      TH0=0;TL0=0;



        

           

           

       send_40();

        



      TR0=1;

      Delay1(20);

      

      EX1=1;



      DelayMs(400);

          

      if(receiver==0)

      Senddata(0xff);//没接到回波,测距失败。

         }

  }

            

}

出0入0汤圆

发表于 2009-3-18 22:11:37 | 显示全部楼层
会不会是等待余波的时间太短了啊?我看到别人用51做这个的时候等待余震的时间都在ms级别的啊。

出0入0汤圆

发表于 2009-3-19 11:22:09 | 显示全部楼层
以前做过超声波测距. 我记得是2ms的余震等待. 测距范围是 0.5m ~ 16m  1%的误差范围

出0入0汤圆

发表于 2009-3-23 13:00:44 | 显示全部楼层
自己干扰呢?》

出0入0汤圆

发表于 2009-3-23 22:12:04 | 显示全部楼层
超声波传感器是40KHZ的么?

出0入0汤圆

发表于 2009-3-23 23:31:08 | 显示全部楼层
余波,电路做得好,也要至少等1ms
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-8 07:33

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表