void eint0(void) interrupt 0//外部中断0 中断子程序
{
static unsigned int tempaddr;//接收地址缓存
static unsigned int tempkey;//接收数据缓存
unsigned int timecnt; //时间
timecnt=(TH0*256+TL0)*1.085;
TH0=0;
TL0=0; // 在外部中断中对定时器清零,重新计数
if((timecnt>80)&&(timecnt<600)&&(cntint<24))
{
if(cntint<16)//接收地址码
{
tempaddr=tempaddr<<1;//将接收的到最低位移到最高位
if(timecnt>250)//210为宽脉冲与低脉冲界线,当振荡电阻为1M时,窄脉冲为110uS,宽脉冲为320uS
{
tempaddr|=1;//宽脉冲为1
}
cntint++;//中断次数加1
}
else if(cntint<24)//接收数据码
{
tempkey=tempkey<<1;
if(timecnt<250)
{
tempkey|=1;
}
cntint++;
}
else//cntint大于24也就是中断了25次时,关闭外部中断0,等待同步码
{
TMOD&=0xf0;//设定时器0为定时方式
TMOD|=0x01;
TH0=0xf1;
TL0=0x9a;
cntint=0;
EX0=0;//关外部中断0
addr=tempaddr;
key=tempkey;
tempaddr=0;
tempkey=0;
}
}
else
{
TMOD&=0xf0;//设定时器0为定时方式
TMOD|=0x01;
TH0=0xf1;
TL0=0x9a;
cntint=0;
EX0=0;//关外部中断0
tempaddr=0;
tempkey=0;
}
}
void timer0(void) interrupt 1//定时器0中断,只有初始化时,空闲时和同步码到来时才中断 ??
{
//TMOD&=0xf0;//将定时器0的工作方式设为门控定时,用以检测脉宽。
TMOD|=0x09;
cntint=0;//外部中断0中断次数设为0
TH0=0;//设定时器0定时初值为0
TL0=0;
EX0=1;//允许外部中断0
IE0=0;//清除外部中断0标志
}
这是模拟PT2272解码的程序段
请问这个程序是如何确定同步码的?if((timecnt>80)&&(timecnt<600)&&(cntint<24)) 是这句吗?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
程序没整理有点乱,将就看吧
#include <config.h>
bit PT2272(uint HDa,uint LDa)
{static uchar Id;
static uint SMin,SMax,LMin,LMax,DMin,DMax;
static uint32 ChDa;
if(!Head)
{if(Up)
{DMin=HDa*29;//<<5-IntDa;
DMax=HDa*33;//<<5+UpDa;
SMin =HDa-Min;
SMax =HDa+Max;
LMin =(HDa<<1)+HDa-Min; //UpDa*3-Min;
LMax =(HDa<<1)+HDa+Max;
}
else
{if(Down)
{if(DMin<LDa&&DMax>LDa)
{Head=1;
Id=0;
RfDa=0;
}
else
Head=0;
}
}
}
else
{if(Up)
{if(HDa>SMin&&HDa<SMax) //短高脉冲
{RfDa+=0x01;
RfDa<<=1;
Id++;
}
else
{if(HDa>LMin&&HDa<LMax) //长高脉冲
{RfDa+=0x00;
RfDa<<=1;
Id++;
}
else
{Head=0;
return(0);
}
}
}
else
{if(Down)
{if(!(LDa>SMin||LDa>LMax))
{Head=0;
return(0);
}
}
}
if(Id>23)
{if(ChDa==RfDa)
{Head=0;
ChDa=0;
Id=0;
return(1);
}
else
{ChDa=RfDa;
Head=0;
RfDa=0;
Id=0;
return(0);
}
}
}
return(0);
}
/********************************信号中断********************************************/
void RFIn() interrupt 7
{if(CCF1)
{CR=0;
CL=CH=0;
CR=1;
if(RFin)
{((uchar *)&DownDa)[0]=CCAP1H; //低电平宽度
((uchar *)&DownDa)[1]=CCAP1L;
Down=1;
}
else
{((uchar *)&UpDa)[0]=CCAP1H; //高电平宽度
((uchar *)&UpDa)[1]=CCAP1L;
Up=1;
Down=0;
}
CCAP1L=CCAP1H=0;
}
CF=CCF0=CCF1=0;
}
一周热门 更多>