日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

51单片机对GPS卫星信号的解码并通过LCD1602或12864显示

發布時間:2023/12/14 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 51单片机对GPS卫星信号的解码并通过LCD1602或12864显示 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

主程序如下

#include "main.h" #include "LCD1602.h" #include "GPS.h"//?¨ò?±?á? unsigned char KEY_NUM = 0; char temp,temp1,b,d; bit Page = 0; unsigned char xdata Display_GPGGA_Buffer[68]; unsigned char xdata Display_GPRMC_Buffer[68]; bit Flag_OV = 0; bit Flag_Calc_GPGGA_OK = 0; bit Flag_Calc_GPRMC_OK = 0;//**************************************************** //?÷oˉêy //**************************************************** void main() {unsigned char i = 0;Init_LCD1602();LCD1602_write_com(0x80); //????éè??LCD1602_write_word("Welcome to use!");Delay_ms(1000);Uart_Init();while(1){Scan_Key();if(Flag_GPS_OK == 1 && RX_Buffer[4] == 'G' && RX_Buffer[6] == ',' && RX_Buffer[13] == '.') //è·?¨ê?·?ê?μ?"GPGGA"?aò???êy?Y{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ê±??×a??μ?±±??ê±?? UTC+8//0x30?aASCII×a???aêy×?if( Hour >= 24) //ò?3?{Hour %= 24; //??è?μ±?°HourFlag_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(Flag_GPS_OK == 1 && RX_Buffer[4] == 'M' && RX_Buffer[52] == ',' && RX_Buffer[59] == ',') //è·?¨ê?·?ê?μ?"GPRMC"?aò???êy?Y{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) //óD????{UTCDate2LocalDate(); //UTCè??ú×a???a±±??ê±?? }Flag_Calc_GPRMC_OK = 1;}if(Page == 0 && Flag_Calc_GPGGA_OK == 1) //?óê?μ?GPGGAêy?Y °′?ü?′°′??{/*LED1 = ~LED1; */Flag_Calc_GPGGA_OK = 0;LCD1602_write_com(0x80); //éè??????LCD1602_write_data(Display_GPGGA_Buffer[28]); //N ?ò??S ??±?á??3óèDisplay GPGGA BUFFER 2¢?±?ó?áè?LCD1602_write_data(Display_GPGGA_Buffer[17]); //?3?èLCD1602_write_data(Display_GPGGA_Buffer[18]); //?3?èLCD1602_write_data(0xdf); //?èLCD1602_write_data(Display_GPGGA_Buffer[19]); //?3?èLCD1602_write_data(Display_GPGGA_Buffer[20]);LCD1602_write_data(Display_GPGGA_Buffer[21]); LCD1602_write_data(Display_GPGGA_Buffer[22]);LCD1602_write_data(Display_GPGGA_Buffer[23]);LCD1602_write_data(Display_GPGGA_Buffer[24]);LCD1602_write_data(Display_GPGGA_Buffer[25]);LCD1602_write_data(Display_GPGGA_Buffer[26]);LCD1602_write_word("'"); //·?LCD1602_write_com(0x80+0x40); //éè?????? LCD1602_write_data(Display_GPGGA_Buffer[42]); //E ?ò?? W í?é?LCD1602_write_data(Display_GPGGA_Buffer[30]); //?-?èLCD1602_write_data(Display_GPGGA_Buffer[31]); LCD1602_write_data(Display_GPGGA_Buffer[32]); LCD1602_write_data(0xdf); LCD1602_write_data(Display_GPGGA_Buffer[33]); LCD1602_write_data(Display_GPGGA_Buffer[34]);LCD1602_write_data(Display_GPGGA_Buffer[35]); //D?êyμ?LCD1602_write_data(Display_GPGGA_Buffer[36]);LCD1602_write_data(Display_GPGGA_Buffer[37]);LCD1602_write_data(Display_GPGGA_Buffer[38]);LCD1602_write_data(Display_GPGGA_Buffer[39]);LCD1602_write_data(Display_GPGGA_Buffer[40]); LCD1602_write_word("'"); }if(Page == 1 && Flag_Calc_GPRMC_OK == 1){/*LED1 = ~LED1;*/Flag_Calc_GPRMC_OK = 0;LCD1602_write_com(0x80); //éè??????LCD1602_write_word("20");LCD1602_write_data(Year_High);LCD1602_write_data(Year_Low);LCD1602_write_data('-');LCD1602_write_data(Month_High);LCD1602_write_data(Month_Low);LCD1602_write_data('-');LCD1602_write_data(Day_High);LCD1602_write_data(Day_Low);LCD1602_write_com(0x80+0x40); //éè??????LCD1602_write_data(Hour/10+0x30);LCD1602_write_data(Hour%10+0x30);LCD1602_write_data(':');LCD1602_write_data(Min_High);LCD1602_write_data(Min_Low);LCD1602_write_data(':');LCD1602_write_data(Sec_High);LCD1602_write_data(Sec_Low);LCD1602_write_word(" ");LCD1602_write_data(Display_GPGGA_Buffer[54]); LCD1602_write_data(Display_GPGGA_Buffer[55]); LCD1602_write_data(Display_GPGGA_Buffer[56]); LCD1602_write_data(Display_GPGGA_Buffer[57]);LCD1602_write_word("m");} } } //**************************************************** //UTCè??úó?μ±μ?è??ú×a?? //**************************************************** 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); //??è?μ±?? ììêy ×?′ó?μif(Day > MaxDay) //ò?3?{Day = 1;Month += 1;if(Month > 12){Year+=1;}}Day_High = Day/10 + 0x30; //×a??è??ú?μ?aASCIIDay_Low = Day%10 + 0x30;Month_High = Month/10 + 0x30; //×a????·Y?μ?aASCIIMonth_Low = Month%10 + 0x30;Year_High = Year%100/10 + 0x30; //×a???ê·Y?μ?aASCIIYear_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??·Y±è??ì?êa£?Dèòa?ù?Yê?2?ê?èò?êà′?D??μ±??ê?28ìì?129ììiDays = IsLeapYear(Year_Value)?29:28;}break;case 4:case 6:case 9:case 11:{iDays = 30;}break;default : break;}return(iDays); }//**************************************************** //èò?ê?ì2a //**************************************************** bit IsLeapYear(unsigned int uiYear) {return (((uiYear%4)==0)&&((uiYear%100)!=0))||((uiYear%400)==0); }//**************************************************** //°′?üé¨?è3ìDò //**************************************************** void Scan_Key() {if( KEY4 == 0 ) //°′?ü1é¨?è{Delay_ms(10); //?óê±è¥??if( KEY4 == 0 ){while(KEY4 == 0); //μè′y?éê?KEY_NUM = 3;Page = ~Page;LCD1602_write_com(0X01); //???á}} } //**************************************************** //MS?óê±oˉêy(12M?§????2aê?) //**************************************************** void Delay_ms(unsigned int n) {unsigned int i,j;for(i=0;i<n;i++)for(j=0;j<123;j++); }1602的程序如下 #include "LCD1602.h"//**************************************************** //MS?óê±oˉêy(12M?§????2aê?) //**************************************************** void LCD1602_delay_ms(unsigned int n) {unsigned int i,j;for(i=0;i<n;i++)for(j=0;j<123;j++); }//**************************************************** //D′??á? //**************************************************** void LCD1602_write_com(unsigned char com) //ê1LCD1602ê1?üμè??á? {LCD1602_RS = 0;LCD1602_delay_ms(1);LCD1602_EN = 1;LCD1602_PORT = com;LCD1602_delay_ms(1);LCD1602_EN = 0; }//**************************************************** //D′êy?Y //**************************************************** void LCD1602_write_data(unsigned char dat) {LCD1602_RS = 1;LCD1602_delay_ms(1); LCD1602_PORT = dat;LCD1602_EN = 1;LCD1602_delay_ms(1);LCD1602_EN = 0; }//**************************************************** //á?D?D′×?·? //**************************************************** void LCD1602_write_word(unsigned char *s) {while(*s>0){LCD1602_write_data(*s);s++;} }void Init_LCD1602() //?′?óμ?GPS??á??° LCD1602μè′y×′ì? {LCD1602_EN = 0;LCD1602_RW = 0; //éè???aD′×′ì?LCD1602_write_com(0x38); //??ê??£ê?éè?¨LCD1602_write_com(0x0c); //?a1???ê??¢1a±êóD?Téè???¢1a±êéá??éè??LCD1602_write_com(0x06); //D′ò???×?·?oó?????óò?LCD1602_write_com(0x01); //???á??á? }GPS程序如下 #include "GPS.h"unsigned char RX_Buffer[68]; unsigned char RX_Count = 0; unsigned char Hour = 0,Min_High = 0,Min_Low = 0,Sec_High = 0,Sec_Low = 0; unsigned char Month = 0,Day = 0,Month_High = 0, Month_Low = 0,Day_Low = 0 ,Day_High = 0, Year_High = 0,Year_Low = 0; unsigned int Year = 0; bit Flag_GPS_OK = 0; unsigned char MaxDay = 0;void Uart_Init() {SCON = 0X50; //UART·?ê?1£?8??UARTREN = 1; //?êDí′?DD?ú?óê?êy?YPCON = 0x00; //SMOD=0;2¨ì??ê2??ó±?TMOD = 0x20; //T1·?ê?2£?ó?óú2úéú2¨ì??êTH1 = 0xFD; //×°3??μTL1 = 0xFD;TR1 = 1; //???ˉ?¨ê±?÷1EA = 1; //′ò?aè????D??????ES = 1; //′ò?a′?DD?ú?D?? }void RECEIVE_DATA(void) interrupt 4 using 3 //?D??4ê1ó?3o???′?′| { unsigned char temp = 0;ES=0;temp = SBUF;RI = 0; // LED1 = ~LED1;if(temp == '$'){RX_Count = 0;Flag_GPS_OK = 0; }RX_Buffer[RX_Count++] = temp;if(RX_Count >= 59){RX_Count = 59;Flag_GPS_OK = 1; }ES=1; }三個.h文件 #ifndef __LCD1602_H__ #define __LCD1602_H__#include <reg52.h>//LCD1602 IOéè?? #define LCD1602_PORT P0 sbit LCD1602_RS = P2^7; sbit LCD1602_RW = P2^6; sbit LCD1602_EN = P2^5;//oˉêy?ò??±?á?éù?÷ extern void LCD1602_delay_ms(unsigned int n); extern void LCD1602_write_com(unsigned char com); extern void LCD1602_write_data(unsigned char dat); extern void LCD1602_write_word(unsigned char *s); extern void Init_LCD1602();#endif
#ifndef __GPS_H__ #define __GPS_H__#include <reg52.h> #include "main.h"//oˉêy?ò??±?á?éù?÷ extern void Uart_Init();extern unsigned char RX_Buffer[68]; extern unsigned char RX_Count; extern unsigned char Hour,Min_High,Min_Low,Sec_High,Sec_Low; extern unsigned char Month,Day,Month_High, Month_Low,Day_Low ,Day_High, Year_High,Year_Low; extern unsigned int Year; extern unsigned char MaxDay;extern bit Flag_GPS_OK;#endif #ifndef __MAIN_H__ #define __MAIN_H__#include <reg52.h>sbit KEY4 = P1^0;//oˉêy?ò??±?á?éù?÷ extern void Delay_ms(unsigned int n); extern void Scan_Key(); extern void UTCDate2LocalDate(void); extern bit IsLeapYear(unsigned int uiYear); extern unsigned char GetMaxDay(unsigned char Month_Value,unsigned int Year_Value);#endif




總結

以上是生活随笔為你收集整理的51单片机对GPS卫星信号的解码并通过LCD1602或12864显示的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。