基于51单片机智能小车循迹功能的实现
说明:本博客来自本人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、运行视频
(建议调小音量再观看)
点击前往查看视频资源
四、总结
第一次做小车,感觉只要搞懂各个模块的实现的原理,做起来就轻松了很多。
文章比较简洁,不足之处,还望指出。