基于單片機的gps的lcd1602顯示
捕獲.PNG (52.29 KB, 下載次數(shù): 39)
下載附件
2018-12-3 15:21 上傳
求大佬看看程序,為什么gps模塊閃爍有信號lcd只會顯示NoGPS Data... ?
單片機源碼:
- /*-------------------主函數(shù)---------------------*/
- #include <LCD1602.h>
- #include <stdio.h>
- typedef unsigned char uchar;
- //GPS數(shù)據(jù)存儲數(shù)組
- uchar Time[6]; //時間——hhmmss
- uchar WD[9]; //緯度
- uchar JD[10]; //經(jīng)度
- uchar Speed[4]; //速度
- uchar Date[6]; //日期——ddmmyy
- //串口中斷需要的變量
- uchar seg_count; //逗號計數(shù)器
- uchar byte_count; //位數(shù)計數(shù)器
- uchar cmd_number; //命令類型
- uchar mode; //0:結(jié)束模式,1:命令模式,2:數(shù)據(jù)模式
- uchar buf_full; //0:緩存數(shù)據(jù)無效;1:整句接收完成,相應數(shù)據(jù)有效
- uchar cmd[5]; //命令類型存儲數(shù)組
- //需要顯示的變量
- unsigned int dsp_count; //刷新次數(shù)計數(shù)器
- void SYS_Init(); //系統(tǒng)初始化
- void main()
- {
- uchar i,Time0,Time1;
- SYS_Init(); //系統(tǒng)初始化
- while(1)
- {
- if(buf_full==0) //緩沖數(shù)據(jù)無效,無GPS信號
- {
- dsp_count++; //刷新次數(shù)計數(shù)器值自增
- if(dsp_count>=65000)
- {
- LCD_Write_String(0,0,"No GPS Data... "); //從第1行首顯示
- while(buf_full==0); //當有GPS信號時退出循環(huán),否則阻塞
- dsp_count=0;
- }
- }
- else if(buf_full) //有GPS信號
- {
- LCD_Write_String(0,0,"GPS success! ");
- //顯示經(jīng)度
- LCD_Write_String(0,1,"JD: E");
- for(i=0;i<10;i++)
- LCD_Write_Char(3+i,1,JD[i]);
- DelayMs(10000);
- //顯示緯度
- LCD_Write_String(0,1,"WD: N");
- for(i=0;i<9;i++)
- LCD_Write_Char(3+i,1,JD[i]);
- DelayMs(10000);
- //顯示時間
- LCD_Write_String(0,1,"BJT: : : ");
- //將格林尼治時間轉(zhuǎn)換為北京時間
- if(((Time[1]-0x30)+(Time[0]-0x30)*10)<16)
- {
- Time0=((Time[1]-0x30)+8)/10+(Time[0]-0x30); //獲得小時的十位數(shù)
- Time1=((Time[1]-0x30)+8)%10; //獲得小時的個位數(shù)
- }
- else if(((Time[1]-0x30)+(Time[0]-0x30)*10)>15)
- {
- Time0=0;
- Time1=((Time[1]-0x30)+(Time[0]-0x30)*10)-16;
- }
- Time0=Time0+0x30; //將數(shù)字轉(zhuǎn)換為字符
- Time1=Time1+0x30;
- LCD_Write_Char(5,1,Time0);
- LCD_Write_Char(6,1,Time1);
- LCD_Write_Char(8,1,Time[2]);
- LCD_Write_Char(9,1,Time[3]);
- LCD_Write_Char(11,1,Time[4]);
- LCD_Write_Char(12,1,Time[5]);
- DelayMs(10000);
- //顯示速度
- LCD_Write_String(0,1,"Speed: ");
- for(i=0;i<4;i++)
- LCD_Write_Char(7+i,1,Speed[i]);
- DelayMs(10000);
- //顯示日期
- LCD_Write_String(0,1,"Date:20 - - ");
- LCD_Write_Char(7,1,Date[4]); //顯示年份
- LCD_Write_Char(8,1,Date[5]);
- LCD_Write_Char(10,1,Date[2]); //顯示月份
- LCD_Write_Char(11,1,Date[3]);
- LCD_Write_Char(13,1,Date[0]); //顯示天數(shù)
- LCD_Write_Char(14,1,Date[1]);
- DelayMs(10000);
- dsp_count=0; //刷新次數(shù)計數(shù)器值清0
- buf_full&=~0x01;
- }
- }
- }
- void SYS_Init()
- {
- SCON=0x50; //串口工作方式1,10位異步通信,允許接收
- TMOD=0x20; //T1工作方式2,8位初值自動重裝
- TH1=0xFD; //波特率9600bps,晶振11.0592MHz
- TL1=TH1;
- TR1=1; //啟動定時器1
- LCD_Init(); //初始化LCD1602
- LCD_Clear(); //清屏
- LCD_Write_String(0,0,"GPS System!");
- IE=0x90; //EA=1開總中斷,ES=1開串行口中斷
- }
- //串口接收中斷
- void Serial() interrupt 4
- {
- uchar temp;
-
- if(RI)
- {
- temp=SBUF;
- switch(temp)
- {
- case '
- [/color]
- :
- cmd_number=0;
- mode=1; //接收命令模式
- byte_count=0; //位數(shù)計數(shù)器清零
- break;
- case ',':
- seg_count++; //逗號計數(shù)加1
- byte_count=0; //位數(shù)計數(shù)器清零
- break;
- case '*':
- mode=0; //結(jié)束模式
- buf_full=1; //整句接收完成
- break;
- default:
- if(mode==1) //命令模式
- {
- cmd[byte_count]=temp;
- 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; //命令類型為1
- mode=2; //數(shù)據(jù)模式
- seg_count=0; //逗號計數(shù)器值為0
- byte_count=0; //位數(shù)計數(shù)器清零
- }
- }
- }
- }
- }
- }
- }
- else if((mode==2) && cmd_number) //接收數(shù)據(jù)處理
- {
- switch(seg_count) //判斷逗號的個數(shù)
- {
- case 1: //時間
- if(byte_count<6)
- Time[byte_count]=temp;
- break;
- case 3: //緯度
- if(byte_count<9)
- WD[byte_count]=temp;
- break;
- case 5: //經(jīng)度
- if(byte_count<10)
- JD[byte_count]=temp;
- break;
- case 7:
- if(byte_count<4) //速度
- Speed[byte_count]=temp;
- break;
- case 9:
- if(byte_count<6) //日期
- Date[byte_count]=temp;
- break;
- }
- }
- byte_count++; //接收位數(shù)加1
- break;
- }
- }
- RI=0;
- }
復制代碼
|