智能小车第二部~~~寻迹
——————————————————————————
承接上文[智能小车(一)](https://blog.csdn.net/asd20172016/article/details/80412150),
在完成超声波避障和1602液晶显示之后,下一步要对小车车增加寻迹的功能,寻迹的模块是
TCRT5000红外反射传感器,主要的实现原理是:TCRT5000传感器的红外发射二极管不断发射红外
时,3脚的电压大于2脚的电压,输出为低电平。根据这个原理就可以写代码啦~
——————————————————————————
实现的主要功能:
. 白纸上画黑线,小车车会沿着黑线走
. 顺路介绍下L298N电机驱动模块
——————————————————————————
第一步: 模块介绍
——————————————————————————
可能这个图片已经写的很清楚了,一个驱动模块带动两个电极,一个
模块需要三个
口。
第二步:话不多说上代码
#include <reg52.h>
/******************寻迹IO口声明********************/
sbit trace1 = P3^5; /*1路*/设置的为两个模块去寻迹
sbit trace2 = P2^5; /*2路*/
/**********************电机的IO口*****************/
sbit em1 = P1^4; //左后,四个电机的驱动
sbit em2 = P1^7; //右后
sbit em3 = P2^7; //右前
sbit em4 = P2^3; //左前
/*电机口*/
sbit in1 = P1^2; //左后
sbit in2 = P1^3;
sbit in3 = P1^5; //右后
sbit in4 = P1^6;
sbit in5 = P3^6; //右前
sbit in6 = P3^7;
sbit in7 = P2^1; //左前
sbit in8 = P2^2;
#define cycle 200 //宏定义一个周期,下面会进行说明
/*****************延时函数*****************/
void Delayms(unsigned int z)
{
unsigned int a, b;
for (a = z; a > 0; a--)
for (b = 110; b > 0; b--);
}
/****因为单片机上电后,电机对应端口送高电平,所以电机被启动,em1就没赋值****/
/********************电机转动************************/
void Forward() //前进
{
in1 = 1;
in2 = 0;
in3 = 1;
in4 = 0;
in5 = 1;
in6 = 0;
in7 = 1;
in8 = 0;
}
void Stop() //停止
{
in1 = 0;
in2 = 0;
in3 = 0;
in4 = 0;
in5 = 0;
in6 = 0;
in7 = 0;
in8 = 0;
}
void Reverse() //倒车
{
in1 = 0;
in2 = 1;
in3 = 0;
in4 = 1;
in5 = 0;
in6 = 1;
in7 = 0;
in8 = 1;
}
void Turn_left() //左转
{
in1 = 0;
in2 = 1;
in3 = 1;
in4 = 0;
in5 = 1;
in6 = 0;
in7 = 0;
in8 = 1;
}
void Turn_right() //右转
{
in1 = 1;
in2 = 0;
in3 = 0;
in4 = 1;
in5 = 0;
in6 = 1;
in7 = 1;
in8 = 0;
}
/*************************寻迹函数************************/
void Trace()
{
if((trace1 == 0) && (trace2 == 0)) //0代表检测到黑线
{
Delayms(50); //首先先做略微的延时,因为trace1、2不是很稳定
Forward(); //前进
Delayms(cycle); //前面宏定义的周期
Stop(); //小车停止,防止小车走的太快,不能很好的寻迹
Delayms(cycle); //再次延时,结束后进入下次循环
}
//因为这里没有写PWM小车的调速程序,怕小车走的太快而不能很好的寻迹,因此,就让小车以
//“走走停停的”形式缓慢前进。
if((trace1 == 0) && (trace2 == 1)) //0代表检测到黑线
{
Delayms(50);
Turn_left();
Delayms(cycle);
Stop(); //防止走的太快
Delayms(cycle);
}
if((trace1 == 1) && (trace2 == 0)) //0代表检测到黑线
{
Delayms(50);
Turn_right();
Delayms(cycle);
Stop(); //防止走的太快
Delayms(cycle);
}
if((trace1 == 1) && (trace2 == 1))
{
Delayms(50);
Forward();
Delayms(cycle);
Stop(); //防止走的太快
Delayms(cycle);
}
}
void main()
{
while(1)
{
Trace(); //死循环,进入寻迹
}
}
——————————————————————————
第三步: 结果展示
1.可能没啥好展示的,其中宏定义中的cycle数值,可能要根据自己的实际情况去改变一下,好了,
明天写蓝牙的那部分代码,今晚有点困,先睡了,不熬夜~~~
2.以及这些代码都是能运行的,不知道当初调了多少BUG,莫名其妙的不对,寻迹模块还是中途换过
的,今晚过了测试,才写的这个博客。
3.每个程序猿经历过的莫名奇妙的让人脑仁疼的破BUG,可能都能当一段故事吹一下,前几天不对,
今天又对了,还真是奇怪,被我归结为模块原因(其实是代码是在改不动了)。嗯,Goodnight.