51单片机蓝牙通讯控制步进电机简易教学,实现精准控制
51单片机蓝牙通讯精准控制步进电机
1.蓝牙模块
本次用到的蓝牙模块为HC-05,关于HC-05怎么配置的文章已经写过很多,这里就不一一介绍了,我下面具体讲一些关于单片机蓝牙数据的收发简单快捷的方法实现蓝牙通讯的功能。
上面是HC-05图片,接线的话RX接单片机TX,TX接单片机RX,VCC和GND直接从单片机上接即可
接下来上代码,蓝牙接收的程序,因为只需要蓝牙控制步进电机转动,所以没有写发的程序,后续再补
void UART() interrupt 4
{
if(RI==1)
{
shou=SBUF;
RI=0;
}
}
蓝牙收到信息后执行命令,之所以是0x31~0x40,是因为单片机接收到的数据是ASCII码,而0X31对应数字1,依次推,收到数据就是2.3.4……,当蓝牙接受到数据进行判断,符号条件则执行,shou变量清零,这里可以用单片机点灯看效果。
void shou()
{
switch(shou)
{
case 0x31:shou=0x00;k1=1;break;
case 0x32:shou=0x00;k2=1;break;
case 0x33:shou=0x00;k3=1;break;
case 0x34:shou=0x00;k4=1;break;
case 0x35:shou=0x00;k5=1;break;
case 0x36:shou=0x00;k6=1;break;
case 0x37:shou=0x00;k7=1;break;
case 0x38:shou=0x00;k8=1;break;
case 0x39:shou=0x00;k9=1;break;
case 0x40:shou=0x00;k10==1;break;
}
}
网上有很多通信的实验,但是我调试的时候发现,有时候数据收发没有成功,那就是定时器设置有误,可以参考单片机参考手册进行开发,这里我用的是stc的单片机,stc的单片机不能直接用51单片机和52单片机设置的初值,所以直接在stc-isp进行快速配置即可
以下为配置好的程序
void UartInit(void) //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xDC; //设定定时初值
TH1 = 0xDC; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
EA=1;
ES=1;
}
记得要打开中断开关,要不然收不到信息
2 .步进电机驱动
关于步进电机的驱动,之前有博客详细讲过,有兴趣的朋友可以看一下51单片机通过驱动器驱动步进电机
以下是步进电机的驱动程序
void main () //主函数
{
EXINT_init();
P0M0=0XFF;
P0M1=0X00;
while(1)
{
if (K1==1) //按键1判断
{
Delay10ms(); //延时
if (K1==1)
{
for(h=0;h<500;h++)//for 循环500次,发送500个脉冲
{
maichong=0;
Delay400us();
maichong=1;
Delay400us();
}
}
}
定义一个脚给脉冲,脉冲为PUL脚,即PUL脚反复给高低电平,即可驱动步进电机转动,如果需要转向则给DIR脚取反即可。关于电机脉冲的延时也可以通过STC-ISP软件进行设置,软件在这篇博客里有讲解如何获取stc-isp软件
进行时间设置
全都设置完毕复制代码到自己的程序中即可
全部程序挤一起的话不适合观看和修改,所以用多个c文件储存程序,然后在主程序调用即可
main.c
#include <stc15f2k60s2.h>
#include <uart.h>
#include <delay.h>
#include <intrins.h>
#define u8 unsigned char
#define u16 unsigned int
//电机脉冲输出引脚
sbit maichong1=P1^1; //定义脉冲输出脚(PUL)电机1脉冲
sbit maichong2=P1^2; //定义脉冲输出脚(PUL)电机2脉冲
//电机方向控制引脚
sbit zhuang1=P0^1; //定义方向引脚(DIR)电机1方向
sbit zhuang2=P0^2; //定义方向引脚(DIR)电机2方向
unsigned int h; //无符号整形变量
/**CSDN博墨**************************************/
/********CSDN博墨********************************/
/****************CSDN博墨************************/
/*************************CSDN博墨***************/
/**********************************CSDN博墨******/
void main () //主函数
{
UartInit();
P0M0=0XFF;
P0M1=0X00;
while(1)
{
working();
if(k1==1)
{
for(h=0;h<500;h++)//for 循环500次,发送500个脉冲,刚好1cm
{
maichong=0;
Delay400us();
maichong=1;
Delay400us();
}
k1=0;//脉冲结束应置0;
zhuang1=~zhuang1//电机方向改变,即DIR脚状态转换
}
if(k2==1){
//执行你要执行的命令
}
}
}
uart.c
#include <stc15f2k60s2.h>
#include <uart.h>
unsigned char shou;//设置接受变量
//读取信号
extern unsigned int k1;//收到信号就执行动作
extern unsigned int k2;
void UartInit(void) //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xDC; //设定定时初值
TH1 = 0xDC; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
EA=1;
ES=1;
}
void working()
{
switch(shou)
{
case 0x31:shou=0x00;k1=1;break;//k设置为自己需要变量
case 0x32:shou=0x00;k2=1;break;
}
}
void UART() interrupt 4
{
if(RI==1)
{
Value=SBUF;
RI=0;
}
}
接收到数据就开始判断,看收到哪个状态,我这里用到2个电机,所以就有2个判断,要用的话修改一下即可
uart.h
#ifndef __UART_H
#define __UART_H
void UartInit(void) ;
void working();
void UART();
#endif
delay.c
#include <stc15f2k60s2.h>
#include <delay.h>
#include <intrins.h>
void Delay400us() //400微秒延时函数
{
unsigned char i, j;
i = 5;
j = 74;
do
{
while (--j);
} while (--i);
}
void Delay10ms() //10毫秒延时函数
{
unsigned char i, j;
i = 108;
j = 145;
do
{
while (--j);
} while (--i);
}
delay.h
#ifndef __DELAY_H
#define __DELAY_H
void Delay400us();
void Delay10ms();
#endif
以上为程序方面的介绍,下面讲一下手机如何实现和蓝牙模块进行通信,可以通过appinventor2,快捷的做一个app,当然如果要快速调试,下载个蓝牙调试助手即可
连接自己的蓝牙,然后调试收发数据即可
以上就是单片机和蓝牙模块HC-05通信教程,如有错误,希望大家指正。
作者:博墨