51单片机寻迹小车_51单片机巡线小车说明书-程序员宅基地

技术标签: 传感器  单片机  

# 基于51单片机的循迹小车(详细讲解+源码)

作为一名学生,这里我就简单谈谈我们小组做这个循迹小车的一个过程。主要是实现小车寻黑线行驶的这样一个功能,速度可以调节(定时器中断模拟PWM波实现)

一丶硬件部分

小车的主体框架是一个三轮的外在形态

电源:采用2S可充电锂电池作为主电源供给(主要是给驱动供电)

传感器:采用灰度传感器(2个)
灰度传感器工作原理很简单,下面有介绍。它和单片机之间的联系体现在:两个灰度传感器的信号输出端DO 分别接单片机的两个引脚,根据它们检测到的值的不同情况(即0,1两种取值,两两组合共4种情况)进而确定小车前进的方向。

驱动:采用的是L298N芯片,一片L298N可以控制两个直流电机,进而驱动两个后轮。关于这个芯片,网上有很多的用户手册,可以去搜索查看,这里我就简单说说他的用法:前面蓝色的3插口是外接电源供电用的,左右两个蓝色的2插口是输出,连接电机,逻辑输入引脚IN1-IN4 接单片机引脚(单片机与驱动的联系也就在这,单片机控制IN1~IN4进而控制小车两个轮子的正转和反转),IN1-IN4旁边的两路输入ENA和ENB分别对应控制左右两路输出(接单片机引脚,通过定时器调节来输出PWM波,实现小车转弯)
在这里插入图片描述
在这里插入图片描述

控制系统:小车采用了51单片机最小系统,主控芯片选择的是STC89C52RC
在这里插入图片描述

另外:亚克力板(车子底板),防滑车轮x2,万向轮x1,杜邦线若干

工作原理简介

传感器:灰度传感器有两个检测灯,一个灯用于发射光,根据不同颜色的地面对光的吸收程度不同进而反射光强度肯定也不同,另一个灯则用于检测反射光的强度来判断是否检测到黑线。
若检测到黑线则输出低电平(0);信号灯熄灭;没检测到黑线则为高电平,信号灯点亮。(电源指示灯是一直亮着的)
在这里插入图片描述

二丶 工作流程

左右两个灰度传感器对地面进行检测,单片机(STC89C52)根据测量值的不同情况组合判断小车的前进方向,同时通过驱动(L298N)来控制小车的运动情况。
几点注意:
1.传感器需要外接电源供电,这里我们直接使用的51单片机的5V输出电压供电
2.驱动芯片L298N也需要外接电源,这里我们使用的2s可充电锂电池连接的芯片的12V电源输入端
3.单片机也需要外接电源供电,这里我们直接连接的L298N的5V电源供电端,因为L298N已经外接了一个12V电源,所以我们直接使用它的5V电源供电端
4.小车各个模块的连线可以参考这个视频:(引用)寻迹小车连线,所谓"拼车"
5.最终小车的图片( ‘线’ 场一片混乱 )
在这里插入图片描述

三丶源码

#include<reg52.h>																		   

typedef unsigned int uint;   
typedef unsigned char uchar;

uchar Duty_left,Duty_right; //左右占空比标志,取1-100
uchar i=0,j=0;
uchar flag;	 //用于循迹方向的判断

//驱动L298N----> 
//ENA,ENB为使能端; ENA,1,2和ENB,3,4分别控制一个电机;
sbit IN1 = P1^0;
sbit IN2 = P1^1;
sbit IN3 = P1^2;
sbit IN4 = P1^3;
sbit ENA = P1^6;
sbit ENB = P1^7;

sbit left=P3^2;	//左右两个灰度传感器
sbit right=P3^3;


//小车直行速度赋值
void forward_move()
{
    
    Duty_left=20;
    Duty_right=12;
    IN1=1;   	//两个电机均正转
    IN2=0; 
    IN3=1;
    IN4=0;
}

//小车停止
void stop()
{
       Duty_left=0;
	Duty_right=0;
    IN1=0;
    IN2=0;
    IN3=0;
    IN4=0;
}

//小车左转速度赋值(用于左边传感器检测到黑线)
void Left_turning()
{
    
    Duty_left=18;
    Duty_right=20;
    IN1=1;       //两个电机一个正转一个反转(或者一个正转一个不转) 
    IN2=0;
    IN3=0;		  
    IN4=1;
}

//小车右转速度赋值(用于右边传感器检测到黑线)
void Right_turning()
{
    
    Duty_left=18;
    Duty_right=20;
    IN1=0;	  
    IN2=1;
    IN3=1;	  
    IN4=0 ;
}


//定时器0中断初始化
void timer0init()
{
    
    TMOD|=0x01;//定时器T0, 工作方式1, 16位
    TH0=0xff;//定时 ff9c  0.1ms
    TL0=0x9c;
    
    EA=1;  //开启总中断
    ET0=1;//开启中断允许
    TR0=1;//开启定时器中断  
}


//定时器中断服务函数
void timer0() interrupt 1
{
    
    TH0=0xff;
    TL0=0x9c;
    i++;
    j++;
    if(i<=Duty_left)//设置左轮占空比,即左轮速度
        ENA=1;
    else
        ENA=0;
    
    if(j<=Duty_right)
        ENB=1;
    else
        ENB=0;
    
    if(i==100)  //设置pwm周期=0.1ms*100=10ms,这样开头定义的变量正好表示占空比数值
    {
    
        i=0;//加到100后变为0,重新计数
    }
    if(j==100)
    {
    
        j=0;
    }  
}

//循迹模块
void xunji()
{
       
    if((left==0)&&(right==1))
    {
    
	    flag = 0;//左边检测到黑线
    }
    else if((left==1)&&(right==0))
    {
    
		  flag = 1;//右边检测到黑线
	}
    else if((left==1)&&(right==1))
	{
    
			flag = 3; //两边都没检测到黑线
	}
		else
	{
    
		  flag = 4;
	}
		switch(flag)
	{
    
		case 0:  Right_turning();break;
		case 1:  Left_turning();break;
		case 3:  forward_move();break;
		case 4:  forward_move();break;
		default: forward_move();break;
	}
}
void main()
{
    
    timer0init();
	//forward_move();
    while(1)
    {
    
    	xunji();
    }
}

六丶最后

最后关于那个定时器中断模拟PWM波调速,我谈谈我的理解:
这里,小车的速度调节通过调节程序里定义的占空比变量的值(Duty_left,Duty_right)。例如,值为x就表示占空比为x%,占空比就是指一个周期内高电平持续时间占整个周期的比值,这里是调节占空比变量的值来控制EN的持续时间进而改变其速度。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_45189961/article/details/108697786

智能推荐

Android开发 webview闪退,Android5以后WebView闪退问题-程序员宅基地

文章浏览阅读2.3k次。Android4.4开发项目中的webview在Android各个版本运行的飞起,可是项目升级,最低版本适配5.0之后,webview各种闪退问题真让人头大!!!!!!!!!!!!!!!啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊我太难了!仔细对比了两个项目的差异,有所发现:Android5.0的build.gradle,注意implementation 'androidx.appcompat:appcompa..._hwtriwebviewlib.apk闪退

html5定位没定到,关于html5+定位的有关经验-程序员宅基地

文章浏览阅读133次。搞了两天,终于把ios跟android端的定位搞明白了,直接看代码//定位的代码要写在plusReady()里面,而且不能用mui自带的mui.plusReady(){}if(window.plus){plusReady();}else{document.addEventListener("plusready",plusReady,false);}function plusReady(){/and..._mapobj.getuserlocation获取不到当前位置信息

Excel 函数 Indirect 使用详解_indirect函数的参数-程序员宅基地

文章浏览阅读2.4k次,点赞2次,收藏10次。或文本字符串构成的。_indirect函数的参数

逻辑表达式中的短路现象-程序员宅基地

文章浏览阅读690次。当使用逻辑操作符时,我们会遇到一种“短路”现象。即一旦能够明确无误地确定整个表达式的值,就不再计算表达式余下部分了。因此,整个逻辑表达式靠后的部分有可能不会被运算。下面对这个现象进行演示:public class ShortCircuit{ //执行test1()时打印出执行信息 static boolean test1(int val){ System.out...._逻辑表达式的计算应该避免短路计算吗

C语言第6次上机,C语言第五次上机作业参考答案-程序员宅基地

文章浏览阅读83次。该楼层疑似违规已被系统折叠隐藏此楼查看此楼#include#defineN3voidaverage(intx[N][10]);voidfindgood(intx[N][10]);voidfindfail(intx[N][10]);voidmain(){//0:学号,1-5:成绩,6:平均分,7:第一门平均分,8:是否及格,9:是否优秀intstu[N][10]={0},i,j..._大连理工大学c语言慕课答案第六次上机

vue 疑难杂症记录_vue渲染数据疑难杂症-程序员宅基地

文章浏览阅读380次。一、render 函数渲染自定义组件注意的问题一般使用vue render函数渲染普通的html标签时,写法如下:render: (h) => { return ('div', {}, '测试内容')}但是有时候我们需要使用render渲染自定组件这时候就不应该在自定义的组件名上加“”号了,写法如下:render: (h) => { return (ToolBar..._vue渲染数据疑难杂症

随便推点

安装MySQL过程中(最后starting server)报错解决方案_安装mysql过程startingserver报错-程序员宅基地

文章浏览阅读161次。安装MySQL过程中(最后starting server)报错解决方案_安装mysql过程startingserver报错

VC++6.0的简单使用!(保姆级)_vc++6.0用不用加return 0-程序员宅基地

文章浏览阅读1.7w次,点赞56次,收藏195次。VC++6.0的简单使用!(保姆级)新建文件夹这个文件夹来存放新建的C文件,便于之后的整理。此文件夹放在一个自己容易找到的地方,比如桌面!打开VC++6.0新建C文件打开软件后,点击左上角文件,选择新建选择文件位置以及类型1.点击文件,选择C++ Source file2.右边文件名处,填写名称,不支持中文,数字或英文,后缀为 .c 比如1.c3.点击位置框处后三点,选择位置,目标位置为刚建好的 c 文件夹因为广告建在桌面,所以找到Desktop文件夹即可找到,Desktop默认在_vc++6.0用不用加return 0

营收增长/市值却下跌超六成,安霸的「危机」待解_安霸是如何落后的-程序员宅基地

文章浏览阅读321次。首次发布等效算力500eTOPS的AI域控制器CV3系列SoC,收购4D成像毫米波雷达公司(傲酷),一系列在汽车赛道的布局,没有能够挽救传统视觉芯片供应商安霸(Ambarella)的股价下行颓势。数据显示,在过去的4个多月时间,安霸股价从2021年12月8日最高点的216.84美元,急速下滑至83.6美元(截至美国时间4月22日收盘),总市值只剩下31.82亿美元,距离高点下滑61.45%。财报数据显示,安霸2022财年第四季度的收入为9020万美元,比2021财年同期的6210万美元增长了45%。_安霸是如何落后的

html中图片只显示部分,两种方法实现css切割图片,只取图片中一部分-程序员宅基地

文章浏览阅读6.5k次。参考地址:http://www.jb51.net/css/150036.html场景:如果一个页面有个img小图标,那么访问浏览器的时候会因为加载图片导致浏览速度放慢。这个时候将这么多的小图标放在一起,整合成一个img,那么只需要访问一张图片就可以了。就可以减少请求图片的次数整合后的img那么整合后的img有了,在使用的过程中如何获取我们想要的像素范围呢?上面的参考地址有写。我就照着做一遍吧。方法..._前端怎么让图片只展示一半内容

activiti工作流引擎入门教程-程序员宅基地

文章浏览阅读1.2w次,点赞11次,收藏79次。activiti简介Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准。Activiti是一种轻量级,可嵌入的BPM引擎,而且还设计适用于可扩展的云架构。 Activiti将提供宽松的Apache许可2.0,同时促进Activiti BPM引擎和BPMN 2.0的匹配。activiti的7大马车1.Repos..._activiti

Ubuntu18.04下VIM安装及配置_ubuntu安装vim-程序员宅基地

文章浏览阅读8.7w次,点赞37次,收藏286次。作者:陈浩 更新日期:2018-09-211.安装VIM $sudo apt-get install vim我的vim 已经是最新版 (2:8.0.1453-1ubuntu1)。2.安装vim-plug 一种方便简洁的插件管理插件终端输入如下命令: $ curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.gi..._ubuntu安装vim