×
嵌入式 > 技术百科 > 详情

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

发布时间:2020-06-16 发布时间:
|
      格力空调遥控器(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单片机中断方式红外接收数据,并通过串口发送
程序编辑: lbq691477940         22/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个字节的遥控键值通过串口输出
  }
}




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
示波器使用时要注意的19个问题