设计背景:

本次设计主要是为了学校的一个电子竞赛才做的这一个小项目,这也是我刚学习51单片机以来做的第一个大制作。其实这个制作的原理很简单,但实际做出来却花了一些时间,下面就简单地给大家介绍一下我们的制作,也为各位网友作为一个参考。

使用到的模块:

51单片机  L298N电机驱动模块  红外传感器模块  hc05蓝牙模块  普通直流电机

实现的原理:

 电路设计:

成品展示:

程序设计:

L298N驱动直行转向程序,这里用的是定时器0作为PWM输出。关于L298N和定时器可以在网上查找资料,知道如何使用,这里就不给大家详细介绍了。

#include "xunji.h"
#include "reg52.h"uchar PWMCnt1;
uchar PWMCnt2;
uchar cntPWM1;
uchar cntPWM2;//uchar PWMA;
//uchar PWMB;void Delay(int xms)        //@12.000MHz
{ while(xms--){unsigned char i, j;i = 2;j = 239;do{while (--j);} while (--i);}
}
void Timer0_init()
{TMOD &=0xF0;TMOD |=0X01;//使用定时器0TH0 = 0xFF;TL0 = 0xA3;EA=1;//全局中断位ET0=1;//定时器0中断允许位TR0=1;//定时器0运行允许位
}
void turnright1()          //右转
{IN1 = 0;  //右轮反转IN2 = 1;IN3 = 0;    //左轮正转IN4 = 1;cntPWM1 = 50;cntPWM2    = 45;
}void turnRight2()         //右转
{IN1 = 0;  //右轮反转IN2 = 1;IN3 = 0;    //左轮正转IN4 = 1;cntPWM1 = 45;cntPWM2    = 40;
}void turnleft1()               //左转
{IN1 = 1;IN2 = 0;     //右轮正转IN3 = 1;IN4 = 0;    //左轮反转cntPWM1 = 45;cntPWM2 = 50;
}               void turnLeft2()                //左转
{IN1 = 1;IN2 = 0;     //右轮正转IN3 = 1;IN4 = 0;    //左轮反转cntPWM1 = 40;cntPWM2 = 45;
}   void forward()               //前进
{IN1 = 1;IN2 = 0;     //右轮正转IN3 = 0;     //左轮正转IN4 = 1;cntPWM1 = 26;cntPWM2    = 25;
}void backward()                     //后退
{IN1 = 0;  //右轮反转IN2 = 1;IN3 = 1;IN4 = 0;   //左轮反转cntPWM1 = 26;cntPWM2 = 25;
}void Stop()                      //停止
{IN1 = 0;IN2 = 0;IN3 = 0;IN4 = 0;
}void interrupttimer0() interrupt 1
{TH0 = (65536 - 50)/256;TL0 = (65536 - 50)%256;PWMCnt1++;PWMCnt2++;PWMCnt1%=100;PWMCnt2%=100;if(PWMCnt1<=cntPWM1){ENA=1;}elseENA=0;if(PWMCnt2<=cntPWM2){ENB=1;}elseENB=0;//
//  if(PWMA<=cntPWM1)
//  {
//      ENA=1;
//  }
//  else
//      ENA=0;
//
//  if(PWMB<=cntPWM2)
//  {
//      ENB=1;
//  }
//  else
//      ENB=0;
}

循迹模块程序,这里利用是4个红外传感器返回的高低电平来判断黑线的位置,从而驱使小车的直行与转向。程序比较繁杂,其实有很多是多余的,还可以进行一些简化,不需要4个传感器都要判断是否输出高低,另外直行的程序最好放在前面,并且再加上else,这样的话,前面判断成功了就不用再去执行后面的程序,可以缩短cpu消耗的时间。

void XunJi(){unsigned char flag = 0;if((left1 == 0)&&(left2 == 0)&&(right1 == 0)&&(right2 == 0))   //0 0 0 0flag = 0;if((left1 == 0)&&(left2 == 0)&&(right1 == 0)&&(right2 == 1))   //0 0 0 1flag = 1;if((left1 == 0)&&(left2 == 0)&&(right1 == 1)&&(right2 == 0))   //0 0 1 0flag = 0;if((left1 == 0)&&(left2 == 0)&&(right1 == 1)&&(right2 == 1))   //0 0 1 1flag = 2;if((left1 == 0)&&(left2 == 1)&&(right1 == 0)&&(right2 == 0))   //0 1 0 0flag = 0;if((left1 == 0)&&(left2 == 1)&&(right1 == 0)&&(right2 == 1))   //0 1 0 1flag = 4;if((left1 == 0)&&(left2 == 1)&&(right1 == 1)&&(right2 == 0))   //0 1 1 0flag = 0;if((left1 == 0)&&(left2 == 1)&&(right1 == 1)&&(right2 == 1))    //0 1 1 1flag = 1;if((left1 == 1)&&(left2 == 0)&&(right1 == 0)&&(right2 == 0))   //1 0 0 0flag = 3;if((left1 == 1)&&(left2 == 0)&&(right1 == 0)&&(right2 == 1))   //1 0 0 1flag = 0;if((left1 == 1)&&(left2 == 0)&&(right1 == 1)&&(right2 == 0))   //1 0 1 0flag = 2;if((left1 == 1)&&(left2 == 0)&&(right1 == 1)&&(right2 == 1))   //1 0 1 1flag = 0;if((left1 == 1)&&(left2 == 1)&&(right1 == 0)&&(right2 == 0))   //1 1 0 0flag = 4;if((left1 == 1)&&(left2 == 1)&&(right1 == 0)&&(right2 == 1))   //1 1 0 1flag = 0;if((left1 == 1)&&(left2 == 1)&&(right1 == 1)&&(right2 == 0))   //1 1 1 0flag = 3;if((left1 == 1)&&(left2 == 1)&&(right1 == 1)&&(right2 == 1))   //1 1 1 1flag = 6;switch(flag){case 0:forward();break;case 1:turnright1();break;case 2:turnright2();break;case 3:turnleft1();break;case 4:turnleft2();break;case 5:backward();break;default:stop();break;}
}

避障模块程序,这里是利用的小车上边的3个红外传感器来识别前方障碍物,根据障碍物位置来做如何的转向,从而实现避障。

void bizhan()  //循迹+避障
{if((bizh1==1)&&(bizh2==1)&&(bizh3==1))XunJi();if((bizh1==0)||(bizh2==0)||(bizh3==0)){stop();Delay (500);turnright2();Delay (60); }
}void bizh()    //避障
{if((bizh1==1)&&(bizh2==1)&&(bizh3==1))forward();if((bizh1==0)&&(bizh2==1)&&(bizh3==1))turnleft2();if((bizh1==1)&&(bizh2==0)&&(bizh3==1))turnright2();if((bizh1==1)&&(bizh2==1)&&(bizh3==0))turnright2();if((bizh1==0)&&(bizh2==0)&&(bizh3==0))turnleft2();if((bizh1==0)&&(bizh2==0)&&(bizh3==1))turnleft1();if((bizh1==1)&&(bizh2==0)&&(bizh3==0))turnright1();
}

蓝牙控制程序

#include "reg52.h"
#include "bluetooth.h"uchar temp;uchar speedA;
uchar speedB;void uart_init()//这是对蓝牙串口进行初始化,不是定时器1
{TMOD &=0xF0;TMOD |=0x21;//定时器1采用方式2 8位初值自动重装SCON=0x50;TL1=0xFD;TH1=0xFD;PCON=0x00;//电源控制寄存位ES=1;//串口通信运行允许位TR1=1;//定时器1运行
}//void sendbyte(uchar c)
//{
//  SBUF=c;//发送数据
//
//  while(!TI);//没有发送完一直执行这个空语句
//  /*发送字节完成后TI 变成1,则需要最后把他置零;RI也一样*/
//  TI=0;//发送串口中断判断位
//}void uart_interrupt() interrupt 4
{if(RI)//串口中断允许位{temp=SBUF;//取出数据RI=0;//取出数据后RI变为1,需要最后把他置零quick();slow();}
}void quick()//蓝牙加速
{speedA*=2;speedB*=2;
}void slow()//蓝牙减速
{speedA%=2;speedB%=2;
}

小车的主程序

#include "reg52.h"
#include "xunji.h"
#include "bluetooth.h"extern uchar temp;//用于切换模式和蓝牙指令void start();void main()
{Timer0_init();uart_init();while(1){start();}}void start()
{switch(temp){case 'e':bizhan();break;case 'f':forward1(); break;case 'a':quick();break;case 'b':backward2(); break;case 'c':slow();break;case 'r':turnleft(); break;case 'l':turnright(); break;case 's':stop(); break;case 'k':bizh();break;default :stop();break;//如果传输了一个这些之外的字母,则stop()}
}

最后

程序只是作为一个参考,真正调试还需要根据实际情况为准。比如PWM的调试,循迹模块程序的简化等。另外上边展示的主要是一些重要的模块程序,详细的可以点击下面的连接自己提取。最后,希望大家都能做出自己满意的小车。

链接:https://pan.baidu.com/s/11-6rN-bxYrJlRpDWrP0K4g 
提取码:armc

51蓝牙红外循迹避障小车+代码相关推荐

  1. 基于STM32F103的红外循迹避障小车设计(含Proteus仿真)

    基于STM32F103的红外循迹避障小车设计 红外循迹及红外避障实现较简单,无论是51单片机还是STM32单片机,其例程随处可见.但是完全可以运行的Proteus仿真,开源的并不多,更不要说基于STM ...

  2. STM32蓝牙控制循迹避障小车——2.循迹模块

    STM32蓝牙控制循迹避障小车源代码--2.循迹模块 注意-所需模块: 接线:四个循迹模块(从左到右分别为1,2,3,4) B4–第1个循迹模块的D0 B5–第2个循迹模块的D0 B6–第3个循迹模块 ...

  3. STM32蓝牙控制循迹避障小车源代码——4.蓝牙控制

    STM32蓝牙控制循迹避障小车源代码--4.蓝牙控制 注意-所需模块: 蓝牙模块 接线: 串口通信 A2–RX A3–TX 所有的代码都是直接从工程里面复制的,实测是没有问题的. 蓝牙控制原理: 设计 ...

  4. STM32蓝牙控制循迹避障小车源代码——3.舵机、超声波测距模块

    STM32蓝牙控制循迹避障小车源代码--3.舵机.超声波测距模块 注意-所需模块: US-015超声波模块 SG90舵机云台 接线:舵机超声波: A1–P2.7 B8–Trig B9–Echo 代码 ...

  5. STM32蓝牙控制循迹避障小车源代码——5.最终程序

    STM32蓝牙控制循迹避障小车源代码--5.最终程序 将前面4讲的内容整合一起.主函数里用switch函数或者if语句来判断接收到的数据,改变小车的运动. 注意要将控制循迹和避障的参数单独定义一个.否 ...

  6. 【IoT】红外循迹避障小车

    说明 随着生产自动化的发展需要,机器人已经越来越广泛地应用到生产自动化上,随着科学技术的发展,机器人的传感器种类也越来越多,其中红外传感器已经成为自动行走和驾驶的重要部件. 红外的典型应用领域为自主式 ...

  7. 自制手机app的51蓝牙+WiFi+循迹+避障OLED显示速度小车

    最近有空了,重新复习了下51单片机,真的是温故而知新,学到了之前没学到的知识,所以打算做个基于51的蓝牙小车玩玩,也算是圆大一的梦吧,就当复习一下. 实现效果: 1.蓝牙可以控制前后左右,调速(快慢) ...

  8. 智能循迹避障小车的红外模块

    智能循迹避障小车的红外模块 - 智能循迹避障小车的红外模块用于3个功能-----------循迹,避障,测速. 红外循迹与红外避障 红外循迹TCRT5000L 红外避障 .观察原理图我们可以发现,它们 ...

  9. STM32循迹避障小车制作代码详解(简单实现版)

    感谢几年来大家的支持,看到大家对工程的呼声很高,所以来把工程上传了,大家自行下载即可哈,谢谢大家支持 这个代码是进阶版的,就是可以跑的很快的,和上面博客的主要区别就是这个代码的避障机制并不是做在主ma ...

  10. c语言智能车跑道检测程序,基于单片机的智能循迹避障小车(附电路原理图,程序清单)...

    基于单片机的智能循迹避障小车(附电路原理图,程序清单)(论文10000字) 摘要:目前,移动机器人的开发和研究越来越令人瞩目,而智能循迹壁障小车作为移动机器人的一个重要分支,非常值得我们探索和讨论.智 ...

最新文章

  1. php实时上传多张图片,php实现多图片上传程序代码
  2. 同一工作组无法访问_工作组,域
  3. String类中不同拼接方式
  4. linux命令passwd各个参数含义
  5. 苹果 AirPods 只能是 iPhone 的配件吗?
  6. Atitit prgrmlan topic--express lan QL query lan表达式语言 目录 1. 通用表达语言(CEL) 1 1.1. 8.2 功能概述 1 1.2. Ongl
  7. 自学c语言难,c语言难学吗?
  8. 笔记本计算机摄像头怎么打开方式,笔记本的摄像头怎么打开,手把手教你笔记本电脑摄像头如何打开...
  9. QQ空间删除的照片怎么找回,你知道回收站吗?
  10. 企业微信 PC端多开
  11. cad重新加载php命令,cad撤回命令是什么
  12. android屏幕亮度自动调节解析
  13. 文章阅读 - 机器学习检测DNS隧道
  14. 20190926CF训练
  15. 技术开放平台,推进开放银行布局
  16. XDOJ 综合题 数字分解排序
  17. 百度API实现地图标点并测距
  18. 苹果Mac系统偏好设置怎样原封不动地迁移(导入)到新电脑中?
  19. 油电混合动力汽车行星齿轮箱设计(论文+CAD图纸)
  20. 计算机实训word报告,计算机实训报告Mcrosoft Word 文档.doc

热门文章

  1. MATLAB导出矢量图
  2. 使用 SPDK 技术优化虚拟机本地存储的 IO 性能
  3. get 和 post 区别
  4. 【搞船日记】【Shapr3D的STL格式转Gcode】
  5. Windows常用密码的破解方法
  6. 安装CentOS操作系统(超详细)
  7. 蓝桥杯web:2.【Bug 调试】修复注册验证问题
  8. 宏定义的黑魔法 - 宏菜鸟起飞手册
  9. Oracle数据库日志清理
  10. 河北省计算机考试报名的照片要求,「河北省考」河北公务员考试报名照片制作在线处理照片教程...