新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 1T-12T單片機中斷方式格力空調(diào)遙控器(YB0F2)解碼

1T-12T單片機中斷方式格力空調(diào)遙控器(YB0F2)解碼

作者: 時間:2016-11-25 來源:網(wǎng)絡(luò) 收藏
格力空調(diào)遙控器(YB0F2)解碼

CUP:STC89C52RC晶振:11.0569MHz
直接如串口輸出 波特率:57600
************************************ 說 明 **********************************************
解碼方式:
以一個9ms的低電平和4.5ms的高電平為引導(dǎo)碼,后跟35位二進制代碼接著0.565ms低電平和20MS高電平跟32位二進制代碼
前4個字節(jié)每個字節(jié)為8位,中間1個字節(jié)只有3位,接著為20MS高電平,跟后4個字節(jié)每個字節(jié)為8位
以低電平為0.565ms、高電平為0.56ms、 周期為1.125ms的組合表示"0";
以低電平為0.565ms、高電平為1.685ms、周期為2.25ms的組合表示"1"。
注意:經(jīng)過紅外接收頭解調(diào)后單片機接收到的高低電平是和遙控器發(fā)射時是相反的一個過程
*兼容1T-12T單片機中斷方式紅外接收數(shù)據(jù),并通過串口發(fā)送
程序編輯: lbq69147794022/07/2011

本文引用地址:http://butianyuan.cn/article/201611/321340.htm

#include
typedef unsigned char uint8;
sbit Ir_Pin = P3^2;
uint8 Ir_Buf[9]; //用于保存解碼結(jié)果

void int1_init(void)
{
IT0 = 1; //下降沿有效
EX0 = 1;
EA = 1;
}

void uart_init(void)
{
TMOD = 0x21;

SCON = 0x50;
PCON |= 0x80;
TH1 = 0xff; //57600bps @ 11.0592MHz
TL1 = 0xff;
TR1 = 1;
}


void UART_Send_Byte(uint8 dat)
{
SBUF = dat;
while (TI == 0);
TI = 0;
}

unsigned int Ir_Get_Low()
{
TL0 = 0;
TH0 = 0;
TR0 = 1;
while (!Ir_Pin && (TH0 & 0x80)==0);//一直計到Ir_Pin不等0與計到大于1.085*32768=35553.28us
TR0 = 0;
return (TH0 * 256 + TL0);//返回T1 高八位和低八位計數(shù)值
}

unsigned int Ir_Get_High()
{
TL0 = 0;
TH0 = 0;
TR0 = 1;
while (Ir_Pin && (TH0 & 0x80)==0);//一直計到Ir_Pin不等1與計到大于1.085*32768=35553.28us
TR0 = 0;
return (TH0 * 256 + TL0);//返回T1 高八位和低八位計數(shù)值
}

main()
{
uart_init();
int1_init();
while (1);
}

void int1_isr() interrupt 0
{
unsigned int temp;
char i,j;
temp = Ir_Get_Low();
if ((temp < 7833) || (temp > 8755)) //引導(dǎo)脈沖低電平8500~9500us
return;//不在這范圍則說明出錯//1.085*7833=8498us ~ 1.085*8755=9499us
temp = Ir_Get_High();
if ((temp < 3686) || (temp > 4608)) //引導(dǎo)脈沖高電平4000~5000us
return; //不在這范圍則說明出錯//1.085*3686=3999us ~ 1.085*4608=4999us

for (i = 0; i < 4; i++) //4個字節(jié)
{
for (j = 0; j < 8; j++) //每個字節(jié)8位
{
temp = Ir_Get_Low();
if ((temp < 184) || (temp > 737)) //200~800us
return;//不在這范圍則說明出錯//1.085*200=217us ~ 1.085*800=868us
temp = Ir_Get_High();
if ((temp < 184) || (temp > 1843)) //200~2000us
return;//不在這范圍則說明出錯//1.085*200=217us ~ 1.085*2000=2170us
Ir_Buf[i] >>= 1;//先將它自動補0
if (temp > 1032) //1120us//1.085*1032=1119us
Ir_Buf[i] |= 0x80;//如果大于1119us才將它設(shè)為1
}
}

for (i = 4; i <= 4; i++) //1個字節(jié)
{Ir_Buf[i] = 0;
for (j = 0; j < 3; j++) //每個字節(jié)8位
{
temp = Ir_Get_Low();
if ((temp < 184) || (temp > 737)) //200~800us
return;//不在這范圍則說明出錯//1.085*200 = 217us ~ 1.085*800 = 868us
temp = Ir_Get_High();
if ((temp < 184) || (temp > 1843)) //200~2000us
return;//不在這范圍則說明出錯//1.085*200 = 217us ~ 1.085*2000 = 2170us
Ir_Buf[i] <<= 1;//先將它自動補0
if (temp > 1032) //1120us//1.085*1032 = 1119us
Ir_Buf[i] |= 0x01;//如果大于1119us才將它設(shè)為1
}
}

//delay21ms();//實測波形只20ms但如果只延時20ms讀出會出錯故延時21ms
temp = Ir_Get_Low();
if ((temp < 184) || (temp > 737)) //200~800us
return;//不在這范圍則說明出錯//1.085*200 = 217us ~ 1.085*800 = 868us
temp = Ir_Get_High();
if ((temp < 17498) || (temp > 19354)) //19~21ms
return;//不在這范圍則說明出錯//1.085*17498 = 18985us ~ 1.085*19354 = 20999us

for (i = 5; i < 9; i++) //4個字節(jié)
{
for (j = 0; j < 8; j++) //每個字節(jié)8位
{
temp = Ir_Get_Low();
if ((temp < 184) || (temp > 737)) //200~800us
return;//不在這范圍則說明出錯//1.085*200 = 217us ~ 1.085*800 = 868us
temp = Ir_Get_High();
if ((temp < 184) || (temp > 1843)) //200~2000us
return;//不在這范圍則說明出錯//1.085*200 = 217us ~ 1.085*2000 = 2170us
Ir_Buf[i] >>= 1;//先將它自動補0
if (temp > 1032) //1120us//1.085*1032 = 1119us
Ir_Buf[i] |= 0x80;//如果大于1119us才將它設(shè)為1
}
}

for(i = 0;i < 9;i++) //通過串口將代碼發(fā)出
{
UART_Send_Byte(Ir_Buf[i]);//將9個字節(jié)的遙控鍵值通過串口輸出
}
}



評論


技術(shù)專區(qū)

關(guān)閉