功能
(1)通過LCD12864顯示GPS模塊的經緯度數據;
(2)可設定當前的定位位置,自動計算與設定位置的距離,當檢測到位置超過設定位置200M時,通過GPRS模塊發送報警信息;
(3)報警時通過通過蜂鳴器發出警報;
(4)根據位置自動計算定位的距離,當找到兒童時,成人可主動關閉警報器;
(5)可實現“一一鍵報警”功能,當按下按鍵時,主動發送當前的位置給設定的手機號;
(6)當找到兒童時,可手動取消報警。
系統框圖
原理圖
程序源代碼
#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; } }
審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
單片機
+關注
關注
6043文章
44621瀏覽量
638570 -
gps
+關注
關注
22文章
2903瀏覽量
166745 -
GPRS
+關注
關注
21文章
984瀏覽量
129649 -
程序
+關注
關注
117文章
3795瀏覽量
81415
原文標題:【011】基于51單片機、GPS、GPRS的兒童防丟失系統(源代碼、原理圖、參考論文、演示視頻等)
文章出處:【微信號:精通單片機與嵌入式,微信公眾號:精通單片機與嵌入式】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
如何去實現一種基于單片機的智能安防系統設計
設計簡介:本設計是基于單片機的智能安防系統,主要實現以下功能:可通過LCD1602安防狀態和是否有人;可通過按鍵控制安防狀態;通過人體紅外監
發表于 02-18 06:44
如何去實現一種基于單片機的防酒駕系統設計
本設計是基于單片機的防酒駕系統,主要實現以下功能:可通過LCD1602顯示車內酒精濃度;可通過按鍵調整酒精濃度最大值;通過人體紅外檢測是否有人;通過MQ-3檢測酒精濃度。標簽:51單片機
發表于 02-18 07:51
基于STC12單片機的電梯防墜系統設計
介紹了基于STC12單片機的電梯防墜系統設計,以STC12C5A60S2-351單片機作為控制器,紅外測距傳感器和加速傳感器將測得數據發送到單片機
發表于 12-19 16:57
?2689次閱讀
如何使用GPS和GSM進行兒童防走失的單片機定位系統設計
鑒于傳統兒童防走失系統使用的局限性 , 設計一種利用單片機控制 、 GPS 定 位 和 GSM 通 信 等 技術的兒童
發表于 03-25 08:00
?30次下載
基于單片機的智能安防系統
設計簡介:本設計是基于單片機的智能安防系統,主要實現以下功能:可通過LCD1602安防狀態和是否有人; 可通過按鍵控制安防狀態; 通過人體紅
發表于 12-23 19:31
?26次下載
基于單片機的防酒駕系統
本設計是基于單片機的防酒駕系統,主要實現以下功能:可通過LCD1602顯示車內酒精濃度; 可通過按鍵調整酒精濃度最大值; 通過人體紅外檢測是否有人; 通過MQ-3檢測酒精濃度。標簽:51單片機
發表于 12-23 19:32
?3次下載
基于STM32單片機的防丟失手環系統設計
通過STM32單片機進行主控,兩個NRF024L01進行數據的發射和接收,發射端的位置信息首先會在顯示屏上進行顯示,并且會通過無線模塊將位置信息傳輸到接收端的顯示屏上進行顯示。系統內為了實現防丟功能
評論