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

2022-01-21 14:21:02 浏览数 (1)

一、环境介绍

单片机型号: 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单片机代码

代码语言:javascript复制
#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代码

0 人点赞