基于51单片机的寻迹小车

智能车刚入门,前段时间制作了一个51寻迹小车,就是网上那种寻迹是用四个红外传感器,驱动是L298N,主板是自己焊接的51最小系统加了一个7805将电池的7.2v稳压成5v(虽然我直接用的电池电压),原题图网上满天飞我就不放了,废话少说,直接上代码:

#include<reg52.h>

sbit Left_led=P1^0;	    //最左边的传感器
sbit Left_mid_led=P1^1;	//左边中间的传感器
sbit Right_mid_led=P1^2;//右边中间的传感器
sbit Right_led=P1^3;  //最右边的传感器
sbit yf=P3^1;
sbit yz=P3^2;
sbit zz=P2^5;
sbit zf=P2^6;
/*yf=1;yz=0;右轮往后
yf=0;yz=1;右轮往前
zf=1;zz=0;左轮往后
zf=0;zz=1;左轮往前
*/

sbit ENA=P1^6;// 
sbit ENB=P1^7;

unsigned char pwm_value_left = 0;
unsigned char pwm_value_right = 0;
unsigned char push_value_left = 0;
unsigned char push_value_right = 0;

void delay_ms(unsigned int ms)// 延时子程序
{    
  unsigned int a,b; 
  for(a=ms;a>0;a--)
  for(b=110;b>0;b--);
}

void init()
{
	EA = 1;
	TMOD |= 0x01;
	TH0 =(65536 - 100) / 256;
	TL0 = (65536 - 100)% 256;	
	ET0 = 1;
	TR0 = 1;
}
void pwm_left()//利用pwm控制左电机速度
	{
    if(push_value_left!=0){
        if(pwm_value_left<push_value_left)
            ENB=1; 
        else
           ENB=0;
    if(pwm_value_left>50)
        pwm_value_left=0;
    }
}

void pwm_right()//利用pwm控制右电机速度
	{
    if(pwm_value_right!=0){
        if(pwm_value_right<push_value_right)
            ENA=1;
        else
            ENA=0;
    if(pwm_value_right>50)
        pwm_value_right=0;
    }
}
void timer0() interrupt 1 using 2{
  TH0 =(65536 - 100) / 256;
	TL0 = (65536 - 100)% 256;	
    pwm_value_left++;
    pwm_value_right++;
    pwm_left();
    pwm_right();
}
void turn_right1()
{ 
	
	push_value_left = 40;
	push_value_right = 0;
	zf=0;
	zz=1;
	yf=0;
	yz=0;
}
 
void turn_right2()
{
	push_value_left = 45;
	push_value_right= 0;
    zz=1;
	zf=0;
	yf=0;
	yz=0;
}
 
void turn_left1()
{
	push_value_left= 0;
	push_value_right= 40;
    zf=0;
	yz=1;
	yf=0;
	zz=0;
}
 
void turn_left2()
{
	push_value_left = 0;
	push_value_right= 45;
	zf=0;
	yz=1;
	yf=0;
	zz=0;
}
 
void qianjin()
{	
	push_value_left = 50;
	push_value_right = 45;//两个电机转速不一样,下方会讲
  yf=0;
  yz=1;    
  zz=1;
  zf=0;
  
}
 void xunji()
{
	if((Left_led == 0)&&(Left_mid_led==1)&&(Right_mid_led== 0)&&(Right_led == 0))
	{
		turn_left1(); delay_ms(10);
		if((Left_led== 0)&&(Left_mid_led  == 0)&&(Right_mid_led  == 0)&&(Right_led   == 0)) return;	
	}
	if((Left_led == 0)&&(Left_mid_led == 0)&&(Right_mid_led == 1)&&(Right_led  == 0))
	{
		turn_right1();delay_ms(10);
		if((Left_led== 0)&&(Left_mid_led  == 0)&&(Right_mid_led  == 0)&&(Right_led   == 0)) return;
	}
	if((Left_led == 0)&&(Left_mid_led== 0)&&(Right_mid_led == 0)&&(Right_led == 1))
	{
		turn_right2();delay_ms(10);
		if((Left_led== 0)&&(Left_mid_led  == 0)&&(Right_mid_led  == 0)&&(Right_led   == 0)) return;
	}
	if((Left_led== 1)&&(Left_mid_led == 0)&&(Right_mid_led == 0)&&(Right_led  == 0))
	{
		turn_left2();delay_ms(10);
		if((Left_led== 0)&&(Left_mid_led  == 0)&&(Right_mid_led  == 0)&&(Right_led   == 0)) return;
	}
}
void main()
{
	init();
	while(1)
	{qianjin();
		xunji();
	}
	}

代码注释写的不多,说一下思路吧:
1.电机控速:利用定时器以及中断控制两个电机pwm脉宽信号中的占空比达到控制电机两端电压以达到控速的效果(不懂的同学b站大学学习一下51单片机pwm那一块就好了,正所谓b站魂,b站人,b站都是人上人,哈哈哈哈)。
2.寻迹:这一块就是判断传感器的四种情况,控制电机的速度,为了让他更精确,你可以在判断过后再判断是否走了直线,如果是,就直接返回。
再说一下制作过程中遇到的问题吧:
1.主板硬件焊接问题就不多说了(最好别用一面锡的洞洞板,实测有效),最主要的是四路红外传感器的位置摆放,还真就是位置定好事半功倍,中间两路的传感器不宜过近(如果你寻迹够精确当我没说),因为如果太近一般情况下他会疯狂检测传感器 ,出现小车“蹦迪摇头”现象。
2.我的电机直线时转速居然不一样!!!!不知道有没有童鞋跟我一样,也算个提示吧。
emmmm,大概就这么多吧,第一次写博客,大佬勿喷,各位老爷,点点关注一起学习吧!!!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烧板大师手把手教你如何烧板

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值