首页 > 其他分享 >基于51单片机智能小车循迹功能的实现

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

时间:2023-04-15 18:23:35浏览次数:36  
标签:Right run 循迹 void 51 单片机 uint motor Left

说明:本博客来自本人CSDN博客

点击跳转本人csdn博客
点击跳转本人个人网站

目录

一、思路(仅供参考)

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

二、部分硬件模块介绍

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、运行视频

(建议调小音量再观看)
点击前往查看视频资源

四、总结

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

标签:Right,run,循迹,void,51,单片机,uint,motor,Left
From: https://www.cnblogs.com/ChaoZeng/p/17321591.html

相关文章

  • 步进电机常见丢步原因分析及解决方法---TMC5160/TMC4361
    在一些自动控制领域中,步进电机的使用仍占着相当大的比例,步进电机与驱动电路组成的开环数控系统,因其简单的结构、低廉的价格和可靠的性能,目前已在很多行业中(工业自动化、医疗自动化、纺织自动化等)广泛应用。步进电机经常被用于精确定位的场合,因而保证电机不发生失步至关重要。......
  • LEC5101视学学习目标
    MAT246LEC5101VisionandLearningObjectivesWinter2023Theultimateobjectiveofthecourse,issummarizedinitstitle:topresentarichcollectionofmathematicalconcepts,toenrichourlanguage,andtosharpenourproblemsolvingintuition.Withthis......
  • 安装SQLServer20xx 提示:需要安装oracle JRE7 更新 51(64位)或更高版本2种解决办法
    这个报错我们有2种方式可以解决,一个是安装提示所说的JRE7,另外一种比较简单,就是不勾选相关功能就不会要求安装JRE了;一、安装OracleJRE7解决方法:先进下面这个网站安装JDK,安装好后配置环境变量,然后重新安装SQLServer2016即可http://www.oracle.com/technetwork/java/javase/do......
  • kuangbin专题一 简单搜索 地牢大师(POJ-2251)
    DungeonMasterTimeLimit:1000MS MemoryLimit:65536KTotalSubmissions:92499 Accepted:31990DescriptionYouaretrappedina3Ddungeonandneedtofindthequickestwayout!Thedungeoniscomposedofunitcubeswhichmayormaynotbefilledwith......
  • day30| 332+51+37
    332.重新安排行程题目简述:给你一份航线列表tickets,其中tickets[i]=[fromi,toi]表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。所有这些机票都属于一个从JFK(肯尼迪国际机场)出发的先生,所以该行程必须从JFK开始。如果存在多种有效的行程,请你按字典排序......
  • HDU 5145 NPY and girls (莫队分块离线)
    题目地址:HDU5145莫队真的好神奇。。这样的复杂度居然只有n*sqrt(n)。。。裸的莫队分块,先离线,然后按左端点分块,按块数作为第一关键字排序,然后按r值作为第二关键字进行排序。都是从小到大,可以证明这样的复杂度只有n*sqrt(n)。然后进行块之间的转移。代码如下:#include<ios......
  • FINS5516 Corporate Finance
    MohamadMOURAD–Term1,2023UNSWSydneyFINS5516–InternationalCorporateFinanceTerm1,2023,UNSWSydneyDataExerciseAssignmentDUE:Sunday16April2023,11:59pm(Sydney,Australiatime)WeightingThisassessmentisworth15%ofyourfinalgradeforFI......
  • ASEMI代理AD9951YSVZ原装ADI车规级AD9951YSVZ
    编辑:llASEMI代理AD9951YSVZ原装ADI车规级AD9951YSVZ型号:AD9951YSVZ品牌:ADI/亚德诺封装:HTQFP-48批号:2023+引脚数量:48安装类型:表面贴装型AD9951YSVZ汽车芯片特征400MSPS内部时钟速度集成14位数模转换器(DAC)32位调整字1kHz偏移时的相位噪声≤−120dBc/Hz(DAC输出)出色......
  • 今日报告-51
    今日打卡所花时间(包括上课):2h代码量(行):100发表博客:1篇(不包括本篇)学习进度和了解到的知识点:今天开了scrum项目冲刺会议,具体探讨了我们之后的规划,前端开发,调用接口等任务。......
  • UVa 514 Rails (water ver.)
    514-RailsTimelimit:3.000seconds http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=455ThereisafamousrailwaystationinPopPushCity.Countrythereisincrediblyhilly.Thest......