STC8A8K64SD4控制的蓝牙小车设计与实现

为了检测自己学习51单片机的成果,制作了一个简单的蓝牙小车,特此来记录一下。

本文会讲解HC-05,L298N电机驱动的使用,12V转5V这个模块比较简单就不做讲解。

废话少说,先上代码!!!

main.c

#include <STC8.H>
#include "UART.h"
#include "PWM.h"
#include "Timer0.h"

void main(void)
{

	P3M1 = 0x00;
	P3M0 = 0xF2;//P30为准双向口,P31为推挽输出;
	P5M1 = 0x00;
	P5M0 = 0xFF;//P50~P53为推挽输出;
	P4M1 = 0x00;
	P4M0 = 0xFF;
	P1M0 = 0xFF;
	P1M1 = 0x00;
	P52 = 0;
	P53 = 0;
	Uart_Init();//串口初始化;
	Timer0Init();//定时器初始化
	EA = 1;//打开总中断;
	while(1);
}

PWM.h

#ifndef __PWM_H
#define __PWM_H
#include <STC8.H>  
#include "UART.h"
sbit IN1 = P3^6;
sbit IN2 = P3^7;
sbit IN3 = P5^0;
sbit IN4 = P5^1;
int a=0;
int count=0;
void forward()
{
			IN1 = 0;
			IN2 = 1;
			IN3 = 0;
			IN4 = 1;
}
void back()
{

			IN1 = 1;
			IN2 = 0;
			IN3 = 1;
			IN4 = 0;
}
void stop()
{
				IN1 = 0;
				IN2 = 0;
				IN3 = 0;
				IN4 = 0;
}
void left()
{
			IN1 = 0;
			IN2 = 1;
			IN3 = 0;
			IN4 = 1;
			
}
void right()
{
			IN1 = 0;
			IN2 = 1;
			IN3 = 0;
			IN4 = 1;
			
}

#endif  

Timer0.c

#include <STC8.H>
void Timer0Init(void)		//1微秒@12.000MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0xF4;		//设置定时初值
	TH0 = 0xFF;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;	
	ET0 = 1;//定时器0开始计时
}

Timer0.h

#include <STC8.H>
void Timer0Init(void);

UART.h 

#ifndef __UART_H
#define __UART_H
#include <STC8.H>
#include "PWM.h"
#include "oled.h"
 
void Uart_Init(void)
{
	PCON &= 0x3F;
	SCON = 0x50;
	AUXR |= 0x40;
	AUXR &= 0xFE;
	TMOD &= 0x0F;
	TH1 = 0xFE;
	TL1 = 0xC8;
	ET1 = 0;
	TR1 = 1;
	ES = 1;
	PS = 2;
}
void Uart1() interrupt 4
{
	ES=0;

	if(RI)
	{
		RI = 0;
		if(SBUF == 'F')
		{
			forward();
			ET0 = 0;
			TF0 = 0;
			P34 = 1;
			P33 = 1;
			P40 = 0;
		}
		else if(SBUF == 'B')
		{
			back();
			ET0 = 0;
			TF0 = 0;
			P34 = 1;
			P33 = 1;
			P40 = 1;
		}
		else if(SBUF == 'L')
		{	ET0 = 1;
			left();
			a=1;
			count=0;
			TF0 = 0;
			P34 = 1;
		}
		else if(SBUF == 'R')
		{ET0 = 1;
			right();
			a=2;
			count=0;
			TF0 = 0;
			P33 = 1;
		}
		else if(SBUF == 'S')
		{	ET0 = 0;
			TF0 = 0;
			stop();
		}
		else if(SBUF == 'X')
		{
			P52 = 1;
		}
		else if(SBUF == 'Y')
		{
			P52 = 0;
		}
		else if(SBUF == 'M')
		{
			P53 = 1;
		}
		else if(SBUF == 'N')
		{
			P53 = 0;
		}
		else if(SBUF == 'A')
		{
			P53 = 1;
			P52 = 1;
		}
		else if(SBUF == 'C')
		{
			P53 = 0;
			P52 = 0;
		}
	}
	if(TI)
	{
		TI = 0;
	}
	ES = 1;
}
void TMO_Rountine(void) interrupt 1
{	
	count++;
	if(a==1)
	{
			if(count==7)
		{
			P33 = 0;
			
		}
		if(count==10)
		{	P33 = 1;
			
			count=0;
		}
	}
	else if(a==2)
	{
		if(count==7)
		{
			P34 = 0;
		}
		if(count==10)
		{	P34 = 1;
			count=0;
		}
	}
	
}
#endif

HC-05模块的使用

概述
HC-05蓝牙模块是一种基于蓝牙协议的简单无线通信设备。该模块基于BC417单芯片蓝牙IC,符合蓝牙v2.0标准,支持UART和USB接口。

具有两种工作模式:命令响应工作模式和自动连接工作模式。

当模块处于命令响应工作模式(或者AT模式)时能才能执行 AT 命令,用户可向模块发送各种 AT指令,为模块设定控制参数或发布控制命令。(AT指令就是我们PC与一些终端设备(例如蓝牙,WiFi模块)之间进行通信的,配置这些终端设备参数的一套指令。)在自动连接工作模式下模块又可分为主(Master)、从(Slave)和回环(Loopback)三种工作角色。当模块处于自动连接工作模式时,将自动根据事先设定的方式连接的数据传输。主模式:该模块可以主动搜索并连接其它蓝牙模块并接收发送数据。从模式:只能被搜索被其它蓝牙模块连接进行接收发送数据。回环:蓝牙模块就是将接收的数据原样返回给远程的主设备。

HC-05蓝牙模块有六个管脚
STATE:状态指示。未连接时输出低电平,连接时输出高电平。
RXD:UART接收引脚
TXD:UART发射引脚
GND:地
VCC:接电源,可以用+5V。
EN:使能。接地禁用模块,悬空或接3.3V使能。

如何进入AT模式:
HC-05与HC-06不同,HC-06没有连接上时,就是AT模式,而HC-05需要有个开关,注意到模块上的小黑点没有,不按的时候是可配对状态,1秒闪2次。按它再上电就使HC-05进入AT模式了,严格的讲,它只是一个开的作用,无法退出AT模式。(退出的话可以在串口发送AT+RESET复位,或者重新上电)此时指示灯慢闪(2秒亮一次),模块进入AT状态。

AT指令可以参考csdn上其他文章,这里就不在列出。

注意事项:这里是凭我自己的调试经验而来

1.发送AT指令的时候,注意应该有换行。

2.电脑上选择的波特率应该和模块一致。

L298N电机驱动的使用

一、接线
废话不多说直接上图

L298N图

1、输出
L298N模块拥有双通道输出,也就是输出A与输出B,可以实现对两路电机进行不同的控制与操作,输出A与输出B就是直接连电机的两端即可。

2、供电AGB与板载5V使能的神奇跳线帽
这里就很迷幻,我就是这里出了差错,不知道该工几伏的电压,也不知道该从哪个口子输入,经过学习别的博主的总结,一共是三种接法。

①双5V输入
在A、B两处都接入一个5V电压,G接GND,AGB上方的板载5V使能要用跳线帽接起来。这种方法电压比较小,轮子可能转不起来,也无法进行PWM调速。不推荐!

②单12V输入
在A处接入一个7-12V电压,G接GND,B是一个5V输出,AGB上方的板载5V使能要用跳线帽接起来。没听错输入就变输出了,可以用来给单片机供电那种(但不太好用),这种方法很好用,转速可以,也可以进行PWM调速,最常用的方法就是它。

③单大于12V输入
在A处接入一个大于12V电压,G接GND,B是一个5V输出,AGB上方的板载5V使能的跳线帽接要拔掉。这种方法电压太大可能会烧坏玩具电机等小型电机,顺便摧毁单片机,不推荐!

3、通道使能
①PWM调速
如果你想用PWM调速,那就把通道使能脚接入单片机的PWM波输出脚。ENA控制输出A,ENB控制输出B。

②非PWM调速
不用PWM调速,就单纯想让电机转动,就给使能脚一个高电平即可,可以通过跳线帽将其与高电平输出脚相连,如果给使能脚低电平的话,电机将无法转动。

4、逻辑输入
四个脚分别接单片机的4个IO口即可。IN1、IN2控制通道A,IN3、IN4控制通道B。

二、使用方法
按照上面的方法进行接线后,我们开始理清逻辑关系。

电机状态是由通道使能脚与其对应的逻辑数输入脚进行控制。非PWM调速,就给ENA高电平,按照表格设置IN1、IN2就可以确定电机状态。PWM调速,ENA与单片机PWM波输出口相连接,按照表格设置IN1、IN2就可以确定电机状态。PWM占空比控制电机转速,占空比越大,转速越高。具体逻辑参照下面两个表格

 补充:

1.作者我另外在小车上加入了前照灯,增加了点趣味

2.使用12V转5V模块是为了给单片机供电,因为使用L298N电机驱动的5V供电十分不稳定,容易烧毁单片机(别问我怎么知道的,烧过。。。。)

成品图:

 

物联沃分享整理
物联沃-IOTWORD物联网 » STC8A8K64SD4控制的蓝牙小车设计与实现

发表评论