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

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

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

 #include <stc15wxx.h>
#include <string.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int void Uart2Init();
void Uart2Sends(uchar *str);
void Uart2BYTE(uchar temp);
uchar hand(uchar *ptr);
void clear_rec_data();
void DelaySec(int sec);
uchar rec_data[];//GSM模块返回数据数组
uchar rec_num;
void Uart3Init();
uchar rec_gpsdata[]={};//Gps模块返回数据数组
uchar rec_gpsnum=;
uchar ok[]=",A,";
uchar gpsdata[]={};
uchar tn,p,gps_ok=;
long tm; void Init ()
{
P0M1 = 0x00; P0M0 = 0x00; //设置为准双向口
P1M1 = 0x00; P1M0 = 0x00; //设置为准双向口
P3M1 = 0x00; P3M0 = 0x00; //设置为准双向口
}
//串行口连续发送char型数组,遇到终止号/0将停止
void Uart1Init(void) //9600bps@11.0592MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x01; //串口1选择定时器2为波特率发生器
AUXR |= 0x04; //定时器2时钟为Fosc,即1T
T2L = 0xE0; //设定定时初值
T2H = 0xFE; //设定定时初值
AUXR |= 0x10; //启动定时器2
EA=;//开总中断
ES=;//开串行口中断
} void Uart1Sends(uchar *str)
{
while(*str!='\0')
{
SBUF=*str;
while(!(SCON & 0x02));//等待发送完成信号(TI=1)出现
SCON &= ~0x02; // 清中断标志
str++;
}
} void main()
{
uchar i=;
Init();
Uart1Init();
Uart2Init();
Uart3Init();
gps_ok=; while()
{
if(strstr(rec_gpsdata,ok)>)//串口3GPS数据解析********************************************************************************************************
{
gpsdata[]=rec_gpsdata[]; //纬度解析
gpsdata[]=rec_gpsdata[];
gpsdata[]='.';
tm=(*(rec_gpsdata[]-0x30)+*(rec_gpsdata[]-0x30)+*(rec_gpsdata[]-0x30)+*(rec_gpsdata[]-0x30)+(rec_gpsdata[]-0x30))/;
gpsdata[]=tm/+0x30; //更新数据接口数据
gpsdata[]=(tm%)/+0x30;
gpsdata[]=(tm%)/+0x30;
if(tm%==)
gpsdata[]=tm%+0x30;
else gpsdata[]=tm%+0x31;
gpsdata[]=',';
tn=;
gpsdata[]=rec_gpsdata[tn]; //经度解析
gpsdata[]=rec_gpsdata[tn+];
gpsdata[]=rec_gpsdata[tn+];
gpsdata[]='.';
tm=(*(rec_gpsdata[tn+]-0x30)+*(rec_gpsdata[tn+]-0x30)+*(rec_gpsdata[tn+]-0x30)+*(rec_gpsdata[tn+]-0x30)+(rec_gpsdata[tn+]-0x30))/;
gpsdata[]=tm/+0x30;
gpsdata[]=(tm%)/+0x30;
gpsdata[]=(tm%)/+0x30;
gpsdata[]=tm%+0x31;
gpsdata[]='\n';
gps_ok=;
break;
}
else gps_ok=;
}
if(gps_ok==)
{
Uart2Sends("AT\r\n"); //同步波特率,如果将模块配置固定波特率,此条指令就不需要发了
while(!hand("OK"))
{
clear_rec_data();
i++;
Uart2Sends("AT\r\n");//
DelaySec();//延时
if(i>=)
{
break;
}
}
clear_rec_data();//删除存储的GSM模块返回的数据,以便于以后继续判断
DelaySec();//延时
P0=0x00;//初始化和检验完毕,led灯产生信号。
Uart2Sends("AT+CSCS=\"GSM\"\r\n"); //
DelaySec();//延时
Uart2Sends("AT+CSCA?\r\n"); //短信中心号码
DelaySec();//延时
Uart2Sends("AT+CMGF=1\r\n"); //方式1
DelaySec();//延时
Uart2Sends("AT+CMGS=\"156-------\"\r\n"); //此处修改短信接收方电话号
DelaySec();//延时
Uart2Sends("SOS:I need help! My position is https;//mo.amap.com/?q="); //此处修改短信内容
Uart2Sends(gpsdata);
DelaySec();//延时
Uart2BYTE(0X1A);
DelaySec();//延时
//拨打电话代码
Uart2Sends("ATD156--------;\r\n"); //拨打电话
}
}
/*
串口2,sim900a通信串口
*/ void Uart2Init() //9600bps@11.0592MHz
{ S2CON = 0x50; //8位数据,可变波特率
AUXR |= 0x04; //定时器2时钟为Fosc,即1T
T2L = 0xE0; //设定定时初值
T2H = 0xFE; //设定定时初值
AUXR |= 0x10; //启动定时器2
EA=;//开总中断
ES=;//开串行口中断
IE2=0x01;
}
/**
interrupt 8 interrupt 17 interrupt 18:串口2 3 4的串口号
**/
void Serial_interrupt() interrupt using
{
uchar temp;
if(S2CON & 0x01) // 接收中断标志判断
{
S2CON &= ~0x01;//等价于RI=0 temp=S2BUF;
rec_data[rec_num++]=temp;
if(rec_num>=)
rec_num=;
else
;
//RI=0;//接收中断信号清零,表示将继续接收
} } //串行口连续发送char型数组,遇到终止号/0将停止
void Uart2Sends(uchar *str)
{
while(*str!='\0')
{
S2BUF=*str;
while(!(S2CON & 0x02));//等待发送完成信号(TI=1)出现
S2CON &= ~0x02; // 清中断标志
str++;
}
}
void Uart2BYTE(uchar temp)
{
S2BUF=temp;
while(!(S2CON & 0x02));//等待发送完成信号(TI=1)出现
S2CON &= ~0x02; // 清中断标志 } uchar hand(uchar *ptr)
{
if(strstr(rec_data,ptr)!=NULL)
return ;
else
return ;
} void clear_rec_data()
{
uchar i;
for(i=;i<strlen(rec_data);i++)
{
rec_data[i]='';
}
rec_num=;
}
//延时函数1s钟
void DelaySec(int sec)
{
unsigned char i, j, k,m; for(m=; m<sec; m++)
{
_nop_();
_nop_();
i = ;
j = ;
k = ;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
}
/*
GPS 模块,串口3通信
*/
// $GPGLL,2236.91284,N,11403.24705,E,060826.00,A,D*66,gps返回数据的示例
void Uart3Init() //9600bps@11.0592MHz
{
S3CON = 0x10; //8位数据,可变波特率
S3CON &= 0xBF; //串口3选择定时器2为波特率发生器
AUXR |= 0x04; //定时器2时钟为Fosc,即1T
T2L = 0xE0; //设定定时初值
T2H = 0xFE; //设定定时初值
AUXR |= 0x10; //启动定时器2
EA=;//开总中断
IE2 |= 0x08; // 串口3中断打开
}
void GPSreturn(void) interrupt
{
uint temp;
if (S3CON & 0x01) // 接收中断标志位
{
S3CON &= ~0x01; // 清中断标志
temp=S3BUF;
if(rec_gpsnum<=)
rec_gpsdata[rec_gpsnum++]=temp;
if(rec_gpsnum>)
rec_gpsnum=;
}
}   

通过GSM模块发送经纬度求救信息。的更多相关文章

  1. 使用 Prometheus Alertmanager 模块发送 Doris 异常信息至钉钉报警群

    基础环境 1.Prometheus 版本:2.22.2 下载地址: https://github.com/prometheus/prometheus/releases/download/v2.22.2 ...

  2. 如何使用Arduino和SIM900A GPRS / GSM模块将数据发送到Web服务器

    今天我们在这里介绍一个非常有趣的项目,我们将使用Arduino开发板和GPRS将数据发送到SparkFun服务器.这是一个基于IoT的项目,我们将使用GSM模块SIM900A将一些数据发送到互联网上的 ...

  3. Linux-C实现GPRS模块发送短信

    “GSM模块,是将GSM射频芯片.基带处理芯片.存储器.功放器件等集成在一块线路板上,具有独立的操作系统.GSM射频处理.基带处理并提供标准接口的功能模块.GSM模块根据其提供的数据传输速率又可以分为 ...

  4. GSM模块_STM32实现GPRS与服务器数据传输经验总结

    硬件环境 MCU:STM32F103RET6 (调试器:J-Link) GSM模块:Ai-Thinker_A6 (安信可)(还需要配一个串口打印工具,当初选这个模块纯粹是因为价格是最便宜的) ---- ...

  5. GSM模块_GPRS数据传输机制和原理

    通信专业术语 BSS--基站子系统,通过无线接口与移动台直接联系,负责在一定区域内和移动台通信.(GSM) BTS--基站收发台,可以看作一复杂的无线调制器,BSS的主要部分,每个分配有若干信道.(G ...

  6. [置顶] 个人微信号发送zabbix告警信息

    之前使用邮件和短信发送zabbix告警信息,但告警信息无法实时查看或者无法发送,故障无法及时通知运维人员. 后来使用第三方微信接口发送信息,愉快地用了一年多,突然收费了. zabbix告警一直是我的痛 ...

  7. PHP版微信公共平台消息主动推送,突破订阅号一天只能发送一条信息限制

    2013年10月06日最新整理. PHP版微信公共平台消息主动推送,突破订阅号一天只能发送一条信息限制 微信公共平台消息主动推送接口一直是腾讯的私用接口,相信很多朋友都非常想要用到这个功能. 通过学习 ...

  8. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十二:串口模块① — 发送

    实验十二:串口模块① — 发送 串口固然是典型的实验,想必许多同学已经作烂,不过笔者还要循例介绍一下.我们知道串口有发送与接收之分,实验十二的实验目的就是实现串口发送,然而不同的是 ... 笔者会用另 ...

  9. Python3+Selenium3+webdriver学习笔记9(发送富文本信息及上传文件处理)

    #!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记9(发送富文本信息及上传文件处理)'''from seleni ...

随机推荐

  1. foobox更新日志

    2020-1-31, 6.1.5.1a 版(*) 跟进汉化版修正.(*) MusicTag升级到 1.0.4.0.(*) 部分图标改良,其他优化和修正.(+) 丰富网络功能,增加一个搜索源,一个榜单源 ...

  2. M-Renamer方法名修改器,iOS项目方法名重构,Objective-C/Swift,代码模型预判,减少误改的机率,替换速度更快,可视化操作,傻瓜式操作,一键操作,引用处自动修改,马甲包的福音

    M-Renamer M-Renamer(Method-Name-Renamer)类方法名修改器,采用链式解析头文件,代码模型预判,减少误改的机率,替换速度更快:可以解析整个项目大多数类的方法,可视化操 ...

  3. 记一次Metasploit心脏出血漏洞攻击测试

    打开msf框架 msfconsole

  4. Trie 字典树,hdu1251

    参考博客:https://www.cnblogs.com/TheRoadToTheGold/p/6290732.html 字典树就是单词树,顺着一条路径到达终止结点就形成一个单词,该单词的前缀包含在这 ...

  5. GitLab私服在Ubuntu上搭建总结

    1.前期准备: sudo apt-get update sudo apt-get install -y curl openssh-server ca-certificates sudo apt-get ...

  6. Django 模型笔记

    关于模型: 1:一个模型类对应一个表,模型类中的属性对应表中的一个字段 2:字段类型(数据库支持的类型) 模型属性 字符串 1:CharField(Maxlength=长度) models.CharF ...

  7. STM32CubeMx——串口使用DMA收发

    用到的是DMA发送数据,接收还是普通的串口接收. 一.代码生成 1.按以前的方法设置好时钟和调试方式,这里就不多说了. 2.设置串口1. 3.在DMA Setting里点击Add添加USART1_TX ...

  8. 多GPU使用详解

    目录: 介绍 记录设备状态 手动分配状态 允许GPU内存增长 在多GPU系统是使用单个GPU 使用多个 GPU 一.介绍 在一个典型的系统中,有多个计算设备.在 TensorFlow 中支持的设备类型 ...

  9. Java生鲜电商平台-电商中"再来一单"功能架构与详细设计(APP/小程序)

    Java生鲜电商平台-电商中"再来一单"功能架构与详细设计(APP/小程序) 说明:在实际的业务场景中(无论是TO B还是TO C)不管是休闲食品.餐饮.水果.日用百货.母婴等高频 ...

  10. 三层架构——ATM + 购物车

    三层架构:用户视图层.逻辑接口层.数据处理层. 一个功能,分成三层架构写,增加程序的可扩展性. 三层是互有联系的,从用户视图层开始写,涉及到那一层就到下一层去写,然后return 返回值,再写回来. ...