基于51蓝牙小车PWM波调速(看完不会你找我!!!)

目录

一、前言

二、硬件部分

(一)、L298N芯片部分介绍

(二)、L298N接线

三、软件部分   

四、手机端设置

五、总结

(一)、问题总结


一、前言

献给大家看看这次的效果图

基于51蓝牙小车PWM波调速(看完不会你找我!!!)_第1张图片

这次小车是在上一次蓝牙小车的基础上增加了调速功能,希望能帮助大家学习51小车。

二、硬件部分

(一)、L298N芯片部分介绍

基于51蓝牙小车PWM波调速(看完不会你找我!!!)_第2张图片

1.主电源正极接12v,主电源负极接GND。

 2.先将5V的跳线帽短接,这样不用额外通过5V输入端外加电源在给单片机供电,可直接有5V输入端连接导线直接给单片机供电,如不将跳线帽短接,则5V输入端输出的电压为12V,连接单片机会导致单片机烧毁(作者亲自体验过...)。

3.A相使能,B相使能是对输入1.2.3.4的控制,如果使能A和使能B加上跳线帽的话,则只需要通过控制输入1.2(一个电机),3.4(另外一个电机)分别给两个电机的两端0和1实现正反转,都给0或者都给1则电机不会转,如果使能A和使能B不加上跳线帽的话,当AB为低电平时,输入1.2.3.4都不会工作,所以可以通过控制使能A和使能B的开和关的周期来控制产生PWM波。

(二)、L298N接线

1.将5V跳线帽短接,由此可以通过5V输入给单片机供电

2.将使能A和使能B的跳线帽取下,将输入1.2.3.4连接IO口的P10,P11,P12,P13口,将使能端AB的与输入端1.2.3.4并列的接口连接到单片机的P26和P27接口

3.OUT1.2.3.4端口和蓝牙连接可以看我的《蓝牙小车》的文章

4.本次使用到的端口在程序中会标明出来

三、软件部分   

代码有多个文件,不想一个一个复制的同学可以在本文末尾下载这个工程

main.c

#include 
#include "UART.h"
#include "Timer0.h"
#include "Nixie.h"
#include "Delay.h"

sbit IN1 = P1^0; // 左上
sbit IN2 = P1^1; // 左下
sbit IN3 = P1^2; // 右上
sbit IN4 = P1^3; // 右上
sbit ENA = P2^6; //使能A
sbit ENB = P2^7; //使能B

unsigned char PWM; //PWM波
static unsigned char speed = 100; //设置速度初始值

void stop() // 停
{
	IN1=0;
	IN2=0;
	IN3=0;
	IN4=0;
}

void forward() // 向前
{
	IN1=1;
	IN2=0;
	IN3=1;
	IN4=0;	  
}

void back() // 向后
{
	IN1=0;
	IN2=1;
	IN3=0;
	IN4=1;	
}

void left() // 向左
{
	IN1=1;
	IN2=0;
	IN3=1;
	IN4=1;
}

void right() // 向右
{
	IN1=1;
	IN2=1;
	IN3=1;
	IN4=0;
	
}

void increase(void)//加速
{
	speed += 5; // 每次增加5
	if(speed >= 100) // 上限是100
	{
		speed = 100;
	}
}
	
void reduce(void)//减速
{
	speed -= 5; // 每次减少5
	if(speed <= 25) // 下限是25
	{
		speed = 25;
	}
}

//串口中断
void Time_Int () interrupt 4
{
	unsigned char date;
	if(RI == 1) // RI为1时软件置0
	{
		RI = 0; // 清除接受标志
		date = SBUF; // 接收数据缓存在date中
		switch (date)
		{
			case ('1'):
			{
				forward();
				break;
			}
			case ('2'):
			{
				back();
				break;
			}
			case ('3'):
			{
				left();
				break;
			}
			case ('4'):
			{
				right();
				break;
			}
			case ('0'):
			{
				stop();
				break;
			}
			case ('5'):
			{
				increase();
				break;
			}
			case ('6'):
			{
				reduce();
				break;
			}
		}
	}
}

//定时器0
void time_control() interrupt 1
	{
		TL0 = 0x66;		//设置定时初值
		TH0 = 0xFC;		//设置定时初值
		PWM++;
		if (PWM == 100)
		{
			PWM = 0;
		}
		if(PWM <= speed)//大于PWM波则打开使能
		{
			ENA = 1;
			ENB = 1;
		}
		if(PWM > speed)//小于PWM波则关闭使能
		{
			ENA = 0;
			ENB = 0;
		}
	}

void main ()
{
	UsartConfiguration(); // 串口初始化
	Timer0Init();//定时器0初始化
	while(1)
	{
		//在数码管可以看到当前的速度是多少
		Nixie(1, speed/100);
		Delay(5);
		Nixie(2, (speed/10)%10);
		Delay(5);
		Nixie(3, speed%10);
		Delay(5);
	}
}

UART.c(串口)

#include 

/**
   * @brief  串口初始化,[email protected]
   * @param  无
   * @retval 无
   */

void UsartConfiguration(void)		//[email protected]
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xFD;		//设定定时初值
	TH1 = 0xFD;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
	ES = 1;        //开启串口中断
    EA = 1; 		//开启总中断
}

/**
   * @brief  串口发送一个字节数据
   * @param  byte 是接收的数据
   * @retval 无
   */

void UART_SendByte(unsigned char byte)
{
	SBUF = byte;
	while (TI == 0);
	TI = 0;
}

                           

UART.h

#ifndef __UART_H__
#define __UART_H__

void UsartConfiguration(void);
void UART_SendByte(unsigned char byte);

#endif

Timer0.c(定时器0)

#include 

/**
   * @brief  定时器0,1毫秒@11.0592MHz
   * @param  无
   * @retval 无
   */

void Timer0Init(void)		//1毫秒@11.0592MHz
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x66;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0 = 1;		//定时器开关
	EA = 1;			//总开关
}



/*模板
	void time_control() interrupt 1
	{
		static unsigned int counst;//局部变量,静态变量,防止每次进入中断,都将counst置为0
		TL0 = 0x66;		//设置定时初值
		TH0 = 0xFC;		//设置定时初值
		counst++;
		if (counst == 1000)
		{
			counst = 0;
			
		}
	
	}
*/

Timer0.h

#ifndef __TIMER0_H__
#define __TIMER0_H__

void Timer0Init(void);

#endif

Nixie.c(数码管)

效果是这样的

基于51蓝牙小车PWM波调速(看完不会你找我!!!)_第3张图片

#include 
#include "Delay.h"

//数码管段码表
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

/**
  * @brief  数码管显示
  * @param  Location 要显示的位置,范围:1~8
  * @param  Number 要显示的数字,范围:段码表索引范围
  * @retval 无
  */
void Nixie(unsigned char Location,Number)
{
	switch(Location)		//位码输出
	{
		case 1:P2_4=1;P2_3=1;P2_2=1;break;
		case 2:P2_4=1;P2_3=1;P2_2=0;break;
		case 3:P2_4=1;P2_3=0;P2_2=1;break;
		case 4:P2_4=1;P2_3=0;P2_2=0;break;
		case 5:P2_4=0;P2_3=1;P2_2=1;break;
		case 6:P2_4=0;P2_3=1;P2_2=0;break;
		case 7:P2_4=0;P2_3=0;P2_2=1;break;
		case 8:P2_4=0;P2_3=0;P2_2=0;break;
	}
	P0=NixieTable[Number];	//段码输出
	Delay(1);				//显示一段时间
	P0=0x00;				//段码清0,消影
}

Nixie.h

#ifndef __NIXIE_H__
#define __NIXIE_H__

void Nixie(unsigned char Location,Number);

#endif

Delay.c(延迟)


/**
  * @brief  毫秒延时
  * @param  xms输入的毫秒
  * @retval 无
  */
void Delay(unsigned int xms)	//@11.0592MHz
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}




Delay.h

#ifndef __DELAY_H__
#define __DELAY_H__

void Delay(unsigned int xms);

#endif

四、手机端设置

在键盘端设置

基于51蓝牙小车PWM波调速(看完不会你找我!!!)_第4张图片

 基于51蓝牙小车PWM波调速(看完不会你找我!!!)_第5张图片

五、总结

(一)、问题总结

1.本程序要使用数码管所以不能占用P0口,不然数码管无法正常显示,当然不用数码管看当前速度的同学可以忽略

2.给L298N供电的电源电压不能太低,否则电压太低电机转速太慢或者电机不转动(只能听到蜂鸣声),本次电机使用的是10V电压

3.有关蓝牙模块的配置和下载可以在我的《蓝牙小车》中搜索

4.本程序的所有工程下载

链接:https://pan.baidu.com/s/1pogIYhfMhclHGqSJbqYMlg 
提取码:2233

--------------------------------------------------------------------------------------------------------------------------

作者马上要大二了!,想趁着这个暑假做一个小车玩一下,如有不对,欢迎在评论区指正。

如果本文对你有所帮助的话,可以star一下喔~

最后大家一起加油努力吧!

你可能感兴趣的:(#,51单片机,#,51小车)