arduino使用BCD电波对时模块获取时间

转自//https://www.geek-workshop.com/thread-7797-1-1.html
//Arduino制作BCD码电波钟
感谢thomas

通过电波钟,获取商丘的国家授时中心发出的时间信号,这是中国的BPC格式,

//https://www.geek-workshop.com/thread-7797-1-1.html
//Arduino制作BCD码电波钟


int timeWidth=0;
int dataOut=0;
int lostData=0;
int flag=0;
int P0=0;
int P1=0;
int P2=0;
int P3=0;
int P4=0;
int BPChour=0;
int BPCminuate=0;
int BPCsecond;
int BPCweek=0;
int BPCday=0;
int BPCmonth=0;
int BPCyear=0;
int BPCArray[19]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

void setup(){
  Serial.begin(9600);
}
void loop(){
  int sensorValue = analogRead(A0);
  if(sensorValue<100){//低位触发计数开始
  timeWidth++; 
  lostData=0;
  }
  else if(timeWidth!=0){//高位输出,如果不为空,则输出脉宽信息
  dataOut=timeWidth-1; 
  //Serial.print(dataOut);//输出原始数据
  BPCArray[flag]=dataOut;
  flag++;
  timeWidth=0;
  }
  else{//低电平计时数开始
  BPCArray[18]=dataOut;
  lostData++; 
  if(lostData>12){//判断是否为1S缺秒脉冲标志,是则换行
  Serial.println("");
//
  int i;
  for (i = 0; i < 19; i = i + 1){
  Serial.print(BPCArray[i]);统一输出存储数据
  }
  Serial.println("");
  P1=BPCArray[0];
  P2=BPCArray[1];
  P3=BPCArray[9];
  P4=BPCArray[18];

  if(BPCArray[0]*20+20==60){
  BPCsecond=0;
  BPCminuate=BPCArray[4]*16+BPCArray[5]*4+BPCArray[6]+1;
  }
  else{
  BPCsecond=BPCArray[0]*20+20;
  BPCminuate=BPCArray[4]*16+BPCArray[5]*4+BPCArray[6];
  }
  if(BPCminuate==60){
  BPChour=BPCArray[2]*4+BPCArray[3]+1;
  BPCminuate=0;
  }
  else{
  BPChour=BPCArray[2]*4+BPCArray[3];
  }
  if(BPChour==0){//noon 12
  BPChour=12;
  }
  BPCweek=BPCArray[7]*4+BPCArray[8];
  BPCday=BPCArray[10]*16+BPCArray[11]*4+BPCArray[12];
  BPCmonth=BPCArray[13]*4+BPCArray[14];
  BPCyear=2000+BPCArray[15]*16+BPCArray[16]*4+BPCArray[17];
  Serial.print(BPCyear);
  Serial.print("-");
  Serial.print(BPCmonth);
  Serial.print("-");
  Serial.print(BPCday);
  Serial.print(" Week:");
  Serial.print(BPCweek);
  Serial.print(" Time: ");
  Serial.print(BPChour);
  Serial.print(":");
  Serial.print(BPCminuate);
  Serial.print(":");
  Serial.print(BPCsecond);
  if(P3>1){
  Serial.print("PM");
  }
  else{
  Serial.print("AM");
  }
  Serial.println("");
  Serial.println("------------------------------------");
///
flag=0;
lostData=0;
  }
  }
delay(100);
}


BPC电波授时编码 一种电波授时编码。其特征在于:帧周期为20秒,每分包含三帧;以秒脉冲宽度表示四进制数的0,1,2,3,以四进制数表示相应的“分”, “时”,“日”,“月”,“年”,“星期”等时间信息;以帧标志表示帧所在的时间段,以缺少秒脉冲作为帧间隔和帧预告标志;采用码位复用技术。本发明克服 了现有的时间编码帧周期过长的缺陷,接收一帧时间信息所用的最少时间由1分减少到20秒,提高了接收机效率,降低了对抗干扰的要求。 名词术语解释: 时间编码:以数字脉冲信号的方式对“分”,“时”,“日”,“月”,“年”,“星期”等时间信息进行编码。 方波秒脉冲:数字脉冲信号的波形为方波,其周期为1秒。 帧(即时间信息帧):一组包含“分”,“时”,“日”,“月”,“年”,“星期”等时间信息和必要的校验标志位的编码(或代码)。 帧周期:一帧的起始到下一帧的起始所用的时间。 背景技术: 电波授时是将高精度原子导出的精确时间信息用时间编码方式,通过无线电发射装置以低频(20KHz—100KHz)无线电波进行传播,用户端利用无线电接 收机接收信号并解调以恢复时间编码,再经过微处理器对编码进行一定的处理(解码)得到精确时间信息。目前在德国,美国,英国,日本等国家,电波授时已广泛 应用于电力,通信,民航,铁路以及个人计时器等各个领域。 电波授时所采用的时间编码是影响时间信息传播准确性和可靠性以及发射,接收装置制造难易程序的重要因素。现有时间编码包括DCF(德国),MDF(英 国),WWVB(美国),JJY/JG2AS(日本)等,这些时间编码的共同特征是:以方波秒脉冲形成时间编码;以脉冲前沿标志1秒的起始,以不同的脉冲 宽度(即方波脉冲信号持续时间)表示二进制数的1或0,以二进制数表示“分”,“时”,“日”,“月”,“年”,“星期”等时间信息,1分一帧,即周期为1分。由于无线电波传播过程中不可避免地要受到各种干扰,因此信息失真,错码,漏码等就成为可能。虽然现有时间编码中设置了必要的校验位用于判断所接收信息的正解 性,但这种简单的校验方式的误判率仍然较高。有效的做法也是目前被广泛采用的方法是:在接收信号时先利用校验码对每组编码进行初步校验,然后对连续接收到 的二到三帧信息进行比较后作出最终判断。因此,要接收到一组完整准确的时间编码信息至少要二到三分时间。这不公使接收机的效率低,而且当干扰比较严重 时,尤其是在远距离发射地,信号微弱或信号有时无的情况下,使得接收信号非常困难甚至不可能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值