欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

浅谈基于51单片机的红外循迹小车

程序员文章站 2022-06-08 21:44:40
...

软件+硬件,仿真

做这个项目是源于我的课程设计,老师很开明,选啥都行。so做了小车。

硬件

硬件很简单,就是51单片机,直流电机,驱动电路用的是“H桥驱动电路”,再加上达林顿管。再就是红外线,因为没来的及买实物,暂时用开关代替了。话不多说,上图。

浅谈基于51单片机的红外循迹小车
两个直流电机, 都是一样的驱动电路。

软件

软件的话,主要就有几个功能函数,加上主函数。

  • 按键检测;
  • pwm函数;
  • 控制函数,根据红外信号来判断直行,左转,还是右转;
  • 转向子函数,前进,左右转;
  • 其他配置函数,因为pwm用定时器产生,必有中断初始化和中断函数;延时函数,按键消抖要用。
    为什么没有红外线信号读取的呢,因为没有实物,我也很想搞,但是时间他不允许啊。

    代码

#include <reg52.h>

#define u8 unsigned char

sbit l_sen = P2^0;
sbit r_sen = P2^1;
sbit l_motor = P2^2;
sbit r_motor = P2^3;
sbit dir_l = P2^4;
sbit dir_r = P2^5;
sbit l_ac = P1^3;
sbit r_ac = P1^4;

u8 pwm_l;		//左加减速标志位
u8 pwm_r;		//右加减速标志位
u8 num;		    //定时器0计数次数 
u8 flag;		//前进,左转,右转判断标志位
u8 l_num;
u8 r_num;


//延时1ms

void delay(u8 ms)
{
	u8 i;
	for(; ms>0; ms--)
	{
		for(i=112; i>0; i--); 
	}
}

//定时器0初始化,方式1,500us
void time0_init(void)
{
	TMOD|=0x01;
	TH0=(65536-500)/256;
	TL0=(65536-500)%256;
	ET0=1;
	EA=1;
	TR0=1;

}
 
//通过按键调节电机速度
void accelerate(void)
{
	if(l_ac==0)
	{
		delay(10);
		if(l_ac==0)
		{
			l_num++;		//左电机加速
			delay(100);
		}
	}
	if(r_ac==0)
	{
		delay(10);
		if(r_ac==0)
		{
			r_num++;		//右电机加速
			delay(100);
		}
	}
	if(l_num > 10)
	{
		l_num = 0;
	}
	if(r_num > 10)
	{
		r_num = 0;
	}		
}


//中断子程序
void t0(void) interrupt 1
{	
	TR0 = 0;
	TL0 = (65536-100)/256;
	TH0 = (65536-100)%256;
	if(num >= 32)
	{
		num = 0;
	}
	num++;
	if(num <= pwm_l)
	{
		l_motor = 0;
	}
	else 
	{
		l_motor = 1;
	}
	if(num <= pwm_r)
	{
		r_motor = 0;
	}
	else
	{
		r_motor = 1;
	}
	TR0 = 1;
	
}

//前进,左转,右转
void qianjin(void)
{
	pwm_l = 25 + l_num;
	pwm_r = 25 + r_num;
}
void turn_left(void)

{
 	pwm_l = 5 + l_num;
	pwm_r = 25 + r_num;
}

void turn_right(void)
{
	pwm_l = 25 + l_num;
	pwm_r = 5 + r_num;
}

//前进,左转,右转判断函数
void control(void )
{
	if(l_sen == 1 && r_sen == 1)
	{
		flag = 0;
	}
	else if(l_sen ==0 && r_sen == 1)
	{
		flag = 1;
	}
	else if(l_sen ==1 && r_sen ==0)
	{
		flag = 2;
	}

	switch(flag)
	{
		case 0:qianjin();		break;
		case 1:turn_left();		break;
		case 2:turn_right();	break;
		default : break;
	}
}

//主函数
void main(void)
{
	flag = 0;
	l_motor = 0;
	r_motor = 0;
	pwm_l = 25;
	pwm_r = 25;
	num = 0;
	time0_init();
	dir_l = 1;
	dir_r = 1;
	l_num = 0;
	r_num = 0;
	while(1)
	{
		accelerate();
		control();	 
	}		
}

ps:按键调速,鸡肋功能,完全是老师要求要加的,个人认为鸡肋。

仿真中的问题总结

  • 1,proteus,开始,电机完全不转,多番调试无果,最后发现,proteus不稳定,果然盗版就是不香。

  • 2,关于电机电压,+12v,应该是,默认的,but默认vcc +5v,导致后来电机转了,超级慢,调速效果根本看不出来,记得要把给电机供电的vcc改为“+12v”,注意,“+12v",不要把”+“搞掉了,不然会报错。

    小车很low,大佬们原谅一下吧!给小白们共享一下经验,祝你们越来越会开车。

相关标签: 单片机