材料:
L298N驱动模块 *1,三轮小车车模*1,7V--8V电池*1,红外循迹模块*2,超声波*1,蓝牙模块*1,及51最小系统板。某宝上都有,拼某某上更便宜,但都要注意要先检测模块是否能正常使用,其中51最小系统板可以自己画,画板子视频 https://m.bilibili.com/video/BV14V411e7cY?buvid=XXAB42EA954DC5B56BABC7C2ECC41720D1BA2&is_story_h5=false&mid=FrmqYoBUrsKtjaslQ4hSIA%3D%3D&p=1&plat_id=344&share_from=ugc&share_medium=android&share_plat=android&share_session_id=a7d66c32-c142-4df8-9b56-b5f30e0421c8&share_source=QQ&share_tag=s_i×tamp=1694780263&unique_k=PJeLT86&up_id=501743004。
前言:
本文主要讲述上述三种模块的基本原理,搭建小车需自行解决,由于能力不足本人未将三种代码合并,所以分开讲解。
L298N驱动模块:
如图1 ,2分别有两个端子,1控制左轮,2控制右轮。以1左轮为例需给俩个端子分别一高一低电平轮子才能动。而其高低电平的共计由3控制,图上并不清晰,实际3为六个引脚,中间四个引脚控制1,2的高低电平,其中左侧两个控左侧两个端子的高低电平,右侧同理,而最左与最右分别为左右引脚的使能端,相当于开关,开关关则无论高低电平均不能输出,4为三个接线端子分别为5V 12V GND ;其中板载5V使能我没有用;
红外循迹:
循迹小车原理
黑色具有较强的吸收能力,当循迹模块发射的红外线照射到黑线时,红外线将会被黑线吸收,导致循迹模块上光敏三极管处于关闭状态,此时模块上一个LED熄灭,D0引脚输出高。在没有检测到黑线时,模块上两个LED 常亮,D0输出低,A0为模拟信号输出(不同距离输出不同电压,一般可以不接)。因此循迹一般为黑线,可以借助下面代码理解一下。主要看下面的if语句来理解循迹,本人用(PWM调速)实现转弯‘pwm相关视频B站上很多且需用定时器,定时器推荐CSDN博主“竹烟淮雨”,亦可用延时加循环实现。
#include <REGX52.H>
#include <INTRINS.H>
L1 = 1;
L2 = 0;//左轮向前
R1 = 0;
R2 = 1;//右轮向前
sbit R = P1^0;//右面D0输出端
sbit L6= P2^2;//左轮使能
sbit R6= P1^1;//右轮使能
sbit L = P2^0;//左面D0输出端
sbit L1 = P2^4;
sbit L2 = P2^5;
sbit R1 = P2^6;
sbit R2 = P2^7;
#define Moto_Go {L1 =1,L2 = 0,R1 = 0,R2 = 1;}
#define Moto_BACK {L1 =0 ,L2 =1 ,R1 =1 ,R2 = 0;}
void Timer0Init(void)
{
TMOD &= 0xF0;
TMOD |= 0x01;
TL0 = 0xF7;
TH0 = 0xFF;
TF0 = 0;
ET0 = 1;
EA = 1;
TR0 = 1;
}
unsigned char Pwm1 = 0;
unsigned char Pwm2 = 0;
unsigned char batter1 = 0;
unsigned char batter2 = 0;
void Delay1ms() //@12.000MHz
{
unsigned char i, j;
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
void Pwm_R(void)
{
Pwm1%=100;
if(Pwm1<=batter1)
{
R6 = 1;
}else
{
R6 = 0;
}
}
void Pwm_L(void)
{
Pwm2%=100;
if(Pwm2<=batter2)
{
L6 = 1;
}else
{
L6 = 0;
}
}
void Timer0() interrupt 1
{
TR0 = 0;
TH0 = 0xF7;
TL0 = 0xFF;
Pwm1++;
Pwm2++;
TR0 = 1;
Pwm_L();
Pwm_R();
TR1 = 1;
}
void main()
{ Timer0Init();
while(1)
{
if((L==1)&&(R==1))
{batter1=35;
batter2=35;
Moto_Go;Delay1ms();}
else if((L==1)&&(R==0))
{ batter1=15;
batter2=5;
Moto_Go;
Delay1ms();}
else if((L==0)&&(R==1))
{batter1=5;
batter2=15;
Moto_Go;Delay1ms();}
else if((L==0)&&(R==0))
{batter1=25;
batter2=25;
Moto_BACK;Delay1ms();}
超声波模块:
本人理解的超声波为给tirg端高电平持续至少10us此时会触发模块发射超声波,超声波发射则echo引脚输出为高,当模块接收到超声波echo输出低电平我们只需计算出这段时长再除以二再*速度即可。超声波建议先用单片机上的LED或蜂鸣器检测一下。
sbit Trig = P1^3;//其它引脚同上文循迹
sbit Echo = P1^4;
float time;
float dis;
void Delay15us() //@11.0592MHz
{
unsigned char i;
i = 39;
while (--i);
}
void stare()//触发
{
Echo=0;//先将echo引脚初始化
Trig=0;
Trig=1;
Delay15us();
Trig=0;}
void Timer0Init(void) 此时定时器是计数功能
{
TMOD &= 0xF0;
TL0 = 0x00; 定时器初值赋0
TH0 = 0x00;
TF0 = 0;
ET0 = 1;
EA = 1;
}
void dist()
{
while(Echo==0);//echo为高时跳出循环,为低跳不出
TR0=1;打开定时器
while(Echo==1);//echo为低时跳出循环,为搞跳不出
TR0=0;关闭定时器
time=TH0*256+TL0;
TH0 = 0;
TL0 = 0;
TF0 = 0;
dis=time*0.017;//时间÷2*10^-6*10^2
if( dis<5)
{Moto_Go//自己定意的函数
}
if(dis>=5)
{Moto_Back//自己定意的函数
}
}
void main()
{Timer0Init();
while(1)
{
stare();
dist();
}
}
蓝牙简单控制:
手机上下载一个蓝牙调试器或其它,手机上默认波特率9600可用XCOM来调,需提前了解一下串口中断。
比如设置名字hh,密码666
AT+NAME=hh
AT+PSWD=666
发送以上两个命令即可(用XCOM,此时波特率应为38000),之后打开手机的蓝牙试试能不能连接成功。
主要用中间四个引脚vcc GND RXD TXD 其中RXD与TXD需要与单片机反接;波特率调为9600后蓝牙连接上时为慢闪,之后即可使用;看代码:
#include <REGX52.H>
sbit L1 = P2^4;
sbit L2 = P2^5;
sbit R1 = P2^6;
sbit R2 = P2^7;
sbit L6= P2^2;
sbit R6= P1^1;
#define Moto_Go {L1 =1,L2 = 0,R1 = 0,R2 = 1;}
#define Moto_L {L1 =0 ,L2 = 1,R1 = 0,R2 =1;}
#define Moto_R {L1 = 1,L2 = 0,R1 = 1,R2 = 0;}
#define Moto_BACK {L1 =0 ,L2 =1 ,R1 =1 ,R2 = 0;}
#define Stop{L1 =0,L2 = 0,R1 = 0,R2 = 0;}
unsigned char Data;
void UartInit(void) //波特率初始化使波特率9600,此部分本人也未学太好,可看其他文章,此文利于理解蓝牙使用逻辑。
{ PCON &= 0x7F;
SCON = 0x50;
TMOD &= 0x0F;
TMOD |= 0x20;
TL1 = 0xFD; 计算波特率
TH1 = 0xFD;
ET1 = 0;
TR1 = 1;
EA = 1;//中断使能
ES = 1;//串口中断使能
}
void receive(unsigned char a)
{L6=1;
R6=1;//左右轮使能
switch(a)
{
case 'A':
Moto_Go;
break;
case 'B':
Moto_L;
break;
case 'C':
Moto_R;
break;
case 'D':
Moto_BACK;
break;
case 'E':
Stop;
break;
}
}
void UartInit_seve() interrupt 4
{
Stop;
RI = 0;
Data = SBUF; SBUF即表示接收的信号也可表时示发出的信号
receive(Data);
}
总结:
本人新手,有错误望指点,一定及时积极改正,且我未能实现代码合并,(合并时未实现功能)望大佬指点;
本文并不详细,仅为帮小白更快理解上述三个模块,理解后造小车便很容易;
任何不懂的地方可私聊,尽我所能;