基于stm32的GPS无线跟踪器嵌入式课程报告.docx
- 文档编号:26595992
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:21
- 大小:327.88KB
基于stm32的GPS无线跟踪器嵌入式课程报告.docx
《基于stm32的GPS无线跟踪器嵌入式课程报告.docx》由会员分享,可在线阅读,更多相关《基于stm32的GPS无线跟踪器嵌入式课程报告.docx(21页珍藏版)》请在冰豆网上搜索。
基于stm32的GPS无线跟踪器嵌入式课程报告
基于STM32的GPS无线跟踪器
1、课题的研究背景及功能介绍
1.1研究背景
近年来,随着中国经济的高速发展,交通的便捷性和城市人口的快速增长,使得每年都有大量走丢的人,中国逐渐步入老龄化社会,使这个社会问题更加雪上加霜。
《亲爱的》《失孤》等电影的热映,反应了小孩子被拐等问题也不容乐观,无论是走丢的老人还是被拐的小孩,都会给社会家庭带来巨大的经济和精神伤害。
为有效解决这一系列问题,我们组的成员研究设计了一种基于STM32的无线跟踪器。
1.2功能介绍
无线跟踪器以STM32作为控制器,GPS模块和GPRS模块分别通过串口1和串口2和STM32进行通信,GPS模块通过卫星定位后,将定位信息显示在TFTLCD屏幕上,将无线跟踪器放到需要被跟踪者的身上,跟踪者通过给跟踪器上的电话号码打一个电话,GPRS模块将电话自动挂断后,然后给跟踪者发送一条包含被跟踪者的地理位置信息的短息,从而实现对被跟踪者的跟踪。
2、系统硬件电路设计
2.1整体硬件电路设计
图1系统整体框图
无线跟踪器硬件组成部分:
STM32F103RBT6开发板、GPS定位模块、TFTLCD显示模块、GPRS模块,中国移动SIM卡一张,杜邦线若干等等。
GPS、GPRS模块与开发板的连接关系如表1所示:
STM32开发板
GND
PA10
PA9
3.3/5V
TXD
RXD
GND
SIM900A(GPRS)模块
GND
STXD
SRXD
GPS模块
VCC
PA3
PA2
GND
表1.GPS、GPRS模块与开发板的连接
GPS模块同STM32需要四根线相连,TXD、RXD同STM32的串口2(PA3、PA2)相连,GPS模块同时还需要单片机供电,VCC、GND引脚同STM的3.3/5V,GND引脚相连。
GPRS模块需要12V1A的电源单独供电,STXD、SRXD引脚与串口1(PA10、PA9)相连,再连接上GND地线即可。
FTFLCD显示模块的插针可以直接插在STM32开发板的卡座上,操作方便。
图2是实物图连接图:
图2.实物图连接图
工作原理:
GPS模块接收卫星定位信息,STM32单片机通过串口2接收GPS传送的定位信息后,通过编程解析数据帧,将定位信息$GPRMC转化成相应的信息并显示在TFTLCD模块上。
当跟踪者给被跟踪者打电话时,STM32通过串口1发送AT命令给GPRS模块使电话自动挂断,并将定位的地理信息通过GPRS模块以短消息的形式发送跟踪者的手机上。
2.2GPS模块介绍
GPS是由美国国防部研制部署和控制的军民两用导航定位卫星系统。
据报道,现在运行的“GPS”系统是由24颗工作卫星和4颗备用卫星组成,它们分布在6个等间距的轨道平面上,每个轨道面上有4颗工作卫星,卫星轨道接近圆形,用户在任何时间都至少能看到4-6颗卫星,定位一次仅需几秒钟,可实现全球范围连续的、近实时的定位、测速与授时。
本次设计使用的ATK-NEO-6MGPS模块是专门为战舰系列开发板设计的GPS模块。
GPS模块有5个引脚,PPS引脚同时连接到了模块自带了的状态指示灯:
PPS指示灯,在默认条件下(没经过程序设置),有2个状态:
1,常亮,表示模块已开始工作,但还未实现定位。
2,闪烁(100ms灭,900ms亮),表示模块已经定位成功。
这样在本次实验中,我们通过PPS指示灯,来判断模块是否定位成功。
2.3GPRS模块介绍
GPRS是通用分组无线业务的简称,是在现有GSM系统上发展出来的一种新的承载业务,目的是为GSM用户提供分组形式的数据业务,GPRS允许用户在端到端分组转移模式下发送和接收数据,而不需要利用电路交换模式的网络资源。
从而提供了一种高效、低成本的无线分组数据业务。
中国移动和中国联通的移动通信网络既是语音通信网络,又是一个能够提供丰富数据业务的服务网络。
GSM网络定位是利用移动通信公司的服务提供商(SP)提供的位置服务向公众提供高精度定位业务。
本次设计使用的SIM900A模块通过串口1(PA9、PA10)与开发板相连,该模块自带开关机键,SIM900A模块上电后,默认是关闭的,需要长按(1S左右)该键,才能开启SIM900A模块。
同时根据网络状态指示灯来判断是否注册到网络,工作状态指示表2如示:
红色LED状态
工作状态
熄灭
关机
64ms亮/800ms灭
没注册到网络
64ms亮/3000ms灭
注册到网络
64ms亮/300ms灭
GPRS通信
表2.网络状态指示灯与工作状态对照表
2.4TFLCD显示模块介绍
TFTLCD即薄膜晶体管液晶显示器,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。
模块采用80并口口方与外部链接,采用16位数据线了)。
该模块的80并口有如下一些信号线:
CS:
TFTLCD片选信号。
WR:
向TFTLCD写入数据。
RD:
从TFTLCD读取数据。
D[15:
0]:
16位双向数据线。
RST:
硬复位TFTLCD。
RS:
命令/数据标志(0,读写命令;1,读写数据)。
TFTLCD模块的RST信号线和OLED模块一样,也是直接接到STM32的复位脚上,并不由软件控制,还需要一个背光控制线来控制TFTLCD的背光,共需要的IO口数目为21个。
3、系统软件设计
本次设计中的软件设计包括四个主要的部分,主程序设计,GPS数据解析程序设计,TFTLCD显示程序设计,GPRS电话短信程序设计,这其中还包括对串口1和串口2的配置程序等,下面分节介绍。
3.1主程序设计
主程序初始化串口1和2,sim900a模块和LED模块,通过调用显示程序中的LCD_ShowString函数,在屏幕上显示“"GPStracker^_^"”的字样。
检查串口2是否接收到GPS发送过来的信息,将接收到的字符串按照NMEA-0183协议逐一解析后,调用显示程序将精度纬度信息显示到LCD屏幕上。
通过AT命令是否有电话打过来,自动挂断电话后,将显示的经度纬度存在数组中,通过sim900a中的短信发送程序将短信发送出去,整个程序执行完成。
主程序流程图
intmain(void)
{
u16i,rxlen;
u16lenx;
u8key;
u8upload=0;
Stm32_Clock_Init(9);//系统时钟设置
delay_init(72);//延时初始化
Uart1_init(72,38400);//串口1初始化为38400
USART2_Init(36,38400);//初始化串口2
LED_Init();//初始化与LED连接的硬件接口
KEY_Init();//初始化与LED连接的硬件接口
LCD_Init();//初始化LCD
Sim900_init();
POINT_COLOR=RED;
LCD_ShowString(30,20,200,16,16,"GPStracker^_^");
while
(1)
{
delay_ms
(1);
if(USART2_RX_STA&0X8000)//接收到一次数据了
{
rxlen=USART2_RX_STA&0X7FFF;//得到数据长度
for(i=0;i USART2_RX_STA=0;//启动下一次接收 USART1_TX_BUF[i]=0;//自动添加结束符 GPS_Analysis(&gpsx,(u8*)USART1_TX_BUF);//分析字符串 Gps_Msg_Show();//显示信息 if(strstr((char*)USART3_RX_BUF,"+CLIP: ")! =NULL) {delay_ms(500); printf("ATH\r\n"); delay_ms(900); pos=strchr((char*)USART2_RX_BUF,'"'); strcpy(num,pos+1,11); Send_Message(tx_buf,num); } strcpy((char*)tx_buf,"\0") } } } 3.2GPS数据解析程序设计 GPS模块同外部设备的通信接口采用UART(串口)方式,输出的GPS定位数据采用NMEA-0183协议(默认),控制协议为UBX协议。 我们要让得定位的地理信息就必须要按照NMEA-0183协议数据格式对接收到的字符串进行解析,提取其中我们要用到的经度纬度信息和UTC时间信息以及相关的的卫星信息等等。 下面首先介绍下NMEA-0183协议的数据格式,然后进行程序解析介绍。 3.2.1NMEA-0183协议简介 NMEA0183是美国国家海洋电子协会为海用电子设备制定的标准格式。 目前已成了GPS导航设备统一的RTCM标准协议。 NMEA-0183协议采用ASCII码来传递GPS定位信息,我们称之为帧。 帧格式形如: $aaccc,ddd,ddd,…,ddd*hh(CR)(LF) 1、“$”: 帧命令起始位 2、aaccc: 地址域,前两位为识别符(aa),后三位为语句名(ccc) 3、ddd…ddd: 数据 4、“*”: 校验和前缀(也可以作为语句数据结束的标志) 5、hh: 校验和(checksum),$与*之间所有字符ASCII码的校验和(各字节做异或运算,得到校验和后,再转换16进制格式的ASCII字符) 6、(CR)(LF): 帧结束,回车和换行符 NMEA-0183常用命令如表3所示: 序号 命令 说明 最大帧长 1 $GPGGA GPS定位信息 72 2 $GPGSA 当前卫星信息 65 3 $GPGSV 可见卫星信息 210 4 $GPRMC 推荐定位信息 70 5 $GPVTG 地面速度信息 34 表3NMEA-0183常用命令 这里我们只使用$GPRMC(推荐定位信息),来确认被跟踪者的经度纬度信息。 $GPRMC语句的基本格式如下: $GPRMC, (1), (2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)*hh(CR)(LF) (1)UTC时间,hhmmss(时分秒) (2)定位状态,A=有效定位,V=无效定位 (3)纬度ddmm.mmmmm(度分) (4)纬度半球N(北半球)或S(南半球) (5)经度dddmm.mmmmm(度分) (6)经度半球E(东经)或W(西经) (7)地面速率(000.0~999.9节) (8)地面航向(000.0~359.9度,以真北方为参考基准) (9)UTC日期,ddmmyy(日月年) (10)磁偏角(000.0~180.0度,前导位数不足则补0) (11)磁偏角方向,E(东)或W(西) (12)模式指示(A=自主定位,D=差分,E=估算,N=数据无效) 3.2.2$GPRMC语句解析程序 u8NMEA_Comma_Pos(u8*buf,u8cx) { u8*p=buf; while(cx) { if(*buf=='*'||*buf<''||*buf>'z')return0XFF;//遇到'*'或者非法字符,则不存在第cx个逗号 if(*buf==',')cx--; buf++; } returnbuf-p; } //m^n函数 //返回值: m^n次方. u32NMEA_Pow(u8m,u8n) { u32result=1; while(n--)result*=m; returnresult; } //str转换为数字,以','或者'*'结束 //buf: 数字存储区 //dx: 小数点位数,返回给调用函数 //返回值: 转换后的数值 intNMEA_Str2num(u8*buf,u8*dx) { u8*p=buf; u32ires=0,fres=0; u8ilen=0,flen=0,i; u8mask=0; intres; while (1)//得到整数和小数的长度 { if(*p=='-'){mask|=0X02;p++;}//是负数 if(*p==','||(*p=='*'))break;//遇到结束了 if(*p=='.'){mask|=0X01;p++;}//遇到小数点了 elseif(*p>'9'||(*p<'0'))//有非法字符 { ilen=0; flen=0; break; } if(mask&0X01)flen++; elseilen++; p++; } if(mask&0X02)buf++;//去掉负号 for(i=0;i { ires+=NMEA_Pow(10,ilen-1-i)*(buf[i]-'0'); } if(flen>5)flen=5;//最多取5位小数 *dx=flen;//小数点位数 for(i=0;i { fres+=NMEA_Pow(10,flen-1-i)*(buf[ilen+1+i]-'0'); } res=ires*NMEA_Pow(10,flen)+fres; if(mask&0X02)res=-res; returnres; } 这部分数据就是按照NMEA-0183协议的数据格式,通过计算逗号的方法来解析数据。 由$GPRMC数据格式可知,不管有没有数据的输出,一定会有逗号出现,会以“*”作为数据的结束符,这样我们只需要计算逗号的数量,来解析数据。 voidNMEA_GPRMC_Analysis(nmea_msg*gpsx,u8*buf) { u8*p1,dx; u8posx; u32temp; floatrs; p1=(u8*)strstr((constchar*)buf,"$GPRMC"); posx=NMEA_Comma_Pos(p1,1);//得到UTC时间 if(posx! =0XFF) { temp=NMEA_Str2num(p1+posx,&dx)/NMEA_Pow(10,dx);//得到UTC时间,去掉ms gpsx->utc.hour=temp/10000; gpsx->utc.min=(temp/100)%100; gpsx->utc.sec=temp%100; } posx=NMEA_Comma_Pos(p1,3);//得到纬度 if(posx! =0XFF) { temp=NMEA_Str2num(p1+posx,&dx); gpsx->latitude=temp/NMEA_Pow(10,dx+2);//得到° rs=temp%NMEA_Pow(10,dx+2);//得到' gpsx->latitude=gpsx->latitude*NMEA_Pow(10,5)+(rs*NMEA_Pow(10,5-dx))/60;//转换° } posx=NMEA_Comma_Pos(p1,4);//南纬还是北纬 if(posx! =0XFF)gpsx->nshemi=*(p1+posx); posx=NMEA_Comma_Pos(p1,5);//得到经度 if(posx! =0XFF) { temp=NMEA_Str2num(p1+posx,&dx); gpsx->longitude=temp/NMEA_Pow(10,dx+2);//得到° rs=temp%NMEA_Pow(10,dx+2);//得到' gpsx->longitude=gpsx->longitude*NMEA_Pow(10,5)+(rs*NMEA_Pow(10,5-dx))/60;//转换为° } posx=NMEA_Comma_Pos(p1,6);//东经还是西经 if(posx! =0XFF)gpsx->ewhemi=*(p1+posx); posx=NMEA_Comma_Pos(p1,9);//得到UTC日期 if(posx! =0XFF) { temp=NMEA_Str2num(p1+posx,&dx);//得到UTC日期 gpsx->utc.date=temp/10000; gpsx->utc.month=(temp/100)%100; gpsx->utc.year=2000+temp%100; } } 由于篇幅有限这里只贴出部分代码,这一部分代码分析了GPRMC信息,将其中的UTC时间,经度纬度的时分秒提取了出来,以便我们后面进行显示程序时使用。 3.2.3TFTLCD显示程序设计 GPS定位显示程序流程图 voidGps_Msg_Show(void) { floattp; POINT_COLOR=BLUE; tp=gpsx.longitude; sprintf((char*)dtbuf,"Longitude: %.5f%1c",tp/=100000,gpsx.ewhemi);//得到经度字符串 LCD_ShowString(30,40,200,16,16,dtbuf); strcat(tx_buf,dtbuf); strcat((char*)tx_buf,"\r\n"); tp=gpsx.latitude; sprintf((char*)dtbuf,"Latitude: %.5f%1c",tp/=100000,gpsx.nshemi);//得到纬度字符串 LCD_ShowString(30,60,200,16,16,dtbuf); strcat(tx_buf,dtbuf); strcat((char*)tx_buf,"\r\n"); tp=gpsx.altitude; sprintf((char*)dtbuf,"Altitude: %.1fm",tp/=10);//得到高度字符串 LCD_ShowString(30,80,200,16,16,dtbuf); tp=gpsx.speed; sprintf((char*)dtbuf,"Speed: %.3fkm/h",tp/=1000); if(gpsx.fixmode<=3)//定位状态 { sprintf((char*)dtbuf,"FixMode: %s",fixmode_tbl[gpsx.fixmode]); LCD_ShowString(30,130,200,16,16,dtbuf); } sprintf((char*)dtbuf,"Validsatellite: %02d",gpsx.posslnum);//用于定位的卫星数 LCD_ShowString(30,150,200,16,16,dtbuf); sprintf((char*)dtbuf,"Visiblesatellite: %02d",gpsx.svnum%100);//可见卫星数 LCD_ShowString(30,170,200,16,16,dtbuf); sprintf((char*)dtbuf,"LocalDate: %04d/%02d/%02d",gpsx.utc.year,gpsx.utc.month,gpsx.utc.date);//显示UTC日期 LCD_ShowString(30,190,200,16,16,dtbuf); sprintf((char*)dtbuf,"UTCTime: %02d: %02d: %02d",gpsx.utc.hour,gpsx.utc.min,gpsx.utc.sec);//显示UTC时间 在主程序死循环程序中我们已经用串口2等待执行GPS数据,一旦接收到GPS模块发过来的数据就进行数据解析,然后调用Gps_Msg_Show函数进行数据显示,Gps_Msg_Show函中包含了对经度纬度UTC时间等数据的显示,由于篇幅问题这里没有具体介绍显示程序。 3.3GPRS电话短信程序设计 GPRS模块的软件设计主要与AT命令有关,下面将先简单介绍AT命令,然后将解释打电话,自动挂断电话,发送地理位置信息的相关程序设计。 3.3.1AT指令简介 AT指令集是从终端设备或数据终端设备向终端适配器或数据电路终端设备发送的。 通过TA,TE发送AT指令来控制移动台的功能,与GSM网络业务进行交互。 用户可以通过AT指令进行呼叫、短信、电话本、数据业务、传真等方面的控制。 AT指令必须以"AT"或"at"开头,以回车( 模块的响应通常紧随其后,格式为: <回车><换行><响应内容><回车><换行>。 3.3.2GPRS程序设计 设计中用到的AT指令: 1.AT+CSCS=GSM在终端输入AT+CSCS=GSM回车键,设置为GSM字符集,设置成功,终端接收到OK 2.AT+CMGF=1 在终端输入AT+CMGF=1回车键,设置为Text模式,设置成功,终端接收到OK 3.AT+CMGS= AT+CMGS=回车键向,向发>HELLO 设置成功终端收到>,再输入发送内容HELLO 4.AT+CLIP=1配置自动显示来电 5.ATH 在终端输入ATH回车键,挂电话 voidsim900a_init(void)//使sim900a波特率匹配 { printf("ati\r\n"); delay_ms(100); printf("ati\r\n"); delay_ms(100); printf("ati\r\n"); delay_ms(10); printf("AT+CLIP=1\r\n");//配置自动显示来电 delay_ms(100); voidSend_Message(u8*Msg,u8num) {printf("AT+CSCS=\"GSM\"\r\n"); delay_ms(1000); printf("AT+CMGF=1\r\n"); delay_ms(10
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 stm32 GPS 无线 跟踪 嵌入式 课程 报告