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

📄 necdecode.txt

📁 红外遥控NEC制式解码软件,已测试很稳定
💻 TXT
字号:
#include "REG2051.h"
#include <intrins.h>
#include "M62429.h"

#define  uchar unsigned char


unsigned char dataIR[4];


uchar  data  flag;      //控制进程标志
unsigned char ir_repeat;//重复按键识别
bit ir_repeat_Flag = 0;
bit iR_Rec_Succ = 0;
uchar  data  count;
unsigned char ir_data;

#define POWER	0x02
#define MODE	0x01

bit    flagTX;          //接收缓冲满标志

sbit   MUTE_PIN = P3^7;
sbit   Mode_Led = P1^3;

bit    Chang_Led_Flag = 0;
sbit Blue_Led = P1^6;
sbit Green_Led = P1^7;
sbit Red_Led = P1^5;
long int Music_Flag = 0;


// define not used interrupt, so generate "reti" in their entrance
unsigned char     iVolumeVal = 15;
#define IR_VOL_ADD	0xf9
#define IR_VOL_SUB	0xfe
#define IR_POWER    0xef
#define IR_SLEEP	0xee
#define IR_MODE		0xed
#define IR_FIX_MODE 0xfc


void intitimer()
{
	  TMOD |= 0x20;                      //T1工作在外部计数器,方式1。 T0工作在内部定时器,方式2
	  TH1  = 0x9b;                      /* 定时器0赋予初值    500uS      */
	  IT0  = 1;                        /* 外部中断1, 下降沿触发    */
	  IT1  = 1;
	  EX0  = 1;                        /* 外部中断1, 允许          */
	  ET1  = 1;                        /* 定时器0中断, 允许        */
	  EX1 = 1;	
	  ES    = 0;                        /* 串行口中断, 允许        */
	  TR1  = 1;                        /* 定时器0, 启动            */
	  //PT1 = 1;
	  //PX1 = 0;
	  EA    = 1;                        /* 总中断, 允许            */
}

unsigned char iFixMode = 0;
unsigned char iIrInStopLed = 0;
unsigned char iIrInStopFlag = 0;
unsigned char iMode = 0;
int i100us = 0;
////////////////////////////////////////////
void ext0_isr(void) interrupt 0 using 1
{
	unsigned char i=0;
	unsigned char width;
	EX0 = 0;
	///////////////////////////////////////////////////////////////////////////////////////////
	width = 0x00;
	/****常规状态下INT1为高电平,由高电平跳变为低电平时(即下降沿)产生中断****/
	// 引导信号:9ms低电平
	//	i100us_C = i100us;
	while(!INT0) /***计算引导电平的宽度***/
	{
		delay_100us();
		width++;
	}
	if (width < 80)   /* 8ms=80*100us 如果不到8ms视为干扰信号 */
	{
	  EX0 = 1;
	  return;
	}
	// 计算4.5ms低电平宽度  
	width = 0x00;
	while(INT0)  /* Wait for boot signal 4.5ms high-level */
	{
		delay_100us();
		width++;
	}
	
	/* 判断是否是重复信号 2.5ms */
	if (width < 30)  /* 3ms=30*100us 如果不到3ms即视为2.5ms重复信号 */
	{
		ir_repeat++;
		if(ir_repeat>4)
		{
			ir_repeat = 0;
			ir_repeat_Flag = 1;
		//	Green_Led = 1;
		}
	  	EX0 = 1;
		return;
	}
	ir_repeat = 0;
	/* Receive new_press */
	// 4.5ms新键码引导电平
	 if (width < 40)   /* 4ms=40*100us 如果不到4ms视为错误信号,放弃接收 */
	 {
	      EX0 = 1;
		  return;
	 }
	
	// 至此,引导码已校验,以下接收地址码和数据码,一共32位 
	 while(i++ < 32)   /* receive 32bits */
	 {
		  while(!INT0);  /* Wait for 0.5625ms low-level passed  */
		  width = 0x00;
		  while(INT0)  /* Wait for data signal high-level "1" 1680us; "0" 560us */ 
		  {  
				delay_100us();
				width++;
		  }
		  ir_data >>= 1;
		  if (width > 0x08) /* identify "1" or "0" */
		   ir_data |= 0x80; 
		  if (i==8)    /* note IR_receive data */
		   dataIR[0] = ir_data;
		  if (i==16)
		   dataIR[1] = ir_data;
		  if (i==24)
		   dataIR[2] = ir_data;
		  if (i==32)
		   dataIR[3] = ir_data;  
	 }
	 if (dataIR[2] != ~dataIR[3])  // 纠错较验
	 {
		  EX0 = 1;
		  flagTX = 0;
		  return;
	 }
	 flagTX = 1;
	 EX0 = 1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -