通过串口返回单片机内读取到的经纬度信息
本实验已经设置好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!='\0') 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]='\n'; 99 100 // Uart1Sends(rec_gpsdata); //此处修改短信内容 101 Uart1Sends(gpsdata); //此处修改短信内容 102 } 103 } 104 105 }
博客园