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

📄 rs_main.c

📁 51单片机红外线遥控器解码源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
		case	0x10:									/*	重复按键译码*/
		case	0x11:
		case	0x12:	if(( RS_High == 0 ) && ( RS_Index == 50 ))
							RS_Index ++;
						else
							RS_Index = 0;
						break;
					
		case	0x21:									/*	帧头搜索*/
		case	0x22:
		case	0x23:	if( RS_High == 0 )
							RS_Index = 1;
						else
							RS_Index = 0;
						break;
					
		case	0x37:									/*	帧尾搜索*/
		case	0x38:
		case	0x39:	Error_Flag = 1;
						if(( RS_Index == 33 ) && ( RS_High == 1 ))
							if(( RS_CODE.KEY[0] == 0x1E ) && ( RS_CODE.KEY[1] == 0xE1 ))
								if(( RS_CODE.KEY[2] ^ RS_CODE.KEY[3] ) == 0xFF )
								{
									KEY_DECODE = RS_CODE.KEY[3];
									RS_Index = 50;		/*	数据帧尾结束*/
									KEY_DECODE_OK = 1;
									Error_Flag = 0;
								}
						if( Error_Flag )		
							RS_Index = 0;
						break;
					
		case	0xF0:									/*	重复按键译码*/
		case	0xF1:
		case	0xF2:	if(( RS_High == 2 ) && ( RS_Index == 51 ))
						{
							RS_Index = 50;
							KEY_DECODE_OK = 1;			/*	重复按键*/
						}
						else
							RS_Index = 0;
						break;
						
		default:			RS_Index = 0;					/*	误码,重新定帧*/			
						break;
	}
	
	/*	重新启动遥控器解码脉冲测量*/
	RS_High = 0;
	TH0 = 0;
	TL0 = 0;
}


/********************************************************************/
/*		定时器中断0服务程序( 遥控解码)					*/
/********************************************************************/
void		Interrupt_T0( void ) interrupt 1
{
	RS_High++;
	if( RS_High > ( IDLE_Cnt + 2 ))			/*	1个单位为32.768ms	*/
	{
		Fresh_KEY_Flag = 1;				/*	首次按键标志*/
		RS_Index = 0;
		RS_High = IDLE_Cnt + 2;
	}
}

/********************************************************************/
/*		外部中断1服务程序( 10ms脉冲输入)				*/
/*		同时用于系统定时任务								*/
/********************************************************************/
void		Interrupt_INT1( void ) interrupt 2
{
	/*	定时器复位,时间基准对齐*/
	TimeSlot = PWM_INIT;
	TH1 = 0xFE;
	TL1 = 0x70;

	/*	系统定时标志*/
	System_Timer = 1;
}


/********************************************************************/
/*		定时器中断1服务程序( PWM 定时器)				*/
/********************************************************************/
void		Interrupt_T1( void ) interrupt 3
{

	unsigned char	CH_Mirror;
		
	/*	0.2ms定时器,PWM步长为0.2ms,占空比从2%起*/
	TH1 = 0xFE;
	TL1 = 0x70;

	P1 = P1_Mirror;								/*输出到端口*/

	/*	计算各通道PWM 脉冲输出*/
	TimeSlot --;

	CH_Mirror = 0x55;
		
	if( POWER_FLAG )								/*电源标志,ON*/
	{
		if( CH_Vol[0] == TimeSlot )
			CH_Mirror &= 0xFE;
		if( CH_Vol[1] == TimeSlot )
			CH_Mirror &= 0xFB;
		if( CH_Vol[2] == TimeSlot )
			CH_Mirror &= 0xEF;
		if( CH_Vol[3] == TimeSlot )
			CH_Mirror &= 0xBF;
	}

	P1_Mirror = CH_Mirror | LED_Mirror;			/*数据输出,0表示有效*/
}

/********************************************************************/
/*						应用程序初始化						*/
/********************************************************************/
void		APP_Initlization( void )				/*	应用程序初始化*/
{
	/*	初始化初始亮度,保持微亮*/
	CH_Vol[0] = 0;
	CH_Vol[1] = 0;
	CH_Vol[2] = 0;
	CH_Vol[3] = 0;
	Current_CH = 1;
}

/********************************************************************/
/*						通道指示灯								*/
/********************************************************************/
void		CH_LED_Control( void )			/*	通道指示灯*/
{
	unsigned char	CH_LED_Mirror;

	CH_LED_Mirror = 0xAA;
	if( POWER_FLAG )
		CH_LED_Mirror &= 0xFD;
	
	switch( Current_CH )
	{
		case 0:	CH_LED_Mirror &= 0x02;		/*	全亮*/
				break;
		case 1:	CH_LED_Mirror &= 0xF7;		/*	1个亮*/
				break;
		case 2:	CH_LED_Mirror &= 0xDF;		/*	高位亮*/
				break;
		case 3:	CH_LED_Mirror &= 0xF7;		/*	2个亮*/
				CH_LED_Mirror &= 0xDF;
				break;
		case 4:	CH_LED_Mirror &= 0x7F;		/*	高位亮*/
				break;
	}
	
	LED_Mirror = CH_LED_Mirror;
}

/********************************************************************/
/*						电源控制								*/
/********************************************************************/
void		CH_Power_ON	( void )				/*	电源控制*/
{
	POWER_FLAG = 1;							/*	电源开启*/
	if(( CH_Vol[0] < VOL_MIN ) || ( CH_Vol[0] > VOL_MAX ))
		CH_Vol[0] = VOL_INIT;
	if(( CH_Vol[1] < VOL_MIN ) || ( CH_Vol[1] > VOL_MAX ))
		CH_Vol[1] = VOL_INIT;
	if(( CH_Vol[2] < VOL_MIN ) || ( CH_Vol[2] > VOL_MAX ))
		CH_Vol[2] = VOL_INIT;
	if(( CH_Vol[3] < VOL_MIN ) || ( CH_Vol[3] > VOL_MAX ))
		CH_Vol[3] = VOL_INIT;
}

/********************************************************************/
/*						运行指示灯控制						*/
/********************************************************************/
void		RUN_LED_Control( void )			/*	运行指示灯控制*/
{
	if( Timer_Flag )
	{
		LED_FLASH_Cnt ++;
		if( RS_High > IDLE_Cnt )						/*	正常运行*/
		{
			if( LED_FLASH_Cnt == 50 )
			{
				RUN_LED = !RUN_LED;
				LED_FLASH_Cnt = 0;
			}
		}
		else									/*	接收遥控码时间*/
		{
			if( LED_FLASH_Cnt == 10 )
			{
				RUN_LED = !RUN_LED;
				LED_FLASH_Cnt = 0;
			}
		}			
	}
}

/********************************************************************/
/*						通道功率增加							*/
/********************************************************************/
unsigned char		VOL_INC( unsigned char VOL )	/*	通道功率增加*/
{
	if( VOL < VOL_MAX )
		VOL ++;
	return( VOL );

}
/********************************************************************/
/*						通道功率减小							*/
/********************************************************************/
unsigned char		VOL_DEC( unsigned char VOL )	/*	通道功率减小*/
{
	if( VOL > VOL_MIN )
		VOL --;
	return( VOL );
}

/*	---------------------------------------------------------------------------------------*/
/*	TCON	*/
/*	TF1	TR1	TF0	TR0	IE1	IT1	IE0	IT0	*/
/*	TFx	定时器溢出标志,1=溢出*/
/*	TRx 	定时器启动标志,1=启动*/
/*	IEx	外部中断申请标志,1=申请*/
/*	ITx	外部中断中断模式,1=下跳沿,0=低电平*/

/*	---------------------------------------------------------------------------------------*/
/*	TMOD	D7~D4-定时器1,	D3~D0-定时器0*/
/*	GATE	C/T	M1	M0,	GATE	C/T	M1	M0	*/
/*	GATE	门控,1=测INTx高脉冲宽度,0=计数器,不受INTx外部输入控制*/
/*	C/T		定时器模式,1=计数器模式,计数Tx脉冲个数0=定时器模式*/
/*	M1 M0	定时器工作模式: 0=13位计数器,1=16位计数器,2=波特率发生器*/

/*	---------------------------------------------------------------------------------------*/
/*	IE	*/
/*	EA	x	x	ES	ET1	TX1	ET0	EX0	*/

/*	---------------------------------------------------------------------------------------*/
/*	SCON	*/
/*	SM0	SM1	SM2	REN	TB8	RB8	TI	RI	*/
/*	SM0	SM1	通信模式,常用方式1*/
/*	SM2		多机通信使能*/
/*	REN		允许接收控制*/
/*	TB8		发送第8位数据*/
/*	RB8		接收第8位数据*/
/*	TI		发送中断标志*/
/*	RI		接收中断标志*/

/*	---------------------------------------------------------------------------------------*/
/*	IP	*/
/*	X	X	X	PS	PT1	PX1	PT0	PX0	*/

/*	---------------------------------------------------------------------------------------*/
/*	PCON	*/
/*	SMOD	X	X	X	GF1	GF0	PD	IDL	*/
/*	SMOD	波特率加倍使能*/
/*	GFx		通用标志寄存器*/
/*	PD		掉电模式*/
/*	IDL		待机模式*/

/*	波特率计算	*/
/*	波特率=(2^SMOD/32) * (OSC/(12*(256-TH1)))	*/
/*	TH1=256-(2^SMOD*OSC)/(384*波特率)	*/

⌨️ 快捷键说明

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