仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (40.17 KB, 下載次數: 82)
下載附件
2021-9-17 18:44 上傳
${@H8GDJ{26U_D70RGJ.png (111.15 KB, 下載次數: 75)
下載附件
2021-9-16 00:41 上傳
$GPRMC
格式為:
$GPRMC,010101.130, A, 3606.6834, N, 12021.7778, E, 0.0, 238.3, 010807,,,A*6C
$GPRMC, <1>, <2>, <3>, <4>, <5>, <6>, <7>, <8>, <9>,
$ pos=0
<1> 當前位置的格林尼治時間,即世界時間,與北京時間差8個小時,格式為hhmmss.ms [pos+6]
<2> 狀態, A 為有效位置, V為非有效接收警告,即當前天線視野上方的衛星個數少于3顆。 [pos+17]
注意幾點:
1、當GPS數據有效時第17位(一般情況下,程序里最好是找第二個逗號在取下一位判斷)為“A”,無效時為“V”;
2、GPS有效時,當速度為0時顯示0.0(兩位數),當速度不為0時小數點前面數據根據情況變化,最大為三位,此處速度單位為節(海里),需要做處理才能得到我們習慣的單位(公里/小時);
3、GPS無效時,除了第17位顯示V以外,不輸入速度,角度數據;
4、當給GPS復位時第17位為V,不輸出速度,角度,時間數據。
d.推薦定位信息(RMC)//項目需要
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh
$GPRMC,082006.000,A,3852.9276,N,11527.4283,E,0.00,0.0,261009,,*38
<1> UTC時間,hhmmss(時分秒)格式 08 時20 分06 秒
<2> 定位狀態,A=有效定位,V=無效定位
<3> 緯度ddmm.mmmm(度分)格式(前面的0也將被傳輸) 北緯38 度52.9276 分
<4> 緯度半球N(北半球)或S(南半球)
<5> 經度dddmm.mmmm(度分)格式(前面的0也將被傳輸) 東經115 度27.4283 分
<6> 經度半球E(東經)或W(西經)
<7> 地面速率(000.0~999.9節,前面的0也將被傳輸)
<8> 地面航向(000.0~359.9度,以真北為參考基準,前面的0也將被傳輸)
<9> UTC日期,ddmmyy(日月年)格式 26日10月09年
<10> 磁偏角(000.0~180.0度,前面的0也將被傳輸)
<11> 磁偏角方向,E(東)或W(西)
<12> 模式指示(僅NMEA0183 3.00版本輸出,A=自主定位,D=差分,E=估算,N=數據無效)
經緯度格式分為三種:度、度-分、度-份-秒
1.) ddd.ddddd 【度 . 度 格式】的十進制小數部分(5位)
2.) ddd°mm.mmm’ 【度 . 分 . 分 格式】的十進制小數部分(3位)
3.) ddd°mm’ss’’ 【度 . 分 . 秒 格式】 Google 使用的是第三種格式 度 分’秒’’
單片機源程序如下:
- #include <reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar dataLength = 80;
- uchar count=0;
- bit Flag1=0;
- bit Flag2=0;
- bit Flag3=0;
- uchar idata uartBuffer[100]={0};//串口GPS數據緩沖數組
- uchar uartByte;//所處幀的部分
- uchar idata uLatitude[14]="W00 00'00.00";//緯度//<3> //以下為GPRMC語句信息提取//
- uchar idata uLongitude[14]="J000 00'00.00";//經度//<5>
- uchar idata uSpeed[10]={0};//地面速度//<7>
- uchar idata uDate[9]="D00/00/00";//日期//<9>
- uchar idata hours[9]="H00/00/00";//時分//<9>
- sbit lcdRs=P3^5;
- sbit lcdRw=P3^6;
- sbit lcdEn=P3^7;
- //數碼管
- //共陰極
- unsigned char dispbitcode[6]={0x01,0x02,0x04,0x08,0x10,0x20};
- unsigned char dispcode[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x07,0x07,0x7F,0x6F};
- //0 0x3F 1 0x06 2 0x5B 3 0x4F 4 0x66 5 0x6D 6 0x7D 7 0x07 8 0x7F 9 0x6F
- unsigned char dispbuf[];
- // 延時函數
- void delay(unsigned int z)
- {
- unsigned int x,y;
- for(x=z;x>0;x--)
- for(y=1;y>0;y--);
- }
- // GPS時間提取函數
- void removehours(unsigned char temp)
- {
- uchar i,k=0;
- for(i=temp+2;i<temp+8;i++)
- hours[k++]=uartBuffer[i];
- }
- // GPS數據處理函數
- void uartBufferDeal()
- {
- uchar i,j;
- uchar comma_n=0;
- for(i=0;i<10;i++)
- {
- if(uartBuffer[i]=='R')
- {
- comma_n=0;//逗號的個數歸零
- for(j=i;j<10;j++)
- {
- if(uartBuffer[j]==',')
- comma_n+=1;
- if(comma_n==0)
- removehours(j);
- }
- }
- }
- }
- // 經緯度數據格式轉換函數
- //==============串口初始化函數==========================
- void uartInit()
- {
- SCON = 0x50; //REN=1允許串行接收狀態,串口工作模式1
- TMOD|= 0x20; //定時器工作方式2
- PCON|= 0; //SMOD設置為0
- TH1 = 0xFD; // 波特率9600、數據位8、停止位1。效驗位無 (11.0592M)
- TL1 = 0xFD;
- TR1 = 1; //定時器T1啟動
- ES = 1; //開串口中斷
- }
- int kk=0;
- //主函數
- void main (void)
- {
- uartInit();//初始化串口
- EA = 1;// 開總中斷
- while(1)
- {
- kk++;
- if(kk==6)kk=0;
- P2=dispbitcode[5-kk];
- P0=dispcode[hours[kk]-'0'];
- delay(300);
- P0=0x00;
- delay(10);
- if(Flag1==1)
- {
- uartBufferDeal();//經緯度數據處理
- Flag1=0;//清除標志位
- count=0;
-
- }
- ES = 1;//開串口中斷
- }
- }
- // 串口中斷函數
- void SerialInt (void) interrupt 4
- {
- if(RI == 1) //RI接收中斷標志
- {
- uartByte=SBUF;
- if(uartByte=='R')
- {
- Flag2=1;
- }
- if(Flag2==1)
- {
- uartBuffer[count++] = uartByte;//緩沖數據存入uartBuffer[]數組
- }
- if(count>=dataLength)
- {
- ES = 0;//關閉串口中斷
- Flag1=1;//標志位置1
- Flag2=0;//標志位清零
- }
- RI = 0;//清除RI接收中斷標志
- }
- }
復制代碼
所有資料51hei附件下載:
proteus2.3.rar
(112.17 KB, 下載次數: 75)
2021-9-16 00:44 上傳
點擊文件名下載附件
全球定位系統GPS模塊 下載積分: 黑幣 -5
|