天天看点

基于51设计的宠物防丢系统(蓝牙+Android上位机)

一、环境介绍

单片机型号:  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. 单片机按下复位键可以清除报警

基于51设计的宠物防丢系统(蓝牙+Android上位机)
APP界面:
基于51设计的宠物防丢系统(蓝牙+Android上位机)
如果自己不想焊接,想要直接模块化搭建环境,可以直接淘宝买系统板+模块即可:
基于51设计的宠物防丢系统(蓝牙+Android上位机)
基于51设计的宠物防丢系统(蓝牙+Android上位机)
基于51设计的宠物防丢系统(蓝牙+Android上位机)

蓝牙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代码

基于51设计的宠物防丢系统(蓝牙+Android上位机)
基于51设计的宠物防丢系统(蓝牙+Android上位机)
基于51设计的宠物防丢系统(蓝牙+Android上位机)
基于51设计的宠物防丢系统(蓝牙+Android上位机)

继续阅读