蓝牙小风扇
主控:
STC89C52RC
所需模块:
蓝牙模块HC-08、继电器、电池、直流电机(马达)
接线:
程序:
将程序下载到单片机后,打开手机HC蓝牙助手,连接到HC-08的蓝牙,然后就可以发送“open”字符串吸合继电器,然后直流电机通电就开始转动,小风扇开启;发送“close”断开继电器,小风扇关闭
后续可将串口部分的代码单独写成一个源文件,供主函数调用
注意:这里有个bug,如果在中断处理函数中再将字符串发送回去,无论是Usart_SendChar(rec[p])还是Usart_SendString(rec),通过串口发送到电脑时显示的字符会缺失,如发送“open”,会显示“ope”,暂时不知是什么原因
如果在发送区发送“ope\n”,则可以正常显示“open”,如果发送“clo\s\e”,则可以正常显示“close”
#include <REGX52.H>
#include <string.h>
#define SIZE 20
#define ON 0
#define OFF 1
sbit relay = P1^0; //继电器
sbit LED = P3^7;
unsigned char rec[SIZE];
/**
* @brief串口初始化
* @param无
* @retval无
*/
void Uart_Init() //9600
{
PCON &= 0x7F; //波特率不倍增
SCON = 0x50; //工作方式1,8位UART,REN=1,允许串行接收控制位
TMOD &= 0x0F; //高位清0
TMOD |= 0x20; //定时器1为8位自动重装载
TH1 = 0xFD; //波特率9600
TL1 = 0xFD;
ET1 = 0; //禁止定时器1中断
TR1 = 1; //开启定时器1
EA = 1; //开启总中断
ES = 1; //开启串行中断
}
/**
* @brief串口发送一个字符
* @param要发送的字符
* @retval无
*/
void Uart_SendChar(unsigned char dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}
/**
* @brief串口发送一个字符串
* @param要发送的字符串
* @retval无
*/
void Uart_SendString(char* str)
{
while(*str != '\0')
{
Uart_SendChar(*str);
str++;
}
}
//串口中断处理函数
void Uart_Rountine() interrupt 4
{
static unsigned int p = 0;
if(RI)
{
RI = 0;
rec[p] = SBUF;
//Uart_SendChar(rec[p]);
p++;
if(p == SIZE)
{
p = 0;
}
if(strstr(rec,"op")) //判断接收到的数据里是否有“op”字符
{
LED = ON; //LED灯亮
relay = ON; //继电器吸合
p = 0;
memset(rec,'\0',SIZE); //清空数据,为下次接收做准备
}
if(strstr(rec,"clo")) //判断接收到的数据里是否有“clo”字符
{
LED = OFF; //LED灯灭
relay = OFF; //继电器断开
p = 0;
memset(rec,'\0',SIZE); //清空数据,为下次接收做准备
}
}
}
void main()
{
Uart_Init();
while(1)
{
}
}
蓝牙助手发送控制信息
手机安装HC-08蓝牙模块配套的蓝牙助手后打开
点击连接蓝牙
连接成功后可以在通信界面里直接发送"open"和"close"控制信息,也可以将这两个控制信息写到自定义按钮里,方便发送
按钮OPEN
按钮CLOSE