1.简介

 
2.超声波的时序图

3.基于51单片机实现的代码
#include "reg52.h"
#include "intrins.h"
sbit  led1=P3^7;//小于10,led1亮,led2灭
sbit  led2=P3^6;//否则,led1灭,led2亮
sbit  trig=P1^5;
sbit  echo=P1^6;
void Delay10us()		//@11.0592MHz
{
	unsigned char i;
	i = 2;
	while (--i);
}
void Delay200ms()		//@11.0592MHz
{
	unsigned char i, j, k;
	_nop_();
	i = 2;
	j = 103;
	k = 147;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}
void Timer0Init(void)		//100微秒@11.0592MHz
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0;		//设置定时初值
	TH0 = 0;		//设置定时初值
	
//	TR0 = 1;		//定时器0开始计时
}
void startHC()
{
  trig=0;
  trig=1;
  Delay10us();
  trig=0;
}
void main()
{
	double time;
	double dis;
	Timer0Init();
	 while(1)
	 {
	 Delay200ms();//因为没有晶振,需要延时200ms
	 startHC();//超声波初始化
	 while(echo==0);
	 TR0 = 1;//开启定时器,记录高电平时长
	 while(echo==1);
	 TR0 = 0;//关闭定时器
	 time=(TH0*256+TL0)*1.085;//1.085微秒
	 dis=time*0.017;//转化为微秒/cm
	 if(dis<10)
	 {
	  led1=0;
	  led2=1;
	 }
	  else
	 {
	  led1=1;
	  led2=0;
	 }
	TL0 = 0;		//重新设置定时初值,方便下一次测距
	TH0 = 0;
	 }
}
 
                


















