一、环境介绍
单片机型号: 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代码