51单片机超声波测距代码
时间: 2023-07-23 20:34:20 浏览: 116
14 超声波测距 STC89 STC15W(WQX06 51单片机 源代码).rar
以下是51单片机超声波测距代码:
```
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit Trig = P1^0; //定义超声波发射引脚
sbit Echo = P1^1; //定义超声波接收引脚
void delay_us(uint us) //延时函数,单位为微秒
{
while(us--);
}
void delay_ms(uint ms) //延时函数,单位为毫秒
{
uint i, j;
for(i = ms; i > 0; i--)
for(j = 110; j > 0; j--);
}
void send_pulse() //发送一次超声波脉冲
{
Trig = 1; //将Trig置高
delay_us(10); //延时10微秒
Trig = 0; //将Trig置低
}
uint measure_distance() //测量距离函数
{
uint distance = 0;
uint timeout = 0;
uint timer = 0;
send_pulse(); //发送一次超声波脉冲
while(Echo == 0); //等待Echo变高
timer = TH0 << 8 | TL0; //读取定时器初值
while(Echo == 1) //等待Echo变低
{
timeout++; //超时计数器加1
if(timeout > 5000) //如果超时计数器超过5000,说明超声波接收异常
{
distance = 0xFFFF; //距离设为最大值
break; //跳出循环
}
}
if(distance != 0xFFFF) //如果距离没有异常
{
timer = TH0 << 8 | TL0 - timer; //计算超声波飞行时间
distance = timer / 58; //计算距离,单位为厘米
}
return distance;
}
void main()
{
uint distance = 0;
TMOD = 0x01; //设置定时器0为16位定时器,工作模式1
TH0 = 0; //定时器初值清零
TL0 = 0; //定时器初值清零
while(1)
{
distance = measure_distance(); //测量距离
if(distance != 0xFFFF) //如果距离没有异常
{
printf("Distance: %d cm\n", distance); //输出距离值
}
delay_ms(500); //延时500毫秒
}
}
```
这段代码使用了定时器和外部中断来测量超声波飞行时间,并计算距离。其中,Trig引脚控制超声波发射,Echo引脚接收超声波信号,定时器用于测量超声波飞行时间,延时函数用于等待超声波回波。
阅读全文