遥控器的样子如上图
解出的键值分别是:关-0x01 摇头-0x10 定时-0x08 风类-0x04 开/风速-0x02 彩灯-0x43
源程序如下:
/************************************************
BA5104红外格式解码
Arzeng 2018.3
*************************************************/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
void display();
void delay(uchar i);
void zir();
uint tes,ird0,ird1;
uchar num,kx,irok;
uchar ircode[8];
sbit ir=P3^3; //HS0038接收头OUT端直接连P3.2(INT0)
void Int1() interrupt 2
{
if(!kx)
{
tes=TH0*256+TL0; //提取中断时间间隔时长
TH0=0;
TL0=0;
ET0=0;
TR0=1; //定时中断重新置零
if((tes>7000)&&(tes<8200))
{
kx=1;
}
}
if(!irok&&kx)
{
TH0=0xfc;
TL0=0xf1;
TR0=1;
ET0=1;
}
}
void t0()interrupt 1//定时器0中断
{
TR0=0;
ird0=(ird0<<1)|!ir;
num++;
if(num>11)
{
irok=1;
zir();
}
}
void zir()
{
//uchar k;
if(ird0<<4==ird1<<4)
{
//for(k=0;k<8;k++){ircode[k]=ird0>>(7+4-k)&0x01;}//ird0>>(7-k)&0x01;} //二进制显示12-5位
//for(k=0;k<8;k++){ircode[k]=ird0>>(7-k)&0x01;}//ird0>>(7-k)&0x01;} //二进制显示低8位
ircode[0]=(ird0>>9&0x07)>>4;
ircode[1]=(ird0>>9&0x07)&0x0f;
ircode[2]=(ird0>>7&0x03)>>4;
ircode[3]=(ird0>>7&0x03)&0x0f;
ircode[6]=(ird0&0x7f)>>4;
ircode[7]=(ird0&0x7f)&0x0f;
}
else
{
ird1=ird0;
}
num=kx=irok=0;
TR0=0;
ET0=0;
}
void main()
{
EA=1;
IT1=1;
EX1=1;
TMOD=0x11;
TH0=0x00;
TL0=0x00;
TR0=0;
ET0=0;
while(1)
{
display();
}
}
void delay(uchar i)
{
uchar j,k;
for(j=i; j>0; j--)
for(k=125; k>0; k--)
{
;
}
}
sbit dula=P2^6;
sbit wela=P2^7;
sbit laba=P2^2;
void display()
{
uchar a;
uchar dis[8];
uchar code table[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
for(a=0; a<8; a++)
{
dis[a]=ircode[a];
}
for(a=0; a<8; a++)
{
dula=0;
P0=table[dis[a]]; //送出要点亮的段
dula=1;
dula=0;
wela=0;
P0=~(0x01<<a); //依次点亮八个位
wela=1;
wela=0;
delay(5);
}
}