1. 超声波测距原理与硬件连接
超声波测距听起来高大上,其实原理特别接地气。就像你在山谷里喊一嗓子,听到回声就能估算距离一样。模块通过TX引脚发射40kHz的超声波(这个频率人耳听不见),遇到障碍物反射后被RX引脚接收。关键点在于计算"喊话"到"听到回声"的时间差。
在CT107D开发板上,硬件连接简单到哭:
- TX接P1.0(就像喇叭的开关)
- RX接P1.1(相当于麦克风)
- 数码管已经内置,直接操作寄存器就能显示
我实测时发现个坑:超声波模块最好离开发板边缘5cm以上,否则电路板本身可能反射超声波导致误判。有次调试半天发现距离永远显示30cm,原来是被开发板外壳反弹了。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 40kHz方波生成秘籍
要让TX引脚准确发出40kHz信号,需要精确控制高低电平时间。1个周期25μs,所以高低电平各12.5μs。但STC15的指令周期是1μs(12MHz时钟),直接写延时函数会有误差。
这是我的优化方案:
c复制void delay12us() {
_nop_(); // 消耗1μs
_nop_(); // 再1μs
unsigned char i = 33;
while(--i); // 精确补足剩余10μs
}
发送8个周期的完整代码:
c复制void send_wave() {
unsigned char i;
for(i=0; i<8; i++) {
TX = 1;
delay12us();
TX = 0;
delay12us();
}
}
注意:实际比赛时建议提前用示波器校准,我遇到过因晶振个体差异导致实际频率38kHz的情况。
3. 定时器捕获与距离计算
定时器配置是核心难点,建议用模式0(13位计数):
c复制TMOD &= 0x0f; // 清零高4位
TH1 = 0x00; // 初始值0
TL1 = 0x00;
计算距离时要注意三个细节:
- 温度补偿:按公式
V=332+0.607t,但比赛时通常简化用344m/s - 单位转换:定时器计数1次=1μs,最终要转成cm
- 防溢出处理:超过测量范围要显示"F"
我的计算公式经过实测
