基于51单片机智能小车循迹功能的实现
目录
- 基于51单片机智能小车循迹功能的实现
- 一、思路(仅供参考)
- 二、部分硬件模块介绍
- 1、L298n电机驱动模块
- 2、两路红外循迹模块
- 三、实现
- 1、代码
- 2、运行视频(...注意:该视频有声音!!!建议先关声音...)
- 四、总结
一、思路(仅供参考)
本实验采用两路红外循迹模块单黑线循迹的方法。当红外循迹模块未检测到黑线,则前进;若一边检测到黑线,则实现转弯;若两边均检测到黑线,则停止。利用两路红外循迹模块接收到的信号控制电机的运动,实现小车的前进,转弯等运动。
二、部分硬件模块介绍
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;elseENA=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;elseENB=0;}else//(Right_moto_var>=Right_cycle){Right_motor_var=0;}
}void Init_timer0()
{TMOD=0x01; //定时器0方式1TH0=(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();}
}
(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、运行视频(…注意:该视频有声音!!!建议先关声音…)
…注意:该视频有声音!!!…
…注意:该视频有声音!!!…
…注意:该视频有声音!!!…
(建议调小音量再观看)
视频若无法正常播放,可前往主页查看视频资源

51循迹小车运行视频
四、总结
第一次做小车,感觉只要搞懂各个模块的实现的原理,做起来就轻松了很多。
文章比较简洁,不足之处,还望指出。