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;
}