//聲明:資源來自熱心分享的某大大。感謝他的分享。自個驗證其正確性
//自適應頻率的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; //糾正了LZ的高低位相反問題
}
// else if((l>1577)&&(l<1977)) //長為1 長1777
else if(((l>((m*3)-(m/2)))&&(l<((m*3)+(m/2)))))
{
i++;
ma1<<=1; //糾正了LZ的高低位相反問題
ma1+=1; //糾正了LZ的高低位相反問題
}
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;
}
|