现在的手机,平板,笔记本电脑都会自带蓝牙。本文将会介绍51单片机使用HC 06 蓝牙模块实现手机与笔记本电脑的通讯。
HC 06 模块
购买HC 06模块后需要检测蓝牙模块是否是好的,使用串口线与HC 06 模块连接起来。并在电脑上的串口助手上发送“AT”,在串口助手上可以收到“OK”。
注:建议使用与本文一样的串口调试助手,或者让商家提供测试的串口助手程序。
硬件连接
HC 06 模块TXD 连接单片机的RXD,HC 06 模块RXD 连接单片机的TXD;
功能描述:
上位机在串口助手发送命令,通过上位机的蓝牙传输到单片机中,实现上位机控制LED,并且返回接收的命令。
效果展示:
笔记本蓝牙与51单片机
手机蓝牙与51单片机
注:
1:HC 06 模块需要跟电脑行蓝牙匹配时,才会出现“蓝牙链接上的标准串行口”,PIN 连接码 默认为 “1234”;通过对比配对前后的设备管理器,增加的COM判断哪个是蓝牙的。
2:笔记本上如果有多个“蓝牙链接上的标准串行口”,可以直接点击开始按钮连接,看下方的串口是否打开正确。
程序:
main.c
#include "uart.h"
void main()
{
Uart_Init();
while(1) ;
}
void Uart_irq() interrupt 4
{
if(RI==1) //接收才有效
{
Uart_GetData();
Uart_CtrlLed();
}
}
sys.h
#include "stdio.h" //标准库头文件
#define ON 1
#define OFF 0
//---重定义关键词---//
//#ifndef uchar
#define uchar unsigned char
//#endif
//#ifndef uint
#define uint unsigned int
//#endif
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
void delayms(uint y);
void delayus(uint i);
void irq0Init();
#endif
sys.c
#include "sys.h"
void delayms(uint y)
{
uint x;
for( ; y>0; y--)
{
for(x=110; x>0; x--);
}
}
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delayus(uint i)
{
while(i--);
}
uart.h
#ifndef __UART_H__
#define __UART_H__
#include "sys.h"
//位操作LED
sbit LED0 = P2^0;
sbit LED1 = P2^1;
sbit LED2 = P2^2;
sbit LED3 = P2^3;
sbit LED4 = P2^4;
sbit LED5 = P2^5;
sbit LED6 = P2^6;
sbit LED7 = P2^7;
extern u8 tack[20];
void Uart_Init();
void Uart_CtrlLed();
void Uart_GetData();
void Uart_PutData(char temp);
void Uart_SendStr(char* pstr);
#endif
uart.c
#include "uart.h"
u8 tack[20]; //定义数组长度,存储接收的数据
u8 recNum = 0; //接受数据的长度
/*******************************************************************************
* 函数名 :UsartInit()
* 函数功能 :设置串口
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void Uart_Init()
{
SCON = 0x50; //工作在方式1 ,8位异步收发,波特率由定时器控制
TMOD = 0x20; //选择定时器1做为波特率发生器,方式2
TH1 = 0xFD; //定时器赋初值
TL1 = 0xFD;
TR1 = 1; //启动定时器
ES = 1; //串口中断允许
EA = 1; //开启总中断
}
/*******************************************************************************
* 函数名 : Usart() interrupt 4
* 函数功能 : 串口通信中断函数
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void Uart_GetData()
{
tack[0]= SBUF;
RI = 0;//清除接收中断标志位
}
void Uart_PutData(char temp)
{
SBUF= temp;//将接收到的数据放入到发送寄存器
while(!TI); //等待发送数据完成
TI=0; //清除发送标志位
}
void Uart_SendStr(char* pstr)
{
while((*pstr)!=0)
{
Uart_PutData(*pstr);
pstr++;
}
}
void Uart_CtrlLed() {
if(tack[0]=='1') {
P2=0xFF;
LED0 = 0;
Uart_SendStr("command 1 \n");
}
else if(tack[0]=='2') {
P2=0xFF;
LED1 = 0;
Uart_SendStr("command 2\n");
}
else if(tack[0]=='3') {
P2=0xFF;
LED2 = 0;
Uart_SendStr("command 3\n");
}
}