⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ir_decode.c

📁 很精筒的NEC红外遥控解码子程序
💻 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 + -