翔飞云端 发表于 2012-11-7 23:41:51

SRF05超声波传感器所遇到的问题 求解答

如图   看不到图请下载附件   第一次发帖 排版不好 大家见谅

问题 1. 前一次检测完成至后一次检测开始最少等待10ms   这10ms作用是什么?我在程序中将这10ms改动也没什么影响

问题 2. SRF05每50ms发射一次信号即每秒20次。等到下次发射你要等50ms,即使SRF05检测到一个很近的物体那么反射信号会变短。这是为了保证超声波的“声音”逐渐消失而不会在下次测量时引起一个错误的反射信号。资料上的。 程序中怎么体现这点?

3. 资料:给发射端至少10us的脉冲就开始测距。SRF05发送以40KHz发送一组包括8个脉冲的超声波并且使反射接收端为高电平。然后它等待反射,一接收到反射信号就将反射接收端置低。因此一个脉冲的宽度和反射接收端与物体的距离成正比例。根据时序图脉冲可以计算测量距离以厘米或英尺为单位。如果没有接收到反射信号SRF05会在30ms以后将接收端置低。
   超声波说明书:有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。

   疑问一:超声波模块自动发送8个40KHZ的方波后,是等待有信号返回时才将ECHO置高,高电平持续时间即为从发射到返回的时间。还是发送8个40KHZ的方波后,紧跟着将接收端置高,有信号返回是时,接收端置 低,从置高到置低的时间即为从发射到返回的时间?

   疑问二:如果没有信号返回如何?资料上写在没信号返回时SRF05会在30ms以后将接收端置低。

   SRF05的测距范围有实验过的说下

程序: 用诺基亚5110显示

#include <reg51.h>

sbit    sclk =   P0^0;      //时钟
sbit    sdin =   P0^1;      //数据
sbit    dc   =   P0^2;      //1写数据,0写指令
sbit    sce=   P0^3;      //片选
sbit    res=   P0^4;      //复位,0复位

sbit    Trig =   P1^0;          //超声波输入
sbit    Echo =   P3^2;          //超声波输出
       
unsigned longtimeH, timeL, time;
unsigned char    t, m, n;

void delay(void)   //20us 误差 -0.46875us
{
    unsigned char a,b;
    for(b=3;b>0;b--)
      for(a=1;a>0;a--);
}
void delayms(char x)        //x ms延迟程序
{
        char i,j;
        for(i=x;i>0;i--);
                for(j=110;j>0;j--);                                  
}


unsigned char code shuzi[]={

0x00,0xF8,0x04,0x02,0x02,0x04,0xF8,0x00,0x00,0x03,0x04,0x08,0x08,0x04,0x03,0x00,        //"0",0

0x00,0x04,0x04,0xFE,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x0F,0x08,0x08,0x00,0x00,        //"1",1

0x00,0x1C,0x02,0x02,0x82,0x62,0x1C,0x00,0x00,0x0C,0x0A,0x09,0x08,0x08,0x0C,0x00,        //"2",2

0x00,0x0C,0x02,0x22,0x22,0x52,0x8C,0x00,0x00,0x06,0x08,0x08,0x08,0x04,0x03,0x00,        //"3",3

0x00,0xC0,0x30,0x08,0x04,0xFE,0x00,0x00,0x00,0x01,0x01,0x09,0x09,0x0F,0x09,0x00,        //"4",4

0x00,0x7E,0x42,0x22,0x22,0x42,0x82,0x00,0x00,0x06,0x08,0x08,0x08,0x04,0x03,0x00,        //"5",5

0x00,0xF8,0x44,0x22,0x22,0x46,0x80,0x00,0x00,0x03,0x04,0x08,0x08,0x04,0x03,0x00,        //"6",6

0x00,0x0E,0x02,0xC2,0x32,0x0E,0x02,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,        //"7",7

0x00,0x1C,0xA2,0x42,0x42,0xA2,0x1C,0x00,0x00,0x07,0x08,0x08,0x08,0x08,0x07,0x00,        //"8",8

0x00,0x38,0x44,0x82,0x82,0x44,0xF8,0x00,0x00,0x00,0x0C,0x08,0x08,0x04,0x03,0x00,        //"9",9

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x00,      //".",10
       
};



unsigned char code hanzi[]=
{

0x00,0x00,0xFE,0x02,0x02,0xFA,0x4A,0x4A,0x4A,0xFA,0x4A,0x4A,0x4A,0xFA,0x02,0x00,
0x80,0x60,0x1F,0x00,0x80,0x93,0x92,0x92,0x92,0xFF,0x92,0x92,0x92,0x93,0x80,0x00,        //"厘",0

0x00,0x40,0x42,0x44,0x58,0x40,0xC0,0xFF,0xC0,0x40,0x50,0x48,0x46,0x40,0x00,0x00,
0x20,0x20,0x10,0x08,0x04,0x03,0x00,0xFF,0x00,0x03,0x04,0x08,0x10,0x20,0x20,0x00,        //"米",1


0x40,0x48,0x48,0x48,0xFF,0x48,0x48,0x42,0xA2,0x9E,0x82,0xA2,0xC2,0xBE,0x00,0x00,
0x80,0x60,0x1F,0x20,0x7F,0x44,0x44,0x40,0x4F,0x48,0x48,0x48,0x48,0x4F,0x40,0x00,        //"超",2

0x00,0x00,0x7C,0x40,0x40,0x40,0x40,0xFF,0x40,0x40,0x40,0x40,0xFC,0x00,0x00,0x00,
0x00,0x7C,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0xFC,0x00,0x00,        //"出",3
};

void delay_1ms(void)//1ms延时函数
{
        unsigned int i;
        for (i=0;i<500;i++)          ;
;
}

/*--------------------------------------------
LCD_write_byte: 使用SPI接口写数据到LCD
输入参数:dt:写入的数据;
command :写数据/命令选择;
编写日期:20080918
----------------------------------------------*/
void LCD_write_byte(unsigned char dt, unsigned char command)
{
        unsigned char i;
        sce=0;       
        dc=command;       
        for(i=0;i<8;i++)
        {
                if(dt&0x80)
                        sdin=1;
                else
                        sdin=0;
                dt=dt<<1;               
                sclk=0;                
                sclk=1;
        }       
        dc=1;       
        sce=1;       
        sdin=1;
}
/*---------------------------------------
LCD_init: 3310LCD初始化
编写日期:20080918
-----------------------------------------*/
void LCD_init(void)
{
        res=0;       
        delay_1ms();
        res=1;
        LCD_write_byte(0x21,0);//初始化Lcd,功能设定使用扩充指令
        LCD_write_byte(0xd0,0);//设定液晶偏置电压
        LCD_write_byte(0x20,0);//使用基本指令
        LCD_write_byte(0x0C,0);//设定显示模式,正常显示
}
/*-------------------------------------------
LCD_set_XY: 设置LCD坐标函数
输入参数:X:0-83Y:0-5
编写日期:20080918
---------------------------------------------*/
void LCD_set_XY(unsigned char X, unsigned char Y)
{
        LCD_write_byte(0x40 | Y, 0);// column
        LCD_write_byte(0x80 | X, 0);// row
}
/*------------------------------------------
LCD_clear: LCD清屏函数
编写日期:20080918
--------------------------------------------*/
void LCD_clear(void)
{
        unsigned char t;
        unsigned char k;
        LCD_set_XY(0,0);
        for(t=0;t<6;t++)
        {
                for(k=0;k<84;k++)
                {
                        LCD_write_byte(0x00,1);
                               
                }
        }
}
/*---------------------------------------------
LCD_write_shu: 显示8(宽)*16(高)点阵列数字字母符号等半角类
输入参数:c:显示的字符;
编写日期:20080918
-----------------------------------------------*/
void LCD_write_shu(unsigned char row, unsigned char page,unsigned char c) //row:列 page:页 dd:字符
{
        unsigned char i;       
       
        LCD_set_XY(row*8, page);// 列,页
        for(i=0; i<8;i++)
        {
                LCD_write_byte(shuzi,1);
        }
       
    LCD_set_XY(row*8, page+1);// 列,页
        for(i=8; i<16;i++)
        {
                LCD_write_byte(shuzi,1);
        }              
}
/*---------------------------------------------
LCD_write_hanzi: 显示16(宽)*16(高)点阵列汉字等半角类
输入参数:c:显示的字符;
编写日期:20080918
-----------------------------------------------*/
void LCD_write_hanzi(unsigned char row, unsigned char page,unsigned char c) //row:列 page:页 dd:字符
{
        unsigned char i;       
       
        LCD_set_XY(row*8, page);// 列,页
        for(i=0; i<16;i++)
        {
                LCD_write_byte(hanzi,1);
        }
       
    LCD_set_XY(row*8, page+1);// 列,页
        for(i=16; i<32;i++)
        {
                LCD_write_byte(hanzi,1);
        }       
}

void INT0_ () interrupt 0               //外部中断0 用作判断回波电平
{
               t = 1;                                          //测试成功标志位
        TR1 = 0;                                 //关闭定时器1
        if((TH1*256+TL1)<=30000)         //判断是否超出测距范围30ms

        {

                      time = TH1 * 256 + TL1;
                      time *= 0.17;
                      m = 0;                        //汉字   厘
               n = 1;                        //汉字   米
         }
        else
                {
                     time = 0;                     //将显示清零
            m = 2;                        //汉字   超
            n = 3;                           //汉字   出
         }                                                    
}
void TF1_() interrupt 3               //定时器1 用作超声波测距计时超出清零
{
       
      TH1 = 0x00;
      TL1 = 0x00;
      TR1 = 0;
      t = 1;
      m = 2;                        //汉字   超
   n = 3;                           //汉字   出
}
voiddisplay()                        //显示数据转换程序
{
        unsigned char mm, ge, shi, bai;
          
        bai = time / 1000;
        shi = (time / 100) % 10;
        ge = (time % 100) / 10;
        mm = (time%100)%10;

        LCD_write_hanzi(6,2,m);                     //m=0时 厘 =2 超
        LCD_write_hanzi(8,2,n);                        //n=1时 米 =3 出

        LCD_write_shu(5,2,mm);                  //豪米
        LCD_write_shu(4,2,10);                        //小数点
        LCD_write_shu(3,2,ge);                  //个位
        LCD_write_shu(2,2,shi);                       //十位
         LCD_write_shu(1,2,bai);                  //百位
}

voidcontrol()
{

                t = 0;                                  //测试成功标志
           TH1 = 0x00;
        TL1 = 0x00;                //初始化定时器1
        Trig = 0;                              //拉低发送
        EX0 = 0;                              //关闭外中断0
        TR1 = 0;                              //关闭定时器1
        Trig = 1;                              //输出置高
        delay();                              //20us的高电平输出
        Trig = 0;                              //关闭发送
        while(Echo == 0);               //等待接收端置高
        EX0 = 1;                              //打开外中断0
        TR1 = 1;                              //开启定时器1
        while(t == 0);
                TR1 = 0;
        EX0 = 0;
               
}

main()
{       
        unsigned char k;
        res = 0;
        for(k=0;k<250;k++);
        res = 1;
        EA = 1;                               //开启总中断
        TMOD = 0x10;                     //定时器1 工作方式
        IT0 = 0;                              //下沿触发方式 INT0由高电位置为低电位时即为外部中断
        ET1 = 1;                           //定时器1控制器
       
        LCD_init();                           //初始化LCD模块
        LCD_clear();                         //清屏幕       
       
       
        while(1)
        {
                              control();
                display();
                delayms(10);             //即问题1   等到下次发射你要等10ms    改动此处延迟 没发现对程序有影响               
        }
}
页: [1]
查看完整版本: SRF05超声波传感器所遇到的问题 求解答