通过串口返回单片机内读取到的经纬度信息

本实验已经设置好gps模块数据刷新速率为1次/秒,其他具体初始化请见https://www.cnblogs.com/wang-zefeng/p/12555646.html

通过串口3将gps的数据送至单片机进行处理,通过串口1将处理好的经纬度数据返回至电脑。

  1 #include <stc15wxx.h>
  2 #include <string.H>
  3 #include <intrins.h>
  4 #define uchar unsigned char
  5 #define uint unsigned int
  6 uchar rec_gpsdata[51]={0};//Gps模块返回数据数组
  7 uchar rec_gpsnum=0,ok[]=",A,";
  8 uchar gpsdata[17]={0};
  9 uchar tn,p;
 10 long tm;
 11 void Init ()
 12 {
 13         P0M1 = 0x00;   P0M0 = 0x00;           //设置为准双向口
 14     P1M1 = 0x00;   P1M0 = 0x00;           //设置为准双向口
 15     P3M1 = 0x00;   P3M0 = 0x00;           //设置为准双向口
 16 }
 17 void Uart3Init(void)        //9600bps@11.0592MHz
 18 {
 19     S3CON = 0x10;        //8位数据,可变波特率
 20     S3CON &= 0xBF;        //串口3选择定时器2为波特率发生器
 21     AUXR |= 0x04;        //定时器2时钟为Fosc,即1T
 22     T2L = 0xE0;        //设定定时初值
 23     T2H = 0xFE;        //设定定时初值
 24     AUXR |= 0x10;        //启动定时器2
 25     EA=1;//开总中断
 26     IE2 |= 0x08;         // 串口3中断打开
 27 }
 28 
 29     void Uart1Init(void)        //9600bps@11.0592MHz
 30 {
 31     SCON = 0x50;        //8位数据,可变波特率
 32     AUXR |= 0x01;        //串口1选择定时器2为波特率发生器
 33     AUXR |= 0x04;        //定时器2时钟为Fosc,即1T
 34     T2L = 0xE0;        //设定定时初值
 35     T2H = 0xFE;        //设定定时初值
 36     AUXR |= 0x10;        //启动定时器2
 37     EA=1;//开总中断
 38     ES=1;//开串行口中断
 39 }
 40 
 41 void GPSreturn(void) interrupt 17
 42 {
 43         uint temp;
 44     if (S3CON & 0x01)           // 接收中断标志位
 45     {
 46         S3CON &= ~0x01;         // 清中断标志
 47                 temp=S3BUF;
 48             if(rec_gpsnum<=50)
 49                 rec_gpsdata[rec_gpsnum++]=temp;
 50             if(rec_gpsnum>50)
 51                 rec_gpsnum=0;
 52     }
 53 }
 54 
 55 //串行口连续发送char型数组,遇到终止号/0将停止
 56 void Uart1Sends(uchar *str)
 57 {
 58     while(*str!='')
 59     {
 60         SBUF=*str;
 61         while(!(SCON & 0x02));//等待发送完成信号(TI=1)出现
 62         SCON &= ~0x02;         // 清中断标志
 63         str++;
 64     }
 65 }
 66  
 67 // $GPGLL,2236.91284,N,11403.24705,E,060826.00,A,D*66
 68 void main()
 69 {
 70     Init();
 71     Uart1Init();
 72     Uart3Init();
 73     while(1) 
 74     {
 75         if(strstr(rec_gpsdata,ok)>0)//串口3GPS数据解析********************************************************************************************************
 76         {
 77                 gpsdata[0]=rec_gpsdata[7];    //纬度解析
 78                 gpsdata[1]=rec_gpsdata[8];
 79                 gpsdata[2]='.';
 80                 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;
 81                 gpsdata[3]=tm/1000+0x30;    //更新数据接口数据
 82                 gpsdata[4]=(tm%1000)/100+0x30;
 83                 gpsdata[5]=(tm%100)/10+0x30;
 84             if(tm%10==9)
 85                 gpsdata[6]=tm%10+0x30;
 86             else gpsdata[6]=tm%10+0x31;
 87                 gpsdata[7]=',';
 88                 tn=20;
 89                 gpsdata[8]=rec_gpsdata[tn];    //经度解析
 90                 gpsdata[9]=rec_gpsdata[tn+1];
 91                 gpsdata[10]=rec_gpsdata[tn+2];
 92                 gpsdata[11]='.';
 93                 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;
 94                 gpsdata[12]=tm/1000+0x30;
 95                 gpsdata[13]=(tm%1000)/100+0x30;
 96                 gpsdata[14]=(tm%100)/10+0x30;
 97                 gpsdata[15]=tm%10+0x31;
 98                 gpsdata[16]='
';
 99             
100             //    Uart1Sends(rec_gpsdata);  //此处修改短信内容
101                 Uart1Sends(gpsdata);  //此处修改短信内容
102     }
103     } 
104 
105 }
博客园
原文地址:https://www.cnblogs.com/wang-zefeng/p/12641723.html