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;
}
}