基于51单片机四路循迹小车

article/2025/8/4 5:14:19

文章目录

    • 一. 任务要求
    • 二. 系统原理
    • 三. 整体方案
      • 1. 控制模块
        • 最小系统
        • 去除AD网格线
      • 2. 电机驱动模块
      • 3. 电源模块
      • 4. 循迹模块
      • 5. 超声波测距模块
    • 四. 车体实物图
    • 五. 软件实现

这学期开设的51单片机课程的课程设计即将验收,今天开始正式着手做循迹小车~

一. 任务要求

在这里插入图片描述
在这里插入图片描述

二. 系统原理

本系统以设计题目的要求为目的,采用STC89C52单片机为控制核心,利用红外传感器检测轨道,控制电动小汽车的自动循迹,快慢速行驶。

这里的轨道是指汽车沿着白色地板上的黑线行驶。由于黑线与白地板的反射系数不同,可以根据接收到的反射光的强度来判断“道路”。常用的方法是红外检测。

红外检测方法,即在汽车行驶过程中,利用红外光在具有不同颜色的物体表面的不同反射特性,不断向地面发射红外光。当红外光与白纸地板相遇时,会发生漫反射,反射光被安装在车内的接收器接收,如果遇到黑线,就会变成红色。外部光被吸收,车内的接收器不能接收红外线。单片机根据是否接收到反射的红外光来确定黑线的位置和汽车的行驶路线。

三. 整体方案

1. 控制模块

小车的核心控制部件采用STC公司生产的8位单片机STC89C52。它是一种低功耗、高性能CMOS8位微控制器,具有8K字节系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但是做了很多的改进使得芯片具有传统51单片机不具备的功能。STC89C52有3个16 位定时器/计数器,2个外部中断,1个串口中断。

最小系统

51单片机的具体引脚功能不细说,不了解的可自行百度。直接上最小系统电路图(自己画的,凑合着看)。顺便说一句,在我看来一个没有指示灯的电路是最烦的电路<(`^´)> 我的复位一定要有灯才行!

在这里插入图片描述
三部分:
①电源电路:给单片机提供5V的电源
②时钟电路:外接11.0592M石英晶振。
③复位电路:确保单片机是从一个确定的初始状态开始。

焊接时注意P0口要接上拉电阻,否则不能用,一般都用排阻做上拉电阻(当然如果能自己画板子就更好了)。

去除AD网格线

记一下怎么去除AD网格线,如图步骤,最后去掉Visible前面的对勾即可,别忘记最后点OK:
在这里插入图片描述

2. 电机驱动模块

我使用的是最经典的LM298N电机驱动:

我太喜欢用298了。不仅可以接至12v(即拥有更强的驱动能力),而且有过电流保护功能,当出现电机卡死时,可以保护电路和电机等。且自带7805降压模块可直接给单片机供电~~
实物图:
在这里插入图片描述
驱动与各部分的连接简介:
输出A、B:分别接到左右马达上,通过使能A、使能B来控制电机正常工作(接高电平为正常工作);
单片机IO控制输入(即IN1-IN4):用来控制马达正反转。接单片机引脚,通过在程序中给引脚高低电平实现正转或反转(详见下边输入输出关系表);
12V输入:接电池盒正极;
5V输入:接单片机VCC,给单片机供电;
电源地(即GND):把电池盒负极和单片机的GND一起接入。
在这里插入图片描述
电路图:
在这里插入图片描述
输入输出关系(使能ENA、ENB均为1的状态下):

In1In2运转状态
10正转
01反转
11刹停
00停止

3. 电源模块

我自己使用的是两节18500锂电池供电。如果觉得两节电池不够,三节12V又太大,也可以在中间加一个7809稳压管把电压降到9V再接入驱动:
在这里插入图片描述

4. 循迹模块

光电循迹是由四对红外收发管组成,通过检测接收到的反射光强,判断黑白线。

当模块探测灯检测到黑线时指示灯熄灭,同时 OUT端口持续输出高电平信号,反之未检测到黑线的探测灯应常亮,OUT端口输出低电平。该模块检测距离 2~60cm,检测角度 35 ° ,检测距离可以通过电位器进行调节,顺时针调电位器,灵敏度增加;逆时针调电位器,灵敏度减少。
在这里插入图片描述
原理图由红外对管和电压比较器两部分组成,红外对管输出的模拟电压通过电压比较器转换成数字电平输出到单片机。

主控板的电路图:
在这里插入图片描述
小板电路图:
在这里插入图片描述
注意连接的时候:VCC-VCC、GND-GND、IN-OUT。

比较器LM339
在这里插入图片描述

5. 超声波测距模块

实物图:
在这里插入图片描述
电路图:
在这里插入图片描述
工作原理
  (1)采用IO口TRIG触发测距,给至少10us的高电平信号;
  (2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
  (3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。
  测试距离=(高电平时间*声速(340M/S))/2;

四. 车体实物图

在这里插入图片描述

五. 软件实现

#include<reg52.h>
typedef unsigned int u16;
typedef unsigned char u8;sbit ENA = P2^0;   //右点机使能
sbit IN1 = P2^1;   //为0右轮反转
sbit IN2 = P2^2;   //为0右轮正转
sbit IN3 = P2^3;   //为0左轮正转
sbit IN4 = P2^4;   //为0左轮反转
sbit ENB = P2^5;   //左电机使能sbit left1 = P1^3;
sbit left2 = P1^2;
sbit right1 = P1^1;
sbit right2 = P1^0;u8 PWMCnt1 = 0;
u8 PWMCnt2 = 0;
u8 cntPWM1 = 0;
u8 cntPWM2 = 0;void Timer0Init();
void XunJi();void main()
{Timer0Init();while(1){XunJi();}	
}
// i = 1时, 大概延时10us
//void delay(u16 i)
//{
//    while (i--);
//}void Timer0Init()
{TH0 = 0xFF;TL0 = 0xA3;TMOD &= 0xF0;TMOD |= 0x01;EA = 1;ET0 = 1;TR0 = 1;
}void TurnRight1()		   //右转
{IN1 = 0;	//右轮反转IN2 = 1;IN3 = 0;	//左轮正转IN4 = 1;cntPWM1 = 70;cntPWM2	= 55;
}void TurnRight2()		   //右转
{IN1 = 0;	//右轮反转IN2 = 1;IN3 = 0;	//左轮正转IN4 = 1;cntPWM1 = 50;cntPWM2	= 40;
}void TurnLeft1()				//左转
{IN1 = 1;IN2 = 0;   	//右轮正转IN3 = 1;IN4 = 0;   	//左轮反转cntPWM1 = 55;cntPWM2	= 70;
}			  	void TurnLeft2()				//左转
{IN1 = 1;IN2 = 0;   	//右轮正转IN3 = 1;IN4 = 0;   	//左轮反转cntPWM1 = 40;cntPWM2	= 50;
}	void Forward()				 //前进
{IN1 = 1;IN2 = 0;   	//右轮正转IN3 = 0;   	//左轮正转IN4 = 1;cntPWM1 = 40;cntPWM2	= 40;
}//void Backward()					 //后退
//{
//	IN1 = 0;	//右轮反转
//	IN2 = 1;
//
//	IN3 = 1;
//	IN4 = 0;	//左轮反转
//	cntPWM1 = 30;
//	cntPWM2	= 30;
//}void Stop()					  //停止
{IN1 = 0;IN2 = 0;IN3 = 0;IN4 = 0;
}
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 = 1;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 = 3;//?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 = 5;switch(flag){case 0:Forward();break;case 1:TurnRight1();break;case 2:TurnRight2();break;case 3:TurnLeft1();break;case 4:TurnLeft2();break;default:Stop();break;}
}void InterruptTime0() interrupt 1
{PWMCnt1++;PWMCnt2++;if(PWMCnt1  >= 200){PWMCnt1 = 0;}if(PWMCnt1 <= cntPWM1){ENA = 1;}else{ENA = 0;}if(PWMCnt2 >= 200){PWMCnt2 = 0;}if(PWMCnt2 <= cntPWM2){ENB = 1;}else{ENB = 0;}TH0 = (65536 - 50)/256;TL0 = (65536 - 50)%256;
}

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

相关文章

51单片机循迹小车

一.材料 1.51单片机开发板 2.L298N电机 3.红外循迹模块 4.直流电机 5.电池&#xff08;提供电源&#xff0c;选用的是三节18650锂电池&#xff09; 6.杜邦线 7.两个主动轮&#xff0c;一个万向轮 8.小车底板&#xff08;亚克力板&#xff09; 二.实现效果 使小车在两…

【51单片机实例教程】智能小车(一)让你的小车跑起来

文章目录 前言 一、硬件 1.小车底盘 2.51单片机最小系统板 3.L298N双路电机驱动板 二、仿真模拟图 三、代码部分 1.直行 2.后退 3.左转圈 4.右转圈 总结 前言 智能小车的项目非常多&#xff0c;比如说循迹避障、蓝牙遥控、视觉控制&#xff08;这一块用51单片机比较…

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

基于51单片机的循迹小车 文章目录 基于51单片机的循迹小车 前言一、系统概述1.工作原理2.控制系统结构框图 二、循迹小车硬件1.电机驱动模块2.循迹模块 三、循迹小车软件四、源码&#xff08;仅供参考&#xff09; 前言 该小车采用单片机STC89C52作为主控制核心&#xff0c;通过…

单片机小车

*## 单片机小车 本周作为单片机新手的我制作了我的第一个作品—单片机小车 一 元件&#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修…