基本原理
接线方式:
VCC、trig(控制端)、 echo(接收端)、 GND
trig - P10
echo - P11
基本工作原理:
(1)采用IO口TRIG触发测距,给至少10us的高电平信号;
(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
(3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;
本模块使用方法简单,一个控制口发一个10US以上的高电平,就可以在接收口等待高电平输出.一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离.如此不断的周期测,即可以达到你移动测量的值
补充
①接受到RX==1时候再计数器1计数和发送超声波后立即TR1=1计数的结果差别不大
②超声波部分用到了定时器1,
③定时器1不能打开ET1,中断允许位
不要记忆步骤,记忆思路然后需要用到什么功能再去补充。
方法如下:
写main函数
if(sonic_flag) //①写中断函数
{
sonic_flag=0; //②定义标志位和TX/RX
send_wave(); //③发送超声波
TR1=1;
while((RX==1) && (TF1==0));
TR1=0;
if(TF1==1)TF1=0;
else
{
sonic_time=TH1;
sonic_time <<= 8;
sonic_time |= TL1;
sonic_distance=(unsigned int)(sonic_time*0.018);//为什么是乘0.018
}
TL1=0;
TH1=0;
smg_distance[5]=smg_duan[sonic_distance/100];
smg_distance[6]=smg_duan[sonic_distance%100/10];
smg_distance[7]=smg_duan[sonic_distance%10];
}
①中断函数
void Timer0_Interrupt() interrupt 1 using 1
{
static int key_count=0,smg_count=0,i=0,sonic_count=0;
key_count++;smg_count++;sonic_count++;
if(key_count==10) //10ms interrupt1
{
key_count=0;
key_flag=1;
}
if(smg_count==3) //3ms interrupt1
{
smg_count=0;
P2=0xc0;P0=0;P2=0;
P2=0xe0;P0=~smg_distance[i];P2=0;
P2=0xc0;P0=smg_wei[i];P2=0;
i++;
if(i==8) i=0;
}
if(sonic_count==50) //这一部分是本次写的
{
sonic_count=0;
sonic_flag=1;
}
}
②定义标志位和TX/RX
bit sonic_flag;
u16 sonic_distance,sonic_time;
③发送超声波
void send_wave(void)
{
u8 i;
for(i=0;i<2;i++)
{
TX=1;
Delay12us();
TX=0;
Delay12us();
}
}
④定时器1如何写
一定要写成12T模式而且不能打开ET1
超声波部分也就是只计时并不中断,所以不用打开ET1
void Timer1Init(void) //1毫秒@11.0592MHz
{
AUXR &= 0xBF; //12T
TMOD |= 0x00; //设置定时器模式
TL1 = 0; //设置定时初值
TH1 = 0; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 0; //定时器1开始计时
}