一、环境介绍
单片机型号: STC89C52
编程软件: keil5
编程语言: C语言
手机APP: 采用QT设计,程序支持跨平台编译运行(Android、IOS、Windows、Linux都可以编译运行,对应平台上QT的环境搭建,之前博客已经发了文章讲解)
完整源码下载地址:
https://download.csdn.net/download/xiaolong1126626497/19766960资料包里包含了: 51单片机源码、Android手机APP源码、可执行文件apk、各种报警声音、说明文档、下载工具。
二、功能与硬件介绍
单片机采用STC89C52,资料非常丰富,keil建工程的时候选择AT89C52即可。
与手机通信的蓝牙采用:HC05 串口蓝牙。
功能介绍:
防丢功能主要是依靠蓝牙来判断是否已经断开。
1. 开发板复位后,蓝牙如果未连接状态,5秒之后蜂鸣器就会报警
2. 蓝牙一旦连接成功后,就需要以300ms的频率向设备发送指定的数据,保活。
3. 如果蓝牙连接上之后,没有发送数据到设备,300ms之后蜂鸣器就会报警。
4. APP上可以手动点击触发报警
5. 单片机按下复位键可以清除报警
APP界面: 如果自己不想焊接,想要直接模块化搭建环境,可以直接淘宝买系统板+模块即可:蓝牙HC05是主从一体的蓝牙串口模块,简单的说,当蓝牙设备与蓝牙设备配对连接成功后,我们可以忽视蓝牙内部的通信协议,直接将将蓝牙当做串口用。当建立连接,两设备共同使用一通道也就是同一个串口,一个设备发送数据到通道中,另外一个设备便可以接收通道中的数据。
为了简化51单片机的编程代码,可以先使用电脑串口调试助手,将HC05的的参数配置完毕,再接到51单片机上。 将HC05蓝牙配置成从机模式,设置好配对密码。
三、51单片机代码
#include <REG52.H>
#define uchar unsigned char
#define uint unsigned long
uchar buffer[8]; //数据缓存数组
uchar rec_flag=0; //数据处理标志
sbit BUZZER = P1^3;
sbit KEY = P3^4;
void delay1ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
void Delay(int ms)
{
while(ms--)
{
delay1ms();
}
}
/************************************************
** 函数名称 : void InitUART(void)
** 函数功能 : 串口初始化函数
** 输 入 : 无
** 输 出 : 无
** 说 明 : 定时器1方式2波特率发生模式,波特率9600bps,晶振11.0592MHZ,误差0%
**TMOD定时器计数器寄存器,SCON串行口寄存器,PCON功率控制寄存器,EA访问外部程序存储器控制信号,ES串口中断允许控制位,TR1定时器1的运行控制位
************************************************/
void InitUART(void)
{
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xFD;
TL1 = 0xFD;
PCON = 0x00;
ES = 1;
TR1 = 1;
EA = 1;
}
/*********************************************
**名称:void TxChar(uchar ch)
**功能:串口发送函数
**输入:uchar ch>当前发送数据
**输出:无
*********************************************/
void TxChar(unsigned char ch)
{
SBUF=ch;
while(!TI);
TI=0;
}
void putstring(uchar *puts) //发送数据
{
for(;*puts!=199;puts++) //遇到停止符199结束
TxChar(*puts);
}
/************************************************
** 函数名称 : void ser(void) interrupt 4
** 函数功能 : 串口接收中断函数
** 输 入 : 无
** 输 出 : 无
** 说 明 : 处理串口发送过来的数据串
************************************************/
void ser(void) interrupt 4
{
static uchar i;
if(RI==1)
{
RI = 0;
if(rec_flag==0)
{
if(SBUF==0xff)
{
rec_flag=1;
i=0;
}
}
else
{
if(SBUF==0xff)
{
rec_flag=0;
if(i==3)
{
//Communication_Decode();
}
i=0;
}
else
{
buffer[i]=SBUF;
i++;
}
}
}
}
/************************************************
** 函数名称 : void main(void)
** 函数功能 : 主函数
** 输 入 : 无
** 输 出 : 无
宠物检测
** 说 明 :
************************************************/
void main(void)
{
uint STOP=0,a=0,a1=0;
uchar bueezr_flag=0,bueezr_count=0,buzzer_time=3;//蜂鸣器报警变量
uchar rxbuf[9];
InitUART();
rxbuf[0]='A';
rxbuf[1]=25;
rxbuf[2]='B';
rxbuf[3]=99;
rxbuf[4]='C';
rxbuf[5]=99;
rxbuf[6]='D';
rxbuf[7]=99;
rxbuf[8]=199;
while(1)
{
putstring(rxbuf);//发送数据函数
Delay(300); //延时300ms
if(KEY==0 && !bueezr_flag){while(KEY==0);rxbuf[1]=22;bueezr_flag=1;}
if(KEY==0 && bueezr_flag){while(KEY==0);rxbuf[1]=11;bueezr_flag=0;a=0;BUZZER=1;}
if(!a)STOP++;
//FF 00 00 01 FF
//
//判断APP下发的数据
if(buffer[2]==0x01) //取消蜂鸣器
{
STOP=0;
a1=1;
buffer[2]=0x00;
}
//15个300ms还没有收到APP下发的数据,继续报警
if(STOP>15 && a1)
{
bueezr_flag=1;
}
if(buffer[1]==0x01) //手动模式报警
{
bueezr_flag=1;//蜂鸣器直接响
a=1; //手动模式标志位
}
/*******蜂鸣器报警********/
bueezr_count++;if(bueezr_count>buzzer_time*10)bueezr_count=buzzer_time+1;
if(bueezr_count%buzzer_time==0 && bueezr_flag)
{
BUZZER=~BUZZER;//蜂鸣器取反 发出声音提示
}
}
}
四、Android手机APP代码