目录
前言
大二的一个寒假,了解到大二的单片机原理这门课需要做一个课程设计,于是为了避免开学后各种事情 的堆积,我打算在寒假做一个课设(反正闲着也是闲着)。
一、简介
该作品为单片机课设作品(虽然最后也没用它),看网上小车挺好玩的,于是就查找了相关资料做了一个基于51单片机的蓝牙避障小车,当然功能也可以更多,比如循迹啥的。我只是简单实现两个功能,先把基础的搞定。
小车有两层板组成,核心板和底板。主控就是用的STC89C51系列的单片机;显示部分用的是0.96寸的OLED显示屏,协议为IIC;蓝牙模块用的是HC-05,其实其它的也都行(比如JDY系列,很便宜),通过串口与单片机进行通信;避障模块用的是红外对管传感器,输出数字信号来判断是否有障碍物。
小车的功能有蓝牙控制功能,OLED显示功能,自动避障功能。
二、硬件介绍
1、整体原理图
这就是个一般的单片机课设,其整体原理图如下。我也参考了一些网上的资料,打算将其开源出来。
2、核心板
核心板其实就是一个普通的51单片机最小系统,可以通过数据手册进行查看最小应用图进行绘制,也可以通过网上其他的渠道进行绘制。最小系统包括晶振电路、复位电路、P0口的上拉电阻。有一个问题需要注意,就是晶振所匹配的电容,容易一定不要选错,不要焊错,我就是因为在板子山焊接的是100nf,无论如何程序也下不进去,因为单片机就没有工作。
3、底板
底板上设计了OLED显示屏,蓝牙模块,避障模块,以及一些独立按键(目前按键还没有写功能),还有一个蜂鸣器。底板我设计的是异形板,前面的板框我进行了倒角的设计,使其更适配车模。
4、电机驱动
电机驱动模块,我选的是常用的L298N,这款电机驱动模块价格也不贵,常用于一些小车的项目中。
5、车模选型
对于车模的选择,我并没有太多的考虑,之间在优信里买的是三轮的车模,两个直流电机驱动轮,一个万向轮。
三、软件介绍
1、电机驱动程序(让小车跑起来)
驱动电机的程序也很简单,网上资料也有很多,这里不错过多赘述。直接贴代码。
motordrive.c
#include "motordriver.h"
sbit IN1 = P0^0;
sbit IN2 = P0^1;
sbit IN3 = P0^2;
sbit IN4 = P0^3;
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=0;
IN4=1;
}
void right()
{
// LF=1;
// LB=0;
// RF=0;
// RB=1;
IN1=0;
IN2=1;
IN3=1;
IN4=0;
}
void stop()
{
// LF=0;
// LB=0;
// RF=0;
// RB=0;
IN1=0;
IN2=0;
IN3=0;
IN4=0;
}
motordrive.h
#ifndef __MOTORDRIVER_H_
#define __MOTORDRIVER_H_
#include <REGX52.H>
void forward();
void back();
void left();
void right();
void stop();
#endif
2、避障模块驱动(让小车实现避障功能)
对于红外对管传感器,它其就是输出一个数字电平信号给单片机,只需要让单片机的引脚去读取是高电平还是低电平就行。当遇到障碍就输出低电平,没有障碍物就是高电平。
3、蓝牙模块调试
对于蓝牙模块,其就是单片机通过串口,将数据发给蓝牙模块。就是用到了51单片机的串口中断这个功能。
以下是串口初始化代码
void UartInit(void) //9600bps@11.0592MHz
{
PCON = 0x00; //关倍频
SCON = 0x50; //8位数据,可变波特率
TMOD |= 0x20; //设置定时器模式
TL1 = 0xFD; //设置定时初始值
TH1 = 0xFD; //设置定时重载值
ET1 = 0; //禁止定时器%d中断
TR1 = 1; //定时器1开始计时
EA=1; //总中断
ES=1; //打开串口中断
}
下面是串口中断服务函数
void Uart_Routine() interrupt 4
{
stop();
RI=0;
receiveData=SBUF;
Receive_data(receiveData);
}
4、OLED显示驱动
对于OLED,这就更加简单了,直接在淘宝客服索要例程即可。
最终实物图
哔站演示视频链接如下
最后附上程序
网盘链接,提取码:4non
https://pan.baidu.com/s/1qj1Uk8tdybWP74y7Lox9NQ