📄 ir_decode.c
字号:
/*******************************************************************/
/* 数码管显 */
/* */
/*******************************************************************/
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
void delay(uchar x); //x*0.14MS
void delay1(int ms);
void beep();
sbit IRIN = P3^2; //红外接收器数据线
sbit BEEP = P3^7; //蜂鸣器驱动线
sbit RELAY= P3^6; //继电器驱动线
uchar IRCOM[]={0x00,0x00,0x00,0x00,0x10,0x10};
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, //0,1,2,3,4,5,6,7
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};//8,9,A,B,C,D,E,F,-
/*******************************************************************
显示函数
*******************************************************************/
void play()
{
P0=(table[IRCOM[4]]);
P2=0x7f;
delay1(1);
P0=(table[IRCOM[5]]);
P2=0xbf;
delay1(1);
P2=0xff;
delay1(1);
}
/*******************************************************************
主函数
*******************************************************************/
main()
{
IE = 0x81; //允许总中断中断,使能 INT0 外部中断
TCON = 0x01; //触发方式为脉冲负边沿触发
IRIN=1; //I/O口初始化
BEEP=1;
RELAY=1;
P0=0xff;
P2=0xff;
play();
while(1)
{
if(IRCOM[2]==0x1d) //UP键
RELAY=0; //继电器吸合
if(IRCOM[2]==0x12) //DOWN键
RELAY=1; //继电器关闭
play(); //显示
}
} //end main
/**********************************************************/
void IR_IN() interrupt 0 //using 0
{
unsigned char j,k,N=0;
EX0 = 0;
delay(15);
if (IRIN==1)
{ EX0 =1;
return;
}
//确认IR信号出现
while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
{delay(1);}
for (j=0;j<4;j++) //收集四组数据
{
for (k=0;k<8;k++) //每组数据有8位
{
while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
{delay(1);}
while (!IRIN) //等 IR 变为高电平
{delay(1);}
while (IRIN) //计算IR高电平时长
{
delay(1);
N++;
if (N>=30)
{ EX0=1;
return;} //0.14ms计数过长自动离开。
} //高电平计数完毕
IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0”
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“1”
N=0;
}//end for k
}//end for j
if (IRCOM[2]!=~IRCOM[3]) //接收时间是否正确
{
EX0=1;
return;
}
if(IRCOM[0]!=0x00) //比较用户码
{
EX0=1;
return;
}
IRCOM[4]=IRCOM[2] & 0x0F; //取键码的低四位
IRCOM[5]=IRCOM[2] >> 4; //右移4次,高四位变为低四位
play();
beep();
EX0 = 1;
}
/**********************************************************/
void beep()
{
unsigned char i;
for (i=0;i<180;i++)
{
delay(6);
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //关闭蜂鸣器
}
/**********************************************************/
void delay(unsigned char x) //x*0.14MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}
/**********************************************************/
void delay1(int ms)
{
unsigned char y;
while(ms--)
{
for(y = 0; y<250; y++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*
;================================
;DT9122D 遥控器
;****** 红外遥控器键值表 ******
; 10 03 01 06
; 09 1D 1F 0D
; 19 1B 11 15
; 17 12 16 4C
; 40 48 04 00
; 02 05 54 4D
; 0A 1E 0E 1A
; 1C 14 0F 0C
;================================
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -