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]