基于51单片机智能小车(避障t寻迹+控制 )0.030 1小车超声波避障功能: 2.小车红外寻迹寻黑线功能; 3.小车可以DS18B20温度采集;。 4.可以手动控制小车左转、右转; 5.小车LCD1602显示距离、温度等信息。 仿真 程序 报gao 原理图

玩单片机的人总绕不开智能小车这个经典项目。今天咱们来拆解一个基于51单片机的全能型智能车——能躲障碍、会走黑线、测温度,还能手动遥控,LCD屏实时显示数据。废话不多说,直接上干货!

一、超声波避障的实战技巧

核心代码段:

void HC_SR04_Trigger(){
    TRIG = 1;
    delay_10us(20);
    TRIG = 0;
}

uint getDistance(){
    while(!ECHO);
    TH1=TL1=0;
    TR1=1;
    while(ECHO);
    TR1=0;
    return (TH1<<8 | TL1)*0.017; //换算厘米
}

这段代码藏着两个骚操作:1.用定时器T1直接捕获高电平时间,比外部中断更省资源;2.0.017这个魔术数字其实是声速(340m/s)/2/10000换算来的。实测中发现超声波偶尔会抽风返回超大值,所以后面要加个if(distance>200) distance=0的过滤。

二、红外寻迹的黑科技

寻迹模块的安装高度直接决定成败!建议离地1.5cm左右,用热熔胶固定时记得做防反光处理。核心检测逻辑:

if((LeftIR==0) && (RightIR==0)){ //双黑线
    goStraight();
} else if(LeftIR==0){ //左偏
    turnLeft(30);
} else if(RightIR==0){ //右偏
    turnRight(30);
}

重点是这个30ms的转向微调时长,需要根据电机转速实测调整。有个坑爹的情况:当小车完全跑偏时会出现左右传感器都检测不到黑线,这时候要加入"记忆"功能,继续按上次转向方向执行。

三、DS18B20的温度玄学

基于51单片机智能小车(避障t寻迹+控制 )0.030 1小车超声波避障功能: 2.小车红外寻迹寻黑线功能; 3.小车可以DS18B20温度采集;。 4.可以手动控制小车左转、右转; 5.小车LCD1602显示距离、温度等信息。 仿真 程序 报gao 原理图

单总线协议最让人头秃的就是时序。实测代码:

float read_temp(){
    uint temp;
    init_ds18b20();
    write_byte(0xCC); //跳过ROM
    write_byte(0x44); //启动转换
    delay_ms(800);    //等待转换
    init_ds18b20();
    write_byte(0xCC);
    write_byte(0xBE); //读寄存器
    temp = read_byte();
    temp |= (read_byte()<<8);
    return temp*0.0625;
}

注意这个800ms的延迟绝对不能省!曾经为了提速改成500ms,结果温度值随机跳变,排查三天才发现是转换时间不足。建议在初始化时多做几次复位检测,避免传感器接触不良导致程序卡死。

四、手动控制的骚操作

遥控部分用了最朴素的按键方案:

if(KEY_LEFT){
    P1 = 0x0A; //左轮停,右轮转
} else if(KEY_RIGHT){
    P1 = 0x05; //右轮停,左轮转
}

P1口直接驱动L298N电机驱动板,这里有个隐藏技巧——在转弯指令后加个5ms的小延迟,能有效防止电机堵转。进阶玩法可以接入蓝牙模块,用手机APP控制,只需要把按键检测改成串口指令解析即可。

五、LCD1602的显示优化

显示刷新率太高会闪屏,太低又不够实时。我的解决方案:

void refreshDisplay(){
    static uint8_t count=0;
    if(++count>=10){ //每10次循环刷新
        sprintf(buffer,"D:%03dcm T:%02.1f",distance,temp);
        lcd_show(0,0,buffer);
        count=0;
    }
}

用静态变量做刷新计数器,实测每500ms更新一次显示效果最佳。注意sprintf的浮点运算会显著增加代码体积,如果内存紧张可以改用整数运算分开显示温度整数和小数部分。

坑王总结:

  1. 电机电源和单片机必须分开供电,否则PWM会导致复位
  2. 超声波模块间隔时间不能小于60ms
  3. 寻迹传感器最好用可调电阻版本,适应不同地面反光
  4. 所有延时代码都要用定时器实现,否则影响其他功能

完整工程里藏着个彩蛋:当温度超过30度时,小车会自动加速10%来"散热"。虽然没什么实际作用,但答辩时这个设计让老师眼前一亮。需要源码和Proteus仿真文件的老铁,评论区喊666后私信(手动狗头)。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐