?? gps.c
字號:
#include <reg51.h>
#include <string.h>
//GPS數據存儲數組
unsigned char time[6]; //時間
unsigned char lock; //定位狀態
unsigned char WD[9]; //緯度
unsigned char WD_a; //緯度方向
unsigned char JD[10]; //經度
unsigned char JD_a; //經度方向
unsigned char speed[5]; //速度
unsigned char date[6]; //日期
//串口中斷需要的變量
unsigned char seg_count; //逗號計數器
unsigned char dot_count; //小數點計數器
unsigned char byte_count; //接收位數計數器
unsigned char cmd_number; //命令類型 1,2,3:RMC格式
unsigned char mode; //0:結束模式,1:接收命令模式,2:數據模式
unsigned char buf_full; //1:整句接收完成,相應數據有效。0:緩存數據無效。
unsigned char cmd[5]; //命令類型存儲數組
void sys_init(void); //系統初始化
main()
{
sys_init();
}
//系統初始化
void sys_init()
{
SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */
TMOD = 0x21; /* TMOD: timer 1, mode 2, 8-bit reload */
TR1 = 1; /* TR1: timer 1 run */
IE=0x90; //開總中斷、串口中斷
}
//串口接收中斷
void uart(void) interrupt 4
{
unsigned char tmp;
if(RI)
{
tmp=SBUF;
switch(tmp)
{
case '$' :
cmd_number=0; //命令類型清空
mode=1; //接收命令模式
byte_count=0; //接收位數清空
break;
case ',' :
seg_count++; //逗號計數加1
byte_count=0; //接收位數清空
break;
case '*' :
mode=0; break;
default:
if(mode==1)
{
//命令種類判斷
cmd[byte_count]=tmp; //接收字符放入類型緩存
if(byte_count>=4)
{ //如果類型數據接收完畢,判斷類型
if(cmd[0]=='G')
{
if(cmd[1]=='P')
{
if(cmd[2]=='R')
{
if(cmd[3]=='M')
{
if(cmd[4]=='C')
{
cmd_number=1;
mode=2;
seg_count=0; //逗號計數器
byte_count=0; //接收位數計數器
}
}
}
}
}
}
else if(mode==2)
{
//接收數據處理
switch (cmd_number)
{
case 1: //類型3數據接收。GPRMC
switch(seg_count)
{
case 1:
if(byte_count<6)
{ //時間處理
time[byte_count]=tmp;
}
break;
case 2: //定位判斷
if(byte_count<1)
{
lock=tmp;
}
break;
case 3: //緯度處理
if(byte_count<9)
{
WD[byte_count]=tmp;
}
break;
case 4: //經度處理
if(byte_count<10)
{
JD[byte_count]=tmp;
}
break;
case 5: //緯度方向處理
if(byte_count<1)
{
WD_a=tmp;
}
break;
case 7: //速度處理
if(byte_count<5)
{
speed[byte_count]=tmp;
}
break;
case 9:
if(byte_count<6)
{ //時間處理
date[byte_count]=tmp;
}
break;
}
byte_count++; //接收數位加1
break;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -