📄 ir_decode.c
字号:
/************************************************
ir_decode.c
遥控解码子程序
采用外部中断0
************************************************/
#include "STC12C2052AD.H"
#include "config.h"
#include "ir_decode.h"
#ifdef CX_12M //值已确定
#define IR_HEAD_UP 13750
#define IR_HEAD_DOWN 13250
#define IR_REPEAT_UP 11500
#define IR_REPEAT_DOWN 11000
#define IR_CODE_0_UP 1375
#define IR_CODE_0_DOWN 875
#define IR_CODE_1_UP 2500
#define IR_CODE_1_DOWN 2000
#endif
#ifdef CX_16M //值已确定
#define IR_HEAD_UP 18334
#define IR_HEAD_DOWN 17666
#define IR_REPEAT_UP 15334
#define IR_REPEAT_DOWN 14666
#define IR_CODE_0_UP 1834
#define IR_CODE_0_DOWN 1166
#define IR_CODE_1_UP 3334
#define IR_CODE_1_DOWN 2666
#endif
#ifdef CX_8M //值已确定
#define IR_HEAD_UP 9167
#define IR_HEAD_DOWN 8833
#define IR_REPEAT_UP 7667
#define IR_REPEAT_DOWN 7333
#define IR_CODE_0_UP 917
#define IR_CODE_0_DOWN 583
#define IR_CODE_1_UP 1667
#define IR_CODE_1_DOWN 1333
#endif
#ifdef CX_11_059M //值已确定
#define IR_HEAD_UP 12672
#define IR_HEAD_DOWN 12211
#define IR_REPEAT_UP 10598
#define IR_REPEAT_DOWN 10137
#define IR_CODE_0_UP 1267
#define IR_CODE_0_DOWN 806
#define IR_CODE_1_UP 2304
#define IR_CODE_1_DOWN 1843
#endif
#ifdef CX_18_432M //值已确定
#define IR_HEAD_UP 21120
#define IR_HEAD_DOWN 20352
#define IR_REPEAT_UP 17664
#define IR_REPEAT_DOWN 16896
#define IR_CODE_0_UP 2112
#define IR_CODE_0_DOWN 1344
#define IR_CODE_1_UP 3840
#define IR_CODE_1_DOWN 3072
#endif
static u8 Ir_Count = 0;
static union Ir_Pulse//联合
{
u8 Width8[2];
u16 Width16;
}IrPulse;
union ir_Code IR;
u8 IR_Code = 0;
bit IR_Repeat = 0;
bit IR_Enable = 0;
/***********************************************
功能:外部中断0
描述:外部中断0服务程序,用做红外遥控捕获解码
参数:无
返回:无
***********************************************/
void Exter0_Int() interrupt 0 using 1
{
IrPulse.Width8[0] = TH1;
IrPulse.Width8[1] = TL1;
TL1 = 0;
TH1 = 0;//清零,让其重新计时
//////////////////////////////////////////////////
if(Ir_Count > 32)
{
Ir_Count = 0;
return; //遥控第一次下降沿中断
}
//////////////////////////////////////////////////
if(Ir_Count == 0)
{
if((IrPulse.Width16 > (IR_HEAD_DOWN)) && (IrPulse.Width16 < (IR_HEAD_UP)))
{
Ir_Count++;
}
else if((IrPulse.Width16 > (IR_REPEAT_DOWN)) && (IrPulse.Width16 < (IR_REPEAT_UP)))
{
IR_Enable = 1;
IR_Repeat = 1;
}
else Ir_Count = 0; //不是正确的遥控头码
return; //退出中断
}
//////////////////////////////////////////////////
else
{
IR.Data32 >>= 1;
if((IrPulse.Width16 > (IR_CODE_0_DOWN)) && (IrPulse.Width16 < (IR_CODE_0_UP)));//读到0
else if((IrPulse.Width16 > (IR_CODE_1_DOWN)) && (IrPulse.Width16 < (IR_CODE_1_UP)))//读到1
{
IR.Data8[0] |= 0x80; //比ir.data32 |= 0x8000省17个字节
}
else
{
Ir_Count = 33; //错误
}
if(Ir_Count == 32)Ir_Succeed();
Ir_Count++;
return; //读到0或1退出中断
}
}
/***********************************************
功能:定时中断1
描述:用作测量红外遥控宽度
参数:无
返回:无
***********************************************/
void Timer1_Int(void) interrupt 3 //using 3
{
Ir_Count = 33; //错误退出
}
/***********************************************
功能:成功收获到红外遥控
描述:
参数:无
返回:无
***********************************************/
void Ir_Succeed(void)
{
// if(IR_SYSCODE1 == IR.Data8[3]) && (IR_SYSCODE2 == IR.Data8[2]))
{
// if(IR.Data8[0] == ~IR.Data8[1])
{
IR_Code = IR.Data8[1];
IR_Enable = 1;
IR_Repeat = 0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -