先给出代码,详细讲解后续再出
#include <REGX52.H>
//距离小于10cm,D5亮,D6灭,反之相反现象
sbit D5=P2^7;
sbit D6=P2^0;
sbit Trig=P1^5;
sbit Echo=P1^6;
void Timer0Init()
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01;
TL0=0;
TH0=0;
//设置定时器0工作模式,初始值设定为0开始数数,不着急启动定时器
}
void Delay10us() //@11.0592MHz
{
unsigned char i;
i = 2;
while (--i);
}
//十进制2左移1位,变成20,相当于乘以10
//二进制1左移1位,变成10(2),相当于乘以2,左移8位乘以2的8次方
void startHC()
{
Trig=0;
Trig=1;
Delay10us();
Trig=0;
}
void main()
{
double time;
double dis;
Timer0Init();
// //1.Trig,给一个10us脉冲信号
while(1)
{
startHC();
// 2.由低电平跳转到高电平,表示开始发波
//
while(Echo==0);
//波发出去的那一下,开始启动定时器
TR0=1;
// 3.由高电平跳转到低电平,表示波回来了
while(Echo==1);
//波回来了定时器停止计时
TR0=0;
// 4.计算出中间经过了多少时间
//
time=(TH0*256+TL0)*1.085;//us 单位
// 5.距离=速度(340m/s)*时间
dis=time*0.017;
if(dis<0)
{
D5=0;
D6=1;
}
else
{
D5=1;
D6=0;
}
//定时器清零以便下一次计算
TL0=0;
TH0=0;
}
}