资讯动态

用51单片机和HC-SR04给玩具车加个“眼睛”:手把手教你DIY一个会自己拐弯的避障小车

发布时间:2026/9/9 21:36:19 来源:尧图企业网站定制
用51单片机和HC-SR04给玩具车加个“眼睛”手把手教你DIY一个会自己拐弯的避障小车周末在家和孩子一起动手做个智能玩具车既能培养孩子的动手能力又能学习基础编程逻辑这样的亲子活动是不是很有吸引力今天我们就用最常见的51单片机开发板、超声波传感器和玩具车底盘打造一个能自动避障的智能小车。不需要复杂的电路知识跟着步骤一步步来两小时内就能看到成果。1. 材料准备与硬件连接1.1 所需材料清单这个项目的魅力在于所有材料都很常见且价格亲民总成本不超过100元主控芯片STC89C52RC开发板市面上最常见的51单片机测距模块HC-SR04超声波传感器价格约5-8元转向控制SG90舵机9g微型舵机价格约10元动力系统玩具车底盘带两个直流电机L298N电机驱动模块其他配件面包板及杜邦线若干18650电池盒两节手机充电宝作为备用电源方案提示如果找不到现成的玩具车底盘可以用纸板自制简易底盘电机可从废旧玩具中拆取。1.2 硬件连接图解连接硬件时建议先在面包板上测试确认无误后再进行固定。主要接线关系如下模块连接引脚单片机引脚HC-SR04 Trig触发信号输入P2.6HC-SR04 Echo回波信号输出P2.5SG90信号线PWM控制信号P2.4L298N IN1电机A正转控制P1.0L298N IN2电机A反转控制P1.1L298N IN3电机B正转控制P1.2L298N IN4电机B反转控制P1.3电源连接特别注意单片机开发板使用5V供电L298N模块需要7-12V电压建议用两节18650电池串联SG90舵机直接接单片机5V输出即可// 引脚定义示例后续编程会用到 sbit IN1 P1^0; // 电机A正转 sbit IN2 P1^1; // 电机A反转 sbit IN3 P1^2; // 电机B正转 sbit IN4 P1^3; // 电机B反转 sbit Echo P2^5; // 超声波Echo sbit Trig P2^6; // 超声波Trig sbit pwm P2^4; // 舵机信号2. 超声波测距原理与实现2.1 HC-SR04工作原理这个价值不到10元的小模块其实蕴含了精妙的物理原理。它通过发射40kHz的超声波脉冲并计算遇到障碍物反射回来的时间差来确定距离。具体工作时序分为三步触发阶段给Trig引脚至少10μs的高电平信号发射阶段模块自动发送8个40kHz的超声波脉冲接收阶段检测Echo引脚高电平持续时间距离计算公式很简单距离(cm) (高电平时间(μs) × 声速(340m/s)) / 2因为声音是往返传播所以要除以2。2.2 测距代码实现下面是用51单片机实现测距的核心代码即使没有编程基础也能理解其逻辑#include intrins.h // 提供_nop_()延时函数 void hcsr04_Init() { Trig 1; // 开始触发 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); // 延时约10μs _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); Trig 0; // 结束触发 while(!Echo); // 等待回波信号 TR0 1; // 启动定时器计时 while(Echo); // 等待回波结束 TR0 0; // 停止计时 } uint calculateDistance() { uint time TH0*256 TL0; // 获取计时器值 TH0 0; TL0 0; // 定时器清零 return (time*1.7)/100; // 换算为厘米 }注意实际使用中需要根据环境温度对声速进行微调常温下340m/s是近似值。3. 舵机控制与转向逻辑3.1 SG90舵机控制原理这个迷你舵机虽然个头小但精度足够我们的避障小车使用。它通过PWM脉宽调制信号控制角度周期20ms50Hz脉宽范围0.5ms-2.5ms对应角度0°-180°几个关键角度对应的控制参数0°0.5ms高电平90°1.5ms高电平180°2.5ms高电平3.2 51单片机产生PWM信号51单片机没有硬件PWM模块但可以通过定时器模拟void Timer1_Init() { TMOD | 0x10; // 定时器1模式1 TH1 0xFE; // 0.5ms定时初值 TL1 0x33; ET1 1; // 使能定时器中断 EA 1; // 开总中断 TR1 1; // 启动定时器 } void timer1() interrupt 3 { TR1 0; // 暂停定时器 TH1 0xFE; // 重装初值 TL1 0x33; if(count angle) pwm 1; // 高电平阶段 else pwm 0; // 低电平阶段 if(count 40) count 0; // 20ms周期计数 TR1 1; // 重启定时器 }使用时只需修改angle变量即可控制角度angle1 → 0°angle3 → 90°angle5 → 180°4. 避障逻辑与整车调试4.1 行为决策流程图小车的智能体现在它的简单决策逻辑上开始 ↓ 超声波测距 ↓ 距离 30cm? → 是 → 直行 ↓否 舵机转向90度左侧 → 测距 ↓ 左侧距离 30cm? → 是 → 左转 ↓否 舵机转向90度右侧 → 测距 ↓ 右侧距离 30cm? → 是 → 右转 ↓否 倒车 → 随机转向4.2 完整控制代码将前面各个模块整合后的主程序void main() { Timer0_Init(); // 超声波计时器 Timer1_Init(); // 舵机PWM定时器 angle 3; // 初始朝前(90度) while(1) { uint dist getDistance(); // 获取距离 if(angle 3) { // 当前朝前 if(dist 30) straight(); // 直行 else { stop(); angle 5; // 向左看(180度) delay_ms(500); } } else if(angle 5) { // 向左看 if(dist 30) turnLeft(); else { angle 1; // 向右看(0度) delay_ms(1000); } } else { // 向右看 if(dist 30) turnRight(); else { back(); // 后退 delay_ms(300); angle 3; // 重新朝前 randomTurn(); // 随机转向 } } delay_ms(100); } }4.3 常见问题排查调试时可能会遇到以下问题及解决方案舵机不转动检查PWM信号线是否接触良好测量电源电压是否达到5V确认代码中angle值在1-5范围内超声波测距不准确保模块前方没有障碍物干扰调整计算公式中的声速系数在Trig和Echo信号线上加10kΩ上拉电阻电机转动方向错误交换L298N输出端的电机线序检查代码中IN1-IN4的电平组合系统供电不足为单片机单独使用充电宝供电在电源正极串联二极管防止反灌5. 进阶改进思路当基础功能实现后可以考虑以下升级方案硬件扩展增加红外传感器实现悬崖检测加装蓝牙模块实现手机遥控使用OLED屏幕显示实时距离软件优化实现记忆路线功能加入速度PID控制开发迷宫求解算法外观美化3D打印定制外壳增加LED状态指示灯设计可拆卸传感器支架这个项目最有趣的地方在于它既是一个完整的入门作品又是无限扩展的平台。和孩子一起调试时不妨鼓励他们提出自己的改进想法比如改变避障距离阈值或者增加声光报警功能。遇到问题不要急着查答案先一起分析可能的原因这种探索过程比最终结果更有教育意义。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价