工作原理:
这里的理解应该是:接受到信号的一瞬间就停止发送,然后高电平持续时间才是超声波一去一来的时间,这样就能说通了
定时器初始化,频率为12MHz,每个计数为1us,(频率越高越精确)
最大计数值为65535,溢出时间为1us*65536=65.536ms=0.0655363
一个计数周期可以测距0.0655363 * 340 (m/s) / 2= 11.14112m
2.该测量距离以远超模块最大量程,因此不需要中断累计溢出次数
#include <REGX52.H>
sbit Trig=P1^2;
sbit Echo=P1^3;
sfr AUXR=0x8e;
void Delay10us() //@11.0592MHz
{
unsigned char i;
i = 2;
while (--i);
}
void Delay1ms(unsigned char xms) //@12.000MHz
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
void fengmingqi()//蜂鸣器
{
unsigned int i;
for(i=0;i<=500;i++)
{
P2_5=~P2_5;
Delay1ms(1);
}
}
void TTL()//发送信号发出,一个10us的电平
{
Trig=0;
Trig=1;
Delay10us();
Trig=0;
}
void Timer0Init()//定时器初始化
{
AUXR&=0x7F;
TMOD=0x01;
TL0=0x00;
TH0=0x00;
TF0=0;
TR0=0;
}
double distance()
{
TL0=0x00;
TH0=0x00;
TTL();
while(Echo==0); //当Echo为1时,开始测量,开启计时
TR0=1;
while(Echo==1);//Echo为0中,测距结束,关闭计时
TR0=0;
return (TH0*256+TL0)*1.085*0.017;//340m/s=34000cm/s-0.034cm/us
}
void main()
{
static double getdistance;
Timer0Init();
fengmingqi();
while(1)
{
getdistance=distance();
if(getdistance<10)
{
P2=0xfe;
fengmingqi();
}
else
{
P2=0xff;
}
}
}