⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 try.c

📁 GPS开发 NEA1803 51单片机与12864 由串口中断收取数据 显示经度纬度 高度 速度 时间 使用卫星数
💻 C
字号:
/*************************************
 GPS  12864	显示程序
***************************************/

#include <AT89X51.H>
#include <stdio.h>
#include "LCD12864_c51.h"
//char code TIME_AREA= 8;                  //时区
//GPS数据存储数组
unsigned char JD[10];                  //经度
unsigned char JD_a;                  //经度方向
unsigned char WD[9];                  //纬度
unsigned char WD_a;                  //纬度方向
unsigned char time[6];            //时间
//串口中断需要的变量
unsigned char seg_count;            //逗号计数器
//unsigned char dot_count;            //小数点计数器
unsigned char byte_count;            //位数计数器
unsigned char cmd_number;            //命令类型
unsigned char mode;                        //0:结束模式,1:命令模式,2:数据模式
unsigned char buf_full;                  //1:整句接收完成,相应数据有效。0:缓存数据无效。
unsigned char cmd[5];                  //命令类型存储数组
unsigned char speed[4]; 
unsigned char date[6]; 

//显示需要的变量
unsigned int dsp_count;            //刷新次数计数器
unsigned char time_count;
void sys_init(void);
main()
{
     unsigned char i;
	 sys_init();
	 while(1)
	 {
          if(buf_full==0)                        //无GPS信号时
           {
                 dsp_count++;
                 if(dsp_count>=65000)
				 {
                       Init_Lcd12864();                  //清屏
					   ResetCursor(0,2);
     				   printf("No GPS connect..");
                       while(buf_full==0);
                       ClearAS();      
                       dsp_count=0;
                 }
           }
           else if(buf_full)
		   {                             //有GPS信号时                  //GGA语句
                                   ResetCursor(0,0);
     				     		   printf("JD:");
								   ResetCursor(3,0);
     				     		   printf("%c",JD_a);
                  //显示经度
                                   for(i=0;i<10;i++)
								   {
									   	ResetCursor(i+4,0);
										printf("%c",JD[i]);
									}

                                   	ResetCursor(0,1);
     				     		    printf("WD:");
									ResetCursor(3,1);
     				     		    printf("%c",WD_a);
									for(i=0;i<9;i++)					    //显示纬度
									{
										 ResetCursor(i+4,1);
									     printf("%c",WD[i]);
									 }
								   	ResetCursor(0,2);
							    	printf("Tim:");
									for(i=0;i<6;i++)					    //显示Time
									 {
									 	ResetCursor(i+4,2);
								        printf("%c",time[i]);
									 }
									ResetCursor(0,3);
							    	printf("Spe:");
									for(i=0;i<4;i++)					    //显示速度
									 {
									 	ResetCursor(i+4,3);
								        printf("%c",speed[i]);
									 }
							  buf_full&=~0x01;
                             dsp_count=0;
                       }
	    }               
							   
}                      

//系统初始化
void sys_init() 
{
//     unsigned char i;
     SCON = 0x50;      /* SCON: mode 1, 8-bit UART, enable rcvr */
     TMOD = 0x20;      /* TMOD: timer 1, mode 2, 8-bit reload */
     TH1=TL1=0xfa;       /* TH1: reload value for 4800 baud @ 11.059MHz */
     TR1 = 1;            /* TR1: timer 1 run */
     Init_Lcd12864();            //初始化LCD
	 ResetCursor(0,1);
     printf("GPS Monitor V1.2");
   	 ClearAS();
     IE=0x90;                  //开总中断、串口中断
}

//串口接收中断
void uart(void) interrupt 4
{
     unsigned char tmp;
     if(RI){
           tmp=SBUF;
           switch(tmp)
		   {
                 case '$':
                       cmd_number=0;            //命令类型清空
                       mode=1;                  //接收命令模式
                       byte_count=0;            //接收位数清空
                       break;
                 case ',':
                       seg_count++;            //逗号计数加1
                       byte_count=0;
                       break;
                 case '*':
                       mode=0;
					   buf_full=1;
                       break;
                 default:
                       if(mode==1){
                             //命令种类判断
                             cmd[byte_count]=tmp;                  //接收字符放入类型缓存
                             if(byte_count>=4){                        //如果类型数据接收完毕,判断类型
                                   if(cmd[0]=='G'){
                                         if(cmd[1]=='P'){
                                               if(cmd[2]=='R'){
                                                   if(cmd[3]=='M'){
                                                          if(cmd[4]=='C'){
                                                                 cmd_number=1;
                                                                 mode=2;
                                                                 seg_count=0;
                                                                 byte_count=0;
                                                           				 }
                                                                   }
  
                                           
                                                             }
                                                       }
                                                 }
                                             }
                                   }
                          else if((mode==2)&cmd_number){
                              //接收数据处理 GPGGA,132920.487,,n,,w,0,00,,,M,0.0,M,,0000*56
                           	 //$GPRMC,161229.487,A,3723.2475,N,12158.3416,W,0.13,309.62,120598, ,*10
							//$GPGGA,161229.487,3723.2475,N,12158.3416,W,1,07,1.0,9.0,M, , , ,0000*18
                                         switch(seg_count){
										 	   case 1:
                                                     if(byte_count<6){                        //时间处理
                                                           time[byte_count]=tmp;      
                                                     }
                                                     break;
                                               case 3:                                                //纬度处理
                                                     if(byte_count<9){
                                                           WD[byte_count]=tmp;
                                                     }
                                                     break;
                                               case 4:                                                //纬度方向处理
                                                     if(byte_count<1){
                                                           WD_a=tmp;
                                                     }
                                                     break;
                                               case 5:                                                //经度处理
                                                     if(byte_count<10){
                                                           JD[byte_count]=tmp;
                                                     }
                                                     break;
                                               case 6:                                                //经度方向处理
                                                     if(byte_count<1){
                                                           JD_a=tmp;
                                                     }
                                                     break;
												case 7:                                                //speed
                                                     if(byte_count<4){
                                                           speed[byte_count]=tmp;
                                                     }
                                                     break;
											//	case 9:                                                //date
                                            //         if(byte_count<6){
                                             //              date[byte_count]=tmp;
                                             //        }
                                             //       break;
                                                               }
                                      
                             								}
                       
                       byte_count++;            //接收数位加1
                       break;
					}
           }
     RI=0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -