搜索
bottom↓
回复: 49

我的电波钟就要好了pic16f877a+8MHZ+LCD12864+DS1302+DS18B20+pic ccs ,大家来看看

[复制链接]

出0入0汤圆

发表于 2010-10-10 14:19:58 | 显示全部楼层 |阅读模式
我最近买了一个BPC某块
<br>1、输出脚接10k电阻,再通过音频线输入笔记本的音频输入插孔;
<br>2、打开GoldWave V5.06,进行录音。
<br>   a.打开笔记本无输入显示;
<br>   b.合上笔记本听到秒信号的声音,开始录制信号波形。
<br>结论:笔记本的显示器对接收机信号影响较大。
<br>3、录制波形图:
<br>
<br>GoldWave V5.06录制的BPC码波形图 <font color=green>(原文件名:全图.jpg)

<br></font>
从上图可以明显看到时间为20秒各帧的分界限。
<br>4、对信号进行分析的过程
<br>  a.连续的两帧进行对比如图:
<br>
<br>连续的两帧对比分析图 <font color=green>(原文件名:连续的两帧对比分析图.jpg)
</font>
b.在GoldWave V5.06中放大时间轴,看第一秒如图:
<br>
<br>第一秒的波形分析 <font color=green>(原文件名:第一秒.jpg)

<br>第二帧第一秒很明显为100毫秒的脉冲,代表为一分钟的01秒开始,那么第一帧应该是一分钟的41秒,应该为300毫秒的脉冲,本人分析可能由于电脑中音频处理引起波形的畸变所导致了失真。<br><br>本贴被 dyydyydyy 编辑过,最后修改时间:2010-07-02,21:26:52.</font>
      c.分别分析各脉冲宽度,标注如图
<br>
<br>两帧的脉冲宽度 <font color=green>(原文件名:连续的两帧的脉冲宽度.jpg)

<br>
<br>由脉冲宽度计算4进制数传分别为:
<br>                   秒  保留  时  分   星期 上下午   日    月   年  校检
<br>脉冲宽(100毫秒)   3   1    13  323   22      4     113   24  133   1
<br>4进制               2   0    02  212   11      3     002   13  022    0     
<br> 信息:10年7月2日2时38分41秒,星期五。
<br>脉冲宽(100毫秒)   1   1    13  324  22       4     113   24  133   1
<br>4进制               0   0    02  213   11      3     002   13  022   0   
<br>
<br>信息:10年7月2日2时39分01秒,星期五。
<br>应为下午,我不知道怎么根据鉴别位判断上下午。
<br>
<br>下面我会陆续把自己的电波钟制作及时上传,只是时间有限,可能需要段时间!!本人邮箱dyydyydyy@126.com,有兴趣的朋友交流啊!!<br><br>本贴被 dyydyydyy 编辑过,最后修改时间:2010-07-02,21:25:59.</font>
  综合网上资料和自己的分析,BPC码编码规则如下:
<br>
<br>BPC时码格式 <font color=green>(原文件名:bpc码格式.jpg)

<br>注意:上图有些错误,19位下半位为11-18位的校检。

我的做好了!!
pic16f877a+8MHZ+LCD12864+DS1302+DS18B20+pic ccs 基本完成,但显示中偶尔出现错行的问题。
(乾龙胜  ql200 pic单片机实验版)

液晶显示 (原文件名:DSCN0593.JPG)


实验板和接收模块 (原文件名:DSCN0597.JPG)
说明:1\为拍摄,天线和显示液晶很近,有干扰,收不到信号。接收电波时大概离20厘米即可。
2\液晶显示中的粗i代表电波钟模块正在校时。细的i代表接收的有效脉冲,依次显示19个脉冲右移。
3\203930代表20点39分30秒校时成功。(因为时间在前10个有效脉冲中已经测量完毕,后20个是日期。故显示的不是0秒或20秒或40秒而是30秒)图中显示到第7个脉冲。

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2010-10-10 14:22:06 | 显示全部楼层
捕捉中断处理和初始函数,供参考。
//电波接收中断处理函数
//主要根据20个脉冲的协议分别判断和处理(计算脉冲宽度、判断同步、计算日期时间)
void dbjs()
{
   set_timer1(0x0000);//计数器1清零,配合捕捉中断进行下一次测量
   Width=(long)n*262+CCP_1/250;//脉冲宽度
   n=0;//将计数器周期清零
   //-----------------------------//获取同步,如果不同步,一直测量两个上升沿之间宽度为2秒,认为找到了帧同步
   if (flag_tb==0)    //如果不同步
   {

      if ((width>1960)&&(width<2040))//两个上升沿(只有帧同步前的两个上升沿为2秒,其他为1秒)之间宽是否为2秒,是2秒表示捕捉到同步
      {flag_lstb=1;//记录同步状态,判断同步是否改变,以和flag_tb比较,如果flag_tb=0并且flag_lstb=1,说明接收中失去同步,则删除最后的同步显示
         flag_tb=1;//同步标志
         setup_ccp1(CCP_CAPTURE_FE); flag_dp=1;//改为下降沿捕捉,flag_dp=1,代表准备捕捉的是高电平
         count=0;//测量的脉冲序列复位,准备测量第一个高电平宽度
      }
   }


   else//已经同步
   {
      if (flag_dp==1) //flag_dp=1,代表准备捕捉的是高电平,现在对测量的高电平宽度进行处理
      {  setup_ccp1(CCP_CAPTURE_RE);flag_dp=0; //上升沿捕捉,flag_dp=0,代表准备捕捉的是低电平
         Pulse_zs=width/100;//求取宽度的整百毫秒部分。
         Pulse_wc=width%100;//获取非整百部分,就是测量误差,并进行误差处理
         //下面判断语句:测得有效脉冲,有效脉冲范围100-400毫秒,考虑测量误差有效脉冲范围实际取55-445毫秒。
         ////////////////如误差45-55毫秒之间不认为是误差,无法分辨,认为测量错误,重新同步。
         if (((width>55)&&(width<445)) && ((Pulse_wc>55)||(Pulse_wc<45)))
         {
            count++;//记录脉冲的序列
            //if (count>19)  {count=0;flag_tb=0;}
            swidth=width;//记录下高电平宽度,以和接着测量的低电平求和,看是否为1秒。
            if (pulse_wc>55) Pulse_zs=Pulse_zs;//例如接收一个156豪秒的脉冲,就认为是接收的200毫秒脉冲,即四进制1。
            else  Pulse_zs=Pulse_zs-1;         //例如接收一个140毫秒的脉冲,就认为是接收的100毫秒脉冲,即四进制0.

            switch(count)
            {case 1://帧信号(相当于秒信号)
               if (Pulse_zs>2) flag_tb=0;//根据协议该位只能是0、1、2,不能是3否则超出范围,表示接收错误,从新同步,
               else {db_Xj=0;db_sec=Pulse_zs*20+10;//0为10秒(从写入1302计算),1为30秒,2为50秒
                      if ((Pulse_zs==1)||(Pulse_zs==2)) db_Xj=~db_Xj;//效验积累计算,计算效验值,1=01,2=10,所以偶效验值取反,0,3不变
                    }
                                    break;
            case 2://保留
                if (Pulse_zs!=0) flag_tb=0;//根据协议,该位必须为0,否则就是错误,认为丢失同步,故也不需要进行效验积累计算
                break;
            case 3://时*4
               db_Hour=Pulse_zs*4;
               if ((Pulse_zs==1)||(Pulse_zs==2)) db_Xj=~db_Xj;//效验积累计算,计算效验值,1=01,2=10,所以偶效验值取反,0,3不变
               break;
            case 4://时*1
               db_Hour=db_Hour+Pulse_zs;//得出最后的时
               if (db_Hour>23) flag_tb=0;//时不能大于23,否则错误,从新搜索同步
               if ((Pulse_zs==1)||(Pulse_zs==2)) db_Xj=~db_Xj;//效验积累计算
               break;
            case 5://分*16
               db_min=Pulse_zs*16;
               if ((Pulse_zs==1)||(Pulse_zs==2)) db_Xj=~db_Xj;//效验积累计算
               break;
            case 6://分*4
               db_min=db_min+Pulse_zs*4;
               if ((Pulse_zs==1)||(Pulse_zs==2)) db_Xj=~db_Xj;//效验积累计算
               break;
            case 7://分*1
               db_min=db_min+Pulse_zs;//得出最后的分
               if (db_min>59) flag_tb=0;//分是否符合范围
               if ((Pulse_zs==1)||(Pulse_zs==2)) db_Xj=~db_Xj;//效验积累计算
               break;
             case 8://星期*4
               if (Pulse_zs>1) flag_tb=0;//该位只能为1或0
               else  {db_Week=Pulse_zs*4;if ((Pulse_zs==1)||(Pulse_zs==2)) db_Xj=~db_Xj;}
               break;
             case 9: //星期*1
               db_Week=db_Week+Pulse_zs;
               if ((Pulse_zs==1)||(Pulse_zs==2)) db_Xj=~db_Xj;//效验积累计算
               if (db_Week==7) db_Week=0;//电波中星期日=7,ds1302中为0,所以进行转换
               if (db_Week>6) flag_tb=0;
               break;
             case 10://上半位为上下午,0是上午,1是下午,后半位为1-9位的校检
               if (Pulse_zs>1) db_Hour=db_Hour+12;//大于1,上半位就是1,时间就是下午
               if ((Pulse_zs==0)||(Pulse_zs==2)) db_Zxj=0; //取出1-9位电波发给的校检值
               ELSE db_Zxj=1;
               if (db_Xj!=db_Zxj) flag_tb=0;//同积累的校检比对失败
               else
               {flag_timeok=1;}//flag_timeok=1,代表一次时间校时完成,在主程序中进行写入1302的操作
               break;
//----------前十个数据接收处理完毕,开始后半组数据接收和处理——————————
             case 11://日*16
               db_Day=Pulse_zs*16;
               db_Xj=0;
               if ((Pulse_zs==1)||(Pulse_zs==2)) db_Xj=~db_Xj;
               break;
             case 12://日*4
               db_Day=db_Day+Pulse_zs*4;
               if ((Pulse_zs==1)||(Pulse_zs==2)) db_Xj=~db_Xj;
               break;
             case 13://日*1
               db_Day=db_Day+Pulse_zs;
               if ((Pulse_zs==1)||(Pulse_zs==2)) db_Xj=~db_Xj;
               if (db_Day>31) flag_tb=0;//判断接收完成的日期符合范围吗
               break;
             case 14://月*4
               db_Month=Pulse_zs*4;
               if ((Pulse_zs==1)||(Pulse_zs==2)) db_Xj=~db_Xj;
               break;
             case 15://月*1
               db_Month=db_Month+Pulse_zs;
               if ((Pulse_zs==1)||(Pulse_zs==2)) db_Xj=~db_Xj;
               if (db_Month>12) flag_tb=0;
               break;
             case 16://年*16
               db_Year=Pulse_zs*16;
               if ((Pulse_zs==1)||(Pulse_zs==2)) db_Xj=~db_Xj;
               break;
             case 17://年*4
               db_Year=db_Year+Pulse_zs*4;
               if ((Pulse_zs==1)||(Pulse_zs==2)) db_Xj=~db_Xj;
               break;
             case 18://年*1
               db_Year=db_Year+Pulse_zs;
               if ((Pulse_zs==1)||(Pulse_zs==2)) db_Xj=~db_Xj;
               break;
             case 19://后半位为11-18位校检
               count=0;
               if (Pulse_zs==db_Xj)//校检比对成功//输出时间
               {
                  flag_dateok=1;//代表一次校时成功,以进行判断是否刷新最后校时的时间
                            disable_interrupts(INT_TIMER1);//关闭电波校时
                            disable_interrupts(INT_CCP1);
                            flag_dbopen=0;
                            flag_tb=0;
               }
               else flag_tb=0;//校检失败
               break;
            }
         }
         else//测得无效高电平脉冲
          {
            flag_tb=0;
          }

      }
     else    //  对测量的低电平宽度进行处理
      {
         swidth=swidth+width;//同上次测量的高电平脉冲求和看是否为1秒.
         if((swidth<1060)&&(swidth>940))//是1秒低电平正确,
         {
            setup_ccp1(CCP_CAPTURE_FE); flag_dp=1;//下降沿捕捉,测量高电平脉冲宽度
         }
         else
         {
            if ((swidth<2040)&&(swidth>1960)&&(count==19))//如果是2秒为最后一个
            {
               setup_ccp1(CCP_CAPTURE_FE); flag_dp=1;
               count=0;
            }
            else//低电平宽度错误准备收搜索同步
            {
               setup_ccp1(CCP_CAPTURE_RE);flag_dp=0;
               flag_tb=0;
            }

         }

      }
   }

}
/////////////////////////////////////////////////////////////////////////////
//电波接收初始化函数
void db_init()
{
   setup_ccp1(CCP_CAPTURE_RE);  //上升捕捉
   flag_dp=0;                   //代表当前正在捕捉电平
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
   set_timer1(0x0000);
   enable_interrupts(INT_TIMER1);//计数器中断开
   enable_interrupts(INT_CCP1);//捕捉中断开
   enable_interrupts(GLOBAL);//全局中断开
   flag_dbopen=1;
}

出0入0汤圆

发表于 2010-10-10 14:30:47 | 显示全部楼层
mark

出0入134汤圆

发表于 2010-10-10 14:40:13 | 显示全部楼层
接收的是中国的信号?
接收模块好小啊
我也经常拿电脑看波形

出0入0汤圆

 楼主| 发表于 2010-10-10 14:42:23 | 显示全部楼层
回复【4楼】elecfun 熊
-----------------------------------------------------------------------

是中国的啊,河南商丘
模块区淘宝上买的15远,但邮费要了我20元,

出0入0汤圆

发表于 2010-10-10 15:31:08 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-10-10 15:42:57 | 显示全部楼层
时间准不准啊。楼主人在哪里?

出0入0汤圆

发表于 2010-10-10 15:45:34 | 显示全部楼层
本來我也想做一個,可借我所在的地方信號不好, 估計做不了.

出0入0汤圆

发表于 2010-10-10 15:47:49 | 显示全部楼层
这个很有意思啊

出0入0汤圆

发表于 2010-10-10 15:51:04 | 显示全部楼层
lz 厉害!  

这东西有意思,下次也做一个

出0入0汤圆

发表于 2010-10-10 15:55:01 | 显示全部楼层
mark

http://www.time.ac.cn/serve/e_c.htm

出0入0汤圆

发表于 2010-10-10 16:52:14 | 显示全部楼层
这类软硬兼施的贴子俺喜欢,模块哪整的?能祥细说说吗?

出0入0汤圆

 楼主| 发表于 2010-10-10 16:54:27 | 显示全部楼层
回复【7楼】luxinsun
-----------------------------------------------------------------------

电波信号是分秒不差,但因为该钟并不是总是能接受到电波信号,每小时尝试接收校对时钟芯片ds1302,只要你的晶振准确,误差也不会大,一小时校对时,误差在一秒内。

出0入0汤圆

 楼主| 发表于 2010-10-10 16:56:38 | 显示全部楼层
回复【12楼】damoplus
-----------------------------------------------------------------------

淘宝买的,中国码的,坚决不用日本码啊!!该程序也不支持日本码,15元,但js邮费要哥20元。

出0入0汤圆

发表于 2010-10-10 18:42:13 | 显示全部楼层
看了好久才明白,谢谢!

感情就是把脉冲宽度-100ms,算剩余几个100ms,
然后按4进制解码

出0入0汤圆

 楼主| 发表于 2010-10-10 19:15:04 | 显示全部楼层
回复【15楼】yan_jian
-----------------------------------------------------------------------

对的啊,程序处理时做了误差处理。显得复杂些,但必须这样做才能保证解码的正确。因为测量是有误差的,设定的误差越小越能保证校时的可靠性,但同时成功率会低些,但从我的应用中看,误差在40ms内完全可靠。

出0入0汤圆

发表于 2010-10-10 19:47:09 | 显示全部楼层
回复【7楼】luxinsun
-----------------------------------------------------------------------

电波信号是分秒不差,但因为该钟并不是总是能接受到电波信号,每小时尝试接收校对时钟芯片ds1302,只要你的晶振准确,误差也不会大,一小时校对时,误差在一秒内。

——————————————————————————————————————————————
理论上是这样,我是说实际测试的时间精度。

出0入0汤圆

发表于 2010-10-10 20:03:22 | 显示全部楼层
MARK!用这个校时主意不错。

出0入0汤圆

 楼主| 发表于 2010-10-10 20:19:17 | 显示全部楼层
回复【17楼】luxinsun
-----------------------------------------------------------------------

看你的软件了,要求精确,你可以做到分秒不差,现在程序是最大提早0.9秒以内啊,第10个脉冲开始是x+9秒的开始,脉冲过后是9秒+100或200或300或400毫秒,你再延时相应的时间就是x+10秒,再要精确你把写1302的时间也算进去啊,但我们不是发射卫星,考虑程序的复杂程度,0。9秒误差可以接受吧!再者把求出的秒加1写入1302就晚了0.1-0。4秒。当然你可以根据协议求出一个更简单的算法,就是在上升沿校时,误差固定,就是考虑到写入1302时间,精确度也应在10毫秒以内。
可以交流,只是提供个思路。。。
至于校时后依靠ds1302提供时间,就要看你的32768hz时钟晶振了,好的几十元,差的几角,反正是一小时一校时,差的在一小时也不会差到10秒吧。
你也可以换用其他的高精度时钟芯片,这样校时后准确度更高。

出0入0汤圆

发表于 2010-10-10 20:41:08 | 显示全部楼层
学习

出50入4汤圆

发表于 2010-10-10 20:48:17 | 显示全部楼层
第一次听说电波钟,,长知识了

出0入0汤圆

发表于 2010-10-10 21:46:06 | 显示全部楼层
好东西啊~~

出0入0汤圆

发表于 2010-10-11 01:50:50 | 显示全部楼层
我所在的地方信號不好, 估計做不了.
GPS或GSM授時又太貴.

出350入8汤圆

发表于 2010-10-11 08:51:13 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-12 08:47:00 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-12 18:25:17 | 显示全部楼层
嗯,软硬皆施,我喜欢。MARK

出0入0汤圆

发表于 2010-10-12 19:09:09 | 显示全部楼层
200ms的误差都有问题,实际产品在100ms才可接受的。

出0入0汤圆

 楼主| 发表于 2010-10-13 12:16:43 | 显示全部楼层
回复【27楼】southpolefirn
-----------------------------------------------------------------------

你误会了!
    电波钟并不是依靠电波走时,电子钟的精度是靠所用的石英晶体振荡器决定的!电波只是提供给电波钟的准确定时自动校时,而不是依靠电波走时。因为电波信号并不是全天发射,你的接收条件也不一样,电波传播受天气、地形、温度这些不确定因素无法克服,如果只依靠电波,你的钟只是走走停停的。这里讨论的是如何校时而不是如何精确。如果说精确,我们可讨论选择什么品牌的晶振!这里说的精确是指《校时》的精确不是“走时”的精确!
电波钟误差不会像普通钟表有时间的积累,随着时间延长而误差增大。电波钟克服了这个缺点,在有信号时最快20秒校时一次,及时修正误差。在本程序修正的基础上,选择高精度晶振,我想校时后误差不会大于10ms,就是校时有1秒的误差,这个误差也是固定的,始终是误差1秒,因为大或小,电波钟会自己及时矫正,这是程序的问题而不是晶振或钟精确度的问题。
   你用手和眼去校时,误差肯定大于10ms,所以你说的问题和我们讨论的不是一个意思。
   你说的是走时,我们讨论的是校时!
   最后,再说一下,这个钟是没有校时调整按钮的。

出0入0汤圆

发表于 2010-10-19 08:43:45 | 显示全部楼层
波形图怎么没有了?

出0入0汤圆

发表于 2010-10-27 22:22:04 | 显示全部楼层
看懂了一点点

出0入0汤圆

发表于 2011-4-20 00:55:42 | 显示全部楼层
记号!

出0入0汤圆

发表于 2011-4-20 20:24:12 | 显示全部楼层
能否把pic 测温的那程序 给我  啊

出0入0汤圆

发表于 2011-5-14 10:11:41 | 显示全部楼层
记号

出0入0汤圆

发表于 2011-5-14 11:29:32 | 显示全部楼层
回复【28楼】dyydyydyy  

电波信号并不是全天发射
-----------------------------------------------------------------------

不能吧,应该是全天发射的吧,只不过你不是全天都能接收的

出0入0汤圆

发表于 2011-5-21 13:54:41 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-26 09:21:45 | 显示全部楼层
那个校验位怎么判断啊?

出0入0汤圆

发表于 2011-12-18 15:51:00 | 显示全部楼层
LZ辛苦了,谢谢你dyydyydyy.

出0入0汤圆

发表于 2011-12-28 14:51:16 | 显示全部楼层
呵呵,BPC模块 挺好。这么大的液晶 ,128X64的吧? 可以把阴历弄上去。有空在弄个整点报时。。就完美了。

出0入0汤圆

发表于 2012-9-3 20:53:53 | 显示全部楼层
我很想看到LZ的LCD的程序,刚好又没贴出来

出0入0汤圆

发表于 2013-1-24 10:14:48 | 显示全部楼层
这个是电波授时模块的破解了吧

出0入0汤圆

发表于 2013-2-11 21:44:06 | 显示全部楼层
是用的校时电波,还是普通收音机报时的哔哔哔哔的信号呀?

出0入0汤圆

发表于 2013-2-15 18:43:54 | 显示全部楼层
MARK 回头仔细看

出0入0汤圆

发表于 2013-2-16 13:36:27 | 显示全部楼层
楼主强悍!

出0入0汤圆

发表于 2015-5-18 22:41:46 | 显示全部楼层
马克留名!

出0入0汤圆

发表于 2017-3-3 16:01:10 | 显示全部楼层
我也想做一个来玩玩!

出0入0汤圆

发表于 2017-4-6 09:38:13 | 显示全部楼层
感觉很强大,一直想做但没实现。

出0入0汤圆

发表于 2017-10-29 08:04:40 | 显示全部楼层
楼主的作品花了不少时间啊
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 03:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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