草庐IT

基于51单片机智能小车循迹功能的实现

CU_Chao 2024-02-21 原文

基于51单片机智能小车循迹功能的实现

目录

一、思路(仅供参考)

本实验采用两路红外循迹模块单黑线循迹的方法。当红外循迹模块未检测到黑线,则前进;若一边检测到黑线,则实现转弯;若两边均检测到黑线,则停止。利用两路红外循迹模块接收到的信号控制电机的运动,实现小车的前进,转弯等运动。

二、部分硬件模块介绍

1、L298n电机驱动模块

2、两路红外循迹模块

背面

正面
--------------------(黄色的旋钮是用来调节灵敏度的)-----------------------------

三、实现

1、代码

(1)、函数部分

#include <reg52.h>
#include "header.h"


void Left_forward()//左轮前转
{
	Left_1=0;
 	Left_2=1;

}
void Left_back()//左轮后转
{
	Left_1=1;
 	Left_2=0;
}
void Left_stop()左轮停止(刹车)
{
	Left_1=1;
	Left_2=1;
}


void Right_forward()//右轮前转
{
	Right_1=1;
	Right_2=0;

}
void Right_back()//右轮后转
{
	Right_1=0;
	Right_2=1;
}
void Right_stop()//右轮停止
{
	Right_1=1;
	Right_2=1;
}


void Forward_run()//前进
{
	Left_forward();
	Right_forward();
}

void Back_run()//后退
{
	Left_back();
	Right_back();
}

void Left_run()//边前进边左转
{
 
	Left_stop();
    Right_forward();
}

void Right_run()//边前进边右转
{
	Left_forward();
	Right_stop();
}
void Stop_run()//停止(刹车)
{
	Left_stop();
	Right_stop();
}
void Stop_Left_run()//原地左转
{
	Left_back();
	Right_forward();
}
void Stop_Right_run()//原地右转
{
	Left_forward();
	Right_back();
}
void PWM_left_motor()//左轮pwm调速
{
	if(Left_motor_var<Left_cycle)
	{
 		if(Left_motor_var<=Left_H)
			ENA=1;
		else
			ENA=0;
	}
	else
	{
		Left_motor_var=0;
	}
}

void PWM_right_motor()//右轮pwm调速
{
	if(Right_motor_var<Right_cycle)
	{
 		if(Right_motor_var<=Right_H)
			ENB=1;
		else
			ENB=0;
	}
	else//(Right_moto_var>=Right_cycle)
	{
		Right_motor_var=0;
	}
}



void Init_timer0()
{
	TMOD=0x01;			//定时器0方式1
	TH0=(65536-100)/256; //100微秒
	TL0=(65536-100)%256;
	EA=1;
	ET0=1;
	TR0=1;
}

void Follow_Function()//循迹函数
{
	if(Left_reaction==0&&Right_reaction==0)//左右均为检测到黑线(有信号返回)
		Forward_run();
	else
	{
	if(Left_reaction==1&&Right_reaction==1)//左右无信号返回,均检测到黑线
		Stop_run();
	if(Left_reaction==0&&Right_reaction==1)	//右边检测到黑线,右转
		Stop_Right_run();	
	if(Left_reaction==1&&Right_reaction==0)//左转
		 Stop_Left_run();
		 }
}
void Delay_1ms(uint k)		
{
	unsigned char i, j;
	while(k--)
	{
		_nop_();
		i = 2;
		j = 199;
		do
		{
			while (--j);
		}
		while (--i);
	}
}

(2)、头文件

#ifndef __header_H
#define __header_H
#include<intrins.h>
typedef unsigned int uint;
/*L298n电机驱动模块*/
sbit Left_1=P1^2;
sbit Left_2=P1^3;
sbit Right_1=P1^4;
sbit Right_2=P1^5;
sbit ENA=P1^0;
sbit ENB=P1^1;
/*红外循迹模块R0、L0*/
sbit Left_reaction=P3^6;
sbit Right_reaction=P3^7;

extern uint Left_motor_var;//用于左电机周期计数
extern uint Left_H;		//左电机高电平,用于计算占空比
extern uint Right_motor_var;
extern uint Right_H;
extern uint Left_cycle;//左电机周期
extern uint Right_cycle;
void Left_forward();
void Left_back();
void Left_stop();
void Right_forward();
void Right_back();
void Right_stop();
void Forward_run();
void Back_run();
void Left_run();
void Right_run();
void Stop_run();
void Stop_Left_run();
void Stop_Right_run();
void PWM_left_motor();
void PWM_right_motor();
void Init_timer0();
void Follow_Function();
void Delay_1ms(uint k);
#endif

(3)、主函数

#include <reg52.h>
#include "header.h"

uint Left_motor_var=0;
uint Left_H=100;
uint Right_motor_var=0;
uint Right_H=100;
uint Left_cycle=100;
uint Right_cycle=100;

void main()
{
	Init_timer0();
	while(1)
	{
		Follow_Function();
	}
}
void timer_t0()interrupt 1
{
	TH0=(65536-100)/256;
	TL0=(65536-100)%256;
	Left_motor_var++;
	Right_motor_var++;
	PWM_left_motor();
	PWM_right_motor();
}

2、运行视频(…注意:该视频有声音!!!建议先关声音…)

…注意:该视频有声音!!!…
…注意:该视频有声音!!!…
…注意:该视频有声音!!!…
(建议调小音量再观看)
视频若无法正常播放,可前往主页查看视频资源

51循迹小车运行视频

四、总结

第一次做小车,感觉只要搞懂各个模块的实现的原理,做起来就轻松了很多。
文章比较简洁,不足之处,还望指出。

有关基于51单片机智能小车循迹功能的实现的更多相关文章

  1. ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能? - 2

    只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您

  2. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  3. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  4. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  5. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  6. ruby-on-rails - rails 功能测试 - 2

    在Rails自动生成的功能测试(test/functional/products_controller_test.rb)中,我看到以下代码:classProductsControllerTest我的问题是:方法调用products()在哪里/如何定义?products(:one)到底是什么意思?看代码,大概意思是“创建一个产品”,但是它是如何工作的呢?注意我是Ruby/Rails的新手,如果这些是微不足道的问题,我深表歉意。 最佳答案 如果您查看test/fixtures文件夹,您会看到一个products.yml文件。这是在您创建

  7. ruby-on-rails - (Ruby,Rails) 基于角色的身份验证和用户管理...? - 2

    我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源

  8. ruby-on-rails - 功能测试 Authlogic? - 2

    在我的一些Controller中,我有一个before_filter检查用户是否登录?用于CRUD操作。application.rbdeflogged_in?unlesscurrent_userredirect_toroot_pathendendprivatedefcurrent_user_sessionreturn@current_user_sessionifdefined?(@current_user_session)@current_user_session=UserSession.findenddefcurrent_userreturn@current_userifdefine

  9. ruby - 在 Rakefile 中动态生成 Rake 测试任务(基于现有的测试文件) - 2

    我正在根据Rakefile中的现有测试文件动态生成测试任务。假设您有各种以模式命名的单元测试文件test_.rb.所以我正在做的是创建一个以“测试”命名空间内的文件名命名的任务。使用下面的代码,我可以用raketest:调用所有测试require'rake/testtask'task:default=>'test:all'namespace:testdodesc"Runalltests"Rake::TestTask.new(:all)do|t|t.test_files=FileList['test_*.rb']endFileList['test_*.rb'].eachdo|task|n

  10. ruby - 如何使用 Ruby 基于字母数字字符串生成颜色? - 2

    我想要像“嘿那里”这样的东西变成,例如,#316583。我希望将任意长度的字符串“归结”为十六进制颜色。我不知道从哪里开始。我在想,每个字符串的MD5散列都是不同的-但如何将该散列转换为十六进制颜色数字? 最佳答案 你可以只取几位前几位:require'digest/md5'color=Digest::MD5.hexdigest('Mytext')[0..5] 关于ruby-如何使用Ruby基于字母数字字符串生成颜色?,我们在StackOverflow上找到一个类似的问题:

随机推荐