51单片机循迹小车

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31339221/article/details/70990814

51循迹小车做起来很简单 。

首先最小系统是要有的;

其次电机工作需要的电流不是IO口可以工作的,所以需要驱动一般使用L298N;

循迹一般是黑线使用ST188.


如果没有电路基础建议使用模块。焊接过程不复杂但是对于新手还是用难度的。


环环相扣保证每个模块都能稳定工作。


贴下参考代码我使用定时器输出PWM波

#include <reg52.h>

#define unint unsigned int
#define unchar unsigned char

extern void display(int x);
/*
* 要改的地方
*/
sbit ENA = P2^0;
sbit ENB = P2^1;
sbit IN1 = P2^2;
sbit IN2 = P2^3;
sbit IN3 = P2^4;
sbit IN4 = P2^5;
sbit jiance1 = P1^0;  //循迹模块
sbit jiance2 = P1^1;  //循迹模块


int time1 = 0,shu = 0;
void zhengzhuan();
void youzhuan();
void zuozhuan();
void xunji();
void  Time0Config();

void main()
{	 
	Time0Config();
	P0=0xff;
	while(1)
	{
	   xunji();	     //循迹程序
	   display(shu); //显示程序
	}	 
}



void  Time0Config()
{
	TMOD = 0x01;		//定时器0工作方式1
	TH0 = 0x3C;
	TL0 = 0xB0;			//装入定时器初值定时50ms
	ET0 = 1;			//定时器0中断允许
	TR0 = 1;
	EA  = 1;				//总中断允许
}


void zhengzhuan()
{
  IN1=1;
  IN2=0;
  IN3=1;
  IN4=0;

}
void zuozhuan()
{
  IN1=1;
  IN2=0;
  IN3=0;
  IN4=0;
}
void youzhuan()
{
   IN1=0;
   IN2=0;
   IN3=1;
   IN4=0;
 }
 void stop()
{
   IN1=0;
   IN2=0;
   IN3=0;
   IN4=0;
 }


void xunji()
{
		zhengzhuan();

		while(jiance1==1&&jiance2==1)
		{
			stop();
	//		break;
		}
		//当一边检测到黑线,进入循环
		while(jiance1==0&&jiance2==1)
		{
			zuozhuan();
		//	break;
		}
		while(jiance1==1&&jiance2==0)
		{
			youzhuan();
		//	break;
		}			
}


void time0(void) interrupt 1     //定时器0中断服务函数
{
	TH0 = 0x3C;
	TL0 = 0xB0;
	time1++;
	if(!(time1 - 20))
	{  time1 = 0;
	   shu++;
	}			
}


展开阅读全文

没有更多推荐了,返回首页