文章目录
前言
💗博主介绍:✌全网粉丝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,可以代码进行修改。二次开发。
设计获取
文章下方名片联系我即可~
精彩专栏推荐订阅:在下方专栏👇🏻
收藏关注不迷路!!
🌟文末获取设计🌟