我在网上找了一些解析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)
|