#include <reg52.h>
#include <intrins.h>
sbit Trig=P3^2;//发射信号
sbit Echo=P3^3;//接收信号
sbit LED0=P1^0;
sbit LED1=P1^1;
unsigned int timed=0;//定义一个时间,存定时器计算的时间
unsigned int dis=0;//定义一个距离,测距
void Ultrasonic_Dis( );
void Delay10us(); //@11.0592MHz
void Trig_start();
void main( )
{
P1=0Xff;
while(1)
{
Ultrasonic_Dis( );
}
}
//2.定义10us的延时函数,使Trig保持高电平10us
void Delay10us() //@11.0592MHz
{
unsigned char i;
i = 2;
while (--i);
}
//3.Trig从0变高电平,延时使Trig保持高电平10us后变低电平
void Trig_start()
{
Trig=0;
Trig=1;
Delay10us();
Trig=0;
}
void Delay1us() //@11.0592MHz
{
_nop_();
_nop_();
}
void Ultrasonic_Dis( )
{
Trig_start();//Trig函数调用
timed=0;
while(Echo==0); //Echo=0时,此时Trig=0时,Echo未触发,程序卡死在while循环这里,只有当
// Trig=1,Echo才会发波,变成高电平等于1,跳出while循环,程序才往下走
do{
Delay1us();
timed++;
} while(Echo==1);//这里只有当EcHo接收波后变低电平,程序才往下走
dis=timed*17/1000; //声速340m/s=34000cm/s=34cm/ms=0.034cm/us
if (dis<1)//当超声波测距大约小于10cm,LED1亮,LED2灭,不成线性,误差较大
{
LED0=0;
LED1=1;
}else{//否则,当超声波测距大于10cm,LED1灭,LED2亮
LED0=1;
LED1=0;
}
}
STC89C52不用定时器计时驱动超声波
于 2022-10-14 21:38:44 首次发布