本博客作为实验笔记,仅供学习交流。(转载请注明出处)

本实验通过GSM模块:SIM900a,实现向特定手机发送sos求救信号,并且利用GPS模块:微科VK2828U7G5LF,将经纬度信息同时发送到手机中。目前已经实现通过串口2发送短信到手机,通过串口3实现接受gps数据并解析至单片机(串口1已预留其他功能)。

本实验的不足之处:由于接收的卫星数越多,GPS信号越精确,定位误差越小,下一步打算通过一些算法实现gps经纬度定位的高精确度。

  1 #include <stc15wxx.h>
  2 #include <string.H>
  3 #include <intrins.h>
  4 #define uchar unsigned char
  5 #define uint unsigned int
  6
  7
  8 void Uart2Init();
  9 void Uart2Sends(uchar *str);
 10 void Uart2BYTE(uchar temp);
 11 uchar hand(uchar *ptr);
 12 void clear_rec_data();
 13 void DelaySec(int sec);
 14 uchar rec_data[40];//GSM模块返回数据数组
 15 uchar rec_num;
 16 void Uart3Init();
 17 uchar rec_gpsdata[51]={0};//Gps模块返回数据数组
 18 uchar rec_gpsnum=0;
 19 uchar ok[]=",A,";
 20 uchar gpsdata[17]={0};
 21 uchar tn,p,gps_ok=0;
 22 long tm;
 23
 24 void Init ()
 25 {
 26         P0M1 = 0x00;   P0M0 = 0x00;           //设置为准双向口
 27     P1M1 = 0x00;   P1M0 = 0x00;           //设置为准双向口
 28     P3M1 = 0x00;   P3M0 = 0x00;           //设置为准双向口
 29 }
 30 //串行口连续发送char型数组,遇到终止号/0将停止
 31     void Uart1Init(void)        //9600bps@11.0592MHz
 32 {
 33     SCON = 0x50;        //8位数据,可变波特率
 34     AUXR |= 0x01;        //串口1选择定时器2为波特率发生器
 35     AUXR |= 0x04;        //定时器2时钟为Fosc,即1T
 36     T2L = 0xE0;        //设定定时初值
 37     T2H = 0xFE;        //设定定时初值
 38     AUXR |= 0x10;        //启动定时器2
 39     EA=1;//开总中断
 40     ES=1;//开串行口中断
 41 }
 42
 43 void Uart1Sends(uchar *str)
 44 {
 45     while(*str!='\0')
 46     {
 47         SBUF=*str;
 48         while(!(SCON & 0x02));//等待发送完成信号(TI=1)出现
 49         SCON &= ~0x02;         // 清中断标志
 50         str++;
 51     }
 52 }
 53
 54 void main()
 55 {
 56     uchar i=0;
 57     Init();
 58     Uart1Init();
 59     Uart2Init();
 60     Uart3Init();
 61     gps_ok=0;
 62
 63     while(1)
 64     {
 65         if(strstr(rec_gpsdata,ok)>0)//串口3GPS数据解析********************************************************************************************************
 66         {
 67                 gpsdata[0]=rec_gpsdata[7];    //纬度解析
 68                 gpsdata[1]=rec_gpsdata[8];
 69                 gpsdata[2]='.';
 70                 tm=(10000*(rec_gpsdata[9]-0x30)+1000*(rec_gpsdata[10]-0x30)+100*(rec_gpsdata[12]-0x30)+10*(rec_gpsdata[13]-0x30)+(rec_gpsdata[14]-0x30))/6;
 71                 gpsdata[3]=tm/1000+0x30;    //更新数据接口数据
 72                 gpsdata[4]=(tm%1000)/100+0x30;
 73                 gpsdata[5]=(tm%100)/10+0x30;
 74             if(tm%10==9)
 75                 gpsdata[6]=tm%10+0x30;
 76             else gpsdata[6]=tm%10+0x31;
 77                 gpsdata[7]=',';
 78                 tn=20;
 79                 gpsdata[8]=rec_gpsdata[tn];    //经度解析
 80                 gpsdata[9]=rec_gpsdata[tn+1];
 81                 gpsdata[10]=rec_gpsdata[tn+2];
 82                 gpsdata[11]='.';
 83                 tm=(10000*(rec_gpsdata[tn+3]-0x30)+1000*(rec_gpsdata[tn+4]-0x30)+100*(rec_gpsdata[tn+6]-0x30)+10*(rec_gpsdata[tn+7]-0x30)+(rec_gpsdata[tn+8]-0x30))/6;
 84                 gpsdata[12]=tm/1000+0x30;
 85                 gpsdata[13]=(tm%1000)/100+0x30;
 86                 gpsdata[14]=(tm%100)/10+0x30;
 87                 gpsdata[15]=tm%10+0x31;
 88                 gpsdata[16]='\n';
 89                 gps_ok=1;
 90                 break;
 91     }
 92         else gps_ok=0;
 93     }
 94         if(gps_ok==1)
 95         {
 96             Uart2Sends("AT\r\n"); //同步波特率,如果将模块配置固定波特率,此条指令就不需要发了
 97             while(!hand("OK"))
 98             {
 99                 clear_rec_data();
100                 i++;
101                 Uart2Sends("AT\r\n");//
102                 DelaySec(1);//延时
103                 if(i>=5)
104                 {
105                     break;
106                 }
107             }
108             clear_rec_data();//删除存储的GSM模块返回的数据,以便于以后继续判断
109             DelaySec(1);//延时
110             P0=0x00;//初始化和检验完毕,led灯产生信号。
111             Uart2Sends("AT+CSCS=\"GSM\"\r\n"); //
112             DelaySec(1);//延时
113             Uart2Sends("AT+CSCA?\r\n"); //短信中心号码
114             DelaySec(1);//延时
115             Uart2Sends("AT+CMGF=1\r\n");  //方式1
116             DelaySec(1);//延时
117             Uart2Sends("AT+CMGS=\"156-------\"\r\n");  //此处修改短信接收方电话号
118             DelaySec(1);//延时
119             Uart2Sends("SOS:I need help! My position is https;//mo.amap.com/?q=");  //此处修改短信内容
120             Uart2Sends(gpsdata);
121             DelaySec(1);//延时
122             Uart2BYTE(0X1A);
123             DelaySec(1);//延时
124         //拨打电话代码
125             Uart2Sends("ATD156--------;\r\n");  //拨打电话
126         }
127 }
128 /*
129 串口2,sim900a通信串口
130 */
131
132 void Uart2Init()        //9600bps@11.0592MHz
133 {
134
135     S2CON = 0x50;        //8位数据,可变波特率
136     AUXR |= 0x04;        //定时器2时钟为Fosc,即1T
137     T2L = 0xE0;        //设定定时初值
138     T2H = 0xFE;        //设定定时初值
139     AUXR |= 0x10;        //启动定时器2
140     EA=1;//开总中断
141     ES=1;//开串行口中断
142     IE2=0x01;
143 }
144 /**
145 interrupt 8 interrupt 17 interrupt 18:串口2 3 4的串口号
146 **/
147 void Serial_interrupt() interrupt 8 using 1
148 {
149     uchar temp;
150     if(S2CON & 0x01)           // 接收中断标志判断
151         {
152          S2CON &= ~0x01;//等价于RI=0
153
154         temp=S2BUF;
155         rec_data[rec_num++]=temp;
156         if(rec_num>=50)
157             rec_num=0;
158         else
159             ;
160         //RI=0;//接收中断信号清零,表示将继续接收
161         }
162
163
164 }
165
166 //串行口连续发送char型数组,遇到终止号/0将停止
167 void Uart2Sends(uchar *str)
168 {
169     while(*str!='\0')
170     {
171         S2BUF=*str;
172         while(!(S2CON & 0x02));//等待发送完成信号(TI=1)出现
173         S2CON &= ~0x02;         // 清中断标志
174         str++;
175     }
176 }
177 void Uart2BYTE(uchar temp)
178 {
179         S2BUF=temp;
180     while(!(S2CON & 0x02));//等待发送完成信号(TI=1)出现
181         S2CON &= ~0x02;         // 清中断标志
182
183 }
184
185 uchar hand(uchar *ptr)
186 {
187     if(strstr(rec_data,ptr)!=NULL)
188         return 1;
189     else
190         return 0;
191 }
192
193 void clear_rec_data()
194 {
195     uchar i;
196     for(i=0;i<strlen(rec_data);i++)
197     {
198         rec_data[i]='0';
199     }
200     rec_num=0;
201 }
202 //延时函数1s钟
203 void DelaySec(int sec)
204 {
205     unsigned char i, j, k,m;
206
207     for(m=0; m<sec; m++)
208     {
209         _nop_();
210     _nop_();
211     i = 43;
212     j = 6;
213     k = 203;
214     do
215     {
216         do
217         {
218             while (--k);
219         } while (--j);
220     } while (--i);
221     }
222 }
223 /*
224 GPS 模块,串口3通信
225 */
226 // $GPGLL,2236.91284,N,11403.24705,E,060826.00,A,D*66,gps返回数据的示例
227 void Uart3Init()        //9600bps@11.0592MHz
228 {
229     S3CON = 0x10;        //8位数据,可变波特率
230     S3CON &= 0xBF;        //串口3选择定时器2为波特率发生器
231     AUXR |= 0x04;        //定时器2时钟为Fosc,即1T
232     T2L = 0xE0;        //设定定时初值
233     T2H = 0xFE;        //设定定时初值
234     AUXR |= 0x10;        //启动定时器2
235     EA=1;//开总中断
236     IE2 |= 0x08;         // 串口3中断打开
237 }
238 void GPSreturn(void) interrupt 17
239 {
240         uint temp;
241     if (S3CON & 0x01)           // 接收中断标志位
242     {
243         S3CON &= ~0x01;         // 清中断标志
244                 temp=S3BUF;
245             if(rec_gpsnum<=50)
246                 rec_gpsdata[rec_gpsnum++]=temp;
247             if(rec_gpsnum>50)
248                 rec_gpsnum=0;
249     }
250 }
251
252
253
254   

通过GSM模块发送经纬度求救信息。相关推荐

  1. Wavecom gsm 模块发送中文短信

    Wavecom gsm 模块发送中文短信 这今天被wavecom 模块发送中文短信的事搞的头大,不过最后还是成功了. 说一说整个事的过程吧! 首先说一下这个事情的背景: 我们公司有条产品线是嵌入式计算 ...

  2. 基于STM32与GSM模块发送中英文短信

    基于STM32与GSM模块发送中英文短信 最近在做毕业设计有用到GSM模块进行短信报警,模块的功能比较多这里就不介绍了,一般的拨打电话都很简单就只需要一条指令即可,发送英文短信也很简单也只要几条命令也 ...

  3. STM32使用GSM模块发送中英文短信(TEXT模式到PDU模式的转换)

    STM32使用GSM模块发送中英文短信(TEXT模式到PDU模式的转换) 目的是按下按键,短信发送 PDU转换网站 链接: PDU转换网站. 使用硬件: ··· 开发板:正点原子战舰V3 GSM模块: ...

  4. GPS\GSM模块的设计与开发

    一.无线遥控模块总体的功能分析及体系结构设计 1.1无线遥控模块总体分析 本系统由STC89C52单片机电路+GPS模块电路+GSM模块SIM800A+指示灯电路+电源电路组成. 1.系统上电后,系统 ...

  5. gsm基于linux程序,基于嵌入式Linux下GSM模块的短信收发系统设计

    摘要:移动通信中的短消息业务以其方便.可靠和价廉得到了广泛应用,本文在嵌入式Linux系统中,通过西门子MC35模块,实现了短信收发系统,该系统采用PDU短信模式,能支持中文短信.程序设计采用异步事件 ...

  6. 使用Arduino和GSM模块进行呼叫和消息

    原文:https://circuitdigest.com/microcontroller-projects/call-and-message-using-arduino-sim900-gsm 使用Ar ...

  7. 基于GSM模块电瓶车防盗系统

    摘要 电动车具有省力,轻便快捷,环保安全的特点.随着电动车的越来越普及,它的防盗问题也越来越突出.为了更好地解决防盗问题,运用新技术对防盗系统进行设计变得非常必要. 本系统主要由单片机,振动传感器.红 ...

  8. 基于单片机GSM模块的家庭防火防盗报系统

    基于单片机GSM模块的家庭防火防盗报系统 本设计由DS18B20温度传感器+MQ-2烟雾传感器+HC-SR501人体红外模块+SIM800C GSM模块+LCD1602显示屏组成. 具体实现功能: ( ...

  9. STM32+果云GA6-GPRS/GSM模块+MQTT+HTTP协议连接中移OneNet上传GPS数据定位

    一.环境介绍 MCU:  STM32F103C8T6 GSM模块: GA6--果云 开发软件: Keil5 完整源码下载:  https://download.csdn.net/download/xi ...

最新文章

  1. 《Android游戏开发详解》——第1章,第1.6节函数(在Java中称为“方法”更好)...
  2. bps、Bps、pps
  3. Orleans MultiClient 多个Silo复合客户端
  4. bzoj 4034: [HAOI2015]树上操作(树链剖分+线段树区间更新)
  5. Kejin Game UVALive - 7264 (最大流转最小割)
  6. 基于区块链的医疗供应链数据隐私保护分布式信息隐藏框架
  7. 9008v android操作系统 电量,三星N9008V (GALAXY Note 3 移动4G Android 4.4)救砖教程 救砖包 刷回官方系统支持OTA升级...
  8. 双因素方差分析和单因素方差分析
  9. OVM虚拟化开启公测,支持Docker全新体验!
  10. python三维图像切片成二维_python之画三维图像
  11. win10系统设置选择电源键按钮功能设置步骤
  12. 深入探究js中无所不在的this
  13. 【考研】计算机考研,我不建议考408
  14. 转义字符表大全(转)
  15. 计算机键盘分为哪几个键区,标准键盘一般分为哪四个键区
  16. Anti-pattern
  17. 网络渗透——CTF实践
  18. 【Linux系列】安装配置Nginx
  19. hz和分贝怎么转换_分贝转换
  20. AndroidStudio创建项目一直卡在Building gradle project info的解决方法

热门文章

  1. 工作中MNU010 至 MNU140表的名称及作用
  2. 云队友丨7年估值2000亿,产业互联网的底层逻辑
  3. 【投资趋势】中国未来最值得投资的十大行业
  4. Fedora 22 for arndale octa board
  5. Monkey测试手机BUG重现及解决方法
  6. Win10删除或移动文件进度卡在99%->系统资源管理器cpu占用率及电源使用情况非常高的解决方法
  7. 树莓派 CM4 启动时 GPIO口输出
  8. tomcat部署web项目指导
  9. java集合 测试对TreeSet的使用
  10. 2016.1.6~2017.7.7,袋鼠云一岁半啦