#include <REG903.H>
sfr SBUF = 0x99;
sfr SSTAT = 0xBA;
sfr BRGR0 = 0xBE;
sfr BRGR1 = 0xBF;
sfr BRGCON = 0xBD;
bit sof=0,start=1,first_PP=1,sendok=1;
unsigned char P_count=0,P_no=0,code_no=0,code_current=0,j,time_count=0;
unsigned char text[6]={0,0,0,0,0,0};
bit in0one;//从1变为0
bit in1one;//从0变为1
bit frame;//有效帧
bit sendflag;
unsigned char Tlow; //低电平高位计数器
unsigned char Thigh; //高电平高位计数器
bit onepluseend;//检测到一个脉冲
unsigned char pluse;//检测出来的信息元,0,1,3为P,4为无效。
unsigned char oldpluse;//上一个检测出来的信息元
unsigned char plusecount;//信息元个数。最大8*10=80
unsigned char pcount,sendcount;
unsigned char allcount;
unsigned char allcounttemp;
void code_decode(unsigned char p,unsigned char c)
{
if(p>5) return; //0 1 2 3 4 5 解码
if(c>7) c++; //0 1 2 3 4 5 6 7 为第一单元 8 9 10 11 12 13 14 15 16 为第二单元
c=c%9;
if (c<4)
text[p]|= (1<<(c)); //秒低位
else
text[p]|= (1<<(c-1)); //秒高位
}
/*
if(!KB2)
{
if(in0one)
{
if( Tlow < 0x90 ) Tlow=TH0;
else frame=0;
}
else
{
in0one=1;
in1one=0;
TR0=0;
TH0=0;
TL0=0;
TR0=1;
}
}
else
{
if(in1one0)
{
if( Thigh < 0x90 ) Thigh=TH0;
else frame=0;
}
else
{
in0one=0;
in1one=1;
TR0=0;
TH0=0;
TL0=0;
TR0=1;
onepluseend=1;
}
}
if( onepluseend )
{
Tlow = Tlow>>4; //只检测12~15位
Thigh =Thigh>>4; //只检测12~15位
onepluseend=0;
if( Thigh == 0x1 && Tlow == 0x7 ) pluse=0; //high 1.1~2.2 low 7.7~8.8 ms
else if( Thigh == 0x4 && Tlow == 0x4) pluse=1; //high 4.4~5.5 low 4.4~5.5
else if( Thigh == 0x7 && Tlow == 0x1 ) pluse=3; //p high 7.7~8.8 low 1.1~2.2
else
{
pluse=4; //无效
frame =0;
}
if( oldpluse == 3 && pluse == 3 )
{
frame ==1;
pcount=0;
plusecount=0;
}
oldpluse=pluse;
if( frame)
{
if( pluse == 3 ) pcount ++;
if( pluse < 3 ) plusecount++;
//用plusecount解码
if( pcount == 10 ) //脉冲对时;
if( pcount ==6 && plusecount == 48 ) //发送
}
else
{
pcount=0;
plusecount=0;
oldpluse=4;
}
Tlow = 0;
Thigh =0;
}*/
/*void sendtouart()
{
for(j=0;j<6;j++)
{
TI=0; // 清除发送中断
SBUF=text[j]; // 开始发送
text[j]=0;
while (!TI); // 等待发送结束
}
}*/
void init(void)
{
P0M1 = 0x04; //P0.2使用输入,P0.4输出
P0M2 = 0xFB;
P1M1 = 0x00; //除RX(P1.1)外,其他推免输出
P1M2 = 0xFD;
TMOD = 0x11; //使用定时器0模式1,定时器1模式1
TH0=0;
//TL0=0;
TH1=0;
//TL1=0;
KB5=1;
ES = 0; // UART 中断禁止
// ET1 = 1; //time1 中断使能
// EA = 1;
}
void UART_init()
{
SCON=0x50; // 选择BRG作为UART波特率
SSTAT=0x60; // 独立Rx / Tx 中断
BRGR0=0xF0; // 设置BRG9600@7.373MHz 内部振荡器
BRGR1=0x02;
BRGCON = 0x03; // 使能 BRG
}
/*void code_decode(char c)
{
c=c%9;
if (c>0&&c<5)
text[0]|= (code_current<<(c-1)); //秒低位
else if (c>5&&c<9)
text[0]|= (code_current<<(c-2)); //秒高位
else if (c>8&&c<13)
text[1]|= (code_current<<(c-9)); //分低位
else if (c>13&&c<17)
text[1]|= (code_current<<(c-10)); //分高位
else if (c>17&&c<22)
text[2]|= (code_current<<(c-18)); //时低位
else if (c>22&&c<25)
text[2]|= (code_current<<(c-19)); //时高位
else if (c>26&&c<31)
text[3]|= (code_current<<(c-27)); //天1低位
else if (c>31&&c<36)
text[3]|= (code_current<<(c-28)); //天1高位
else if (c>35&&c<38)
text[4]|= (code_current<<(c-36)); //天2
else if (c>44&&c<49)
text[5]|= (code_current<<(c-45)); //年低位
else if (c>49&&c<54)
text[5]|= (code_current<<(c-46)); //年高位
}*/
void main(void)
{
init();
UART_init();
//
while(1)
{
/*if (first_PP) //第一次捕捉一个完整的帧
{
while(!KB2);
TR0=1;
TH1=0;
TR1=1;
while(KB2);
TR0=0;
while(!KB2);
if (TH0>0x6d&&TH1<0xa1) //正脉宽大于7.5ms,整个周期小于11ms
{
P_count++; //P数量加一
if (sof)
P_no++;
}
else
{
P_count=0;
TR1=0;
TH1=0;
//TL1=0;
}
TH0=0;
//TL0=0;
if (P_count==2) //置帧开始标志
sof=1;
if (P_no>=9&&time_count<43) //一个完整帧结束,退出第一次捕捉,9个P总时间小于764ms
{
first_PP=0;
sof=0;
TR1=0;
TH1=0;
//TL1=0;
time_count=0;
}
}
else if (!first_PP&&!sof) //捕获帧头(两个P)
{
while(!KB2);
TR0=1;
TR1=1;
while(KB2);
TR0=0;
while(!KB2);
TR1=0;
if (TH0>0x6d&&TH1<0xa0) //正脉宽大于7.5ms,整个周期小于11ms
{
TH0=0;
//TL0=0;
TH1=0;
//TL1=0;
while(!KB2);
KB4=0; //给主CPU发中断脉冲
TR0=1;
TR1=1;
while(KB2);
TR0=0;
while(!KB2);
if (TH0>0x6d&&TH1<0xa0) //正脉宽大于7.5ms,整个周期小于11ms
{
P_no=0;
code_no=0;
sof=1;
KB4=1;
sendok=1;
time_count=0;
}
}
TH0=0;
//TL0=0;
}
else if (sof&&!first_PP) //帧开始标志位,解码相应时间
{
while(!KB2);
TR0=1;
while(KB2);
TR0=0;
if (TH0<0x50) //正脉宽小于于5.5ms
{
if (TH0<0x25) //正脉宽小于于2.5ms
code_current=0;
else
code_current=1;
code_no++;
code_decode(code_no);
}
else
P_no++;
if (P_no>=9)
sof=0;
if (P_no==6)
{
TR1=0;
if (time_count<47&&sendok) //从帧头开始周期小于835ms
{
sendtouart();
time_count=0;
sendok=0;
}
else //出错,重新开始第一次捕捉
{
first_PP=1;
sof=0;
}
TH0=0;
//TL0=0;
TH1=0;
//TL1=0;
}
}*/
if(!KB2)
{
if(in0one)
{
if( Tlow < 0x90 ) Tlow=TH0;
else frame=0;
}
else
{
in0one=1;
in1one=0;
TR0=0;
TH0=0;
TL0=0;
TR0=1;
}
}
else
{
if(in1one)
{
if( Thigh < 0x90 ) Thigh=TH0;
else frame=0;
}
else
{
in0one=0;
in1one=1;
TR0=0;
TH0=0;
TL0=0;
TR0=1;
onepluseend=1;
}
}
if( onepluseend )
{
onepluseend=0;
//0.972 ms 0x0e00
//2.986 ms 0x2b00
//3.958 ms 0x3900
//6.041ms 0x5700
//6.944 0x6400
//9.027ms 0x8200 判断码元类型pluse=3为位置码元
if( Thigh > 0x0e && Thigh < 0x2b && Tlow > 0x64 && Tlow <0x82 ) pluse=0; //高脉冲在1~3 ms之间
else if( Thigh > 0x39 && Thigh < 0x57 && Tlow > 0x39 && Tlow < 0x57) pluse=1; //高脉冲在4~6 ms之间
else if( Thigh > 0x64 && Thigh <0x82 && Tlow > 0x0e && Tlow < 0x2b ) pluse=3; //高脉冲在7~9 ms之间
else
{
pluse=4; //无效
frame =0;
}
//8.471ms 0x7A00
//11.527ms 0xA600
if( ((Thigh + Tlow )>0xa6) || ((Thigh + Tlow )<0x7A) ) //整个脉冲在8.5~11.5 ms之间
{
pluse=4; //无效
frame =0;
}
//连续两个码元都为位置码元,准备接收帧
if( oldpluse == 3 && pluse == 3 )
{
frame =1;
pcount=0;
plusecount=0;
allcount=1;
KB4=1;
}
else if( frame )
{
if( pluse <4 )
{
if( pluse == 3 ) pcount ++;
else
{
if( pluse == 1 ) code_decode(pcount,plusecount);//用plusecount解码
plusecount++; //以0为基准
}
allcount++;
}
//检测P
allcounttemp=allcount%10;
if( allcounttemp==0 )
{
if( pluse!=3 )
{
frame=0;
}
}
else if( pluse == 3 )
{
frame=0;
}
/*检测分隔符
if( ((allcounttemp == 5)&&(allcount!=5)) || (allcount==6) )
{
if( pluse != 0 )
{
frame=0;
}
}*/
if( pcount == 10 ) //脉冲对时;
{
KB4=0; //给主CPU发中断脉冲
frame=0;
}
//8+5*9=53
if( pcount ==6 && plusecount == 53 ) //发送
{
sendflag=1;
TI=0;
SBUF=text[0]; // 开始发送
text[0]=0;
sendcount=