版主: wanchong , wangyu , eepwwp , firedom |
ishaq5niu
最后登陆时间:2014-07-25 16:35:49 |
现在刷树莓派香蕉派功能通了,等学生来飞圈子试下,,,再刷到GALILEO对比下板子的负载性能,,
|
贝多芬的悲伤
最后登陆时间:2014-09-01 18:45:11 |
规律:所有开发手记都是以开箱照开始的……
|
zkynew001
最后登陆时间:2014-08-24 23:07:54 |
有木有刷Android
|
中科院
最后登陆时间:2014-08-02 23:02:45 |
在一段时间接触windows iot 后,整的开始喜欢上了这个鉲飞
|
中科院
最后登陆时间:2014-08-02 23:02:45 |
等等就附上---相关过程
|
caocheng
最后登陆时间:2014-07-23 11:45:14 |
网线应该可以100多米的,难道你的是山寨线? 或者水晶头接错了? 1,2是一队, 3,6是一对
|
中科院
最后登陆时间:2014-08-02 23:02:45 |
上周日,我在成都市电子市场转了一天,几乎没有找到一家有我想要的GPS芯片--------不过,现在已经把GPS调节好了,数据精度u,也是提高了一个档次,就是采集还有问题,会出现一些时断时续~~~接下来,就要自己去做电池了,希望可以减轻重量。。至于数据传输模块,还是需要自己解决,还有显示模块,是不是也要去找整个全双拼场
|
中科院
最后登陆时间:2014-08-02 23:02:45 |
在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的调试 由于上一次发货太多,结果损失头大,这次就只好这样。 |
中科院
最后登陆时间:2014-08-02 23:02:45 |
不知道为什么代码发不上了,还得继续发
|
中科院
最后登陆时间:2014-08-02 23:02:45 |
#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; } |