基于51单片机的循迹小车(初学者必备!!!)

article/2025/8/3 12:52:47

基于51单片机的循迹小车

文章目录

    • 基于51单片机的循迹小车
  • 前言
  • 一、系统概述
    • 1.工作原理
    • 2.控制系统结构框图
  • 二、循迹小车硬件
    • 1.电机驱动模块
    • 2.循迹模块
  • 三、循迹小车软件
  • 四、源码(仅供参考)


前言

在这里插入图片描述
该小车采用单片机STC89C52作为主控制核心,通过传感器传来的信号,对当前环境作出判断,最后对电机做出相应的动作。单片机通过红外传感器检测场地黑线,从而控制电机驱动模块,改变电机转速来控制小车方向,从而达到循迹的目的。

一、系统概述

整个系统包括51单片机控制模块、电机驱动模块、循迹模块、电源和小车车体。

1.工作原理

·本系统采用简单明了的设计方案。
·通过高发射功率红外光电二极管和高灵敏光电晶体管组成的传感器循迹模块判断黑线路径。
·然后由STC89C52单片机通过IO口控制L298N驱动模板改变两个直流电机的工作状态。
·最后实现小车循迹

2.控制系统结构框图

在这里插入图片描述

二、循迹小车硬件

1.电机驱动模块

L298N实物接线图及驱动原理图:在这里插入图片描述

在这里插入图片描述
(1) L298N是一个内部有两个H桥的驱动芯片,这样电机的运转只需要用三个信号控制:两个方向信号和一个使能信号。(输入的电压不可超过它的额定电压)
(2)L298N芯片的工作电压需要两路:
第一路:输出供给电机回路的工作电源
第二路:输入逻辑控制回路电源5V(电源出/入)
L298N接入直流电机的端口接法:
在这里插入图片描述

2.循迹模块

(1)循迹原理: 利用红外线对于不同颜色具有不同的反射性质的特点。在小车行驶过程中传感器的红外发射二极管不断发射红外光,当红外光遇到白色地面时发生漫反射,红外对管接收管接收反射光;如果遇到黑线则红外光被吸收,则红外管接收不到信号。
红外对管采集回来的信号通过2路循迹传感器模块里面的LM339比较器后输出高或低电平,从而实现信号的检测。
原先只用了两个红外传感器,发现它并不能完成直角拐弯,需要四个传感器配合才能完成。
(2)所谓的差速,是指左右两车轮的速度差,假如左边车轮比右边快,则小车会偏向右。同时,左边的车轮转速比右的满,那么小车会向左边转动。
目前主要有以下两种方式:
①小车向左转,可以左轮停止,左轮继续转动,这样可实现左转,这种方式实现小角度的转弯,在角度不大时可采用此种方式。
②小车向左转,可以是左轮反转,右轮正转,这样可以实现大角度的左转,甚至可以进行原地打转。
同理可推出小车如何向右转向。

三、循迹小车软件

(1)主要采用C语言来编译程序。模块化结构程序的设计,可以使系统软件便于调试与优化,也使其他人更好的理解和阅读系统的程序设计。因此,软件的设计上,运用了模块化程序的结构对软件进行设计,使得程序变得更加直观易懂。程序的主要模块有:主程序、定时溢出中断服务程序、外部中断服务程序。
(2) Keil C51单片机软件开发系统可用于编译C或汇编源文件。然后分别由C51编译器编译生成目标文件(.OBJ)。目标文件与库文件一起经LIB51连接定位生成绝对目标文件(.ABS)。ABS文件由OH51转换成标准的Hex文件。
(3) 在软件调试中,使用功能强大的WAVE 6000软件进行软件编译与调试,使用Microcontroller ISP Software及其配套的单片机对程序进行烧录。

四、源码(仅供参考)

#ifndef _LED_H_
#define _LED_H_//定义小车驱动模块输入IO口 sbit L293D_IN1=P1^2; sbit L293D_IN2=P1^3;sbit L293D_IN3=P1^4;sbit L293D_IN4=P1^5;sbit L293D_EN1=P1^6;sbit L293D_EN2=P1^7;/***蜂鸣器接线定义*****/sbit BUZZ=P2^3;#define Left_1_led        P3_4	 //左传感器  #define Right_1_led       P3_5	 //右传感器    #define Left_moto_pwm	  P1_6	 //PWM信号端#define Right_moto_pwm	  P1_7	 //PWM信号端#define Left_moto_go      {P1_2=1,P1_3=0;}  //左电机向前走#define Left_moto_back    {P1_2=0,P1_3=1;} 	//左边电机向后转#define Left_moto_Stop    {P1_2=0,P1_3=0;}         //左边电机停转                     #define Right_moto_go     {P1_4=1,P1_5=0;}	//右边电机向前走#define Right_moto_back   {P1_4=0,P1_5=1;}	//右边电机向后走#define Right_moto_Stop   {P1_4=0,P1_5=0;}      	//右边电机停转   unsigned char pwm_val_left  =0;//变量定义unsigned char push_val_left =0;// 左电机占空比N/20unsigned char pwm_val_right =0;unsigned char push_val_right=0;// 右电机占空比N/20bit Right_moto_stop=1;bit Left_moto_stop =1;unsigned  int  time=0;/************************************************************************/
//前速前进void  run(void)
{push_val_left=15;	 //速度调节变量 0-20。。。0最小,20最大push_val_right=15;Left_moto_go ;   //左电机往前走Right_moto_go ;  //右电机往前走
}//左转void  leftrun(void)
{	 push_val_left=15;push_val_right=20;Right_moto_go ;  //右电机往前走Left_moto_Stop   ;  //左电机不动
}//右转void  rightrun(void)
{ push_val_left=20;push_val_right=15;Left_moto_go  ;   //左电机往前走Right_moto_Stop    ;  //右电机不动	
}//停止void  stop(void)
{	 Right_moto_Stop ;  //右电机停止Left_moto_Stop  ;  //左电机停止
}/************************************************************************/
/*                    PWM调制电机转速                                   */
/************************************************************************/
/*                    左电机调速                                        */
/*调节push_val_left的值改变电机转速,占空比            */void pwm_out_left_moto(void)
{  if(Left_moto_stop){if(pwm_val_left<=push_val_left){Left_moto_pwm=1; 
//		     Left_moto_pwm1=1; }else {Left_moto_pwm=0;
//		     Left_moto_pwm1=0; }if(pwm_val_left>=20)pwm_val_left=0;}else    {Left_moto_pwm=0;
//           Left_moto_pwm1=0; }
}
/******************************************************************/
/*                    右电机调速                                  */  void pwm_out_right_moto(void)
{ if(Right_moto_stop){ if(pwm_val_right<=push_val_right){Right_moto_pwm=1; 
//		   Right_moto_pwm1=1; }else {Right_moto_pwm=0;
//		   Right_moto_pwm1=0; }if(pwm_val_right>=20)pwm_val_right=0;}else    {Right_moto_pwm=0;
//           Right_moto_pwm1=0; }
}/***************************************************/
///*TIMER0中断服务子函数产生PWM信号*/void timer0()interrupt 1   using 2
{TH0=0XFc;	  //1Ms定时TL0=0X18;time++;pwm_val_left++;pwm_val_right++;pwm_out_left_moto();pwm_out_right_moto();}
	#include<AT89X52.H>		  //包含51单片机头文件,内部有各种寄存器定义#include<ZY-4WD_PWM.H>		  //包含HL-1蓝牙智能小车驱动IO口定义等函数//主函数void main(void)
{	P1=0X00;   //关电机	TMOD=0X01;TH0= 0XFc;		  //1ms定时TL0= 0X18;TR0= 1;ET0= 1;EA = 1;			   //开总中断while(1)	//无限循环{ //有信号为0  没有信号为1if(Left_1_led==0&&Right_1_led==0)run();   //调用前进函数else{			  if(Left_1_led==1&&Right_1_led==0)	    //左边检测到黑线{leftrun();		  //调用小车左转  函数}if(Right_1_led==1&&Left_1_led==0)		//右边检测到黑线{	  rightrun();		   //调用小车右转	函数}if(Right_1_led==1&&Left_1_led==1)		//悬空状态  避悬崖{	  stop();		   //调用小车停止}}	 }
}```

http://chatgpt.dhexx.cn/article/wZdKruKl.shtml

相关文章

单片机小车

*## 单片机小车 本周作为单片机新手的我制作了我的第一个作品—单片机小车 一 元件&#xff1a;1.单片机最小系统板 2.杜邦线 3.USB转TTL CH340模块STC单片机下载线刷机板USB转串口 4.智能小车配件 红外寻迹 5.智能小车51单片机套件底盘组装寻迹避障开发板编程循迹机器人配件 …

51单片机之智能小车(避障、跟随、循迹)

目录 基本概述 硬件组成 功能 关键字 模块介绍 电机模块L9110S 循迹模块&#xff08;TCRT5000传感器&#xff09; 红外避障模块 测速模块 小车 移动小车&#xff08;控制电机转动&#xff0c;使小车前进、后退、左转、右转 &#xff09; 遥控小车&#xff08; 使…

详细介绍如何从零开始制作51单片机控制的智能小车(一)———让小车动起来

从本文开始&#xff0c;在之后的一段时间里&#xff0c;我会通过本系列文章&#xff0c;详细介绍如何从零开始用51单片机去实现智能小车的控制&#xff0c;本文作为本系列的第一篇文章&#xff0c;主要介绍如何让小车动起来。 本系列文章链接&#xff1a; ------------------…

乐观锁-基于CAS原理

乐观锁理论基础 乐观锁的操作过程中其实没有没有任何锁的参与&#xff0c;乐观锁只是和悲观锁相对&#xff0c;严格的说乐观锁不能称之为锁。下面我们就通过乐观锁与悲观锁的对比来更好的理解乐观锁。 乐观锁与悲观锁的概念 乐观锁&#xff1a;总是假设最好的情况…

JAVA CAS原理深度分析

CAS CAS:Compare and Swap, 翻译成比较并交换。 java.util.concurrent包中借助CAS实现了区别于synchronouse同步锁的一种乐观锁。 本文先从CAS的应用说起&#xff0c;再深入原理解析。 CAS应用 CAS有3个操作数&#xff0c;内存值V&#xff0c;旧的预期值A&#xff0c;要修…

CAS原理图

主要原理 1 用户第一次访问一个CAS 服务的客户web 应用时&#xff08;访问URL &#xff1a;http://192.168.1.90:8081/web1 &#xff09;&#xff0c;部署在客户web 应用的cas AuthenticationFilter &#xff0c;会截获此请求&#xff0c;生成service 参数 2 然后redirect 到C…

java---CAS原理分析详解

目录 一、什么是CAS 二、乐观锁与悲观锁 1.乐观锁出现原因 2.乐观锁 3.乐观锁的实现机制---CAS 三、JAVA对CAS的支持 首先演示实际的操作 上述过程的内部原理(java层面) 四、CAS缺陷 1.ABA问题 解决ABA问题 2.循环时间长开销大 3.只能保证一个变量的原子操作 4.解…

AQS和CAS原理

锁机制&#xff08;AQS和CAS&#xff09; 一、AQS 1、AQS原理 AQS&#xff1a;AbstractQuenedSynchronizer抽象的队列式同步器。是除了java自带的synchronized关键字之外的锁机制。     AQS的全称为&#xff08;AbstractQueuedSynchronizer&#xff09;&#xff0c;这个类…

CAS原理解析

什么是CAS cas全称为compareAndSwap&#xff0c;可以很清楚的翻译知道意思为“比较和交换”&#xff0c;字面意思其实就已经解释了CAS的实现原理 CAS简介 从jdk5开始&#xff0c;jdk提供了java.util.concurrent.*&#xff0c;此包下面的类在高并发场景下经常使用&#xff0c;包…

搞定CAS的原理,看这一篇就够了!

一、什么是CAS&#xff1f; CAS &#xff08;compareAndSwap&#xff09;&#xff0c;中文叫比较交换&#xff0c;是一种无锁原子算法&#xff0c;映射到操作系统就是一条CPU的原子指令&#xff0c;其作用是让CPU先进行比较两个值是否相等&#xff0c;然后原子地更新某个位置的…

深入理解vue.js双向绑定的实现原理

vue.js是MVVM&#xff08;模型到视图和视图到模型&#xff09;结构的&#xff0c;同类的还有AngularJs&#xff1b;至于MVC、MVP、MVVM的比较网上已经有很多了&#xff0c;这样不再重复。这篇文章将给大家深入的介绍vue.js双向绑定的实现原理&#xff0c;有需要的朋友们可以参考…

MVVM数据双向绑定

MVVM采用双向数据绑定&#xff0c;view中数据变化将自动反映到viewmodel上&#xff0c;反之&#xff0c;model中数据变化也将会自动展示在页面上。把Model和View关联起来的就是ViewModel。ViewModel负责把Model的数据同步到View显示出来&#xff0c;还负责把View的修改同步回Mo…

vue双向绑定的理解

什么是双向绑定 把Model绑定到View&#xff0c;当我们用JavaScript代码更新Model时&#xff0c;View就会自动更新。在单向绑定的基础上&#xff0c;用户更新了View&#xff0c;Model的数据也自动被更新了&#xff0c;这种情况就是双向绑定 如&#xff1a; 当用户填写表单时&a…

实现vue数据双向绑定

关注公众号&#xff0c;每天都能领外卖红包 关于vue数据双向绑定也是面试很喜欢问的题目了&#xff0c;这里讲下实现方式&#xff0c;效果图、源码、demo在文章末尾 首先看下vue的基本结构 <div id"app"> <div>{{a.b.c}}</div></div> n…

双向绑定原理

适合读者: 了解 MV* 架构模式 希望了解双向绑定原理 从MVC、MVVM说起 参考阮一峰老师的文章:http://www.ruanyifeng.com/blog/2015/02/mvcmvp_mvvm.html 流程:View根据Model展示页面,当页面发生操作时(commander),View传递指令到Controller层,Controller层根据comman…

Angular 双向绑定

Angular10教程--2.3 双向绑定 双向绑定大致可以分成两种类型&#xff1a;一、普通组件的双向绑定二、表单中的双向绑定[(ngModel)]单独使用表单元素在标签中使用 总结&#xff1a; 前面我们了解了属性绑定、事件绑定以及输入和输出的使用&#xff0c;是时候了解双向绑定了。本节…

理解双向绑定

这里是修真院前端小课堂&#xff0c;每篇分享文从 【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】 八个方面深度解析前端知识/技能&#xff0c;本篇分享的是&#xff1a; 【 理解双向绑定】 大家好&#xff0c;我是IT修…

html双向绑定,双向绑定

单向绑定非常简单,就是把Model绑定到View,当我们用JavaScript代码更新Model时,View就会自动更新。 有单向绑定,就有双向绑定。如果用户更新了View,Model的数据也自动被更新了,这种情况就是双向绑定。 什么情况下用户可以更新View呢?填写表单就是一个最直接的例子。当用户…

数据双向绑定

#一、什么是双向绑定 我们先从单向绑定切入单向绑定非常简单&#xff0c;就是把Model绑定到View&#xff0c;当我们用JavaScript代码更新Model时&#xff0c;View就会自动更新双向绑定就很容易联想到了&#xff0c;在单向绑定的基础上&#xff0c;用户更新了View&#xff0c;M…

双向数据绑定是什么

面试官&#xff1a;双向数据绑定是什么 一、什么是双向绑定 我们先从单向绑定切入单向绑定非常简单&#xff0c;就是把Model绑定到View&#xff0c;当我们用JavaScript代码更新Model时&#xff0c;View就会自动更新双向绑定就很容易联想到了&#xff0c;在单向绑定的基础上&am…