//自适应频率的2262解码代码 晶振11.0592到22.1184MHZ
#include"AT89x52.h"
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit shou = P3^2;
//=========================================================================
void InitTimer0(void)
{
TMOD = 0x11; //定时器1,定时器0用模式1 16位计时用,12T
EA = 1;
ET0 = 1;
ET1=1;
}
//========================================================================
void main(void)
{
InitTimer0();
EX0=1;
while(1);
}
//========================================================================
void ex0(void) interrupt 0
{
bit err=0;
uchar i,tl,th,ma1,ma2,ma3;
uchar TimeCount;
uint l,m;
EX0=0;
TR1=1;
i=0;
if(TimeCount>0)//当按键按下释放后该值不在赋值就同通过递减直到该值等于0
{
TimeCount--;//等于0后表示按键释放
}
while(shou==0);
while(i<24)
{
while(shou==0); //等待高电平到来
tl=TL1;
th=TH1;
TH1=TL1=0; //记录低电平长度并初始化高电平头
l=th;
l=((l<<8)+tl);
if(i==0) //处理低电平
{
if(l>2360)
{ //确认是引导头
m=l/31;
}
else //不符合规则(出错)
{
i=0;
TR1=0;
TH1=TL1=0;
err=1;
break;
}
}
else
{
if(((l>(m-(m/4)))&&(l<(m+(m/4))))||((l>((m*3)-(m/2)))&&(l<((m*3)+(m/2)))));
else
{
i=0;
TR1=0;
TH1=TL1=0;
err=1;
break;
}
}
while(shou==1); //等待低电平到来
th=TH1;
tl=TL1;
TH1=TL1=0;
l=th;
l=((l<<8)+tl);
// if((l>460)&&(l<760)) //短为0 短610
if(((l>(m-(m/4)))&&(l<(m+(m/4)))))
{
i++;
ma1>>=1;
}
// else if((l>1577)&&(l<1977)) //长为1 长1777
else if(((l>((m*3)-(m/2)))&&(l<((m*3)+(m/2)))))
{
i++;
ma1>>=1;
ma1+=128;
}
else //不符合规则出错
{
i=0;
TR1=0;
TH1=TL1=0;
err=1;
break;
}
if(i==8)
{
ma3=ma1;
//SBUF=ma3;
//P1=ma3;
}
if(i==16)
{
ma2=ma1;
//SBUF=ma2;
//P1=ma2;
}
if(i==24)////解码成功结束
{
if(TimeCount==0)//为0表示是新的一次按下对其进行处理,如过该值大于0表示已经按下不在处理
{
ACC=ma1;
if(ACC==0xC0)
//P1=0xef;
P1_0=~P1_0;
if(ACC==0x30)
//P1=0xdf;
P1_1=~P1_1;
if(ACC==0x0c)
//P1=0xbf;
P1_2=~P1_2;
if(ACC==0x03)
//P0=0x7f;
P1_3=~P1_3;
}
TimeCount=30;//防止按键没放开直在取反,保证按1次只做1次处理
}
}
TR1=0;
TH1=0;
TL1=0;
EX0=1;
} |