一、原理图
跳线帽在1-3、2-4为超声波模式。
二、原理分析
发射与接收:
Trig引脚(触发信号):单片机发送一个 10μs以上的高电平脉冲,通过触发模块发射 8个40kHz的超声波脉冲。
Echo引脚(回波信号):模块接收到反射波后,Echo引脚输出高电平,持续时间与超声波往返时间成正比。
距离计算公式:
距离=高电平时间×声速 / 2;
声速按 340m/s(或更精确的 343m/s,25℃时)计算。
时间单位为秒,最终距离单位为米,需转换为厘米(如:结果×100)。
void Send_40KHz() { unsigned char i=8; while(i--) //发送8个40KHZ超声波脉冲 { TX = 1; Delay12us(); TX = 0; Delay12us(); } }
测量所用的计时器采用PCA模块,以节省定时器的使用。
unsigned int GetDis() { unsigned int t; CMOD = 0x00; //12分频计数 CL = CH = 0; //初始值为0 Send_40KHz(); //发送脉冲 CR = 1; //开始计数 while((RX == 1) && (CF == 0)); //当接收到返回脉冲或计数溢出时跳出 CR = 0; //停止计数 if(CF == 1) //若计数溢出 { CF = 0; return 0; } else //否则为接收到返回脉冲 { t = (CH << 8) | CL; return (unsigned int)(t * 0.0172); //343 / 1000 / 2 } }
三、注意事项和常见问题
-
时序要求:
-
Trig触发脉冲必须≥10μs,否则模块可能不响应。
-
两次测量间隔建议≥60ms,避免信号干扰。
-
-
误差处理:
-
温度补偿:声速受温度影响(公式:
声速=331.4 + 0.6×温度℃
)。 -
超距处理:模块最大量程约4m,超出后Echo可能无响应,需设置超时检测。
-
-
资源冲突:
-
使用定时器时,避免与其他功能(如数码管动态扫描)冲突。
-
若需高精度,可采用输入捕获功能(如STC15的PCA模块),也节省定时器。
-
-
无回波信号:检查Trig触发信号是否正常,模块供电是否稳定。
-
距离跳变:添加软件滤波(如多次测量取中值)。
-
响应超时:在代码中添加超时退出机制,防止死循环。