基于单片机的gps的lcd1602显示
求大佬看看程序,为什么gps模块闪烁有信号lcd只会显示NoGPS Data... ?
单片机源码:
- /*-------------------主函数---------------------*/
- #include <LCD1602.h>
- #include <stdio.h>
- typedef unsigned char uchar;
- //GPS数据存储数组
- uchar Time[6]; //时间——hhmmss
- uchar WD[9]; //纬度
- uchar JD[10]; //经度
- uchar Speed[4]; //速度
- uchar Date[6]; //日期——ddmmyy
- //串口中断需要的变量
- uchar seg_count; //逗号计数器
- uchar byte_count; //位数计数器
- uchar cmd_number; //命令类型
- uchar mode; //0:结束模式,1:命令模式,2:数据模式
- uchar buf_full; //0:缓存数据无效;1:整句接收完成,相应数据有效
- uchar cmd[5]; //命令类型存储数组
- //需要显示的变量
- unsigned int dsp_count; //刷新次数计数器
- void SYS_Init(); //系统初始化
- void main()
- {
- uchar i,Time0,Time1;
- SYS_Init(); //系统初始化
- while(1)
- {
- if(buf_full==0) //缓冲数据无效,无GPS信号
- {
- dsp_count++; //刷新次数计数器值自增
- if(dsp_count>=65000)
- {
- LCD_Write_String(0,0,"No GPS Data... "); //从第1行首显示
- while(buf_full==0); //当有GPS信号时退出循环,否则阻塞
- dsp_count=0;
- }
- }
- else if(buf_full) //有GPS信号
- {
- LCD_Write_String(0,0,"GPS success! ");
- //显示经度
- 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: : : ");
- //将格林尼治时间转换为北京时间
- if(((Time[1]-0x30)+(Time[0]-0x30)*10)<16)
- {
- Time0=((Time[1]-0x30)+8)/10+(Time[0]-0x30); //获得小时的十位数
- Time1=((Time[1]-0x30)+8)%10; //获得小时的个位数
- }
- else if(((Time[1]-0x30)+(Time[0]-0x30)*10)>15)
- {
- Time0=0;
- Time1=((Time[1]-0x30)+(Time[0]-0x30)*10)-16;
- }
- Time0=Time0+0x30; //将数字转换为字符
- 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]); //显示天数
- LCD_Write_Char(14,1,Date[1]);
- DelayMs(10000);
- dsp_count=0; //刷新次数计数器值清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; //位数计数器清零
- break;
- case ',':
- seg_count++; //逗号计数加1
- byte_count=0; //位数计数器清零
- break;
- case '*':
- mode=0; //结束模式
- 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; //数据模式
- seg_count=0; //逗号计数器值为0
- byte_count=0; //位数计数器清零
- }
- }
- }
- }
- }
- }
- }
- else if((mode==2) && cmd_number) //接收数据处理
- {
- switch(seg_count) //判断逗号的个数
- {
- case 1: //时间
- if(byte_count<6)
- Time[byte_count]=temp;
- break;
- case 3: //纬度
- if(byte_count<9)
- WD[byte_count]=temp;
- break;
- case 5: //经度
- 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++; //接收位数加1
- break;
- }
- }
- RI=0;
- }
复制代码
|