您的位置 首页 培训

1T-12T单片机中止方法格力空调遥控器(YB0F2)解码

格力空调遥控器(YB0F2)解码CUP:STC89C52RC晶振:110569MHz直接如串口输出波特率:57600************************************说明

格力空调遥控器(YB0F2)解码

CUP:STC89C52RC晶振:11.0569MHz
直接如串口输出 波特率:57600
************************************ 说 明 **********************************************
解码方法:
以一个9ms的低电平和4.5ms的高电平为引导码,后跟35位二进制代码接着0.565ms低电平和20MS高电平跟32位二进制代码
前4个字节每个字节为8位,中心1个字节只要3位,接着为20MS高电平,跟后4个字节每个字节为8位
以低电平为0.565ms、高电平为0.56ms、 周期为1.125ms的组合表明”0″;
以低电平为0.565ms、高电平为1.685ms、周期为2.25ms的组合表明”1″。
留意:经过红外接纳头解调后单片机接纳到的凹凸电平是和遥控器发射时是相反的一个进程
*兼容1T-12T单片机中止方法红外接纳数据,并经过串口发送
程序修改: lbq69147794022/07/2011

#include
typedef unsigned char uint8;
sbit Ir_Pin = P3^2;
uint8 Ir_Buf[9]; //用于保存解码成果

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 高八位和低八位计数值
}

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 高八位和低八位计数值
}

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)) //引导脉冲低电平8500~9500us
return;//不在这规模则阐明犯错//1.085*7833=8498us ~ 1.085*8755=9499us
temp = Ir_Get_High();
if ((temp < 3686) || (temp > 4608)) //引导脉冲高电平4000~5000us
return; //不在这规模则阐明犯错//1.085*3686=3999us ~ 1.085*4608=4999us

for (i = 0; i < 4; i++) //4个字节
{
for (j = 0; j < 8; j++) //每个字节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才将它设为1
}
}

for (i = 4; i <= 4; i++) //1个字节
{Ir_Buf[i] = 0;
for (j = 0; j < 3; j++) //每个字节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才将它设为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个字节
{
for (j = 0; j < 8; j++) //每个字节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才将它设为1
}
}

for(i = 0;i < 9;i++) //经过串口将代码宣布
{
UART_Send_Byte(Ir_Buf[i]);//将9个字节的遥控键值经过串口输出
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/peixun/259225.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部