自制格力空调遥控器YB0F2按键码



自制格力空调遥控器YB0F2按键码

自制格力空调遥控器YB0F2按键码
============================================================================================================
接收方一般使用TL0038一体化红外线接收器进行接收解码,当TL0038接收到38kHz红外信号时,输出端输出低电平,否则
为高电平.所以红外遥控器发送红外信号时,在低电平处发送38kHz红外信号,高电平处则不发送红外信号。
功能:
P3.3接SW1按键 上电默认为P1.6口LED闪烁,当按动SW1时由P1.0~P1.5循环点亮,再按SW1变为P1.6口LED闪烁。
P3.4接SW2按键 按 SW2一次发射一次、23度、制冷、风速=自动、健康、照明开、自动上下扫风、节能——开机。
   及恢复P1.6口LED闪烁(即不控制自动开、关)。
P3.5接SW3按键 按 SW3一次发射一次、23度、制冷、风速=自动、健康、照明开、自动上下扫风、节能——关机。

P1.0 = LED1: 点亮时表示、28度、制冷、风速=自动、健康、照明开、自动上下扫风、节能——以1小时开半小时关循环。
P1.1 = LED2: 点亮时表示、27度、制冷、风速=自动、健康、照明开、自动上下扫风、节能——以1小时开半小时关循环。
P1.2 = LED3: 点亮时表示、26度、制冷、风速=自动、健康、照明开、自动上下扫风、节能——以1小时开半小时关循环。
P1.3 = LED4: 点亮时表示、25度、制冷、风速=自动、健康、照明开、自动上下扫风、节能——以1小时开半小时关循环。
P1.4 = LED5: 点亮时表示、24度、制冷、风速=自动、健康、照明开、自动上下扫风、节能——以1小时开半小时关循环。
P1.5 = LED6: 点亮时表示、23度、制冷、风速=自动、健康、照明开、自动上下扫风、节能——以1小时开半小时关循环。
P1.6 = LED7: 闪亮时表示、不控制自动开、关。

CPU:AT89C2051系列 STC89C51系列   晶振22.1184M P1.7为遥控OUT 通过PNP三极管驱动红外线发射管

作者:LBQ QQ:691477940  09/07/2011      21:15      E-mail:lbq691477940@126.com

升级记录:

 1.增加按SW3按键后会恢复P1.6口LED闪烁(即不控制自动开、关。)22/07/2011     19:36

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
bit irout;    //红外管状态
sbit ir = P1^7;   //红外发射管控制脚,发射管正极与VCC相接负极经电阻与P1.7相接
uint count, set_count; //中断计数,设定中断次数
bit flag,keyflag;  //红外发送标志=1时发送0,按键标志位
#define hi   110; //发送编码中的1.69ms高电平1
#define low  34;  //发送编码中的0.56ms低电平0//34
#define low1  28;  //发送编码中的0.565ms低电平0
sbit  sw1 = P3^3;
sbit  sw2 = P3^4;
sbit  sw3 = P3^5;
sbit led1 = P1^0;
sbit led2 = P1^1;
sbit led3 = P1^2;
sbit led4 = P1^3;
sbit led5 = P1^4;
sbit led6 = P1^5;
sbit led7 = P1^6;
uchar code irsys0[9]={0×41,0x0C,0×20,0×50,0X02,0X01,0X20,0X00,0X94};//28度/制冷、风速=自动/健康/照明开/上下扫风/节能/开->关,第五个只有三位
uchar code irsys1[9]={0×49,0x0C,0×60,0×50,0X02,0X01,0X20,0X00,0X14};//28度/制冷、风速=自动/健康/照明开/上下扫风/节能/关->开,第五个只有三位
uchar code irsys2[9]={0×41,0x0B,0×20,0×50,0X02,0X01,0X20,0X00,0X84};//27度/制冷、风速=自动/健康/照明开/上下扫风/节能/开->关,第五个只有三位
uchar code irsys3[9]={0×49,0x0B,0×60,0×50,0X02,0X01,0X20,0X00,0X04};//27度/制冷、风速=自动/健康/照明开/上下扫风/节能/关->开,第五个只有三位
uchar code irsys4[9]={0×41,0x0A,0×20,0×50,0X02,0X01,0X20,0X00,0X74};//26度/制冷、风速=自动/健康/照明开/上下扫风/节能/开->关,第五个只有三位
uchar code irsys5[9]={0×49,0x0A,0×60,0×50,0X02,0X01,0X20,0X00,0XF4};//26度/制冷、风速=自动/健康/照明开/上下扫风/节能/关->开,第五个只有三位
uchar code irsys6[9]={0×41,0×09,0×20,0×50,0X02,0X01,0X20,0X00,0X64};//25度/制冷、风速=自动/健康/照明开/上下扫风/节能/开->关,第五个只有三位
uchar code irsys7[9]={0×49,0×09,0×60,0×50,0X02,0X01,0X20,0X00,0XE4};//25度/制冷、风速=自动/健康/照明开/上下扫风/节能/关->开,第五个只有三位
uchar code irsys8[9]={0×41,0×08,0×20,0×50,0X02,0X01,0X20,0X00,0X54};//24度/制冷、风速=自动/健康/照明开/上下扫风/节能/开->关,第五个只有三位
uchar code irsys9[9]={0×49,0×08,0×60,0×50,0X02,0X01,0X20,0X00,0XD4};//24度/制冷、风速=自动/健康/照明开/上下扫风/节能/关->开,第五个只有三位
uchar code irsysA[9]={0×41,0×07,0×20,0×50,0X02,0X01,0X20,0X00,0X44};//23度/制冷、风速=自动/健康/照明开/上下扫风/节能/开->关,第五个只有三位
uchar code irsysB[9]={0×49,0×07,0×60,0×50,0X02,0X01,0X20,0X00,0XC4};//23度/制冷、风速=自动/健康/照明开/上下扫风/节能/关->开,第五个只有三位
uchar ircode,irdata,num; 

void delay(uint z)//延时1ms,晶振22.1184M
{
uint x,y;
for(x =z ;x > 0;x–)
 for(y = 228;y > 0;y–);  //11.0592MHZ时为y=110
}

void sendcode_8(void)
{
uchar i;
for(i = 0;i < 8;i++)
{
 TH0 = 0xE8;  //定时13us,0.013ms,38K红外波,晶振22.1184
 TL0 = 0xE8;
 set_count = low;//设定中断次数,发送0.56ms  38k红外波(编码中的0.56ms低电平)
 flag = 1;    //红外发送标志
 count = 0;    //中断计数
 TR0 = 1;    //启动定时器0
 while(count < set_count);
 TR0 = 0;   //关闭定时器0
 if(ircode & 0×01)//判断红外编码最低位,1宽的高电平,0窄的高电平
 {
  set_count = hi; //设定中断次数
 }
 else
 {
  set_count = low1; //设定中断次数
 }
 flag = 0;  //红外发送标志
 count = 0;  //中断计数
 TH0 = 0xE8;  //定时13us,0.013ms,38K红外波,晶振22.1184
 TL0 = 0xE8;
 TR0 = 1;  //启动定时器0
 while(count < set_count);
 TR0 = 0;
 ircode = ircode >> 1;
}
}

void sendcode_3(void)//前35位
{
uchar i;
for(i = 0;i < 3;i++)

 TH0 = 0xE8;  //定时13us,0.013ms,38K红外波,晶振22.1184
 TL0 = 0xE8;
 set_count = low;//设定中断次数,发送0.56ms  38k红外波(编码中的0.56ms低电平)
 flag = 1;    //红外发送标志
 count = 0;    //中断计数
 TR0 = 1;    //启动定时器0
 while(count < set_count);
 TR0 = 0;  //关闭定时器0
 if(ircode & 0×01)
 {
  set_count = hi; //设定中断次数
 }
 else
 {
  set_count = low1;//设定中断次数
 }
 flag = 0;  //红外发送标志=0
 count = 0;  //中断计数=0
 TH0 = 0xE8;  //定时13us,0.013ms,38K红外波,晶振22.1184
 TL0 = 0xE8;
 TR0 = 1;  //启动定时器0
 while(count < set_count);
 TR0 = 0;    //关闭定时器0
 ircode = ircode >> 1;
}
}


void timer0(void) interrupt 1
{
count++;
if(flag == 1)  //如果红外发送标志=1
{
 irout = ~irout; //红外管状态=取反后的红外管状态
    //这里可以改为=0不取反另用ne555产生38K信号与p1.7口的信号相与后接IR
else
{
 irout = 1;  //红外管状态=1
}
ir = irout;   //红外发射管控制脚=红外管状态
}

void sendcode(unsigned char *array)
{

ET1 = 0;
TH0 = 0xE8;   //定时13us,0.013ms,38K红外波,晶振22.1184
TL0 = 0xE8;
set_count = 600; //设定中断次数,发送9ms 38K红外光
flag = 1;     //红外发送标志=1
count = 0;     //中断计数=0
TR0 = 1;     //启动定时器0
while(count < set_count);
TR0 = 0;    //关闭定时器0

set_count = 317;//设定中断次数,间隔4.5ms//317
flag = 0;    //红外发送标志
count = 0;   //中断计数
TR0 = 1;    //启动定时器0
while(count < set_count);
TR0 = 0;    //关闭定时器0

ircode = array[0];//发送前1-8位
sendcode_8(); 
ircode = array[1];//发送前9-16位
sendcode_8();
ircode = array[2];//发送前17-24位
sendcode_8();
ircode = array[3];//发送前25-32位
sendcode_8();
ircode = array[4];//发送前33-35位
sendcode_3();

set_count = low;//发送0.56ms  38k红外波(编码中的0.56ms低电平)
flag = 1;   //红外发送标志=1
count = 0;   //中断计数=0
TR0 = 1;   //启动定时器0
while(count<set_count);
TR0 = 0;  //关闭定时器0
ir = 1;   //红外发射管控制脚=1

delay(20); //延时20ms(编码中的20ms高电平)

ircode = array[5];//发送后1-8位
sendcode_8();
ircode = array[6]; //发送后9-16位
sendcode_8();
ircode = array[7];//发送后17-24位
sendcode_8();
ircode = array[8]; //发送后25-32位
sendcode_8();

set_count = low;//设定中断次数,发送0.56ms  38k红外波(编码中的0.56ms低电平)
flag = 1;   //红外发送标志
count = 0;   //中断计数
TR0 = 1;    //启动定时器0
while(count<set_count);
TR0 = 0;    //关闭定时器0
ir = 1;   //红外发射管控制脚=1
ET1 = 1;
}

void init_timer()
{
EA = 1;
TMOD = 0×12;//定时器0方式2即8位自动重载模式/定时器1为工作方式1(0001 0010)
ET0 = 1;
TH0 = 0xE8;//定时13us,0.013ms,38K红外波,晶振22.1184
TL0 = 0xE8;
ET1 = 1;
TH1 = (65536-46080)/256; //22.1184MHZ 约为 25MS
TL1 = (65536-46080)%6;
TR1 = 1;
}

void main(void)
{
uchar send,sww;
uint num1;
init_timer();
count = 0;    //中断计数
flag = 0;  //红外发送标志
irout = 1;    //红外管状态=1
send = 0;
sww = 0;
P1 = 0XFF;
while(1)
{
  
 if(sw1 == 0) //P3.3接SW1按键温度选择
 {
  delay(10);
  if(sw1 == 0)
  {
   sww++;
   num = 0;
   num1 = 0;
   if(sww >= 7)
   {
    sww = 0;
    P1 |= 0x7f;//让p1.6-p1.0 = 1
   }
  }
  while(!sw1);   
 }

  
 if(sw2 == 0) //P3.4接SW2按键 23度开
 {
  delay(10);
  if(sw2 == 0)
  {
   sendcode(irsysA);//发23度/制冷、风速=自动/健康/照明开/上下扫风/开->关
   sww = 0;  //恢复P1.6口LED闪烁(即不控制自动开、关。)
   P1 |= 0x7f;  //让p1.6-p1.0 = 1
  }
  while(!sw2);   
 }

  
 if(sw3 == 0) //P3.5接SW3按键 23度关
 {
  delay(10);
  if(sw3 == 0)
  {
   sendcode(irsysB);//发23度/制冷、风速=自动/健康/照明开/上下扫风/节能/关->开
  }
  while(!sw3);   
 }

 switch(sww)
 {
  case 0:
        
    break;
   }
  case 1:
        
    P1  |= 0x7f;//让p1.6-p1.0 = 1
    led1 = 0;
    break;
   }
  case 2:
   {
    P1  |= 0x7f;//让p1.6-p1.0 = 1
    led2 = 0;
    break;
   }
  case 3:
   {
    P1  |= 0x7f;//让p1.6-p1.0 = 1
    led3 = 0;
    break;
   
  case 4:
   {
    P1  |= 0x7f;//让p1.6-p1.0 = 1
    led4 = 0;
    break;
   }
  case 5:
   {
    P1  |= 0x7f;//让p1.6-p1.0 = 1
    led5 = 0;
    break;
   }
  case 6:
   {
    P1  |= 0x7f;//让p1.6-p1.0 = 1
    led6 = 0;
    break;
   
 }

 if(sww != 0)
 {
  if(num == 200)//0.025 * 200 = 5s
  {
   num = 0;
   num1++;
  }
  if(num1 == 360) //5s * 360 = 1800s = 0.5H
  {
   num1 = 0;
   send++;
   if(send > 2)
   {
    send = 0;
   }
   switch(send)
   {
    case 0:
    //sww = 0不发射
     if(sww == 1)
     {
      sendcode(irsys1);//28度/制冷、风速=自动/健康/照明开/上下扫风/节能/关->开
     }
     if(sww == 2)
     {
      sendcode(irsys3);//27度/制冷、风速=自动/健康/照明开/上下扫风/节能/关->开
     }
     if(sww == 3)
     {
      sendcode(irsys5);//26度/制冷、风速=自动/健康/照明开/上下扫风/节能/关->开
     }
     if(sww == 4)
     {
      sendcode(irsys7);//25度/制冷、风速=自动/健康/照明开/上下扫风/节能/关->开
     }
     if(sww == 5)
     {
      sendcode(irsys9);//24度/制冷、风速=自动/健康/照明开/上下扫风/节能/关->开
     }
     if(sww == 6)
     {
      sendcode(irsysA);//23度/制冷、风速=自动/健康/照明开/上下扫风/节能/关->开
     }
     break;
    
    case 2:
    //sww = 0不发射
     if(sww == 1)
     {
      sendcode(irsys0);//28度/制冷、风速=自动/健康/照明开/上下扫风/开->关
     }
     if(sww == 2)
     {
      sendcode(irsys2);//27度/制冷、风速=自动/健康/照明开/上下扫风/开->关
     }
     if(sww == 3)
     {
      sendcode(irsys4);//26度/制冷、风速=自动/健康/照明开/上下扫风/开->关
     }
     if(sww == 4)
     {
      sendcode(irsys6);//25度/制冷、风速=自动/健康/照明开/上下扫风/开->关
     }
     if(sww == 5)
     {
      sendcode(irsys8);//24度/制冷、风速=自动/健康/照明开/上下扫风/开->关
     }
     if(sww == 6)
     {
      sendcode(irsysB);//23度/制冷、风速=自动/健康/照明开/上下扫风/开->关
     }
     break;
    }
    
  
 }
 else
 {
  if((sww == 0)&&(num == 10))//0.025 * 10 = 0.25s
  {
   num = 0;
   led7 = ~led7;
  }
 }
}
}

void timer1(void) interrupt 3
{
TH1 = (65536-46080)/256; //22.1184MHZ 约为 25MS=0.025s
TL1 = (65536-46080)%6;
num ++;
}