单片机超声波测距代码
时间: 2024-06-11 22:02:47 浏览: 31
单片机超声波测距通常需要使用到定时器和外部中断,以下是一个基于STC89C52单片机的超声波测距代码示例:
```
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit Trig = P1^0; // 超声波发射信号引脚
sbit Echo = P1^1; // 超声波接收信号引脚
void Init_Timer0() // 定时器0初始化
{
TMOD &= 0xF0;
TMOD |= 0x01; // 定时器0工作在模式1
TH0 = 0x00;
TL0 = 0x00; // 定时器初值设为0
}
void Init_Interrupt() // 外部中断初始化
{
IT0 = 1; // 中断类型为下降沿触发
EX0 = 1; // 开启外部中断0
EA = 1; // 开启总中断
}
void Delay10us() // 延时函数
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void Trig_Signal() // 发送超声波信号
{
Trig = 1;
Delay10us();
Trig = 0;
}
void main()
{
uint distance = 0; // 距离变量
uchar count = 0; // 计数器变量
Init_Timer0(); // 初始化定时器0
Init_Interrupt(); // 初始化外部中断
while(1)
{
Trig_Signal(); // 发送超声波信号
while(!Echo); // 等待接收到超声波信号
TR0 = 1; // 启动定时器
while(Echo); // 等待超声波信号结束
TR0 = 0; // 关闭定时器
distance = TH0*256 + TL0; // 计算距离
distance = distance/58; // 转换为厘米单位
if(distance >= 400) // 距离超出有效范围
count++;
else // 距离有效
count = 0;
if(count == 3) // 连续3次距离超出有效范围,则报警(此处可根据需求修改)
P2 = 0x00;
else
P2 = 0xFF;
}
}
void Interrupt_0() interrupt 0 // 外部中断0服务程序
{
TH0 = 0;
TL0 = 0; // 定时器初值清零
}
```