0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于单片机的儿童防丢失系统设计

精通单片机与嵌入式 来源:精通单片机与嵌入式 2023-12-04 09:06 次阅读

功能

(1)通过LCD12864显示GPS模块的经纬度数据;

(2)可设定当前的定位位置,自动计算与设定位置的距离,当检测到位置超过设定位置200M时,通过GPRS模块发送报警信息

(3)报警时通过通过蜂鸣器发出警报;

(4)根据位置自动计算定位的距离,当找到儿童时,成人可主动关闭警报器;

(5)可实现“一一键报警”功能,当按下按键时,主动发送当前的位置给设定的手机号;

(6)当找到儿童时,可手动取消报警。

系统框图

fbae1714-9234-11ee-939d-92fbcf53809c.png

原理图

fc991804-9234-11ee-939d-92fbcf53809c.png

程序源代码

#include  "project.h"
unsigned char ucMode = 0;
unsigned char xdata Longitude[13] = "E:";  //保存经度数据
unsigned char xdata Latitude[13] = "N:";//保存纬度数据
bit PosSuc = 0;  //定位成功的标志,为1时表示定位成功,为0表示定位不成功
double fLongitude = 0.0;   //保存浮点型数据,经度
double fLatitude = 0.0;    //保存浮点型数据, 纬度


double fLongitudeLoa = 0.0; //当前所在地的经度
double fLatitudeLoa = 0.0;    //当前所在地的纬度


    double Dis = 0.0;  
#define PI                      3.1415926
#define EARTH_RADIUS            6378.004        //地球近似半径
 
// 求弧度
double radian(double d)
{
    return d * PI / 180.0;   //角度1? = π / 180
}
 
//计算距离
double get_distance(double lat1, double lng1, double lat2, double lng2)
{
    xdata double radLat1 = radian(lat1);
    xdata double radLat2 = radian(lat2);
    xdata double a = radLat1 - radLat2;
    xdata double b = radian(lng1) - radian(lng2);
     
    xdata double dst = 2 * asin((sqrt(pow(sin(a / 2), 2) + cos(radLat1) * cos(radLat2) * pow(sin(b / 2), 2) )));
     
    dst = dst * EARTH_RADIUS;
    //dst= round(dst * 10000) / 10000;
    return dst;
}






/*********************************************************************************************************
** 函数名称:      ProcRxBuf
** 函数描述:      处理GPS接收的数据
** 输入参数:      NONE
** 输出参数:      NONE
** 返回值:        NONE
*********************************************************************************************************/
void ProcRxBuf(void)
{
    if(RxFlag == 1)  //数据接收完毕
    {
        
        EA = 0;
        RxFlag = 0;
        
        if(RxBuf[17] == 'A')
        {      
            ucMode = 1;
            if(PosSuc == 0)   //初次定位成功
            {
                
                fLongitudeLoa = fLongitude; //当前所在地的经度
                fLatitudeLoa = fLatitude;    //当前所在地的纬度
                fLongitudeLoa = fLongitude; //当前所在地的经度
                fLatitudeLoa = fLatitude;    //当前所在地的纬度   
                PosSuc = 1;
            }
            LCD_Location(1,0);
            LCD_Display("  GPS 定位成功  ");
            PosSuc = 1;  //定位成功标志置1
            Latitude[0] = 'N';
            Latitude[1] = ':';
            fLatitude = (double)atof(&RxBuf[21]) / (double)60.0 + (RxBuf[19] - 0x30)*10 + (RxBuf[20]- 0x30);
            Latitude[12] = 0;
            Latitude[2] =  (unsigned long)fLatitude %100 / 10 + 0x30;
            Latitude[3] =  (unsigned long)fLatitude % 10+ 0x30;
            Latitude[4] =  '.';
            Latitude[5] =  (unsigned long)(fLatitude * 10) % 10+ 0x30;
            Latitude[6] =  (unsigned long)(fLatitude * 100) % 10+ 0x30;
            Latitude[7] =  (unsigned long)(fLatitude * 1000) % 10+ 0x30;
            Latitude[8] =  (unsigned long)(fLatitude * 10000) % 10+ 0x30;
            Latitude[9] =  (unsigned long)(fLatitude * 100000) % 10+ 0x30;
            Latitude[10] =  (unsigned long)(fLatitude * 1000000) % 10+ 0x30;
            Latitude[11] =  (unsigned long)(fLatitude * 10000000) % 10+ 0x30;
            Latitude[12] = 0;          


            Longitude[0] = 'E';
            Longitude[1] = ':';   
            fLongitude = (double)atof(&RxBuf[34]) / (double)60.0 + (RxBuf[31] - 0x30)*100 + (RxBuf[32]- 0x30) * 10 + (RxBuf[33]- 0x30);
            Longitude[2] =  (unsigned long)fLongitude / 100 + 0x30;
            Longitude[3] =  (unsigned long)fLongitude %100 / 10 + 0x30;
            Longitude[4] =  (unsigned long)fLongitude % 10+ 0x30;
            Longitude[5] =  '.';
            Longitude[6] =  (unsigned long)(fLongitude * 10) % 10+ 0x30;
            Longitude[7] =  (unsigned long)(fLongitude * 100) % 10+ 0x30;
            Longitude[8] =  (unsigned long)(fLongitude * 1000) % 10+ 0x30;
            Longitude[9] =  (unsigned long)(fLongitude * 10000) % 10+ 0x30;
            Longitude[10] =  (unsigned long)(fLongitude * 100000) % 10+ 0x30;
            Longitude[11] =  (unsigned long)(fLongitude * 1000000) % 10+ 0x30;
            Longitude[12] = 0;    
        }
        else
        {
            PosSuc = 0;   //定位成功标志清零
        }
        
        memset(RxBuf,0,80);
        RxWP = 0;
        EA = 1;
    }
}


bit Key1Up = 1;  //按键松开标志,为1时表示按键已经松开,为0时,表示按键未松开
sbit KEY1 = P3^4;  //按键,按下按键时发送定位信息到手机
sbit KEY2 = P3^5;  //按键,按下按键时存储正确的定位信息


/*********************************************************************************************************
** 函数名称:      SendHelp
** 函数描述:      发送求救信息
** 输入参数:      NONE
** 输出参数:      NONE
** 返回值:        NONE
*********************************************************************************************************/
void SendHelp(double Dis)
{
    unsigned char i = 0;
    xdata unsigned char ucTemp[45] = {0};


    for(i = 0; i < 13;i++)
    {
        ucTemp[i] = Latitude[i];
    }
    for(i = 0; i < 13; i++)
    {
        ucTemp[i+12] = Longitude[i];
    }
    strcat(ucTemp,"distance=");
    ucTemp[33] = ((unsigned long)Dis % 100 /  10 + 0x30);
    ucTemp[34] = ((unsigned long)Dis %10 + 0x30);
    ucTemp[35] = ('.');
    ucTemp[36] = ((unsigned long)(Dis * 10) %  10 + 0x30);
    ucTemp[37] = ((unsigned long)(Dis * 100) %  10 + 0x30);
    ucTemp[38] = ((unsigned long)(Dis * 1000) %  10 + 0x30);
    ucTemp[39] = 'k';
    ucTemp[40] = 'm';
    SendSMS(ucTemp,41);  //发送手机短信 
    DelayMs(1000);
    UART1_ClearRxBuf();
}


/*********************************************************************************************************
** 函数名称:      ProcKey
** 函数描述:      处理按键函数,按键按下时发送定位信息到手机
** 输入参数:      NONE
** 输出参数:      NONE
** 返回值:        NONE
*********************************************************************************************************/
void ProcKey1(void)
{    


    if( (Key1Up == 1) && (KEY1 == 0))  //按键处于松开状态时,按键按下,定位完成才判断按键
    {
        DelayMs(20);   //防抖动延时
        if(KEY1 == 0)
        {       
            Key1Up = 0;            
            if(PosSuc == 1)
            {            
                SendHelp(Dis);
            }
            else if(PosSuc == 0)
            {
                LCD_Location(3,0);
                LCD_Display("请等定位成功    ");
                DelayMs(2000);
                LCD_Location(3,0);
                LCD_Display("                ");
            }
        }
    }    
    else if(KEY1 == 1)
    {
        Key1Up = 1;
    }
}

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6035

    文章

    44553

    浏览量

    634730
  • gps
    gps
    +关注

    关注

    22

    文章

    2895

    浏览量

    166190
  • GPRS
    +关注

    关注

    21

    文章

    984

    浏览量

    129427
  • 程序
    +关注

    关注

    117

    文章

    3785

    浏览量

    81006

原文标题:【011】基于51单片机、GPS、GPRS的儿童防丢失系统(源代码、原理图、参考论文、演示视频等)

文章出处:【微信号:精通单片机与嵌入式,微信公众号:精通单片机与嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于AT89C51单片机追尾系统

    基于AT89C51单片机追尾系统
    发表于 08-14 11:35

    基于单片机的智能小区安系统

    求基于单片机的智能小区安系统 论文及原理图呀 有偿也行
    发表于 04-16 23:01

    如何去实现一种基于单片机的智能安系统设计

    设计简介:本设计是基于单片机的智能安系统,主要实现以下功能:可通过LCD1602安状态和是否有人;可通过按键控制安状态;通过人体红外监
    发表于 02-18 06:44

    如何去实现一种基于单片机酒驾系统设计

    本设计是基于单片机酒驾系统,主要实现以下功能:可通过LCD1602显示车内酒精浓度;可通过按键调整酒精浓度最大值;通过人体红外检测是否有人;通过MQ-3检测酒精浓度。标签:51单片机
    发表于 02-18 07:51

    Silabs的Flash单片机丢失程序原因

    本内容介绍了Silabs的Flash单片机丢失程序原因
    发表于 06-14 15:07 122次下载
    Silabs的Flash<b class='flag-5'>单片机</b><b class='flag-5'>丢失</b>程序原因

    基于STC12单片机的电梯系统设计

    介绍了基于STC12单片机的电梯系统设计,以STC12C5A60S2-351单片机作为控制器,红外测距传感器和加速传感器将测得数据发送到单片机
    发表于 12-19 16:57 2628次阅读
    基于STC12<b class='flag-5'>单片机</b>的电梯<b class='flag-5'>防</b>坠<b class='flag-5'>系统</b>设计

    如何使用GPS和GSM进行儿童走失的单片机定位系统设计

    鉴于传统儿童走失系统使用的局限性 , 设计一种利用单片机控制 、 GPS 定 位 和 GSM 通 信 等 威廉希尔官方网站 的儿童
    发表于 03-25 08:00 30次下载
    如何使用GPS和GSM进行<b class='flag-5'>儿童</b><b class='flag-5'>防</b>走失的<b class='flag-5'>单片机</b>定位<b class='flag-5'>系统</b>设计

    基于单片机的智能安系统

    设计简介:本设计是基于单片机的智能安系统,主要实现以下功能:可通过LCD1602安状态和是否有人; 可通过按键控制安状态; 通过人体红
    发表于 12-23 19:31 26次下载
    基于<b class='flag-5'>单片机</b>的智能安<b class='flag-5'>防</b><b class='flag-5'>系统</b>

    基于单片机酒驾系统

    本设计是基于单片机酒驾系统,主要实现以下功能:可通过LCD1602显示车内酒精浓度; 可通过按键调整酒精浓度最大值; 通过人体红外检测是否有人; 通过MQ-3检测酒精浓度。标签:51单片机
    发表于 12-23 19:32 3次下载
    基于<b class='flag-5'>单片机</b>的<b class='flag-5'>防</b>酒驾<b class='flag-5'>系统</b>

    基于51单片机酒驾检测系统设计Proteus仿真

    基于51单片机酒驾检测系统设计Proteus仿真
    发表于 12-30 09:33 27次下载

    基于STM32单片机丢失手环系统设计

    通过STM32单片机进行主控,两个NRF024L01进行数据的发射和接收,发射端的位置信息首先会在显示屏上进行显示,并且会通过无线模块将位置信息传输到接收端的显示屏上进行显示。系统内为了实现丢功能
    的头像 发表于 08-08 15:14 1857次阅读

    基于51单片机的汽车碰撞系统设计

    电子发烧友网站提供《基于51单片机的汽车碰撞系统设计.pdf》资料免费下载
    发表于 10-08 09:54 2次下载
    基于51<b class='flag-5'>单片机</b>的汽车<b class='flag-5'>防</b>碰撞<b class='flag-5'>系统</b>设计

    单片机与GSM的实用型安报警系统的设计

    电子发烧友网站提供《单片机与GSM的实用型安报警系统的设计.pdf》资料免费下载
    发表于 10-30 10:29 0次下载
    <b class='flag-5'>单片机</b>与GSM的实用型安<b class='flag-5'>防</b>报警<b class='flag-5'>系统</b>的设计

    基于单片机的汽车碰撞系统设计与实现

    电子发烧友网站提供《基于单片机的汽车碰撞系统设计与实现.rar》资料免费下载
    发表于 01-02 10:04 1次下载

    基于单片机的汽车碰撞系统设计与实现

    电子发烧友网站提供《基于单片机的汽车碰撞系统设计与实现.rar》资料免费下载
    发表于 01-12 10:48 24次下载