当前位置: 首页 > article >正文

单片机毕业设计基于单片机寻迹巡线避障智能小车系统设计

文章目录

  • 前言
  • 资料获取
  • 设计介绍
  • 功能介绍
  • 设计程序
  • 具体实现截图
  • 设计获取


前言

💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗
👇🏻 精彩专栏 推荐订阅👇🏻
单片机设计精品实战案例
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人

资料获取

文章底部名片,详细资料联系我。

设计介绍

基于单片机寻迹巡线避障智能小车系统设计是一个融合了单片机控制技术、传感器技术、电机驱动技术以及智能算法的综合项目。该系统旨在设计一款能够自动跟随特定路径(如黑线)并具备避障功能的智能小车,可广泛应用于教育、科研、工业生产及娱乐等领域

功能介绍

基于单片机寻迹巡线避障智能小车系统设计是一个具有挑战性和实用价值的项目。通过合理的硬件和软件设计,可以实现小车的自主寻迹、巡线和避障功能,为智能机器人和自动化设备领域的发展提供有力支持。随着技术的不断发展和完善,该系统的应用范围和性能还将进一步提升。

智能小车系统以单片机为核心控制器,结合传感器模块、电机与驱动模块、电源模块等硬件,实现小车的自主寻迹、巡线和避障功能。系统注重稳定性、可靠性和智能化水平,以适应复杂环境中的任务需求。
在这里插入图片描述

设计程序

#include <reg51.h>
#include <intrins.h>
/* #include "ultrasonic_wave.h"//超声波头函数 */
#define unchar	unsigned char
#define uint	unsigned int
#define ULint	unsigned long int
sbit		left_go		= P0 ^ 0;       /* 左轮前进,1有效 */
sbit		left_re		= P0 ^ 1;       /* 左轮后退 */
sbit		reght_go	= P0 ^ 2;       /* 右轮前进 */
sbit		reght_re	= P0 ^ 3;       /* 右轮后退 */
sbit		mh		= P0 ^ 4;       /* 避障 */
sbit		rs		= P0 ^ 5;       /* lcd RE端 */
sbit		rw		= P0 ^ 6;       /* lcd R/W端 */
sbit		e		= P0 ^ 7;       /* lcd E端 */
sbit		sou		= P1 ^ 6;       /* 蜂鸣输出 */
unchar		seconds		= 60, s = 0; minutes = 59;
char code	number[]	= { "0123456789" };

char flag = 0;
/* 超声波 */
char flags = 0;
/* 超声波距离 */
char flag1s = 0;
/* 计算定时间 */
uint time = 0;
/* 计算距离 */
ULint L_ = 0;
/* 数值有误 */
unchar FW = 0;

unchar p1zt = 0xff, moshi = 0x00;       /* p1zt存p1口寻迹状态,moshi存控制模式 */

/* =====================延时函数==================*/
void delay()                            /* 延时100us */
{
	unchar i;
	for ( i = 0; i < 100; i++ )
		;
}


void delay_50ms()   /* 延时50ms */
{
	unchar ms;
	for ( ms = 0; ms < 50; ms++ )
	{
		delay();
	}
}


void seg( unchar i )  /* 可选秒延时i=1表示1s */
{
	unchar a;
	for (; i > 0; i-- )
	{
		for ( a = 0; a < 20; a++ )
			delay_50ms();
	}
}


/* ===============lcd屏控制=============== */
void xsj( unchar dat[16], w )    /* 写数据函数,dat[16]要显的字符串,w字符个数,w<16 */
{
	unchar a;
	for ( a = 0; a < w; a++ )
	{
		rs	= 1;
		rw	= 0;
		P2	= dat[a];
		e	= 0; delay();
		e	= 1; delay();
		e	= 0; delay();
	}
}


void xml( unchar ml )     /* 写命令函数 */
{
	rs	= 0;
	rw	= 0;
	P2	= ml;
	e	= 0; delay();
	e	= 1; delay();
	e	= 0; delay();
}


void lcd_csh()       /* lcd初始化 */
{
	xml( 0x38 );
	xml( 0x0c );
	xml( 0x01 );
	xml( 0x06 );
}


void lcd_js( unchar i )    /* lcd秒计数 */
{
	unchar ge, shi, bai, qian;
	xml( 0x80 );
	xsj( "Dist:    cm       ", 16 );

	qian	= i / 1000;
	bai	= i % 1000 / 100;
	shi	= i % 1000 % 100 / 10;
	ge	= i % 1000 % 100 % 10;

	xml( 0x85 );

	rs	= 1;
	rw	= 0;
	P2	= number[qian];
	e	= 0; delay();
	e	= 1; delay();
	e	= 0; delay();
	e	= 0; delay();

	rs	= 1;
	rw	= 0;
	P2	= number[bai];
	e	= 0; delay();
	e	= 1; delay();
	e	= 0; delay();

	rs	= 1;
	rw	= 0;
	P2	= number[shi];
	e	= 0; delay();
	e	= 1; delay();
	e	= 0; delay();

	rs	= 1;
	rw	= 0;
	P2	= number[ge];
	e	= 0; delay();
	e	= 1; delay();
	e	= 0; delay();


	seg( 1 );
}


/* ===============蜂鸣器========== */
void soud( char a, b )     /* a 次数,b=10短鸣,b=30长鸣 */
{
	unchar c, d, e = b;
	sou = 0;
	for (; a > 0; a-- )
	{
		for ( c = 0; c < e; c++ )
			for ( d = 0; d < 50; d++ )
			{
				sou = ~sou;
				delay();
			}
		delay_50ms();
	}
}


/*=====================车轮与避障控制====================*/
void left0()                    /* 左转 */
{
	left_go		= 0;    /* 左轮停止 */
	left_re		= 0;
	reght_go	= 1;    /* 右轮前进 */
	reght_re	= 0;
	soud( 1, 10 );
	xml( 0xc0 );
	/* xsj("    zuo zhuang  ",16); */
	xsj( "    Turn Left   ", 16 );
}


void left1()                    /* 左急转 */
{
	left_go		= 0;    /* 左轮后退 */
	left_re		= 1;
	reght_go	= 1;    /* 右轮前进 */
	reght_re	= 0;
	soud( 2, 10 );
	xml( 0xc0 );
	xsj( "  Turn Left(JI) ", 16 );
}


void reght0()                   /* 右转 */
{
	left_go		= 1;    /* 左轮前进 */
	left_re		= 0;
	reght_go	= 0;    /* 右轮停止 */
	reght_re	= 0;
	soud( 1, 10 );
	xml( 0xc0 );
	xsj( "   Turn Right   ", 16 );
}


void reght1()                   /* 右急转 */
{
	left_go		= 1;    /* 左轮前进 */
	left_re		= 0;
	reght_go	= 0;    /* 右轮后退 */
	reght_re	= 1;
	soud( 2, 10 );
	xml( 0xc0 );
	xsj( " Turn Right(JI) ", 16 );
}


void go()                       /* 前进 */
{
	left_go		= 1;    /* 左轮前进 */
	left_re		= 0;
	reght_go	= 1;    /* 右轮前进 */
	reght_re	= 0;
	xml( 0xc0 );
	xsj( "   Go Forward   ", 16 );
}


void re()                       /* 后退 */
{
	left_go		= 0;    /* 左轮后退 */
	left_re		= 1;
	reght_go	= 0;    /* 右轮后退 */
	reght_re	= 1;
	soud( 1, 30 );
	xml( 0xc0 );
	xsj( "     Go Back    ", 16 );
}


void stop()                     /* 停止 */
{
	xml( 0xc0 );
	xsj( "   Wu Hei Xian      ", 16 );
}


void mhq()                      /* 避障 */
{
	stop();
	mh = 1;
	delay();
	mh = 0;
	xml( 0xc0 );
	xsj( "  Obstacle... ", 16 );
}


/*=====================超声波====================*/

/* 超声波管脚定义 */
sbit	RX	= P3 ^ 0;
sbit	TX	= P3 ^ 1;

/* 超声波初始化 */
void Init_ultrasonic_wave()
{
	TX	= 0;    /* 关闭发射 */
	TMOD	= 0x11; /* 设T0为方式1,GATE=1; */
	TH0	= 0;
	TL0	= 0;
	TH1	= 0x3c;
	TL0	= 0xb0;
	ET0	= 1;    /* 允许T0中断 */
	ET1	= 1;
	TR1	= 1;
	EA	= 1;    /* 开启总中断 */
}


/* 启动超声波 */
void StartModule()      /* 启动模块 */
{
	TX = 1;         /* 启动一次模块 */
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	TX = 0;
}


/* 计算速度 */
void JS_()
{
	L_ = (time * 3.86) / 200; /* 算出来是CM; */
}


/* 距离计算 SD为当时的超声速度 */
void Conut()
{
	time	= TH0 * 256 + TL0;
	TH0	= 0;
	TL0	= 0;
	JS_();

	/* 距离大于200或者超时 */
	if ( L_ > 500 || flags == 1 )
	{
		flags = 0;
		/* 无效显示 */
		flag1s	= 0;
		L_	= 500;
		FW	= 1;
/*		Feng_Start(); */
	}
	/* 距离小于100 */
	else if ( L_ <= 500 )
	{
		flag1s	= 1;
		FW	= 0;
/*		Feng_Stop(); */
	}
}


/* ====================控制模式=============== */
void zidong()                           /* 自动模式 */
{
	p1zt = P1;
	if ( (p1zt & 0x20) == 0x20 )    /* 障碍判断 */
	{
		soud( 3, 10 );
		while ( (p1zt & 0x20) == 0x20 )
		{
			mhq();
			delay_50ms();
			p1zt = P1;
		}
		mh = 0;
	}
	p1zt = p1zt & 0x1f;
	switch ( p1zt )
	{
	case 0x1b: go(); delay_50ms(); break;           /* 正常 */
	case 0x13: reght0(); delay_50ms(); break;       /* 左偏 */
	case 0x19: left0(); delay_50ms(); break;        /* 右偏 */
	case 0x17: reght1(); delay_50ms(); break;       /* 左强偏 */
	case 0x1d: left1(); delay_50ms(); break;        /* 右强偏 */
	case 0x1F: stop(); delay_50ms(); break;        /* 右强偏 */
	/*
	 * case 0x1a:stop();delay_50ms(); break;	      / * 停止 * /
	 * case 0x00: re(); delay_50ms(); break;           / * 出道 * /
	 */
	default: break;
	}
}


void main()
{
	Init_ultrasonic_wave();
	/* 定时器开关打开 */

	stop();
	mh = 0;
	lcd_csh();
	xml( 0x80 );
	xsj( "    welcome", 11 );
	xml( 0xc0 );
	xsj( "nice to meet you", 16 );
	seg( 3 );
	xml( 0xc0 );
	xsj( " please wait ...", 16 );
	seg( 2 );
	while ( 1 )
	{
		StartModule();  /* 启动超声波 */
		while ( !RX )
			;       /* 当RX为零时等待 */
		TR0 = 1;        /* 开启计数 */
		while ( RX )
			;       /* 当RX为1计数并等待 */
		TR0 = 0;        /* 关闭计数 */
		Conut();        /* 计算距离 */
		lcd_js( L_ );
		if ( L_ < 200 )
		{
			mh = 1;
			xml( 0xc0 );
			xsj( "  Obstacle... ", 16 );
			left0(); delay_50ms();
		}else{
			mh = 0;
			switch ( moshi )
			{
			case 0x00: zidong();
				xml( 0x80 );
				break;
			default: break;
			}
		}
	}
}





具体实现截图

三个模拟红外传感器进行检测循迹,具体模式如图所示,使用超声波进行避障,避障距离可以进行调整,预设为200cm,可以代码进行修改。二次开发。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

设计获取

文章下方名片联系我即可~

精彩专栏推荐订阅:在下方专栏👇🏻

毕业设计精品实战案例

收藏关注不迷路!!

🌟文末获取设计🌟


http://www.kler.cn/a/311662.html

相关文章:

  • Hive简介 | 体系结构
  • selenium大量并发连接驱动超时
  • 数据结构-图的概念
  • 08、Java学习-面向对象中级:
  • Day39 | 动态规划 :完全背包应用 零钱兑换零钱兑换II
  • 智能问答系统流程详解:多轮对话与模型训练的技术要点及案例
  • .NET 一直跻身 30 大Github最活跃开源项目之列。
  • JDK自带的序列化
  • sqli-labs靶场搭建
  • 鸿蒙OpenHarmony【轻量系统芯片移植案例】标准系统方案之瑞芯微RK3566移植案例
  • Datawhile 组队学习Tiny-universe Task01
  • 数据结构-2.8.单链表的建立
  • 【Spring】IocDI详解(6)
  • VMWare17.5.2中Windows7企业版安装VMWareTools失败及解决办法
  • stm32单片机个人学习笔记3(GPIO输出)
  • Python 正则表达式详解:从基础匹配到高级应用
  • 华为OD机试 - 构成指定长度字符串的个数(Python/JS/C/C++ 2024 E卷 100分)
  • <<编码>> 第 14 章 反馈与触发器(7)--分频器与计数器 示例电路
  • 提升工作效率,引领编程新时代
  • 【大模型开发】 迎接AI新时代:Qwen2.5发布,超越LLaMA3!本地私有化部署:如何通过一键API调用不同模型?(附源码地址)
  • 速盾:cdn一般多长时间清理下缓存?
  • 基于Ubuntu22.04的cups安装与配置
  • Servlet的继承结构
  • Java语言程序设计基础篇_编程练习题**18.31 (替换单词)
  • 网络爬虫requests访问请求过程
  • java识别图片上的文字、java中语言库tessdate的使用