我在網上找了一些解析GPS的程序,并用OLED顯示出來。目前可以做到解析和顯示,但做不到實時刷新。請高手指點一下。謝謝
IIC的程序就不貼出來了。
單片機源程序如下:
- #include <reg51.h>
- #include "iic_oled.h"
- #define u8 unsigned char
- #define u16 unsigned int
- #define u32 unsigned long
- u8 RX_Buffer[68]; //此數組用于直接儲存來自GPS的原始數據
- u8 RX_Count = 0;
- //u8 Hour = 0,Min_High = 0,Min_Low = 0,Sec_High = 0,Sec_Low = 0;
- u8 Month = 0,Day = 0,Month_High = 0, Month_Low = 0,Day_Low = 0 ,Day_High = 0, Year_High = 0,Year_Low = 0;
- u16 Year = 0;
- bit Flag_GPS_OK = 0;
- u8 MaxDay = 0;
- u8 xdata Display_GPGGA_Buffer[68]={0}; //用于儲存GPGGA的數據
- bit Flag_Calc_GPGGA_OK = 0; //GPGGA完整有效的數據已收到的標志變量
- void Uart_Init();
- u8 GetMaxDay(u8 Month_Value,u16 Year_Value);
- bit IsLeapYear(u16 uiYear);
- void Delay500ms() ;
- //****************************************************
- //主函數
- //****************************************************
- void main()
- {
- u16 i = 0;
- Uart_Init(); //串口初始化
- OLED_Init();//初始化OLED
- OLED_Clear();//清屏
- while(1)
- {
- if ( Flag_GPS_OK == 1 && RX_Buffer[4] == 'G'
- && RX_Buffer[6] == ',' && RX_Buffer[13] == '.'
- ) //確認是否收到"GPGGA"這一幀完整有效的數據
- {
- for( i = 0; i < 67 ; i++) //必須為i<67,因為要確保Display_GPGGA_Buffer[67]為'\0',便于串口發送
- {
- Display_GPGGA_Buffer[i] = RX_Buffer[i]; //儲存到數組中
- }
- Flag_Calc_GPGGA_OK = 1; //收到完整有效數據后,置為1
-
- }
- if(Display_GPGGA_Buffer[28] == 'N')
- {
- OLED_ShowChar(0, 0, 'G');
- OLED_ShowChar(8, 0, 'P');
- OLED_ShowChar(16, 0, 'S');
- OLED_ShowChar(24, 0, ':');
-
- OLED_ShowChar(0, 2, Display_GPGGA_Buffer[28]);//N
- OLED_ShowChar(8, 2, ':'); //:
- OLED_ShowChar(16, 2, Display_GPGGA_Buffer[17]);
- OLED_ShowChar(24, 2, Display_GPGGA_Buffer[18]);
- OLED_ShowChar(32, 2, 127);
- OLED_ShowChar(40, 2, Display_GPGGA_Buffer[19]);
- OLED_ShowChar(48, 2, Display_GPGGA_Buffer[20]);
- OLED_ShowChar(56, 2, '.');
- OLED_ShowChar(64, 2, Display_GPGGA_Buffer[22]);
- OLED_ShowChar(72, 2, Display_GPGGA_Buffer[23]);
- OLED_ShowChar(80, 2, Display_GPGGA_Buffer[24]);
- OLED_ShowChar(88, 2, Display_GPGGA_Buffer[25]);
- OLED_ShowChar(96, 2, Display_GPGGA_Buffer[26]);
- OLED_ShowChar(104, 2, 39);
-
- OLED_ShowChar(0, 4, Display_GPGGA_Buffer[42]);//E
- OLED_ShowChar(8, 4, ':'); //:
- OLED_ShowChar(16, 4, Display_GPGGA_Buffer[30]);
- OLED_ShowChar(24, 4, Display_GPGGA_Buffer[31]);
- OLED_ShowChar(32, 4, Display_GPGGA_Buffer[32]);
- OLED_ShowChar(40, 4, 127);
- OLED_ShowChar(48, 4, Display_GPGGA_Buffer[33]);
- OLED_ShowChar(56, 4, Display_GPGGA_Buffer[34]);
- OLED_ShowChar(64, 4, '.');
- OLED_ShowChar(72, 4, Display_GPGGA_Buffer[36]);
- OLED_ShowChar(80, 4, Display_GPGGA_Buffer[37]);
- OLED_ShowChar(88, 4, Display_GPGGA_Buffer[38]);
- OLED_ShowChar(96, 4, Display_GPGGA_Buffer[39]);
- OLED_ShowChar(104, 4, Display_GPGGA_Buffer[40]);
- OLED_ShowChar(112, 4, 39);
- }
- else
- {
- OLED_ShowChar(0, 0, 'G');
- OLED_ShowChar(8, 0, 'P');
- OLED_ShowChar(16, 0, 'S');
- OLED_ShowChar(24, 0, ':');
- OLED_ShowChar(0, 2, 'n');//N
- OLED_ShowChar(8, 2, 'o'); //:
- OLED_ShowChar(16, 2, 't');
- OLED_ShowChar(24, 2, 32);
- OLED_ShowChar(32, 2, 'c');
- OLED_ShowChar(40, 2, 'o');
- OLED_ShowChar(48, 2, 'n');
- OLED_ShowChar(56, 2, 'n');
- OLED_ShowChar(64, 2, 'e');
- OLED_ShowChar(72, 2, 'c');
- OLED_ShowChar(80, 2, 't');
- OLED_ShowChar(88, 2, 32);
- OLED_ShowChar(96, 2, 32);
- OLED_ShowChar(104, 2, 32);
-
- OLED_ShowChar(0,4, 32);//E
- OLED_ShowChar(8,4, 32); //:
- OLED_ShowChar(16,4, 32);
- OLED_ShowChar(24,4, 32);
- OLED_ShowChar(32,4, 32);
- OLED_ShowChar(40,4, 32);
- OLED_ShowChar(48,4, 32);
- OLED_ShowChar(56,4, 32);
- OLED_ShowChar(64,4, 32);
- OLED_ShowChar(72,4, 32);
- OLED_ShowChar(80,4, 32);
- OLED_ShowChar(88,4, 32);
- OLED_ShowChar(96,4, 32);
- OLED_ShowChar(104,4, 32);
- OLED_ShowChar(112,4, 32);
-
- }
-
- }
- }
- void Uart_Init()
- {
- SCON = 0X50; //UART方式1;8位UART
- REN = 1; //允許串行口接收數據
- PCON = 0x00; //SMOD=0;波特率不加倍
- TMOD = 0x20; //T1方式2,用于產生波特率
- TH1 = 0xFD; //裝初值
- TL1 = 0xFD;
- TR1 = 1; //啟動定時器1
- EA = 1; //打開全局中斷控制
- ES = 1; //打開串行口中斷
- }
- void RECEIVE_DATA(void) interrupt 4 using 3 //串口中斷函數,收到GPS的數據時進入此中斷
- {
- u8 temp = 0;
- ES=0; //先關閉串行口中斷
- if(RI)
- {
- temp = SBUF; //接收SBUF中的數據
- if(temp == '
- ) //若是統一的數據頭,則作為數組第一個元素
- {
- RX_Count = 0;
- Flag_GPS_OK = 0;
- }
- RX_Buffer[RX_Count++] = temp; //收到的數據放到數組中
- if(RX_Count >= 66) //序號大于66的數據無用,統一放到第66位覆蓋掉
- {
- RX_Count = 66;
- }
- if(temp == '*') //收到*,則完成一幀數據的接收,不管是否完整有效
- {
- Flag_GPS_OK = 1; //標志變量置為1
- }
- }
- RI = 0; //接收完成的標志位清零
- ES=1; //重新打開串行口中斷
- }
復制代碼
全部資料51hei下載地址:
改版.rar
(57.14 KB, 下載次數: 16)
2021-9-1 23:24 上傳
點擊文件名下載附件
|