技能梳理22@8051+小车+循迹+交汇

245 阅读3分钟

两个8051做主控的小车,各自循迹行驶,交汇时指示灯点亮,交汇结束熄灭

1、项目简介

在这里插入图片描述

2、实现逻辑

#逻辑比较简单,在简介里面基本描述清楚了
#资料挺多的,卖家给的,小白可以顺便学一下51单片机

3、应用场景

在这里插入图片描述

4、核心代码梳理

#include <reg52.h>//51头文件
#include <QX_A11.h>//QX_A11智能小车配置文件
unsigned char	pwm_val_left,pwm_val_right;	//中间变量,用户请勿修改。
unsigned char 	pwm_left,pwm_right;			//定义PWM输出高电平的时间的变量。用户操作PWM的变量。
#define		PWM_DUTY		200			//定义PWM的周期,数值为定时器0溢出周期,假如定时器溢出时间为100us,则PWM周期为20ms。
#define		PWM_HIGH_MIN	70			//限制PWM输出的最小占空比。用户请勿修改。
#define		PWM_HIGH_MAX	PWM_DUTY	//限制PWM输出的最大占空比。用户请勿修改。

void Timer0_Init(void); //定时器0初始化
void LoadPWM(void);//装入PWM输出值 
void forward(unsigned char LeftSpeed,unsigned char RightSpeed);//QX_A11智能小车前进 
void left_run(unsigned char LeftSpeed,unsigned char RightSpeed);//QX_A11智能小车左转  
void right_run(unsigned char LeftSpeed,unsigned char RightSpeed);//QX_A11智能小车右转
void stop(void);//QX_A11智能小车停车

void Tracking()
{
	//为0 没有识别到黑线 为1识别到黑线
	char data1,data2 = left_led1,data3 = right_led1;
	data1 = data2*10+data3;
	if(data1 == 11)//在黑线上,前进
	{
		forward(120,120);//前进
	}
	else
	{
	 	if(data1 == 10)//小幅偏右,左转
		{
			left_run(80,160);//左转
		}
		if(data1 == 1)//小幅偏左,右转
		{
			right_run(160,80);//右转
		}
		if(data1 == 0)//大幅偏左或偏右,已脱离轨道
		{
			stop();	
		}
	}
}

/*主函数*/     
void main(void)
{
    char fir = fir_pin;
	int num = 0;
	Timer0_Init();//定时0初始化
	while(1)
	{
		Tracking();
		fir = fir_pin;
	    if(!fir)	//low no
		{
		  if(num > 0)
		  	num--;
		}
		else 
		{
	        num = 3000;
		}

		if(!num)	//low no
		{
		  beep = 1;
		  led1_pin = 1;
		  led2_pin = 0;
		}
		else 
		{
			beep = 0;	 //yes
			led1_pin = 0;
			led2_pin = 1;
		}
	}	
}


/*********************************************
QX_A11智能小车前进
入口参数:LeftSpeed,RightSpeed
出口参数: 无
说明:LeftSpeed,RightSpeed分别设置左右车轮转速
**********************************************/
void forward(unsigned char LeftSpeed,unsigned char RightSpeed)
{
	pwm_left = LeftSpeed,pwm_right =  RightSpeed;//设置速度
	left_motor_go; //左电机前进
	right_motor_go; //右电机前进
}
/*小车左转*/
/*********************************************
QX_A11智能小车左转
入口参数:LeftSpeed,RightSpeed
出口参数: 无
说明:LeftSpeed,RightSpeed分别设置左右车轮转速
**********************************************/
void left_run(unsigned char LeftSpeed,unsigned char RightSpeed)
{
	pwm_left = LeftSpeed,pwm_right =  RightSpeed;//设置速度
	left_motor_back; //左电机后退
	right_motor_go; //右电机前进	
}

/*********************************************
QX_A11智能小车右转
入口参数:LeftSpeed,RightSpeed
出口参数: 无
说明:LeftSpeed,RightSpeed分别设置左右车轮转速
**********************************************/
void right_run(unsigned char LeftSpeed,unsigned char RightSpeed)
{
	pwm_left = LeftSpeed,pwm_right =  RightSpeed;//设置速度
	right_motor_back;//右电机后退
	left_motor_go;    //左电机前进
}
/*********************************************
QX_A11智能小车停车
入口参数:无
出口参数: 无
说明:QX_A11智能小车停车
**********************************************/
void stop(void)
{
	left_motor_stops;
	right_motor_stops;
}
/*********************************************
QX_A11智能小车PWM输出
入口参数:无
出口参数: 无
说明:装载PWM输出,如果设置全局变量pwm_left,pwm_right分别配置左右输出高电平时间
**********************************************/
void LoadPWM(void)
{
	if(pwm_left > PWM_HIGH_MAX)		pwm_left = PWM_HIGH_MAX;	//如果左输出写入大于最大占空比数据,则强制为最大占空比。
	if(pwm_left < PWM_HIGH_MIN)		pwm_left = PWM_HIGH_MIN;	//如果左输出写入小于最小占空比数据,则强制为最小占空比。
	if(pwm_right > PWM_HIGH_MAX)	pwm_right = PWM_HIGH_MAX;	//如果右输出写入大于最大占空比数据,则强制为最大占空比。
	if(pwm_right < PWM_HIGH_MIN)	pwm_right = PWM_HIGH_MIN;	//如果右输出写入小于最小占空比数据,则强制为最小占空比。
	if(pwm_val_left<=pwm_left)		Left_moto_pwm = 1;  //装载左PWM输出高电平时间
	else Left_moto_pwm = 0; 						    //装载左PWM输出低电平时间
	if(pwm_val_left>=PWM_DUTY)		pwm_val_left = 0;	//如果左对比值大于等于最大占空比数据,则为零

	if(pwm_val_right<=pwm_right)	Right_moto_pwm = 1; //装载右PWM输出高电平时间
	else Right_moto_pwm = 0; 							//装载右PWM输出低电平时间
	if(pwm_val_right>=PWM_DUTY)		pwm_val_right = 0;	//如果右对比值大于等于最大占空比数据,则为零
}
/********************* Timer0初始化************************/
void Timer0_Init(void)
{
	TMOD |= 0x02;//定时器0,8位自动重装模块
	TH0 = 164;
	TL0 = 164;//11.0592M晶振,12T溢出时间约等于100微秒
	TR0 = 1;//启动定时器0
	ET0 = 1;//允许定时器0中断
	EA	= 1;//总中断允许	
}
 
/********************* Timer0中断函数************************/
void timer0_int (void) interrupt 1
{
	 pwm_val_left++;
	 pwm_val_right++;
	 LoadPWM();//装载PWM输出
}	

5、部分参考资料

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6、注意事项

#买的两个线程红外循迹小车,改造的交汇
#用黑色绝缘胶带搞的循迹,胶带最好3cm宽,否则小车摆动比较厉害

完整可运行项目地址