精华内容
下载资源
问答
  • 系统由电源电路、晶振电路、复位电路、LCD驱动电路等组成,此系统用以读取GPS模块的数据并处理,最后显示在LCD12864上面,用户可以实时通过读取12864显示的内容了解自己的位置以及当前时间
  • 本设计主要是制作出一款基于51单片机GPS定位器,根据设计需求,硬件部分主要由51单片机+GPS定位模块+LCD12864液晶+LED指示灯+3.3V稳压电路+天线设计而成;如图: 二.设计功能 (1)单片机选用:51单片机(STC89C...

    一.硬件方案

    本设计主要是制作出一款基于51单片机的GPS定位器,根据设计需求,硬件部分主要由51单片机+GPS定位模块+LCD12864液晶+LED指示灯+3.3V稳压电路+天线设计而成;如图:
    

    在这里插入图片描述

    二.设计功能

    (1)单片机选用:51单片机(STC89C51/52、AT89C51/52、AT90C51/52均可兼容),GPS定位模块(带天线)。
    (2)采用LCD12864液晶显示当前的时间、日期、经度、速度、航向、高度、海拔等信息。
    (3)采用了3颗LED指示灯,红灯为GPS接收数据指示灯,黄灯为GPRNC数据有效指示灯,绿灯为GPGGA数据有效指示灯。

    三.设计原理图

    (1)原理图主要采用AD软件进行设计,如图:
    在这里插入图片描述

    (2)PCB图如下:
    在这里插入图片描述

    四.软件设计

    主程序源码

    /****************************************
    主函数	
    /****************************************/
    void main(void)
    {
    	uchar error_num = 0;
    
    	Uart_Init();  //初始化串口
    	Lcd_Init();	  //初始化LCD
    	GPS_Init();   //初始化GPS
    	rev_stop=0;
    	REV_NO;
    	while(1)
    	{
    		if (rev_stop)   //如果接收完一行
    		{
    			TR0 = 1;   //开启定时器
    			REV_YES;
    			if (change_page % 2 == 1)  //换页
    			{
    				if (GPS_GGA_Parse(rev_buf, &GPS))  //解析GPGGA
    				{
    					GGA_YES;
    					GPS_DisplayTwo();  //显示第二页信息
    					error_num = 0;
    					gps_flag = 0;
    					rev_stop  = 0;
    					REV_NO;
    				}
    				else
    				{
    					error_num++;
    					if (error_num >= 20) //如果数据无效超过20次
    					{
    						GGA_NO;
    						error_num = 20;
    						GPS_Init();     //返回初始化
    					}
    					gps_flag = 0;
    					rev_stop  = 0;
    					REV_NO;
    				}
    
    			}
    			else
    			{
    				if (GPS_RMC_Parse(rev_buf, &GPS)) //解析GPRMC
    				{
    					RMC_YES;
    
    					GPS_DisplayOne();	  //显示GPS第一页信息
    					error_num = 0;
    					gps_flag = 0;
    					rev_stop  = 0;
    					led1 = 1;	
    				}
    				else
    				{
    					error_num++;
    					if (error_num >= 20) //如果数据无效超过20次
    					{
    						RMC_NO;
    						error_num = 20;
    						GPS_Init();     //返回初始化
    					}
    					gps_flag = 0;
    					rev_stop  = 0;
    					REV_NO;
    				}
    			}
    		}
    	}
    }
    
    

    如需资料请关注公众号“单片机实例设计”,首页回复“GPS定位”获取资料;
    在这里插入图片描述

    展开全文
  • 本系统由STC89C52单片机电路+GPS模块电路+GSM模块SIM800A+指示灯电路+电源电路组成。 1、系统上电后,系统向特定手机号码发送短信,短信内容为系统的当前经纬度信息。40s左右发一次。 2、如果需要立刻发送经纬度信息...

    系统功能分析

    (末尾附文件)
    系统功能分析
    本系统由STC89C52单片机电路+GPS模块电路+GSM模块SIM800A+指示灯电路+电源电路组成。
    1、系统上电后,系统向特定手机号码发送短信,短信内容为系统的当前经纬度信息。40s左右发一次。
    2、如果需要立刻发送经纬度信息,直接按板载按键即可立刻发送经纬度数据,不用等待40s。
    3、短信发送及初始化有状态指示灯指示。
    4、GSM模块是SIM800A,该模块和SIM900A电路程序完全兼容外观外形一模一样。
    3.1.2系统总体结构
    本系统具体框图如下图所示:
    在这里插入图片描述

    模块电路的设计

    在这里插入图片描述
    5V电源电路设计
    本系统选择5V直流电源作为系统总电源,为整个系统供电,电路简单、稳定。DC为电源的DC插座,可以直接接USB电源线,一端插在DC插座上,另外一端可以插在5V电源上,如电脑USB、充电宝、手机充电器等等。LED为红色LED灯,作为系统是否有点的指示灯,电阻为1K电阻,起到限流作用,保护LED灯,以防电流过大烧坏LED灯。SW为自锁开关,开关按下后,红灯亮,此时系统电源5V直流输出。开关再次按下后,红灯灭,此时系统电源无5V电源输出。
    在这里插入图片描述
    GSM_SIM800A模块电路设计
    GSM模块,是将GSM射频芯片、基带处理芯片、存储器、功放器件等集成在一块线路板上,具有独立的操作系统、GSM射频处理、基带处理并提供标准接口的功能模块。GSM模块具有发送SMS短信,语音通话,GPRS数据传输等基于GSM网络进行通信的所有基本功能。简单来讲,GSM模块加上键盘、显示屏和电池,就是一部手机。
    SIM800A是SIMCOM公司推出的一款高性能工业级 GSM/GPRS 模块, 该模块具有极高的性价比,在双频的市场中占据极大份额。
    GSM_SIM800A模块采用高性能工业级GSM/GPRS模块:SIM800A,工作频段:GSM900/1800MHz。硬件设计在官方设计上加以优化,采用高效开关电源供电,SIM卡采用主流的卡座,质量更坚固。GSM_SIM800A模块在外围硬件的设计上参考了SIM800A 模块的硬件设计指南,对板子的电源、保护和抗干扰上做足了功夫。电源采用开关电源模块供电,电源利用效率高。

    系统软件设计

    #include <reg52.h> 
    #include <intrins.h>
    #include <stdio.h>
    #include "delay.h"
    
    /**The UART1 stage1**/
    #define STAGE_SOHE  0x01
    #define STAGE_TYPE  0x02
    #define STAGE_NONE  0x03
    #define STAGE_DATA  0x04
    
    #define INIT 0xFF
    #define TRUE 0x00
    #define FALSE 0x01
    
    sbit LED = P1^0;//指示灯
    sbit key =P2^0;//按键
    
    unsigned char Lin0_No[13]="N:000.000000";//显示北纬
    unsigned char Lin1_Ea[12]="E:000.000000";//显示东经
    
    unsigned long xdata time_20ms=0;
    
    unsigned char xdata	devide_flag;		        //GPS数据逗号分隔符
    unsigned char xdata	speed_end;			//收速度数据结束标志
    unsigned char xdata	dir_end;			//收方向角数据结束标志
    unsigned char xdata  sysmode_GPS=FALSE;                    //gps有效无效标志
    unsigned char xdata ew_flag;                        //东西标志
    unsigned char xdata ns_flag;                        //南北标志
    
    unsigned char xdata	gps_infor_weijing[17];    //暂存经纬度 格式是以度分秒的是形式
    unsigned char xdata	gps_infor_speed[4];       //暂存速率
    unsigned char xdata	gps_infor_time[6];        //时间暂存
    unsigned char xdata	gps_infor_date[6];        //日期暂存
    unsigned char xdata	gps_infor_dir[3];         //方向暂存
    
    unsigned char xdata recv1_step=STAGE_SOHE;                       //串口接收指令步骤
    unsigned char xdata uart1_r_buf;                       //串口的缓存
    unsigned char xdata rev1_buf_busy;                    //串口接收忙碌标志
    unsigned char xdata temp1_buf[85];                   //串口接收数组
    unsigned int  xdata record1=0;   					//串口接收计数
    unsigned char i ;
    
    unsigned char dealGpsMes=FALSE;   //gps定时处理标志
    
    unsigned char reportTime = 0;//短信上报时间 计数
    
    void Init_Timer0(void);//函数声明
    void gpsDealfun(void);
    void uartSendStr(unsigned char *s,unsigned char length);
    void UART_Init(void);
    void uartSendByte(unsigned char dat);
    
    
    void main (void)
    {
    	Init_Timer0();        //定时器0初始化
    	
    	UART_Init();	  //串口初始化
    
    	LED = 0;		   //打开led
    	key = 1;
    	for(i=0;i<50;i++)	 //延时有助于稳定
    	{DelayMs(100);}	
    	uartSendStr("aAT+CMGF=1\r\n",12);	//初始化gsm模块
    
    	for(i=0;i<7;i++)	 //延时有助于稳定
    	{DelayMs(100);}
    	uartSendStr("AT+CSCS=\"GSM\"\r\n",15);
    
    	for(i=0;i<7;i++)	    //延时有助于稳定
    	{DelayMs(100);}
    	LED =1;
    
    	while(1)         //主循环
    	{
    		if(dealGpsMes==TRUE)   //gps信息处理
    		{
    			dealGpsMes=FALSE;  //清除标志
    			gpsDealfun();	   //gps信息处理函数
    		}
    		
    		if((reportTime >= 20)||(key == 0))		//2s计数一次
    		{
    			reportTime = 0;
    			LED=0;		//打开led
    			uartSendStr("AT+CMGF=1\r\n",11);  //设置字符集
    			for(i=0;i<5;i++)
    			{DelayMs(100);}
    			uartSendStr("AT+CSCS=\"GSM\"\r\n",15); //设置
    			for(i=0;i<5;i++)
    			{DelayMs(100);}
    			uartSendStr("AT+CMGS=\"+8618105140357\"\r\n",26); //可以修改电话号码
    //			uartSendStr("AT+CMGS=\"+8617686988225\"\r\n",26); //可以修改电话号码
    			for(i=0;i<3;i++)
    			{DelayMs(100);} 
    			uartSendStr(Lin0_No,13);//发送短信内容 在gps数据处理情况	
    			uartSendStr(Lin1_Ea,12);		
    						
    			for(i=0;i<2;i++)
    			{DelayMs(100);}
    			uartSendByte(0x1a);        	//发送
    			for(i=0;i<40;i++)
    			{DelayMs(100);}
    
    			LED =1;	  //关闭led
    		}
    		DelayMs(5);	
    	}
    }
    
    void gpsDealfun(void)
    {
    	unsigned char num=0;
    	unsigned long Mid_Du;       //中间变量 暂存经纬度的整数部分 即度
    	unsigned long Mid_Fen;      //中间变量 暂存经纬度的小数部分 即分  gps原始数据是度分秒格式
    	unsigned long Mid_Vale;     中间变量 暂存经纬度 并将其扩大了10000000倍
    
    	if(sysmode_GPS==TRUE)		//检测gps是否有效数据
    	{
    		sysmode_GPS=FALSE;			//清除有效位
    
            Mid_Du=(gps_infor_weijing[0]-0x30)*10000000+(gps_infor_weijing[1]-0x30)*1000000;    //处理纬度 暂存整数部分扩大10000000
            
            Mid_Fen=(gps_infor_weijing[2]-0x30)*10000000+(gps_infor_weijing[3]-0x30)*1000000+
              (gps_infor_weijing[4]-0x30)*100000+(gps_infor_weijing[5]-0x30)*10000+
                (gps_infor_weijing[6]-0x30)*1000+(gps_infor_weijing[7]-0x30)*100;        //处理纬度 暂存小数部分扩大10000000       
            Mid_Fen=Mid_Fen/60;                                                     //分秒换算为小数位
            Mid_Vale=Mid_Du+Mid_Fen;        //最终纬度 格式为000.00000000 非度分秒格式
            Lin0_No[0]='N';
    		Lin0_No[1]='N';                  
    		Lin0_No[2]=':';                  
    		Lin0_No[3]='0';                  
            Lin0_No[4]=Mid_Vale/10000000+0x30;                  //将处理后的纬度填入字符串 并打印显示
            Lin0_No[5]=(Mid_Vale/1000000)%10+0x30;
            Lin0_No[6]='.';
            Lin0_No[7]=(Mid_Vale/100000)%10+0x30;
            Lin0_No[8]=(Mid_Vale/10000)%10+0x30;
            Lin0_No[9]=(Mid_Vale/1000)%10+0x30;
            Lin0_No[10]=(Mid_Vale/100)%10+0x30;
            Lin0_No[11]=(Mid_Vale/10)%10+0x30;
            Lin0_No[12]=Mid_Vale%10+0x30;
            
            Mid_Du=(gps_infor_weijing[8]-0x30)*100000000+(gps_infor_weijing[9]-0x30)*10000000+(gps_infor_weijing[10]-0x30)*1000000; //处理经度 暂存整数部分扩大10000000
            
            Mid_Fen=(gps_infor_weijing[11]-0x30)*10000000+(gps_infor_weijing[12]-0x30)*1000000+
              (gps_infor_weijing[13]-0x30)*100000+(gps_infor_weijing[14]-0x30)*10000+
                (gps_infor_weijing[15]-0x30)*1000+(gps_infor_weijing[16]-0x30)*100; //处理经度 暂存小数部分扩大10000000       
            Mid_Fen=Mid_Fen/60;                                                //分秒换算为小数位
            Mid_Vale=Mid_Du+Mid_Fen;                                          //最终经度 格式为000.00000000 非度分秒格式
            Lin1_Ea[0]='E';                  
    		Lin1_Ea[1]=':';     
            Lin1_Ea[2]=Mid_Vale/100000000+0x30;                            //将处理后的经度填入字符串 并打印显示
            Lin1_Ea[3]=(Mid_Vale/10000000)%10+0x30;
            Lin1_Ea[4]=(Mid_Vale/1000000)%10+0x30;
            Lin1_Ea[5]='.';
            Lin1_Ea[6]=(Mid_Vale/100000)%10+0x30;
            Lin1_Ea[7]=(Mid_Vale/10000)%10+0x30;
            Lin1_Ea[8]=(Mid_Vale/1000)%10+0x30;
            Lin1_Ea[9]=(Mid_Vale/100)%10+0x30;
            Lin1_Ea[10]=(Mid_Vale/10)%10+0x30;
            Lin1_Ea[11]=Mid_Vale%10+0x30;
           
    	}
    	else
    	{
            Lin1_Ea[0]='G';               //无gps信号情况下 打印正在连接
    		Lin1_Ea[1]='P';                  
    		Lin1_Ea[2]='S';                  
            Lin1_Ea[3]=' ';                  /*将处理后的纬度填入字符串 并打印显示*/
            Lin1_Ea[4]='L';
            Lin1_Ea[5]='I';
            Lin1_Ea[6]='N';
            Lin1_Ea[7]='K';
            Lin1_Ea[8]='I';
            Lin1_Ea[9]='N';
            Lin1_Ea[10]='G';
            Lin1_Ea[11]='.';Lin1_Ea[12]='.';Lin1_Ea[13]='.';
    		for(i=0;i<14;i++)
    		{
    			Lin0_No[i]=Lin1_Ea[i];
    		}
    	}
    //	DelayMs(10);
    //	SendStr(Lin0_No,12);
    //	DelayMs(10);
    //	SendStr(Lin1_Ea,12);
    }
    
    
    void Init_Timer0(void)
    {
    	TMOD |= 0x01;	  //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响		     
    	TH0 = 0x0B8;	  //11.0592M 20ms
    	TL0 = 0x00;
    	EA=1;            //总中断打开
    	ET0=1;           //定时器中断打开
    	TR0=1;           //定时器开关打开
    }
    
    void Timer0_isr(void) interrupt 1 
    {
    	TH0 = 0x0B8;	  //11.0592M 20ms
    	TL0 = 0x00;
    	time_20ms++;
    	if(time_20ms%100==0)	//2s左右处理一次
    	{
    		dealGpsMes=TRUE;	
    		reportTime++;
    	}
    }
    
    void UART_Init(void)
    {
        SCON  = 0x50;		        // SCON: 模式 1, 8-bit UART, 使能接收  
        TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
        TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz  
        TR1   = 1;                  // TR1:  timer 1 打开                         
        EA    = 1;                  //打开总中断
        ES    = 1;                  //打开串口中断
    }
    
    void uartSendByte(unsigned char dat)
    {
    	unsigned char time_out;
    	time_out=0x00;
    	SBUF = dat;			  //将数据放入SBUF中
    	while((!TI)&&(time_out<100))  //检测是否发送出去
    	{time_out++;DelayUs2x(10);}	//未发送出去 进行短暂延时
    	TI = 0;						//清除ti标志
    }
    
    void uartSendStr(unsigned char *s,unsigned char length)
    {
    	unsigned char NUM;
    	NUM=0x00;
    	while(NUM<length)	//发送长度对比
    	{
    		uartSendByte(*s);  //放松单字节数据
    		s++;		  //指针++
    		NUM++;		  //下一个++
      	 }
    }
    
    void UART_SER (void) interrupt 4 //串行中断服务程序
    {
        if(RI)                        //判断是接收中断产生
        {
    	  RI=0;                      //标志位清零
    	  uart1_r_buf=SBUF;                      //提取buf中的值
    	  rev1_buf_busy=0x00;                         //判别 放置break问题
    	  switch(recv1_step)
    	  {
    	  case STAGE_SOHE: if(uart1_r_buf == '$')     //判断接收到了$  具体原因参考GPS标准协议NMEA0183
    	  {
    	    rev1_buf_busy=0x01;
    	    if(uart1_r_buf == '$')              //再次查看接收的是否是$
    	    {
    	      recv1_step=STAGE_TYPE;            //跳转到下一步
    	      record1=0;                        //计数清零
    	    }
    	    else
    	    {
    	      recv1_step=STAGE_SOHE;        //恢复初始化
    	      record1=0;
    	    }
    	  }
    	  break;
    	  case STAGE_TYPE: if(rev1_buf_busy == 0x00)
    	  {
    
    	    rev1_buf_busy=0x01;
    	    temp1_buf[record1]=uart1_r_buf;
    	    record1++;
    	    if(record1 == 0x05)
    	    {                                                 //查看$GPRMC开头的命令行
    	      if((temp1_buf[0] == 'G') && (temp1_buf[1] == 'P') && (temp1_buf[2] == 'R') && (temp1_buf[3] == 'M') && (temp1_buf[4] == 'C'))
    	      {
    	        recv1_step=STAGE_NONE;    //跳转到下一步
    	        record1=0;
    	      } 
    	      else
    	      {
    	        recv1_step=STAGE_SOHE;//恢复初始化
    	        record1=0;
    	      }
    	    }
    	  }
    	  break;
    	  case STAGE_NONE: if(rev1_buf_busy == 0x00)//接收命令格式:$GPRMC,054347.00,A,3202.04770,N,11846.23632,E,0.000,0.00,221013,,,A*67
    	  {
    	    rev1_buf_busy=0x01;
    	    record1++;
    	    if((record1 > 0x01) && (record1 < 0x08))                                                                                    
    	    {
    	      gps_infor_time[record1-2]=uart1_r_buf;			//时间存储						
    	    }
    	    if((uart1_r_buf == ',') && (record1 > 0x07) && (record1 < 0x010))   //||((uart1_r_buf == ',') && (record1==0x02))
    	    {
    	      record1=0xcc;
    	    }
    	    if(record1 ==  0xcd)
    	    {
    	      record1=0;
    	      devide_flag=2;
    	      speed_end=0x00;
    	      dir_end=0x00;
    	      if(uart1_r_buf == 'A')  //gps收到数据 且有效
    	      { 
    	        recv1_step=STAGE_DATA;    //跳转到下一步
    	      }
    	      else
    	      {
    	        sysmode_GPS=FALSE;
    	        recv1_step=STAGE_SOHE;    //无效恢复初始化
    	        record1=0;
    	      }
    	    }
    	  }
    	  break;
    	  case STAGE_DATA:  if(rev1_buf_busy == 0x00)
    	  {
    	    rev1_buf_busy=0x01;
    	    record1++;
    	    if(uart1_r_buf == ',')    //判断逗号
    	    { 
    	      devide_flag++;      //逗号次数记录
    	      record1=0;
    	    }
    	    if(devide_flag == 3)
    	    {
    	      if((record1 > 0) && (record1 < 5))
    	      {
    	        gps_infor_weijing[record1-1]=uart1_r_buf;	    //存储经纬度 此处为纬度							
    	      }
    	      if((record1 > 5) && (record1 < 10))             //跳过小数点的存储
    	      {
    	        gps_infor_weijing[record1-2]=uart1_r_buf;	   //存储经纬度 此处为纬度															
    	      }
    	    }
    	    if(devide_flag == 4)
    	    {
    	      if(record1 > 0)
    	      {
    	        ns_flag=uart1_r_buf;            //接收纬度NS标志
    	      }
    	    }
    	    if(devide_flag == 5)
    	    {
    	      if((record1 > 0) && (record1 < 6))
    	      {
    	        gps_infor_weijing[record1+7]=uart1_r_buf;	  //存储经纬度 此处为纬度										
    	      }
    	      if((record1 > 6) && (record1 < 11))                //跳过小数点的存储
    	      {
    	        gps_infor_weijing[record1+6]=uart1_r_buf;       //存储经纬度 此处为经度																			
    	      }
    	    }
    	    if(devide_flag == 6)
    	    {
    	      if(record1 > 0)
    	      {
    	        ew_flag=uart1_r_buf;            //经度度 EW标志
    	      }
    	    }
    	    if(devide_flag == 7)
    	    {
    	      if(speed_end == 0x00)
    	      {
    	        if((record1 > 0) && (uart1_r_buf != '.'))
    	        {
    	          gps_infor_speed[record1-1]=uart1_r_buf;   //接收速率
    	        }
    	        else if(uart1_r_buf == '.')
    	        {
    	          record1--;
    	          speed_end=0xff;
    	        }
    	      }
    	      else if(speed_end == 0xff)
    	      {
    	        speed_end=0xfe;
    	        gps_infor_speed[record1-1]=uart1_r_buf;
    	        gps_infor_speed[3]=gps_infor_speed[record1-1];
    	        gps_infor_speed[2]=gps_infor_speed[record1-2];
    	        if(record1 > 2)
    	        {
    	          gps_infor_speed[1]=gps_infor_speed[record1-3];
    	        }
    	        else
    	        {
    	          gps_infor_speed[1]=0x30;
    	        }
    	        if(record1 > 3)
    	        {
    	          gps_infor_speed[0]=gps_infor_speed[record1-4];
    	        }
    	        else
    	        {
    	          gps_infor_speed[0]=0x30;
    	        }
    	      }
    	    }
    	    if(devide_flag == 8)
    	    {
    	      if(dir_end == 0x00)
    	      {
    	        if((record1 > 0) && (uart1_r_buf != '.'))
    	        {
    	          gps_infor_dir[record1-1]=uart1_r_buf;   //存储方向
    	        }
    	        else if(uart1_r_buf == '.')
    	        {
    	          record1--;
    	          dir_end=0xff;
    	        }
    	      }
    	      else if(dir_end == 0xff)
    	      {
    	        dir_end=0xfe;
    	        if(record1 == 2)
    	        {
    	          gps_infor_dir[2]=gps_infor_dir[record1-2];
    	          gps_infor_dir[1]=0x30;
    	          gps_infor_dir[0]=0x30;
    	        }
    	        if(record1 == 3)
    	        {
    	          gps_infor_dir[2]=gps_infor_dir[record1-2];
    	          gps_infor_dir[1]=gps_infor_dir[record1-3];
    	          gps_infor_dir[0]=0x30;
    	        }
    	      }
    	    }
    	    if(devide_flag == 9)
    	    {
    	      if((record1 > 0) && (record1 < 7))
    	      {
    	        gps_infor_date[record1-1]=uart1_r_buf;
    	      }
    	    }
    	    if(uart1_r_buf == 0x0d)
    	    {
    	      recv1_step=STAGE_SOHE;    //接收完成 并信号确定 
    	      record1=0;                //恢复初始化状态 为下一次准备
    	      devide_flag=0;
    	      sysmode_GPS=TRUE;         //置位 GPS 信号为正确
    	    }
    	  }
    	  break;
    	  }
    	}
       if(TI)  //如果是发送标志位,清零
    	TI=0;
    }
     
    
    

    链接:https://pan.baidu.com/s/1FSMLsaumjvjNPuRfHn4CWw
    提取码:kpye

    展开全文
  • 本系统由STC89C52单片机电路+GPS模块电路+GSM模块SIM800A+指示灯电路+电源电路组成。

    1、设计需求及目标

    本系统由STC89C52单片机电路+GPS模块电路+GSM模块SIM800A+指示灯电路+电源电路组成。

    1、系统上电后,系统向特定手机号码发送短信,短信内容为系统的当前经纬度信息。40s左右发一次。

    2、如果需要立刻发送经纬度信息,直接按板载按键即可立刻发送经纬度数据,不用等待40s。

    3、短信发送及初始化有状态指示灯指示。

    4、GSM模块是SIM800A,该模块和SIM900A电路程序完全兼容外观外形一模一样

    2、设计思路及方案

     本系统具体框图如下图所示:

     硬件电路如图:

    资料获取请关注微信公众号“电子工程师成长日记”,回复关键词:“资料”!

    展开全文
  • 这里提出一种基于EM411GPS接收模块和PIC18F2550单片机的手持式GPS定位系统设计方案。该系统采用点阵字符液晶屏显示接收GPS卫星数据,并用SD卡记录所接收到的GPS信息,从而实现GPS数据导入电子地图。
  • 这里提出一种基于EM411 GPS接收模块和PIC18F2550单片机的手持式GPS定位系统设计方案。该系统采用点阵字符液晶屏显示接收GPS卫星数据,并用SD卡记录所接收到的GPS信息,从而实现GPS数据导入电子地图。
  • 单片机差分GPS定位系统设计

    千次阅读 多人点赞 2018-03-23 19:50:54
    背景意义 随着GPS定位的不断发展和普及,用户对GPS定位精度的要求越来越高,单点...利用普通的 GPS接收机和单片机建立单片机差分GPS定位系统可以有效提高定位精度,且具有设备简单 、造价低及使用灵活的特点,有重...

    背景意义

    随着GPS定位的不断发展和普及,用户对GPS定位精度的要求越来越高,单点的GPS定位精度在水平方向上只能达到几十米的精度。在实际应用中往往不能满足要求。差分GPS定位技术可以使定位精度达到米级甚至更高精度。购买现成的差分GPS设备可以直接进行定位,但价格昂贵。利用普通的 GPS接收机和单片机建立单片机差分GPS定位系统可以有效提高定位精度,且具有设备简单 、造价低及使用灵活的特点,有重要的实际应用意义。
    项目视频

    技术路线

    这里写图片描述

    设计方案

    单片机差分GPS定位系统的结构由参考站、数据通信模块移动站三个部分组成。由事先经过精确测量定位的参考站,计算卫星测量中缓慢变化的各种误差分量,形成对可见卫星的测量修正值,再通过数据通信传给附近的移动站,从而构成差分定位,提高GPS定位精度。
    这里写图片描述

    模块选取

    为实现系统功能,我们本着性能稳定,成本较低的原则对几个重要的模块进行了选取。
    这里写图片描述
    这里写图片描述

    硬件设计

    核心控制板电路

    原理图绘制

    原理图

    PCB布线

    这里写图片描述
    这里写图片描述

    焊接电路板

    这里写图片描述

    核心控制板实物

    这里写图片描述

    移动站包装

    为便于用户使用提高美观性我们将移动站进行了包装,其外部包含LCD显示屏,薄膜按键,状态指示灯,JATG下载接口,天线外接接口。
    这里写图片描述

    软件实现

    参考站程序

    参考站的主要作用是提供卫星偏差数据给移动站。
    (1)GPS信息解码
    (2)差分数据计算、发送
    (3)位置信息的显示
    这里写图片描述

    GPS解码

    $GPGGA,124105.00,3853.16302,N,11530.23581,E,1,05,1.37,59.3,M,-10.9,M,,*45
    $GPGSA,A,3,09,17,23,28,12,,,,,,,,1.90,1.37,1.31*0B
    $GPGSV,4,1,14,01,02,065,,02,21,260,,03,33,049,,06,63,286,*7D
    $GPGLL,3853.16302,N,11530.23581,E,124105.00,A,A*6A
    

    在$GPGGA语句中就包含了我们所需要的经度、纬度、高度等信息。 为减轻单片机接收数据压力,我们可以通过U-blox公司的官方软件u-center对GPS的波特率,输出数据内容,输出数据频率进行修改。
    这里写图片描述

    差分数据计算和发送

    差分数据包含经度、纬度和海拔高度三个分量。均为双精度浮点型变量,为保障其传输精度,我们将差分数据乘1000打印为字符串并增加校验位进行传输。
    这里写图片描述

    移动站程序

    移动站是整个系统的功能站。
    (1)GPS信息解码
    (2)差分数据接收,定位信息修正
    (3)位置信息的显示(经纬度方式,坐标轨迹方式)
    (4)语音播报
    这里写图片描述

    差分数据接收定位

    信息修正差分数据的接收在串口终端中。
    这里写图片描述
    这里写图片描述

    语音播报

    语音模块通过串口发送命令的方式触发。发送格式为7E FF 06 03 00 00 xx EF。其中xx为需要播报的语音段,按拷贝顺序依次排列。
    这里写图片描述
    在时间播报和经度纬度海拔高度上都含有大量的浮点型数字。因此有必要编写一个通用的转换程序,将字符一位位转换为对应的语音地址,但在转换过程中又要考虑到个十百千万的单位添加,中间连续零,末尾零等问题,避免出现“零百”、“零零”等现象。
    这里写图片描述

    性能测试

    移动站功能测试

    移动站主要功能有:
    (1)差分定位功能
    (2)经纬度显示和直角坐标显示
    (3)语音播报
    (4)轨迹记录
    (5)测距功能
    这里写图片描述
    这里写图片描述

    移动站定位精度测试

    采用实验室高精度GPS定位板卡BDM683三系统八频高精度 OEM 板卡进行参考站准确坐标的确定。其单点定位精度可达:平面1.5m,高程3.0m,RTK定位精度为:平面10mm+1ppm,高程15mm+1ppm。
    这里写图片描述
    这里写图片描述
    将移动站分别放置到实现确定好的5个基准点,使用串口将移动站单点定位和差分定位的数据发送电脑,进行记录。为保障测试的有效性,每个点记录约10分钟。

    D,   38.875495,  115.497905,   36.500000,   38.875762,  115.497553,   32.993300,   32.330055D,   38.875495,  115.497905,   36.500000,   38.875762,  115.497553,   32.993300,   32.330055D,   38.875495,  115.497905,   36.500000,   38.875762,  115.497553,   32.993300,   32.330055D,   38.875495,  115.497905,   36.600000,   38.875762,  115.497553,   33.093300,   32.330055D,   38.875495,,   

    这里写图片描述
    这里写图片描述
    以第一个定位点为例:

    原始数据提取。

    利用MATLAB将1.TXT中的原始数据进行分析和提取,得到单点定位和差分定位的经度、纬度、高度数据
    这里写图片描述

    误差分析。

    水平误差 水平误差即测量出的坐标值与准确值的水平间距。利用MATLAB中自带的distance函数可以很方便的求出。
    例如:errorx1(i)=distance(R(1),R(2),lat(i),lon(i),6378137);
    垂直误差 垂直误差即为在海拔高度上测量值与准确值的差值。
    测试点1的水平误差和垂直误差
    这里写图片描述
    这里写图片描述
    5个测试点的定位水平误差(保留两位小数)
    这里写图片描述
    5个测试点的定位垂直误差(保留两位小数)
    这里写图片描述
    设计的的单片机差分GPS定位系统
    在水平方向定位误差从平均43米,缩减到平均1.5米左右,提升了96%的精度。
    在垂直方向上,虽然没有水平方向上提升那么明显,但是也从9米左右提高到2.3米左右,提升定位精度73%。
    在成本较低的前提下实现了定位精度数量级的提升,满足系统的设计要求。

    工作总结:

    本文针对当前对于GPS定位对于在低成本条件下实现高精度定位的需求,设计了单片机差分GPS系统。经过方案设计,模块选取,硬件制作,软件编写调试等一系列过程将系统设计完成并实现了基本功能,测试结果表明,系统的定位精度满足要求。实现了水平方向1.5m垂直方向2.3m的定位精度。
    创新特色
    1、利用单片机和GPS组成差分定位系统,在一定程度上提高了定位精度。
    2、体积小巧、携带方便、造价低廉。
    3、配备语音LCD显示屏按键等人机交互模块,功能多,使用十分方便。
    4、预留外接串口,方便作为拓展模块配合其他系统使用。

    展开全文
  • 基于单片机GPS定位农田面积测量仪设计(原理图+源程序+bom表+演示视频) 通过串口1连接ATK-NEO-6M GPS模块,然后通过液晶显示GPS信息,包括精度、纬度、高 度、速度、用于定位的卫星数、可见卫星数、UTC时间等信息。...
  • 在介绍GPS定位基本原理的基础上,提出了一种基于AT89C52系列单片机的液晶GPS定位仪的设计方案,详细介绍了定位仪的硬件和软件设计。实际应用表明,该系统能够实现对GPS全球定位系统的定位导航信息帧参数的提取,实现了...
  • 106【电路方案】基于单片机GPS定位农田面积测量仪设计 摘要: 基于单片机GPS定位农田面积测量仪设计(原理图+源程序+bom表+演示视频) 通过串口1连接ATK-NEO-6M GPS模块,然后通过液晶显示GPS信息,包括精度、...
  • 系统硬件电路主要有GPS、液晶显示器、STC12C5A60S2、LED状态指示单片机上电复位和电源等部分组成。GPS发送的串行数据送至单片机串行口经处理后通过键盘选择要显示的信息,送至LCD液晶显示器。LCD液晶显示器会定时...
  • 定位数据发给单片机后,单片机拔号上网,再传递给远程的电脑,在电脑的谷歌地图上显示出来。 1.GPS用的瑞士 UBLOX LEA 模块,因为是自己做着玩,就从网上选择了便宜的GPRS模块 二手的台湾BENQ M22 2.另外自己做了个...
  • 基于STC8F_12864设计一个带万年历、GPS定位测速、指针模拟的电子时钟,原理图源程序都分享出来了,有需要的可以下载了看看。 主要器件: STC最新单片机STC8F2K64S4 DS3231高精度时钟芯片 显示屏幕为带字库的12864 本...
  • 基于C3-370C的GPS定位及轨迹记录仪! 开始用M48作控制MCU,结果写着写着,发现Flash空间不足,想换个M8或M88的,还不好买,手上正好还有两块STC90C52,8K的,于是就换上C52了。C52不带AD,那电池检测又成问题,于是...
  • ATK-NEO-6M-V2.3(V2.3是版本号)是一款高性能GPS定位模块。该模块采用U-BLOX NEO-6M模组,模块自带MAXIM公司高增益(20.5dB)LNA芯片与高性能陶瓷天线结合,组成接收天线,相当于集成有源天线了。 NEO-6M-V2.3 GPS定位...
  • ATKATK -S1216F8北斗模块是一款高性能GPS北斗双模定位模块 。 该模块该特点包括: 1,模块采用S1216F8S1216F模组,体积小巧,性能优异。 2, 模块可通过串口进行各种参数设置, 并可保存在内部FLASH ,使用方便。 3,...
  • 提出了一种以OEM模块GPS9808和MSP430F169单片机为核心器件的智能定位系统的设计方案。同时介绍了GPS9808和MSP430F169的主要功能及特点, 给出了由GPS9808和MSP430F169单片机、GSM短消息模块TC35i所组成的物体智能...
  • 系统由电源电路、晶振电路、复位电路、LCD驱动电路等组成,此系统用以读取GPS模块的数据并处理,最后在LCD液晶显示屏上显示经纬度和时间,用户可以实时通过读取显示的内容了解自己的位置以及当前时间,并可以实现...
  • 提供了嵌入式GPS终端设计方案,通过单片机控制的串口通信利用车载GPS终端提供的定位信息和CDMA无线通讯功能,实现实时显示定位信息等功能。
  • 本研究用单片机控制OEM板接收导航信息,对GPS数据采集系统的硬件和软件提出了详细的设计方案,给出了提取GPS特征数据的算法,这对研究GPS定位及其在综合导航中的应用,以及对OEM 板的二次开发等都是非常实用的。
  • 移动通信网络中移动终端的定位方法可分为两大类:一类是基于手机的定位方法,通过在每个移动终端(如手机)内部安装微型GPS接收器进行定位。另一类是基于网络的定位方法。这种方法与基于移动终端的定位方法正相反,...
  • 摘要: 提出了一种以OEM模块GPS9808和MSP430F169单片机为核心器件的智能定位系统的设计方案。同时介绍了GPS9808和MSP430F169的主要功能及特点, 给出了由GPS9808和MSP430F169单片机、GSM短消息模块TC35i所组成的物体...
  • 打开野火多功调试助手,选“GPS定位功能” 选好端口和波特率,端口就是USB转TTL的COM口,波特率选56000,点“打开串口” 发射器接上5V电源 等待GPS模块定位了LED指示灯会闪烁,同时接收器的LED指示灯也会跟着闪烁 ...
  • 将自己电脑的网络IP写入单片机,通过GPRS模块 上网,将定位数据发到电脑上在地图上显示出来。 这是GPS模块提供的测试软件,直接接上串口就可以测试模块的定位性能及数据。 下图为定位精度,谷歌地图的显示。 天线是...
  • 1引言  全球定位系统GPS是由美国为高精度导航和定位而研制的全球性被动式无线电卫星系统,... 一种简单有效的城市公益设施的定位系统由GPS和Radio Detection两种定位设备配合组成一种测量方案,并将所存信息输出到GI
  • 本设计主要是制作出一款基于51单片机的GPS自动报站公交车,根据设计需求,硬件部分应该具有的功能有,GPS定位、语音播报、液晶显示、按键操作以及相应的指示灯提示,所以本次设计采用了STC89C58RC单片机作为主控芯片...
  • 利用凌阳SPCE061A串行口通信接收GPS模块输出的经纬度信息,通过对比存储经、纬度数据和相应的站点名字。确认公交车是否进入设定站台范围内,以达到自动报站的目的;再设计的过程中给出硬件电路的设计方案、主要软件...
  • 方案:AVR单片机+UBLOX GPS+GPRS 原理:定位数据发给单片机后,单片机拔号上网,再传递给远程的电脑,在电脑的谷歌地图上显示出来。 1.GPS用的瑞士 UBLOX LEA 模块,因为是自己做着玩,就从网上选择了便宜...
  • 创客:机器人GPS定位导航小车的制作-基于物联网的应用 目录 前言 3 画册 4 第1章机器人小车基础知识 17 1.1 机器人小车全新认识 17 1.2 机器人小车释疑解惑 17 1.3 机器人小车的驱动方式 18 第2章 机器人小车的构成 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 697
精华内容 278
关键字:

单片机gps定位方案