一、效果展示
在写这篇博客之前,让我们来看一下最终效果如何。
二、创作灵感
起初,想要实现这个功能是为了上床后不用下去关灯,后面发现运用相同原理还可以大实现出门不带钥匙,用手机连接蓝牙输入已设定的“密码”即可开锁(当然,安全性还是比不上密码锁的)。
效果演示部分演示的是“第三版”的代码效果。
第一版:连接蓝牙,直接发送使舵机转动指定角度的指令,优点是简单粗暴,缺点是需要再发送使舵机“归位”的指令。
第二版:加入自定义指令功能(if else语句实现,相当于“密码”)。
第三版:在以前的基础上加入延时一定时间让舵机自动归位功能。
三、硬件电路
对于SG90三线舵机的介绍https://mp.csdn.net/mp_blog/creation/editor/136581211
1、关灯的
这个由于本人疏忽,忘记预留烧录接口,所以只能把芯片取下在学习板或最小系统板上烧录了。
链接:https://pan.baidu.com/s/1GssOhks6NtcmH47ij8FF9w?pwd=tone
提取码:tone
2、开门的
注意这块PCB我用了STC89C52RC贴片封装,如果照着原理图画PCB的话别忘了留焊接蓝牙的地方!
链接:https://pan.baidu.com/s/1cEUCCpokiQuwpbLpFIdLFQ?pwd=tone
提取码:tone
3、蓝牙参数
淘宝商铺:易加物联
宽乘长为: 1cm*1.45cm
4、工作原理
蓝牙接收到手机发送的数据后,将串口接收缓冲器(SBUF)接收到的数据发送给单片机,单片机接收到指定后做出一系列响应(生成PWM驱动舵机)。
5、使用方法
手机安装应用程序“易加蓝牙”,找到有彩色头像的蓝牙,如图。
应用下载链接:https://pan.baidu.com/s/13xTky3AYN4dSWmCFGaxcig?pwd=tone
提取码:tone
四、源码
main.c
#include <REGX52.H>
#include "TIMER.h"
#include "DELAY.h"
#include "BT.h"
sbit SG_PWM=P2^7; //定义舵机信号线接口
unsigned char count=0;
unsigned char jd=0;
typedef unsigned int uint;
typedef unsigned char uchar;
uint pass = 0;//数据位
void main()
{
UartInit //初始化
Timer0Init();
while(1)
{
if( pass == 2)
{
jd=0x02;
Delay(500);
pass = 0;
jd=0x01;
}
else
{
jd=0x01;
}
}
}
void UART_INTERRUPT() interrupt 4
{
pass = SBUF;
RI = 0;
SBUF = pass;
while(!TI);
TI = 0;
}
void Timer0() interrupt 1
{
TL0 = 0x33; //1111 1110 0011 0011 ,0.5ms
TH0 = 0xFE;
count++;
count%=40; //使count的值一直处于0~39,正好四十个数,40*0.5=20,对应pwm
if(count<jd)
{
SG_PWM=1;
}
else
{
SG_PWM=0;
}
}
Timer.c
#include <REGX52.H>
/**
* @brief 定时器0初始化,1毫秒@11.0592MHz
* @param 无
* @retval 无
*/
void Timer0Init(void) //1毫秒@11.0592MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0xA4; //设置定时初始值
TH0 = 0xFF; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
EA=1;
PT0=0;
}
Timer.h
#ifndef __TIMER02_H__
#define __TIMER02_H__
void Timer0Init(void);
#endif
Delay.c
void Delay(unsigned int xms) //@11.0592MHz
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
Delay.h
#ifndef __DELAY_H__
#define __DELAY_H__
void Delay(unsigned int xms);
#endif
BT.c
#include <REGX52.H>
void UartInit(void) //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xFD; //设置定时初始值
TH1 = 0xFD; //设置定时重载值
ET1 = 0; //禁止定时器%d中断
TR1 = 1; //定时器1开始计时
EA = 1;
ES = 1;//串口中断
SM1 = 1;//串口工作方式1
REN = 1;//串口允许接收
SM0 = 0;
}
BT.h
#ifndef __BT_H__
#define __BT_H__
void UartInit(void);
#endif