版主: wanchong , wangyu , eepwwp , firedom

分享到:
共24条 2/3 « 1 2 3 »   

我正用北斗/GPS做四轴飞行器控制3G/4G带宽测试地图,,,

ishaq5niu
我是GG
高级会员

最后登陆时间:2014-07-25 16:35:49

11# 发表于 2014-09-01 10:10:45
现在刷树莓派香蕉派功能通了,等学生来飞圈子试下,,,再刷到GALILEO对比下板子的负载性能,,

RE: 基于蜂窝网络的智能化运动保卫智能设备

贝多芬的悲伤
我是GG
高级会员

最后登陆时间:2014-09-01 18:45:11

12# 发表于 2014-09-03 21:43:16
规律:所有开发手记都是以开箱照开始的……

RE: 基于蜂窝网络的智能化运动保卫智能设备

zkynew001
我是GG
高级会员

最后登陆时间:2014-08-24 23:07:54

13# 发表于 2014-09-04 09:46:53
有木有刷Android

RE: 基于蜂窝网络的智能化运动保卫智能设备

中科院
我是GG
高级会员

最后登陆时间:2014-08-02 23:02:45

14# 发表于 2014-09-10 22:24:18
在一段时间接触windows iot 后,整的开始喜欢上了这个鉲飞

RE: 基于蜂窝网络的智能化运动保卫智能设备

中科院
我是GG
高级会员

最后登陆时间:2014-08-02 23:02:45

15# 发表于 2014-09-10 22:33:19
等等就附上---相关过程

RE: 基于蜂窝网络的智能化运动保卫智能设备

caocheng
我是GG
高级会员

最后登陆时间:2014-07-23 11:45:14

16# 发表于 2014-09-15 14:19:25
网线应该可以100多米的,难道你的是山寨线? 或者水晶头接错了? 1,2是一队, 3,6是一对

RE: 基于蜂窝网络的智能化运动保卫智能设备

中科院
我是GG
高级会员

最后登陆时间:2014-08-02 23:02:45

17# 发表于 2014-09-16 21:46:10
上周日,我在成都市电子市场转了一天,几乎没有找到一家有我想要的GPS芯片--------不过,现在已经把GPS调节好了,数据精度u,也是提高了一个档次,就是采集还有问题,会出现一些时断时续~~~接下来,就要自己去做电池了,希望可以减轻重量。。至于数据传输模块,还是需要自己解决,还有显示模块,是不是也要去找整个全双拼场

RE: 基于蜂窝网络的智能化运动保卫智能设备

中科院
我是GG
高级会员

最后登陆时间:2014-08-02 23:02:45

18# 发表于 2014-09-29 10:51:39
在gps芯片选择上,我使用了ublox的常见芯片,它的主要功能的实现就是刚开始的GPS定位原理,接收到发来的信号,它有一个基本的格式,是美国电子海洋协会制造的,LTE附一下对这个规则的解析格式的代码

 unsigned char i = 0;
 while(Serial.available() > 0)
 {  
  Uart_Buffer = Serial.read(); //获取GPS信息
  Serial.write(Uart_Buffer);   //测试使用

  if(Uart_Buffer == '$')
  {
   RX_Count = 0;
   //Flag_GPS_OK = 0;
  }
 
  if(RX_Count < 6)
  {
   GPS_COM[RX_Count++] = Uart_Buffer;
  }
  else if( GPS_COM[0] == '$' && GPS_COM[1] == 'G'&& GPS_COM[2] == 'P'&& GPS_COM[3] == 'G'&& GPS_COM[4] == 'G'&& GPS_COM[5] == 'A' ) //获取GPGGA数据
  {
   RX_GPGGA_Buffer[RX_Count] = Uart_Buffer;
   if(RX_GPGGA_Buffer[RX_Count] == '\n')
   {
    Flag_GPGGA_OK = 1;
    
   }
   else
   {
    RX_Count++;
   }   
  }
  else if( GPS_COM[0] == '$' && GPS_COM[1] == 'G'&& GPS_COM[2] == 'P'&& GPS_COM[3] == 'R'&& GPS_COM[4] == 'M'&& GPS_COM[5] == 'C' ) //获取GPRMC数据
  {
   RX_GPRMC_Buffer[RX_Count] = Uart_Buffer;
   if(RX_GPRMC_Buffer[RX_Count] == '\n')
   {
    Flag_GPRMC_OK = 1;
    
   }
   else
   {
    RX_Count++;
   }   
  }
  else if( GPS_COM[0] == '$' && GPS_COM[1] == 'G'&& GPS_COM[2] == 'P'&& GPS_COM[3] == 'G'&& GPS_COM[4] == 'L'&& GPS_COM[5] == 'L' ) //获取GPGLL数据
  {
   if(Uart_Buffer == '\n')
   {
    Flag_GPS_OK = 1;       //一组数据都是最后一帧是GPGLL,接收完GPGLL说明接收数据完成  
   }
  }
 

 }

 if(Flag_GPS_OK == 1)
 {
  Flag_GPS_OK = 0;
  Serial.print("**************************************************\n");
  if(Flag_GPGGA_OK == 1)
  {
   Serial.print("UTC_Time:");
   Flag_GPGGA_OK = 0;

   UTC_Hour = (RX_GPGGA_Buffer[7]-0x30)*10+(RX_GPGGA_Buffer[8]-0x30);   //获取UTC时间
   UTC_Min = (RX_GPGGA_Buffer[9]-0x30)*10+(RX_GPGGA_Buffer[10]-0x30);
   UTC_Sec = (RX_GPGGA_Buffer[11]-0x30)*10+(RX_GPGGA_Buffer[12]-0x30);

   Serial.print(UTC_Hour);
                        

   Serial.print(':');
   Serial.print(UTC_Min);
   Serial.print(':');
   Serial.print(UTC_Sec);
   Serial.print("\n");

   Serial.print("Altitude: ");     //海拔
   for(i = 0 ; i < 4 ; i++)
   {
    Altitude[i]=RX_GPGGA_Buffer[54+i];
    Serial.print(Altitude[i]);
   }
   Serial.print(" m");
   Serial.print("\n");

  }


  if(Flag_GPRMC_OK == 1)
  {
   Serial.print("UTC_Date:");
   Flag_GPRMC_OK = 0;

   UTC_Year = (RX_GPRMC_Buffer[57]-0x30)*10+(RX_GPRMC_Buffer[58]-0x30);   //获取UTC日期
   UTC_Month = (RX_GPRMC_Buffer[55]-0x30)*10+(RX_GPRMC_Buffer[56]-0x30);
   UTC_Day = (RX_GPRMC_Buffer[53]-0x30)*10+(RX_GPRMC_Buffer[54]-0x30);

   Serial.print("20");
   Serial.print(UTC_Year);
   Serial.print('-');
   Serial.print(UTC_Month);
   Serial.print('-');
   Serial.print(UTC_Day);   
   Serial.print("\n");

   Serial.print("Latitude: ");
   Latitude_N_or_S = RX_GPRMC_Buffer[30];     //纬度
   Serial.print(Latitude_N_or_S);
   Serial.print(" ");
   for(i = 0;i<10;i++)
   {
    Latitude[i]=RX_GPRMC_Buffer[19+i];
    Serial.print(Latitude[i]);


   }
   Serial.print("\n");



   Serial.print("Longitude: ");
   Longitude_E_or_W = RX_GPRMC_Buffer[44];     //经度
   Serial.print(Longitude_E_or_W);
   Serial.print(" ");
   for(i = 0;i<11;i++)
   {
    Longitude[i]=RX_GPRMC_Buffer[32+i];
    Serial.print(Longitude[i]);
   }
   Serial.print("\n");

       
   Serial.print("Speed: "); //速度
   for(i=0;i<5;i++)
   {
    Speed[i]=RX_GPRMC_Buffer[46+i];
    Serial.print(Speed[i]);
   }
   Serial.print(" m/s");
   Serial.print("\n");   
  }
Uart_Buffer是指的接收到的没有最后一步解析的GPS信号。GPS_COM[6];   //存放当前GPS指令名称,例如:$GPGGA,这里的信号,可能会有干扰,如果不是规则里的信号,就直接忽略,然后接着下一步。

在gps芯片选择上,我使用了ublox的常见芯片,它的主要功能的实现就是刚开始的GPS定位原理,接收到发来的信号,它有一个基本的格式,是美国电子海洋协会制造的,LTE附一下对这个规则的解析格式的代码

 unsigned char i = 0;
 while(Serial.available() > 0)
 {  
  Uart_Buffer = Serial.read(); //获取GPS信息
  Serial.write(Uart_Buffer);   //测试使用

  if(Uart_Buffer == '$')
  {
   RX_Count = 0;
   //Flag_GPS_OK = 0;
  }
 
  if(RX_Count < 6)
  {
   GPS_COM[RX_Count++] = Uart_Buffer;
  }
  else if( GPS_COM[0] == '$' && GPS_COM[1] == 'G'&& GPS_COM[2] == 'P'&& GPS_COM[3] == 'G'&& GPS_COM[4] == 'G'&& GPS_COM[5] == 'A' ) //获取GPGGA数据
  {
   RX_GPGGA_Buffer[RX_Count] = Uart_Buffer;
   if(RX_GPGGA_Buffer[RX_Count] == '\n')
   {
    Flag_GPGGA_OK = 1;
    
   }
   else
   {
    RX_Count++;
   }   
  }
  else if( GPS_COM[0] == '$' && GPS_COM[1] == 'G'&& GPS_COM[2] == 'P'&& GPS_COM[3] == 'R'&& GPS_COM[4] == 'M'&& GPS_COM[5] == 'C' ) //获取GPRMC数据
  {
   RX_GPRMC_Buffer[RX_Count] = Uart_Buffer;
   if(RX_GPRMC_Buffer[RX_Count] == '\n')
   {
    Flag_GPRMC_OK = 1;
    
   }
   else
   {
    RX_Count++;
   }   
  }
  else if( GPS_COM[0] == '$' && GPS_COM[1] == 'G'&& GPS_COM[2] == 'P'&& GPS_COM[3] == 'G'&& GPS_COM[4] == 'L'&& GPS_COM[5] == 'L' ) //获取GPGLL数据
  {
   if(Uart_Buffer == '\n')
   {
    Flag_GPS_OK = 1;       //一组数据都是最后一帧是GPGLL,接收完GPGLL说明接收数据完成  
   }
  }
 

 }

 if(Flag_GPS_OK == 1)
 {
  Flag_GPS_OK = 0;
  Serial.print("**************************************************\n");
  if(Flag_GPGGA_OK == 1)
  {
   Serial.print("UTC_Time:");
   Flag_GPGGA_OK = 0;

   UTC_Hour = (RX_GPGGA_Buffer[7]-0x30)*10+(RX_GPGGA_Buffer[8]-0x30);   //获取UTC时间
   UTC_Min = (RX_GPGGA_Buffer[9]-0x30)*10+(RX_GPGGA_Buffer[10]-0x30);
   UTC_Sec = (RX_GPGGA_Buffer[11]-0x30)*10+(RX_GPGGA_Buffer[12]-0x30);

   Serial.print(UTC_Hour);
                        

   Serial.print(':');
   Serial.print(UTC_Min);
   Serial.print(':');
   Serial.print(UTC_Sec);
   Serial.print("\n");

   Serial.print("Altitude: ");     //海拔
   for(i = 0 ; i < 4 ; i++)
   {
    Altitude[i]=RX_GPGGA_Buffer[54+i];
    Serial.print(Altitude[i]);
   }
   Serial.print(" m");
   Serial.print("\n");

  }


  if(Flag_GPRMC_OK == 1)
  {
   Serial.print("UTC_Date:");
   Flag_GPRMC_OK = 0;

   UTC_Year = (RX_GPRMC_Buffer[57]-0x30)*10+(RX_GPRMC_Buffer[58]-0x30);   //获取UTC日期
   UTC_Month = (RX_GPRMC_Buffer[55]-0x30)*10+(RX_GPRMC_Buffer[56]-0x30);
   UTC_Day = (RX_GPRMC_Buffer[53]-0x30)*10+(RX_GPRMC_Buffer[54]-0x30);

   Serial.print("20");
   Serial.print(UTC_Year);
   Serial.print('-');
   Serial.print(UTC_Month);
   Serial.print('-');
   Serial.print(UTC_Day);   
   Serial.print("\n");

   Serial.print("Latitude: ");
   Latitude_N_or_S = RX_GPRMC_Buffer[30];     //纬度
   Serial.print(Latitude_N_or_S);
   Serial.print(" ");
   for(i = 0;i<10;i++)
   {
    Latitude[i]=RX_GPRMC_Buffer[19+i];
    Serial.print(Latitude[i]);


   }
   Serial.print("\n");



   Serial.print("Longitude: ");
   Longitude_E_or_W = RX_GPRMC_Buffer[44];     //经度
   Serial.print(Longitude_E_or_W);
   Serial.print(" ");
   for(i = 0;i<11;i++)
   {
    Longitude[i]=RX_GPRMC_Buffer[32+i];
    Serial.print(Longitude[i]);
   }
   Serial.print("\n");

       
   Serial.print("Speed: "); //速度
   for(i=0;i<5;i++)
   {
    Speed[i]=RX_GPRMC_Buffer[46+i];
    Serial.print(Speed[i]);
   }
   Serial.print(" m/s");
   Serial.print("\n");   
  }
Uart_Buffer是指的接收到的没有最后一步解析的GPS信号。GPS_COM[6];   //存放当前GPS指令名称,例如:$GPGGA,这里的信号,可能会有干扰,如果不是规则里的信号,就直接忽略,然后接着下一步。

让12864写出要显示的数据

#include "LCD12864.h"

//********************************************************************
//LCD12864  忙 信号检测
//********************************************************************
void LCD12864_WaitIdle()

{
 unsigned char i;
 LCD12864_DA_PORT = 0xff;
 LCD12864_RS_PORT = 0;
 LCD12864_RW_PORT = 1;
 LCD12864_E_PORT = 1;
 while((LCD12864_DA_PORT&0x80)==1); /*等待BF 不为1*/
 LCD12864_E_PORT = 0;
 for(i=0;i<5;i++);
}


//********************************************************************
//检测忙信号写入命令字 com_da 为待写入的命令字
//********************************************************************
void LCD12864_COM_Write( unsigned char com_da)
{
 LCD12864_WaitIdle();
 LCD12864_RS_PORT = 0;
 LCD12864_RW_PORT = 0;
 LCD12864_DA_PORT = com_da;
 LCD12864_E_PORT = 1;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 LCD12864_E_PORT = 0;
}

//********************************************************************
//不检测忙信号写入命令字  com_da 为待写入的命令字
//********************************************************************
void LCD12864_NoWaitIdle_COM_Write(unsigned char com_da)
{
 LCD12864_RS_PORT = 0;
 LCD12864_RW_PORT = 0;
 LCD12864_DA_PORT = com_da;
 LCD12864_E_PORT = 1;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 LCD12864_E_PORT = 0;
}

//********************************************************************
//数据写入  da  为待写入的8位数据
//********************************************************************
void LCD12864_Data_Write(unsigned char da)

{
 LCD12864_WaitIdle(); /*检测忙信号*/
 LCD12864_RS_PORT = 1;
 LCD12864_RW_PORT = 0;
 LCD12864_DA_PORT = da;
 LCD12864_E_PORT = 1;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 LCD12864_E_PORT = 0;
}


//*************************************************************************************
//写连续字符函数
//*************************************************************************************
void LCD12864_write_word(unsigned char *s)
{
 while(*s>0)
 {
  LCD12864_Data_Write(*s);
  s++;
 }
}

//********************************************************************
//1MS为单位的延时程序,不准确
//********************************************************************
void lcd_delay_ms(unsigned char x)
{
    unsigned char j;
    while(x--){
        for(j=0;j<125;j++)
            {;}
        }   
}


//********************************************************************
//LCD12864初始化
//********************************************************************
void LCD12864_Reset()
{
 lcd_delay_ms(100); /*适当延时待LCD自动复位完成*/
 LCD12864_NoWaitIdle_COM_Write(0x30); /*使用8位并口通讯*/
 lcd_delay_ms(10);
 LCD12864_NoWaitIdle_COM_Write(0x30); /*使用8位并口通讯*/
 lcd_delay_ms(10);
 LCD12864_NoWaitIdle_COM_Write(0x0c); /*显示开及光标设置*/
 lcd_delay_ms(10);
 LCD12864_NoWaitIdle_COM_Write(0x01); /*显示清屏*/
 lcd_delay_ms(30);
 LCD12864_NoWaitIdle_COM_Write(0x06); /*DDRAM的地址计数器(AC)加1*/
 lcd_delay_ms(30);
}


//void LCD12864_PHOTO_SET()
//{
// LCD12864_COM_Write(0x36);
// lcd_delay_ms(10);
// LCD12864_COM_Write(0x36);
// lcd_delay_ms(10);
//}
//
void LCD12864_HAIZI_SET()
{
 LCD12864_COM_Write(0x30);
 lcd_delay_ms(10);
 LCD12864_COM_Write(0x30);
 lcd_delay_ms(10);
}
//
//
//void LCD12864_HAIZI_WRITE(unsigned char xpos,unsigned char ypos,unsigned char daH,unsigned char daL)
////ST7920 汉字字符写入
////参数说明:  xpos 待写入的X位置
////ypos 待写入的Y位置
////daH 待写入的汉字的高八位 daL待写入的汉字的低八位
//{
// unsigned char xy_pos;
// if((xpos>=8)||(ypos>=4) ) return; /*X位置超出显示范围退出*/
// if(ypos==0)         xy_pos = 0x80 + xpos;
// else if(ypos==1) xy_pos = 0x90 + xpos; /*计算转换地址*/
// else if(ypos==2) xy_pos = 0x88 + xpos;
// else if(ypos==3) xy_pos = 0x98 + xpos;
// LCD12864_COM_Write(xy_pos); /*写地址*/
// lcd_delay_ms(1);
// LCD12864_Data_Write(daH); /*写高八位数据*/
// lcd_delay_ms(1);
// LCD12864_Data_Write(daL); /*写低八位数据*/
// lcd_delay_ms(1);
//}
//
//
//void LCD12864_PHOTO_WRITE(unsigned char *img)
//{
// unsigned char x,y,i,j;
// unsigned int k=0;
// y=0x80; /*设置起始 绘图区的 Y地址坐标*/
// x=0x80; /*设置起始 绘图区的 X地址坐标*/
// for(i=0;i<32;i++){  /*写上半部*/
//  LCD12864_COM_Write(y);
//  LCD12864_COM_Write(x);
//  for(j=0;j<16;j++){
//   LCD12864_Data_Write(img[k]);
//   k++;
//   }
//  y++;
//  }
//
// y=0x80; /*设置起始 绘图区的 Y地址坐标*/
// x=0x88; /*设置起始 绘图区的 X地址坐标*/
// for(i=0;i<32;i++){  /*写下半部*/
//  LCD12864_COM_Write(y);
//  LCD12864_COM_Write(x);
//  for(j=0;j<16;j++){
//   LCD12864_Data_Write(img[k]);
//   k++;
//   }
//  y++;
//  }
//
//}

这个程序的基本吗,大家都容易看懂,也就不多说。
    LCD12864_Reset();                                //初始化液晶
    LCD12864_HAIZI_SET();                            //设置为普通模式
    
    Delay_ms(100);
    

    LCD12864_NoWaitIdle_COM_Write(0x80);                        //指针设置
    LCD12864_write_word("※※※※※※※※");
    LCD12864_NoWaitIdle_COM_Write(0x90);                        //指针设置
    LCD12864_write_word("    欢迎使用    ");            
    LCD12864_NoWaitIdle_COM_Write(0x88);                        //指针设置
    LCD12864_write_word("正在初始化GPS...");
    LCD12864_NoWaitIdle_COM_Write(0x98);                        //指针设置
    LCD12864_write_word("※※※※※※※※");

    Uart_Init();

    while(1)
    {
        Scan_Key();
        if(Flag_GPS_OK == 1 && RX_Buffer[4] == 'G' && RX_Buffer[6] == ',' && RX_Buffer[13] == '.')            //确定是否收到"GPGGA"这一帧数据
        {
            for( i = 0; i < 68 ; i++)
            {
                Display_GPGGA_Buffer[i] = RX_Buffer[i];    
            }
            Hour = (Display_GPGGA_Buffer[7]-0x30)*10+(Display_GPGGA_Buffer[8]-0x30)+8;            //UTC时间转换到北京时间UTC+8    
                                                                                                //0X30为ASCII码转换为数字
                if( Hour >= 24)                //溢出
            {
                Hour %= 24;                //获取当前Hour
                Flag_OV = 1;            //日期进位
            }
            else
            {
                Flag_OV = 0;
            }

            Min_High = Display_GPGGA_Buffer[9];
            Min_Low = Display_GPGGA_Buffer[10];
    
            Sec_High = Display_GPGGA_Buffer[11];
            Sec_Low = Display_GPGGA_Buffer[12];

            Flag_Calc_GPGGA_OK = 1;
        }

        if(Page == 0 && Flag_Calc_GPGGA_OK == 1)
        {
            LED1 = ~LED1;
            Flag_Calc_GPGGA_OK = 0;
        
            LCD12864_NoWaitIdle_COM_Write(0x80);            //设置指针
            LCD12864_write_word("★");                //显示内容
            LCD12864_Data_Write(Hour/10+0x30);
            LCD12864_Data_Write(Hour%10+0x30);
            LCD12864_write_word("时");
    
            LCD12864_Data_Write(Min_High);
            LCD12864_Data_Write(Min_Low);
            LCD12864_write_word("分");
    
            LCD12864_Data_Write(Sec_High);
            LCD12864_Data_Write(Sec_Low);
            LCD12864_write_word("秒");
            LCD12864_write_word("★");
    
    
            LCD12864_NoWaitIdle_COM_Write(0x90);            //设置指针
            LCD12864_write_word("纬度:");                //显示内容
            
            LCD12864_Data_Write(Display_GPGGA_Buffer[28]);            //N 或者 S
            LCD12864_Data_Write(' ');

            LCD12864_Data_Write(Display_GPGGA_Buffer[17]);            //纬度
            LCD12864_Data_Write(Display_GPGGA_Buffer[18]);            //纬度
            LCD12864_write_word("°");
            LCD12864_Data_Write(Display_GPGGA_Buffer[19]);            //纬度
            LCD12864_Data_Write(Display_GPGGA_Buffer[20]);            //纬度
            LCD12864_write_word("' ");


            LCD12864_NoWaitIdle_COM_Write(0x88);            //设置指针
            LCD12864_write_word("经度:");                //显示内容
            
            LCD12864_Data_Write(Display_GPGGA_Buffer[42]);            //E 或者 W

            LCD12864_Data_Write(Display_GPGGA_Buffer[30]);            //经度
            LCD12864_Data_Write(Display_GPGGA_Buffer[31]);    
            LCD12864_Data_Write(Display_GPGGA_Buffer[32]);    
            LCD12864_write_word("°");
            LCD12864_Data_Write(Display_GPGGA_Buffer[33]);            
            LCD12864_Data_Write(Display_GPGGA_Buffer[34]);        
            LCD12864_write_word("' ");

            LCD12864_NoWaitIdle_COM_Write(0x98);            //设置指针
            LCD12864_write_word("海拔:    ");                //显示内容
            
            LCD12864_Data_Write(Display_GPGGA_Buffer[54]);    
            LCD12864_Data_Write(Display_GPGGA_Buffer[55]);    
            LCD12864_Data_Write(Display_GPGGA_Buffer[56]);    
            LCD12864_Data_Write(Display_GPGGA_Buffer[57]);
            LCD12864_write_word("米");            
        }
        
        if(Flag_GPS_OK == 1 && RX_Buffer[4] == 'M' && RX_Buffer[52] == ',' && RX_Buffer[59] == ',')            //确定是否收到"GPRMC"这一帧数据
        {
            for( i = 0; i < 68 ; i++)
            {
                Display_GPRMC_Buffer[i] = RX_Buffer[i];    
            }

            Year_High = Display_GPRMC_Buffer[57];
            Year_Low = Display_GPRMC_Buffer[58];

            Month_High = Display_GPRMC_Buffer[55];
            Month_Low = Display_GPRMC_Buffer[56];

            Day_High = Display_GPRMC_Buffer[53];
            Day_Low = Display_GPRMC_Buffer[54];


            if(Flag_OV == 1)            //有进位
            {
                UTCDate2LocalDate();            //UTC日期转换为北京时间        
            }

            Flag_Calc_GPRMC_OK = 1;
        }

        if(Page == 1 && Flag_Calc_GPRMC_OK == 1)
        {
            LED1 = ~LED1;
            Flag_Calc_GPRMC_OK = 0;
            
            LCD12864_NoWaitIdle_COM_Write(0x80);            //设置指针
            LCD12864_write_word("20");
            LCD12864_Data_Write(Year_High);
            LCD12864_Data_Write(Year_Low);
            LCD12864_write_word("年");
    
            LCD12864_Data_Write(Month_High);
            LCD12864_Data_Write(Month_Low);
            LCD12864_write_word("月");
    
            LCD12864_Data_Write(Day_High);
            LCD12864_Data_Write(Day_Low);
            LCD12864_write_word("日");
            
            
            LCD12864_NoWaitIdle_COM_Write(0x90);            //设置指针
            LCD12864_write_word("速度:  ");                //显示内容

            LCD12864_Data_Write(' ');
            LCD12864_Data_Write(Display_GPRMC_Buffer[46]);        
            LCD12864_Data_Write(Display_GPRMC_Buffer[47]);        
            LCD12864_Data_Write(Display_GPRMC_Buffer[48]);            
            LCD12864_Data_Write(Display_GPRMC_Buffer[49]);    
            LCD12864_Data_Write(Display_GPRMC_Buffer[50]);
            
            LCD12864_write_word("米");
                        
        }        
    }
}

//****************************************************
//UTC日期与当地日期转换
//****************************************************
void UTCDate2LocalDate(void)
{
    Day = (Day_High - 0x30) * 10 + (Day_Low-0x30) + 1;        //日  加一
    Month = (Month_High - 0x30) * 10 + (Month_Low - 0x30);
    Year = 2000 + (Year_High - 0x30) * 10 + (Year_Low - 0x30);
    
    MaxDay = GetMaxDay(Month,Year);                //获取当月 天数 最大值
    if(Day > MaxDay)        //溢出
    {
        Day = 1;
        Month += 1;
        if(Month > 12)
        {
            Year+=1;
        }
    }

    Day_High = Day/10 + 0x30;                //转换日期值为ASCII
    Day_Low = Day%10 + 0x30;

    Month_High = Month/10 + 0x30;            //转换月份值为ASCII
    Month_Low = Month%10 + 0x30;

    Year_High = Year%100/10 + 0x30;            //转换年份值为ASCII
    Year_Low = Year%10 + 0x30;            
}

//****************************************************
//获取当月日期最大值
//****************************************************
unsigned char GetMaxDay(unsigned char Month_Value,unsigned int Year_Value)
{
    unsigned char iDays;
    switch(Month_Value)
    {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            {
                iDays = 31;
            }
            break;
        case 2:
            {
                //2月份比较特殊,需要根据是不是闰年来判断当月是28天还29天
                iDays = IsLeapYear(Year_Value)?29:28;
            }
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            {
                iDays = 30;
            }
            break;
        default : break;
    }
    return(iDays);                        
}

//****************************************************
//闰年检测
//****************************************************
bit IsLeapYear(unsigned int uiYear)
{
    return (((uiYear%4)==0)&&((uiYear%100)!=0))||((uiYear%400)==0);
}


//****************************************************
//按键扫描程序
//****************************************************
void Scan_Key()
{
    if( KEY4 == 0 )                         //按键1扫描
    {
        Delay_ms(10);                    //延时去抖
        if( KEY4 == 0 )
        {
            while(KEY4 == 0);            //等待松手
            KEY_NUM = 4;
            Page = ~Page;
            LCD12864_NoWaitIdle_COM_Write(0X01);    //清屏
        }
    }
}
//****************************************************
//MS延时函数(12M晶振下测试)
//****************************************************
void Delay_ms(unsigned int n)
{
    unsigned int  i,j;
    for(i=0;i<n;i++)
        for(j=0;j<123;j++);
}

接着,把12864的口按标准接到伽利略板子上,再去完成ZIGBEE的调试

由于上一次发货太多,结果损失头大,这次就只好这样。

RE: 基于蜂窝网络的智能化运动保卫智能设备

中科院
我是GG
高级会员

最后登陆时间:2014-08-02 23:02:45

19# 发表于 2014-10-31 16:06:48
不知道为什么代码发不上了,还得继续发

RE: 基于蜂窝网络的智能化运动保卫智能设备

中科院
我是GG
高级会员

最后登陆时间:2014-08-02 23:02:45

20# 发表于 2014-10-31 17:31:28
#include "GPS.h"


//****************************************************
//UTC日期与当地日期转换
//****************************************************
void GPS_UBLOX::UTCDate2LocalDate(void)
{
unsigned char MaxDay;
Beijing_Day = UTC_Day + 1; //日  加一

MaxDay = GetMaxDay(Beijing_Month,Beijing_Year); //获取当月 天数 最大值
if(Beijing_Day > MaxDay) //溢出
{
Beijing_Day = 1;
Beijing_Month += 1;
if(Beijing_Month > 12)
{
Beijing_Year+=1;
}
}
}


//****************************************************
//UTC时间与当地时间转换
//****************************************************
void GPS_UBLOX::UTCTime2LocalTime(void)
{
unsigned char MaxDay;
Beijing_Min = UTC_Min;
Beijing_Sec = UTC_Sec;
Beijing_Hour = UTC_Hour + 8;


Beijing_Year = UTC_Year + 2000;
Beijing_Month = UTC_Month;
Beijing_Day = UTC_Day;


if(Beijing_Hour >= 24)
{
Beijing_Hour %= 24;
UTCDate2LocalDate();
}
}


//****************************************************
//获取当月日期最大值
//****************************************************
unsigned char GPS_UBLOX::GetMaxDay(unsigned char Month_Value,unsigned int Year_Value)
{
unsigned char iDays;
switch(Month_Value)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
{
iDays = 31;
}
break;
case 2:
{
//2月份比较特殊,需要根据是不是闰年来判断当月是28天还29天
iDays = IsLeapYear(Year_Value)?29:28;
}
break;
case 4:
case 6:
case 9:
case 11:
{
iDays = 30;
}
break;
default : break;
}
return(iDays);
}


//****************************************************
//闰年检测
//****************************************************
bool GPS_UBLOX::IsLeapYear(unsigned int uiYear)
{
return (((uiYear%4)==0)&&((uiYear%100)!=0))||((uiYear%400)==0);
}




//********************************************************
//获取GPS信息
//********************************************************
void GPS_UBLOX::Get_GPS()
{
unsigned char i = 0;
while(Serial.available() > 0) 
{
Uart_Buffer = Serial.read(); //获取GPS信息
Serial.write(Uart_Buffer); //测试使用


if(Uart_Buffer == '$')
{
RX_Count = 0;
//Flag_GPS_OK = 0;
}

if(RX_Count < 6)
{
GPS_COM[RX_Count++] = Uart_Buffer;
}
else if( GPS_COM[0] == '$' && GPS_COM[1] == 'G'&& GPS_COM[2] == 'P'&& GPS_COM[3] == 'G'&& GPS_COM[4] == 'G'&& GPS_COM[5] == 'A' ) //获取GPGGA数据
{
RX_GPGGA_Buffer[RX_Count] = Uart_Buffer;
if(RX_GPGGA_Buffer[RX_Count] == '\n')
{
Flag_GPGGA_OK = 1;

}
else
{
RX_Count++;
}
}
else if( GPS_COM[0] == '$' && GPS_COM[1] == 'G'&& GPS_COM[2] == 'P'&& GPS_COM[3] == 'R'&& GPS_COM[4] == 'M'&& GPS_COM[5] == 'C' ) //获取GPRMC数据
{
RX_GPRMC_Buffer[RX_Count] = Uart_Buffer;
if(RX_GPRMC_Buffer[RX_Count] == '\n')
{
Flag_GPRMC_OK = 1;

}
else
{
RX_Count++;
}
}
else if( GPS_COM[0] == '$' && GPS_COM[1] == 'G'&& GPS_COM[2] == 'P'&& GPS_COM[3] == 'G'&& GPS_COM[4] == 'L'&& GPS_COM[5] == 'L' ) //获取GPGLL数据
{
if(Uart_Buffer == '\n')
{
Flag_GPS_OK = 1; //一组数据都是最后一帧是GPGLL,接收完GPGLL说明接收数据完成
}
}



}


if(Flag_GPS_OK == 1)
{
Flag_GPS_OK = 0;
Serial.print("**************************************************\n");
if(Flag_GPGGA_OK == 1)
{
Serial.print("UTC_Time:");
Flag_GPGGA_OK = 0;


UTC_Hour = (RX_GPGGA_Buffer[7]-0x30)*10+(RX_GPGGA_Buffer[8]-0x30); //获取UTC时间
UTC_Min = (RX_GPGGA_Buffer[9]-0x30)*10+(RX_GPGGA_Buffer[10]-0x30);
UTC_Sec = (RX_GPGGA_Buffer[11]-0x30)*10+(RX_GPGGA_Buffer[12]-0x30);


Serial.print(UTC_Hour);
Serial.print(':');
Serial.print(UTC_Min);
Serial.print(':');
Serial.print(UTC_Sec);
Serial.print("\n");


Serial.print("Altitude: "); //海拔
for(i = 0 ; i < 4 ; i++)
{
Altitude[i]=RX_GPGGA_Buffer[54+i];
Serial.print(Altitude[i]);
}
Serial.print(" m");
Serial.print("\n");


}


if(Flag_GPRMC_OK == 1)
{
Serial.print("UTC_Date:");
Flag_GPRMC_OK = 0;


UTC_Year = (RX_GPRMC_Buffer[57]-0x30)*10+(RX_GPRMC_Buffer[58]-0x30); //获取UTC日期
UTC_Month = (RX_GPRMC_Buffer[55]-0x30)*10+(RX_GPRMC_Buffer[56]-0x30);
UTC_Day = (RX_GPRMC_Buffer[53]-0x30)*10+(RX_GPRMC_Buffer[54]-0x30);


Serial.print("20");
Serial.print(UTC_Year);
Serial.print('-');
Serial.print(UTC_Month);
Serial.print('-');
Serial.print(UTC_Day);
Serial.print("\n");


Serial.print("Latitude: ");
Latitude_N_or_S = RX_GPRMC_Buffer[30]; //纬度
Serial.print(Latitude_N_or_S);
Serial.print(" ");
for(i = 0;i<10;i++)
{
Latitude[i]=RX_GPRMC_Buffer[19+i];
Serial.print(Latitude[i]);
}
Serial.print("\n");






Serial.print("Longitude: ");
Longitude_E_or_W = RX_GPRMC_Buffer[44]; //经度
Serial.print(Longitude_E_or_W);
Serial.print(" ");
for(i = 0;i<11;i++)
{
Longitude[i]=RX_GPRMC_Buffer[32+i];
Serial.print(Longitude[i]);
}
Serial.print("\n");



Serial.print("Speed: "); //速度
for(i=0;i<5;i++)
{
Speed[i]=RX_GPRMC_Buffer[46+i];
Serial.print(Speed[i]);
}
Serial.print(" m/s");
Serial.print("\n");
}


UTCTime2LocalTime();


Serial.print("Beijing_Time:");
Serial.print(Beijing_Hour);
Serial.print(':');
Serial.print(Beijing_Min);
Serial.print(':');
Serial.print(Beijing_Sec);
Serial.print("\n");


Serial.print("Beijing_Date:");
Serial.print(Beijing_Year);
Serial.print('-');
Serial.print(Beijing_Month);
Serial.print('-');
Serial.print(Beijing_Day);
Serial.print("\n");
Serial.print("**************************************************\n");
Serial.print("\n");


}
}


//********************************************************
//初始化GPS用到的变量
//********************************************************
void GPS_UBLOX::Init_GPS()
{
Flag_GPGGA_OK = 0;
RX_Count = 0;
Uart_Buffer = 0;
}
共24条 2/3 « 1 2 3 »   
快速回复主题
  • 匿名不能发帖!请先 [ 登陆 注册 ]