一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
楼主: 无锡风
收起左侧

[其他综合] GPS模块 串行通信,TTL电平匹配的问题

[复制链接]
发表于 2015-3-10 21:15 | 显示全部楼层
来看看
发表于 2015-3-10 21:27 | 显示全部楼层
不需要什么电平变换吧,一直都是直接接单片机,
 楼主| 发表于 2015-3-11 09:20 | 显示全部楼层
benli 发表于 2015-3-10 21:27
不需要什么电平变换吧,一直都是直接接单片机,

谢谢 benli來关注!
我理解:

1、误码不是一直有,GPS授時、也不要求"分分秒秒"都准确;
2、一般的单片机IO口,多是上下"推挽(??)"方式的输入输出电路,对信号电平的"容忍度"髙;
因此,您说"一直都是直接接单片机",都能"正常工作",没有错。
一一浦东张兄,在我这里试用的一台GPS授時的数码管钟,就是"正常"工作着的……
我这,不是"在玩"吗?

……

正好,想念请教一下 benli老师(能者为师!我看到了您在「数码」的GPS大作了):
一套LED3264点阵屏万年历,用1302定時、18B20测温(室内外双温),常規电路;
现欲"加入GPS授時'单元'",需要修改软件(C语言)难不难(不必改动显示格式等其他各方面)?
如果是汇编的LED钟,増加GPS授時单元呐?
谢谢先!


发表于 2015-3-11 17:36 | 显示全部楼层
无锡风 发表于 2015-3-10 20:35
今天试了试,"天綫供电"端、是否接5V供电,与GPS是否工作、误码的多少,好像无关?
不知道,您所说的 ...

我只会这样玩,GPS时钟走时很正常。
gps1.jpg
 楼主| 发表于 2015-3-11 19:44 | 显示全部楼层
zhangym 发表于 2015-3-11 17:36
我只会这样玩,GPS时钟走时很正常。

张兄言重了。
您是我玩数码管、点阵屏万年历的启蒙老师之一,更是玩GPS钟、我的先行老师!


您的GPS时钟,的確走時很正常。
我只是在电脑上试GPS模块,偶然发现会出现误码,而且与供电电压相关……
发表于 2015-3-11 20:57 | 显示全部楼层
老冯客气了,我也只是照葫芦画瓢,能用就好。而且感觉这个模块有电池可以保持走时数据,不要说错几个码,就是断电后也是可以保持正常走时的。
发表于 2015-3-11 21:05 | 显示全部楼层
本帖最后由 zhangym 于 2015-3-11 21:07 编辑

仔细看了你的GPS数据,明显是GPS没有接收好信号,那个$GPRMC 时间后面的字母A,或者V   A就是GPS定位信号,您那个好像显示的是V。
gps.jpg

点评

所以还是要先看看模块的天线是否正常供电和天线的摆放位置。你买的那个天线里面是有信号放大器。  发表于 2015-3-11 21:22
就是啊!?  发表于 2015-3-11 21:08
 楼主| 发表于 2015-3-11 21:06 | 显示全部楼层
zhangym 发表于 2015-3-11 20:57
老冯客气了,我也只是照葫芦画瓢,能用就好。而且感觉这个模块有电池可以保持走时数据,不要说错几个码,就 ...

这倒是一一准确且"皮实"一一"能用就好"!
http://webkit-fake-url://2C865F6C-E03C-4510-BB1D-B32248B53FA9/imagegif
刚才我还在说,谢谢您的3R33模块呐……
https://www.yleee.com.cn/thread-40235-1-1.html

发表于 2015-3-13 20:26 | 显示全部楼层
本帖最后由 benli 于 2015-3-13 20:32 编辑
无锡风 发表于 2015-3-11 09:20谢谢 benli來关注!
我理解:

别叫俺老师,惭愧啊!那GPS板子上有稳压器,可以直接5v供电,与单片机也可以直接连接
51单片机默认是弱上拉的开漏结构,

C程序移植很简单,GPS接收是独立的程序模块,可以方便的加入原程序之中
至于汇编,就不懂了
  1. void Uart() interrupt 4 using 1
  2. {   
  3.         uchar data Rx_temp ;
  4.         static uchar fg_count=0;        //数据间隔,计数
  5.         static uchar Rx_count=0;
  6.         static uchar n=0;                     //握手信号计数
  7.         static uchar da_count=0;         //数据计数
  8. //        static bit RX_start;    //GPS数据接收开始标志位
  9.         uchar idata GPRMC[6]={0x24,0x47,0x50,0x52,0x4D,0x43};    //GPS选择接收字符$GPRMC,

  10.            if(RI)                                          
  11.      {
  12.                    RI=0;
  13.                     Rx_temp=SBUF;

  14. /******* 监控握手信号进行软件复位自动下载 ******/
  15.               if(Rx_temp==0x7f)  
  16.               {                                                   //STC下载指令是0x7f
  17.                    n++;                                 
  18.                    if(n>20)                      //如果连续收到20次0x7f
  19.                    {
  20.                                IAP_CONTR=0x60;  //复位至ISP区  
  21.                                         n=0;   
  22.                    }
  23.               }
  24.                   else
  25.                           n=0;

  26. /********* GPS数据处理 **************/
  27.                   if(Rx_count<6)
  28.                   {
  29.                             if(Rx_temp==GPRMC[Rx_count])    //比较开始$GPRMC字符,     
  30.                                Rx_count++;
  31.                      else   
  32.                                  Rx_count=0;        
  33.                    }
  34.                 else  //找到GPRMC开始保存数据
  35.                 {
  36.                          if(Rx_temp==',')                                //如果收到逗号,
  37.                         {
  38.                                 fg_count++;                                        //计数增加
  39.                                 da_count=0;
  40.                         }
  41.                         else
  42.                         {
  43.                                  if(fg_count==1)                                //保存时间数据
  44.                                 {
  45.                                         if(da_count<6)                   //只保存前6位时间数据
  46.                                                 SJ[da_count++]=Rx_temp;
  47.                                 }
  48.                                 else
  49.                                         if(fg_count==2)                        //保存定位信息
  50.                                         {       
  51.                                                 if(Rx_temp=='A')        //如果收到A
  52.                                                         DW_OK=1;                //则定位成功
  53.                                                 else
  54.                                                         DW_OK=0;
  55.                                         }
  56.                                         else
  57.                                                 if(fg_count==9)                                  //保存日期数据
  58.                                                         RQ[da_count++]=Rx_temp;
  59.                                                 else
  60.                                                         if(fg_count>10)                         //接收完毕
  61.                                                         {
  62.                                                                  RX_over=1;
  63. //                                                                RX_start=0;
  64.                                                                 fg_count=0;
  65.                                                                 da_count=0;
  66.                                                                 Rx_count=0;
  67.                                                         }       
  68.                         }       
  69.                 }       
  70.         }

  71. }

  72. void GPSdata()
  73. {

  74.         static uchar idata hour[2],min[2],sec[2],year[2],mon[2],day[2];        //临时时间数据 ,为了预防数据传输的误码,使用了2次数据比较
  75.         static uchar a,max;

  76.         RX_over=0;
  77.                                                                                                    //保存临时时间数据
  78.         hour[a]=(SJ[0]-0x30)*10        + (SJ[1]-0x30);                 //时
  79.         min [a]=(SJ[2]-0x30)*10        + (SJ[3]-0x30);                 //分
  80.         sec [a]=(SJ[4]-0x30)*10        + (SJ[5]-0x30);                 //秒
  81.         day [a]=(RQ[0]-0x30)*10 + (RQ[1]-0x30);                 //日
  82.         mon [a]=(RQ[2]-0x30)*10 + (RQ[3]-0x30);                 //月
  83.         year[a]=(RQ[4]-0x30)*10 + (RQ[5]-0x30);                 //年
  84.         a++;
  85.         for(max=0;max<6;max++)
  86.         {
  87.                  SJ[max]=0;
  88.                 RQ[max]=0;
  89.         }
  90.         if(a>1)
  91.         {
  92.                 a=0;
  93.                 //如果第二次秒比上次小1,并且分,时,日,月年相同
  94.                 if(sec[1]-sec[0]==1&&min[1]==min[0]&&hour[1]==hour[0]&&day[1]==day[0]&&mon[1]==mon[0]&&year[1]==year[0])
  95.                 {
  96.                         sec[1]+=1;                  //GPS时间是包含毫秒的,加上1秒补偿传输和程序处理的延时
  97.                         if(sec[1]>59)
  98.                         {
  99.                                  sec[1]=0;
  100.                                 min[1]+=1;
  101.                                 if(min[1]>59)
  102.                                 {
  103.                                  min[1]=0;
  104.                                  hour[1]+=1;
  105.                                 }
  106.                         }
  107.                         hour[1]+=8;                        //转换为北京时间 ,东8区要+8
  108.                         if(hour[1]>23)                //如果超过23则到了第二天
  109.                         {   
  110.                                 hour[1]-=24;        //
  111.                                 day[1]+=1;                //日+1

  112.                                 switch(mon[1])                //获取每月最大天数
  113.                                 {
  114.                                          case 2:                         //2月
  115.                                                 if(year[1]%4==0)  //判断是否闰月,只取2000-2099年,因此简单的%4运算
  116.                                                         max=29;                  //闰月29天
  117.                                                 else
  118.                                                         max=28;                  //正常28天
  119.                                                 break;
  120.                                         case 4:        case 6:         
  121.                                         case 9: case 11:     //4,6,9,11月                                       
  122.                                                 max=30;                         //30天
  123.                                                 break;
  124.                                         default:
  125.                                                 max=31;                  //其他月份1,3,5,7,8,10,12月31天
  126.                                         break;               
  127.                                 }
  128.                                 if(day[1]>max)
  129.                                 {
  130.                                         mon[1]+=1;
  131.                                         day[1]=0;
  132.                                         if(mon[1]>12)
  133.                                         {
  134.                                                  year[1]+=1;
  135.                                                 mon[1]=0;
  136.                                         }
  137.                                 }
  138.                         }
  139.                         DS1302_WriteData(0x8e, 0x00);   //允许写操作                写入时间数据到1302
  140.                         DS1302_WriteData(0x80, sec[1]/10*16 + sec[1]%10 );          //秒
  141.                         DS1302_WriteData(0x82, min[1]/10*16 + min[1]%10 );          //分
  142.                         DS1302_WriteData(0x84, hour[1]/10*16 + hour[1]%10 ); //时
  143.                         DS1302_WriteData(0x86, day[1]/10*16 + day[1]%10 );         //日
  144.                         DS1302_WriteData(0x88, mon[1]/10*16 + mon[1]%10 );         //月
  145.                         DS1302_WriteData(0x8c, year[1]/10*16 + year[1]%10 ); //年
  146.                         DS1302_WriteData(0x8e, 0x80);   //写保护

  147.                         GPS_POW=1;                         //关闭GPS电源
  148. //                        ES_OFF;
  149.                         GetAllTime();                 //读取全部时间
  150.                         GetNL_ri();                         //农历转换
  151.                 }
  152.         }
  153. }

  154. main()
  155. {
  156.                  if(RX_over&&DW_OK)           //接收完一帧数据并且收到定位成功信息后进行数据处理,定位后的时间肯定是准确的
  157. //                 if(RX_over && (RQ[5]>0x34 & RQ[5]<0x39) )        //如果信号较差能收到时间却没有定位可以用这句降低处理条件
  158.                          GPSdata();

  159.                  if(shi1==0&&shi2==1&&fen1==0&&fen2==0)         //1点同步时间
  160.                  {
  161.                           ES_ON;                                //打开独立波特率发生器 ]
  162.                         GPS_POW=0;                        //打开GPS电源
  163.                  }
  164. }
复制代码

评分

参与人数 1一乐金币 +30 收起 理由
慎华 + 30 很给力!

查看全部评分

发表于 2015-3-13 20:31 | 显示全部楼层
benli 发表于 2015-3-13 20:26
别叫俺老师,惭愧啊!那GPS板子上有稳压器,可以直接5v供电,与单片机也可以直接连接
51单片机默认是弱 ...

期待大师出个接收GPS信号的点阵屏时钟。先谢谢啦!

评分

参与人数 1一乐金币 +12 收起 理由
慎华 + 12 早就做好了,只是benli很低调!呵呵。。。.

查看全部评分

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-19 03:06 , Processed in 0.050177 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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