51智能小车黑线寻迹(防出线)

此实验需要pwm的知识,实验用到的传感器主要就是RPR220传感器;实验原理就是左右两个传感器通过对红外光进行判断,如果是黑线的话输出0,否则输出1

 实验之前需要调节左右两个电位器,用一根宽度为2.6厘米的黑线尽量将左右两个LED的调到碰到黑线同时灭,离开黑线同时亮

 通过原理图找到关于实验的两个控制引脚为P3^2,P3^3;其中还要定义蜂鸣器和矩阵键盘的引脚

#ifndef __QXA51_H__
#define __QXA51_H__

/*电机驱动IO定义*/
sbit IN1=P1^2; //为1 左电机反转
sbit IN2=P1^3; //为1 左电机正转
sbit IN3=P1^6; //为1 右电机正转
sbit IN4=P1^7; //为1 右电机反转
sbit EN1=P1^4; //为1 左电机使能
sbit EN2=P1^5; //为1 右电机使能
sbit left_led1=P3^3;//左寻迹信号 为0没有识别到黑线 为1识别到黑线
sbit right_led1=P3^2;//右寻迹信号 为0没有识别到黑线 为1识别到黑线
sbit beep=P2^3;
sbit key_s2=P3^0;

#define left_motor_en		    EN1=1 //左电机使能
#define left_motor_stops		EN1=0 //左电机停止
#define right_motor_en		  EN2=1 //右电机使能
#define right_motor_stops		EN2=0 //右电机停止

#define left_motor_go		    IN1=0,IN2=1 //左电机正转
#define left_motor_back		  IN1=1,IN2=0 //左电机反转
#define right_motor_go		  IN3=1,IN4=0 //右电机正转
#define right_motor_back		IN3=0,IN4=1 //右电机反转

#endif

#include <REGX52.H>
#include <QXA51.H>
unsigned char pwm_left_val = 150;//左电机占空比值 取值范围0-170,0最快
unsigned char pwm_right_val = 150;//右电机占空比值取值范围0-170 ,0最快
unsigned char pwm_t;//周期

void delay(unsigned int z)//毫秒级延时
{
	unsigned int x,y;
	for(x = z; x > 0; x--)
		for(y = 114; y > 0 ; y--);
}	
/*小车前进*/
void forward()
{
	left_motor_go; //左电机前进
	right_motor_go; //右电机前进
}
/*小车左转*/
void left_run()
{
	left_motor_stops; //左电机停止
	right_motor_go; //右电机前进	
}
/*小车右转*/
void right_run()
{
	right_motor_stops;//右电机停止
	left_motor_go;    //左电机前进
}
/*小车后退*/
void backward()
{
	left_motor_back; //左电机后退
	right_motor_back; //右电机后退	
}

//定时器0中断
void timer0() interrupt 1
{
	pwm_t++;//周期计时加
	if(pwm_t == 255)
		pwm_t = EN1 = EN2 = 0;
	if(pwm_left_val == pwm_t)//左电机占空比	
		EN1 = 1;		
	if(pwm_right_val == pwm_t)//右电机占空比
		EN2 = 1;			 
}
void main()
{
	for(;;)	//死循环
	{
		if(key_s2 == 0)// 实时检测S2按键是否被按下
		{
			delay(5); //软件消抖
			if(key_s2 == 0)//再检测S2是否被按下
			{
				while(!key_s2);//松手检测
				beep = 0;	//使能有源蜂鸣器
				delay(200);//200毫秒延时
				beep = 1;	//关闭有源蜂鸣器
				break;		//退出FOR死循环
			}
		}
	}
	delay(1000);//延时1秒
	TMOD |= 0x02;//8位自动重装模块
	TH0 = 220;
	TL0 = 220;//11.0592M晶振下占空比最大比值是256,输出100HZ
	TR0 = 1;//启动定时器0
	ET0 = 1;//允许定时器0中断
	EA	= 1;//总中断允许
	while(1)
	{
		//为0 没有识别到黑线 为1识别到黑线
		if(left_led1 == 1 && right_led1 == 1)//左右寻迹探头识别到黑线
		{
			forward();//前进
		}
		else
		{
			if(left_led1 == 1 && right_led1 == 0)//小车右边出线,左转修正
			{
				left_run();//左转
			}
			if(left_led1 == 0 && right_led1 == 1)//小车左边出线,右转修正
			{
				right_run();//右转
			}
			if(left_led1 == 0 && right_led1 == 0)//左右寻迹探头都没识别到黑线
			{
				backward();//后退
			}		
		}		
	}
}

  • 0
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值