目录
一、前言
二、硬件部分
(一)、L298N芯片部分介绍
(二)、L298N接线
三、软件部分
四、手机端设置
五、总结
(一)、问题总结
献给大家看看这次的效果图
这次小车是在上一次蓝牙小车的基础上增加了调速功能,希望能帮助大家学习51小车。
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波。
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(数码管)
效果是这样的
#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
在键盘端设置
1.本程序要使用数码管所以不能占用P0口,不然数码管无法正常显示,当然不用数码管看当前速度的同学可以忽略
2.给L298N供电的电源电压不能太低,否则电压太低电机转速太慢或者电机不转动(只能听到蜂鸣声),本次电机使用的是10V电压
3.有关蓝牙模块的配置和下载可以在我的《蓝牙小车》中搜索
4.本程序的所有工程下载
链接:https://pan.baidu.com/s/1pogIYhfMhclHGqSJbqYMlg
提取码:2233
--------------------------------------------------------------------------------------------------------------------------
作者马上要大二了!,想趁着这个暑假做一个小车玩一下,如有不对,欢迎在评论区指正。
如果本文对你有所帮助的话,可以star一下喔~
最后大家一起加油努力吧!