|
本帖最后由 一寸灰 于 2019-1-30 12:38 编辑
●这里的循迹是指小车在白色地面上 沿着黑线走;
●传感器利用不同颜色的物体表面有不同反射性的特点:白色地面发生漫反射,黑色则被吸收。
小车的组成结构
• 硬件部分
红外传感器
驱动*2
杜邦线*若干
51最小系统*1
螺丝卡簧固定片亚克力板底盘
• 软件部分:
keil软件所写的c语言程序,控制51单片机
传感器:
在小车行驶过程中传感器不断地向地面发射红外光,红外光遇到白色地板发生漫反射,反射光被传感器的接收管接受;遇到黑色红外光会被吸收 单片机以此确定黑线的位置来控制小车的行走路线。循迹51最小系统原理图:
因为所用的L298N驱动模块上有5V稳压端,所以最小系统上面可以不需要稳压电路,直接用驱动供电即可。
下面是可以简单循迹的源代码:
#include <reg52.h>
#include "include.h"
unsigned char pwm_val =0;//变量定义
unsigned char val_left =15;// 左电机占空比N/20 //速度调节变量 0-20。。。0最小,20最大
bit PWM_ON=1;//电机PWM开关
/***************PWM电机转速***************/
void pwm_moto(void)
{
if(PWM_ON)
{
if(pwm_val <= val_left)
{
if(LIN1==1&&LIN2==1&&RIN1==1&&RIN2==1)
{ LOUT1 = 0 ;LOUT2 = 1 ;ROUT1 = 1 ;ROUT2 = 0 ;}
else if(LIN1==0&&LIN2==1&&RIN1==1&&RIN2==1)
{ LOUT1 = 1 ;LOUT2 = 0 ;ROUT1 = 1 ;ROUT2 = 0 ;}//快左拐
else if(LIN1==0&&LIN2==0&&RIN1==1&&RIN2==1)
{ LOUT1 = 1 ;LOUT2 = 0 ;ROUT1 = 1 ;ROUT2 = 0 ;}//快左拐
else if(LIN1==1&&LIN2==0&&RIN1==1&&RIN2==1)
{ LOUT1 = 0 ;LOUT2 = 0 ;ROUT1 = 1 ;ROUT2 = 0 ;}//慢左拐
else if(LIN1==1&&LIN2==1&&RIN1==0&&RIN2==1)
CarTurnRight_Low();//慢右拐
else if(LIN1==1&&LIN2==1&&RIN1==1&&RIN2==0)
{ LOUT1 = 0 ;LOUT2 = 1 ;ROUT1 = 0 ;ROUT2 = 1 ;}//快右拐
else if(LIN1==0&&LIN2==0&&RIN1==1&&RIN2==1)
{ LOUT1 = 0 ;LOUT2 = 1 ;ROUT1 = 0 ;ROUT2 = 1 ;}//快右拐
else if((LIN1==0&&LIN2==0&&RIN1==1&&RIN2==0)||(LIN1==0&&LIN2==1&&RIN1==0&&RIN2==1)||(LIN1==1&&LIN2==0&&RIN1==0&&RIN2==1))
{ LOUT1 = 0 ;LOUT2 = 1 ;ROUT1 = 1 ;ROUT2 = 0 ;}
}
else
{
LOUT1 = 0 ;LOUT2 = 0 ;ROUT1 = 0 ;ROUT2 = 0 ;
}
if(pwm_val>=20)
pwm_val=0;
}
else
{
LOUT1 = 0 ;LOUT2 = 0 ;ROUT1 = 0 ;ROUT2 = 0 ;
}
}
void main()
{
P2=0X00; //关电机
// delay(1000);
TMOD=0X01;
TH0= 0XFC;//0xFF;//0.25ms 定时//0XFC; //1ms定时
TL0= 0X66;//0x1A;//0X66;
TR0= 1;
ET0= 1;
EA = 1; //开总中断
while(1) //无限循环 无黑线为零全亮0 有黑线灯灭为一
{ //作用当为直道时 无调速即全速前进 弯道时有调速
if(LIN1==0&&LIN2==0&&RIN1==0&&RIN2==0)
{PWM_ON = 0; CarGoAhead();}
else
{PWM_ON = 1;}
}
}
//TIMER0中断服务子函数产生PWM信号
void timer0()interrupt 1
{
TH0=0XFC; //1Ms定时
TL0=0X66;
pwm_val++;
pwm_moto();
}
//定义小车光电模块输入IO口
sbit LIN1 = P1^0; //左循迹红外传感器
sbit LIN2 = P1^1;
sbit RIN1 = P1^2; //右循迹红外传感器
sbit RIN2 = P1^3;
//定义小车电机驱动模块输出IO口
sbit LOUT1 = P2^0;//LIN1 LIN3 IN1 IN2 电机1的转速和方向
sbit LOUT2 = P2^1;//LIN2 LIN4 IN3 IN4 电机2的转速和方向
sbit ROUT1 = P2^2;//RIN1 RIN3
sbit ROUT2 = P2^3;//RIN2 RIN4
//#define Left_moto_go {LOUT1 = 0,LOUT2 = 1;} //左边电机正转
//#define Left_moto_back {LOUT1 = 1,LOUT2 = 0;} //左边电机反转
//#define Left_moto_Stop {LOUT1 = 0,LOUT2 = 0;} //左边电机停转
//#define Right_moto_go {ROUT1 = 1,ROUT2 = 0;} //右边电机正转
//#define Right_moto_back {ROUT1 = 0,ROUT2 = 1;} //右边电机反转
//#define Right_moto_Stop {ROUT1 = 0,ROUT2 = 0;} //右边电机停转
//void delay(unsigned int xms)
//{
// unsigned int i,j;
// for(i=xms;i>0;i--) //i=xms即延时约xms毫秒
// for(j=112;j>0;j--);
//}
void CarGoAhead(void)//快进(P1=0000 1010 P1=0x0A)
{
// Left_moto_go;
// Right_moto_go;
LOUT1 = 0 ;
LOUT2 = 1 ;
ROUT1 = 1 ;
ROUT2 = 0 ;
}
//void CarBack(void)//快退(P1=0000 0101 P1=0x05)
//{
// Left_moto_back;
// Right_moto_back;
//}
void CarTurnLeft_Low(void)//慢左拐(P1=0000 1000 P1=0x08)
{
// Left_moto_Stop;
// Right_moto_go;
LOUT1 = 0 ;
LOUT2 = 0 ;
ROUT1 = 1 ;
ROUT2 = 0 ;
}
void CarTurnLeft_High(void)//快左拐(P1=0000 1001 P1=0x09)
{
// Left_moto_back;
// Right_moto_go;
LOUT1 = 1 ;
LOUT2 = 0 ;
ROUT1 = 1 ;
ROUT2 = 0 ;
}
void CarTurnRight_Low(void)//慢右拐(P1=0000 0010 P1=0x02)
{
// Left_moto_go;
// Right_moto_Stop;
LOUT1 = 0 ;
LOUT2 = 1 ;
ROUT1 = 0 ;
ROUT2 = 0 ;
}
void CarTurnRight_High(void)//快右拐(P1=0000 0110 P1=0x06)
{
// Left_moto_go;
// Right_moto_back;
LOUT1 = 0 ;
LOUT2 = 1 ;
ROUT1 = 0 ;
ROUT2 = 1 ;
}
|
-
0.png
(87.85 KB, 下载次数: 157)
-
0.png
(57.93 KB, 下载次数: 135)
-
-
51循迹.pdf
1.72 MB, 下载次数: 46, 下载积分: 黑币 -5
评分
-
查看全部评分
|