自制格力空调遥控器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 ++;
}