Bootstrap

51单片机小项目--红外巡线小车

        这次项目要求我们使用51单片机,实现红外循迹超声波避障的功能。

        我将这个几个实现的任务一步步分解开来,首先要然小车动起来,需要模块是需要电机和定时器,我们那时候用到小黄电机,驱动是用的L298N。然后就是将其他实现的功能加进去,比如先使用红外对管,可以让小车寻黑线,使用超声波躲避障碍,然后和队友一起焊遥控器,控制小车穿越规定障碍路线。当时我们51单片机的基础很差(其实就没有学),而且C语言都没有学,什么都不会,CSDN也是第一次用,搜索效率是真低啊,还好隔壁组有大佬,请教了好几次,把程序要来直接用,虽然效果不是很好,但是渐渐的我也摸索到了方法,那时候我负责红外循迹,也是三个任务里面比较难的,因为基础差,我们都没将三个任务的程序在一个main函数里面。后面的博客我会将三个程序合起来,算是弥补当时的小遗憾吧。

L298N驱动

        先了解L298N驱动的工作原理,现在看它的驱动原理,有了不同的感觉,因为我也是最近学习一些数字电路的内容,回顾它还是蛮简单的,使用之前一定要看对口再接线,尤其是正负极,还有5V和12V的接口(有一个板载5V使能跳线帽:供电电压为5V时套上,12V时摘下),其次弄懂它的逻辑原理,L298N是一个两路的驱动,它可以驱动两个电机,每一路驱动都有一个使能口,两个逻辑输入口,不同情况对应电机不同的状态。

方法1:

        这个方法是三个口控制一个电机,其实也可以使用两个口直接控制的,但是我先说一下前面这种吧,而且最开始我也是使用三个口的,这是基础的控制方法了。

IN1IN2ENA电机状态
XX0停止
101顺时针
011逆时针
000停止
110停止

(1:表示高电平,0:表示低电平)

        主要是还是使能口的确定,确定使能口的高低电平,然后给逻辑口1或0,就可以控制电机了。软件程序是需要使用定时器的,设置PWM值控制电机的转速。


//以定时器0和定时器1为例
#define uint unsigned int
uint PWM=0;  //定义PWM值,控制电机转速
uint pwm1=0;

sbit IN11 = P1^0; //定义逻辑口
sbit IN21 = P1^1;    

sbit IN31 = P1^2;                                      
sbit IN41 = P1^3;

sbit a1=P2^1; //定义驱动使能口a1
sbit b1=P2^2; //定义驱动使能口b1
uint i=0,j=0;

void Time() //定时器0和1初始函数
{ 
    TMOD |= 0x11;  //设置定时器0方式为1 定时器1为方式1
//  TMOD |= Ox01;  //设置定时器0方式为1
    EA=1;          //打开总中断
    TH0 = 0xfc;    //设置定时器处置为高四位,定时1ms
    TL0 = 0x18;    //设置定时器设置为低四位
    ET0 = 1;	  //打开定时器0中断允许
    TR0 = 1;   	  //打开定时器0
    
    TH1 = 0xfc;    //设置定时器处置为高四位,定时1ms
    TL1 = 0x18;    //设置定时器设置为低四位
    ET1 = 1;	  //打开定时器1中断允许
    TR1 = 1;   	  //打开定时器1
    
}

void Timer0() interrupt 1
{
    TH0=0xfc; 
	TL0=0x18;		
	if(i>PWM)a1=1;else a1=0;			
	i++;
	if(i>=100)i=0;
}
void Timer1() interrupt 3
{
    TH1=0xfc; 
	TL1=0x18;		
	if(j>pwm1)b1=1;else b1=0;		
	j++;
	if(j>=100)j=0;
}

void forward_move()  //电机正转函数,速度50,最大速度100
{
    PWM = 50;
    pwm1 = 50;

    IN11 = 0; 
    IN21 = 1;    

    IN31 = 0;                                      
    IN41 = 1;					
}

void xunji() //定义循迹函数
{
    forward_move();
    //这里需要用户自己写了,我们但是使用了红外对管循黑线,它很简单,使用的对管多了,逻辑就复杂一点,但是谨慎一点就好
}
void main()
{
    Timer();
    while(1)
    {
        xunji();
    }
}

​

方法2 :

        第二种方法是使用在性能更高的芯片上,比如STM32F1或F4系列的。首先要将使能口跳线帽拔掉,开启PWM调速。由于STM32的定时器有PWM模式,有模式1和模式2,这样就可以将普通口拉高或拉低,通过定时器的PWM模式(我使用的PWM模式2),赋值两个通道,直接给驱动的逻辑口输入需要的速度值即可。(这里需要对STM32定时器PWM模式有一定的理解,不然还是有点费力的,当时我就没弄明白只是会用,现在回过头才恍然大悟)

电机状态IN1IN2
正转1/PWM0
反转01/PWM
待机00
刹车11

(1:表示高电平;0:表示低电平;PWM:表示脉宽调制波,调节占空比改变调速)

        第二种方法因为要使用到STM32系里开发板,这里我就不提供代码了,等我后面写我们校内赛的总结的时候,可以加上这方面的代码。

        我的能力有限,但是希望可以帮助一些刚学习51单片机的朋友,最后呢,如有错误,还望指正,一起进步,一起努力,加油,我们不可以停止脚步哦!

        

;