找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1461|回复: 0
打印 上一主题 下一主题
收起左侧

为什么单片机+gps模块闪烁有信号lcd1602只会显示NoGPS Data...

[复制链接]
跳转到指定楼层
楼主
基于单片机的gps的lcd1602显示


求大佬看看程序,为什么gps模块闪烁有信号lcd只会显示NoGPS Data... ?

单片机源码:
  1. /*-------------------主函数---------------------*/
  2. #include <LCD1602.h>
  3. #include <stdio.h>

  4. typedef unsigned char uchar;

  5. //GPS数据存储数组
  6. uchar Time[6];                //时间——hhmmss
  7. uchar WD[9];                //纬度
  8. uchar JD[10];                //经度
  9. uchar Speed[4];                //速度
  10. uchar Date[6];                //日期——ddmmyy

  11. //串口中断需要的变量
  12. uchar seg_count;        //逗号计数器
  13. uchar byte_count;        //位数计数器
  14. uchar cmd_number;         //命令类型
  15. uchar mode;                        //0:结束模式,1:命令模式,2:数据模式
  16. uchar buf_full;                //0:缓存数据无效;1:整句接收完成,相应数据有效
  17. uchar cmd[5];                //命令类型存储数组

  18. //需要显示的变量
  19. unsigned int dsp_count;                //刷新次数计数器

  20. void SYS_Init();                        //系统初始化

  21. void main()
  22. {
  23.         uchar i,Time0,Time1;
  24.         SYS_Init();                                //系统初始化
  25.         while(1)
  26.         {
  27.                 if(buf_full==0)                //缓冲数据无效,无GPS信号
  28.                 {
  29.                         dsp_count++;        //刷新次数计数器值自增
  30.                         if(dsp_count>=65000)
  31.                         {
  32.                                 LCD_Write_String(0,0,"No GPS Data... ");                //从第1行首显示
  33.                                 while(buf_full==0);                        //当有GPS信号时退出循环,否则阻塞
  34.                                 dsp_count=0;
  35.                         }
  36.                 }
  37.                 else if(buf_full)        //有GPS信号
  38.                 {
  39.                         LCD_Write_String(0,0,"GPS success!    ");
  40.                         //显示经度
  41.                         LCD_Write_String(0,1,"JD:           E");
  42.                         for(i=0;i<10;i++)
  43.                                 LCD_Write_Char(3+i,1,JD[i]);
  44.                         DelayMs(10000);
  45.                         //显示纬度
  46.                         LCD_Write_String(0,1,"WD:           N");
  47.                         for(i=0;i<9;i++)
  48.                                 LCD_Write_Char(3+i,1,JD[i]);
  49.                         DelayMs(10000);
  50.                         //显示时间
  51.                         LCD_Write_String(0,1,"BJT:   :  :    ");
  52.                         //将格林尼治时间转换为北京时间
  53.                         if(((Time[1]-0x30)+(Time[0]-0x30)*10)<16)
  54.                         {
  55.                                 Time0=((Time[1]-0x30)+8)/10+(Time[0]-0x30);                //获得小时的十位数
  56.                                 Time1=((Time[1]-0x30)+8)%10;                                        //获得小时的个位数
  57.                         }
  58.                         else if(((Time[1]-0x30)+(Time[0]-0x30)*10)>15)
  59.                         {
  60.                                 Time0=0;
  61.                                 Time1=((Time[1]-0x30)+(Time[0]-0x30)*10)-16;
  62.                         }
  63.                         Time0=Time0+0x30;                        //将数字转换为字符
  64.                         Time1=Time1+0x30;
  65.                         LCD_Write_Char(5,1,Time0);
  66.                         LCD_Write_Char(6,1,Time1);
  67.                         LCD_Write_Char(8,1,Time[2]);
  68.                         LCD_Write_Char(9,1,Time[3]);
  69.                         LCD_Write_Char(11,1,Time[4]);
  70.                         LCD_Write_Char(12,1,Time[5]);
  71.                         DelayMs(10000);
  72.                         //显示速度
  73.                         LCD_Write_String(0,1,"Speed:        ");
  74.                         for(i=0;i<4;i++)
  75.                                 LCD_Write_Char(7+i,1,Speed[i]);
  76.                         DelayMs(10000);
  77.                         //显示日期
  78.                         LCD_Write_String(0,1,"Date:20  -  -  ");
  79.                         LCD_Write_Char(7,1,Date[4]);        //显示年份
  80.                         LCD_Write_Char(8,1,Date[5]);
  81.                         LCD_Write_Char(10,1,Date[2]);        //显示月份
  82.                         LCD_Write_Char(11,1,Date[3]);
  83.                         LCD_Write_Char(13,1,Date[0]);        //显示天数
  84.                         LCD_Write_Char(14,1,Date[1]);
  85.                         DelayMs(10000);

  86.                         dsp_count=0;        //刷新次数计数器值清0
  87.                         buf_full&=~0x01;
  88.                 }
  89.         }
  90. }

  91. void SYS_Init()
  92. {
  93.         SCON=0x50;                //串口工作方式1,10位异步通信,允许接收
  94.         TMOD=0x20;                //T1工作方式2,8位初值自动重装
  95.         TH1=0xFD;                //波特率9600bps,晶振11.0592MHz
  96.         TL1=TH1;
  97.         TR1=1;                        //启动定时器1
  98.         LCD_Init();                //初始化LCD1602
  99.         LCD_Clear();        //清屏
  100.         LCD_Write_String(0,0,"GPS System!");
  101.         IE=0x90;                //EA=1开总中断,ES=1开串行口中断
  102. }

  103. //串口接收中断
  104. void Serial() interrupt 4
  105. {
  106.         uchar temp;
  107.                                                                                                          
  108.         if(RI)
  109.         {
  110.                 temp=SBUF;
  111.                 switch(temp)
  112.                 {
  113.                 case '

  114. [/color]

  115. :
  116.                         cmd_number=0;
  117.                         mode=1;                                //接收命令模式
  118.                         byte_count=0;                //位数计数器清零
  119.                         break;
  120.                 case ',':
  121.                         seg_count++;                //逗号计数加1
  122.                         byte_count=0;                //位数计数器清零
  123.                         break;
  124.                 case '*':
  125.                         mode=0;                                //结束模式
  126.                         buf_full=1;                        //整句接收完成
  127.                         break;
  128.                 default:
  129.                         if(mode==1)                        //命令模式
  130.                         {
  131.                                 cmd[byte_count]=temp;
  132.                                 if(byte_count>=4)
  133.                                 {
  134.                                         if(cmd[0]=='G'){
  135.                                                 if(cmd[1]=='P'){
  136.                                                         if(cmd[2]=='R'){
  137.                                                                 if(cmd[3]=='M'){
  138.                                                                         if(cmd[4]=='C'){
  139.                                                                                 cmd_number=1;        //命令类型为1
  140.                                                                                 mode=2;                        //数据模式
  141.                                                                                 seg_count=0;        //逗号计数器值为0
  142.                                                                                 byte_count=0;        //位数计数器清零
  143.                                                                         }
  144.                                                                 }
  145.                                                         }
  146.                                                 }
  147.                                         }
  148.                                 }
  149.                         }
  150.                         else if((mode==2) && cmd_number)        //接收数据处理
  151.                         {
  152.                                 switch(seg_count)                //判断逗号的个数
  153.                                 {
  154.                                 case 1:                                        //时间
  155.                                         if(byte_count<6)        
  156.                                                 Time[byte_count]=temp;
  157.                                         break;
  158.                                 case 3:                                        //纬度
  159.                                         if(byte_count<9)
  160.                                                 WD[byte_count]=temp;
  161.                                         break;
  162.                                 case 5:                                        //经度
  163.                                         if(byte_count<10)
  164.                                                 JD[byte_count]=temp;
  165.                                         break;
  166.                                 case 7:
  167.                                         if(byte_count<4)        //速度
  168.                                                 Speed[byte_count]=temp;
  169.                                         break;
  170.                                 case 9:
  171.                                         if(byte_count<6)        //日期
  172.                                                 Date[byte_count]=temp;
  173.                                         break;
  174.                                 }
  175.                         }
  176.                         byte_count++;                //接收位数加1
  177.                         break;
  178.                 }
  179.         }
  180.         RI=0;
  181. }
复制代码




新建 Microsoft Word 文档 (2).docx

16.12 KB, 下载次数: 12

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表