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

📄 rs_main.c

📁 51单片机红外线遥控器解码源代码
💻 C
📖 第 1 页 / 共 2 页
字号:

#include		<REG51.H>

//定义端口资源

sbit		Control_1	=	P1^0;				/*	输出到光耦,低电平选通*/
sbit		Control_2	=	P1^2;				/*	输出到光耦,低电平选通*/
sbit		Control_3	=	P1^4;				/*	输出到光耦,低电平选通*/
sbit		Control_4	=	P1^6;				/*	输出到光耦,低电平选通*/

sbit		Control_LED1	=	P1^1;			/*	输出到发光二极管,低电平点亮*/
sbit		Control_LED2	=	P1^3;			/*	输出到发光二极管,低电平点亮*/
sbit		Control_LED3	=	P1^5;			/*	输出到发光二极管,低电平点亮*/
sbit		Control_LED4	=	P1^7;			/*	输出到发光二极管,低电平点亮*/

sbit		BUZZER_Control	=	P3^6;			/*	蜂鸣器,低电平蜂鸣*/

sbit		RUN_LED		=	P3^7;			/*	运行指示LED	*/


//键盘编码

#define	KEY_SHIFT		0x06
#define	KEY_TONE		0x16
#define	KEY_POWER		0x86
#define	KEY_1			0x7E
#define	KEY_2			0x2E
#define	KEY_3			0x26
#define	KEY_4			0x5E
#define	KEY_5			0x6E
#define	KEY_6			0x56
#define	KEY_7			0x9E
#define	KEY_8			0xAE
#define	KEY_9			0xB6
#define	KEY_0			0xBE
#define	KEY_ESC		0x96
#define	KEY_DEC		0xDE
#define	KEY_OK			0x8E
#define	KEY_INC			0xCE


void		Main_Initlization( void );			/*	主初始化程序*/
void		Interrupt_INT0( void );				/*	遥控解码*/
void		Interrupt_INT1( void );				/*	10ms定时脉冲中断*/
void		Interrupt_T0( void );				/*	遥控解码*/
void		Interrupt_T1( void );				/*	PWM 定时器*/

void		KEY_Process( void );				/*	遥控按键解码*/

void		APP_Initlization( void );			/*	应用程序初始化*/

void		CH_LED_Control( void );			/*	通道指示灯*/
void		CH_Power_ON( void );				/*	电源控制*/
void		RUN_LED_Control( void );			/*	运行指示灯控制*/
unsigned char		VOL_INC( unsigned char VOL );	/*	通道功率增加*/
unsigned char		VOL_DEC( unsigned char VOL );	/*	通道功率减小*/

/*	遥控器解码变量定义*/
bit				KEY_DECODE_OK;			/*	遥控器解码成功标志*/
bit				Fresh_KEY_Flag;				/*	首次按键标志*/
unsigned char		KEY_DECODE;				/*	解码后的键值*/

unsigned char		RS_Index;					/*	当前遥控码位置*/
unsigned char		RS_High;					/*	遥控器解码定时器高位*/
unsigned long		RS_Decode;					/*	解码数据*/

union	URS_CODE							/*	遥控码解码数据*/
{											/*	格式:设备码1E,设备反码E1*/
	unsigned char KEY[4];						/*	数据码,数据反码,32bit	*/
	unsigned long	FULL_KEY;
} RS_CODE;

/*	PWM 信号发生脉冲变量定义*/
unsigned char		TimeSlot;					/*	PWM定时器*/
unsigned char		CH_Vol[4];					/*	通道音量数据*/
unsigned char		Current_CH;					/*	当前遥控控制通道选择0~3*/

bit				POWER_FLAG;				/*	电源总开关标志*/

#define			PWM_INIT	200				/*	初始计数值*/
#define			VOL_MAX	PWM_INIT-2		/*	最大值,越大,功率越大*/
#define			VOL_MIN	VOL_MAX-40		/*	最小值,越小,功率越低*/
#define			VOL_INIT	VOL_MIN + 10		/*	初始亮度*/

#define			IDLE_Cnt	3				/*	空闲时间,确定新键按下*/

unsigned	char		P1_Mirror;					/*	P1口镜像寄存器*/
unsigned char		LED_Mirror;					/*	LED镜像寄存器*/

/*	系统处理变量定义*/
bit	System_Timer;							/*	系统10ms定时标志,来自100Hz中断*/
bit	Timer_Flag;								/*	10ms定时器标志*/

unsigned char		LED_FLASH_Cnt;				/*	LED闪烁定时器*/
unsigned char		PRE_KEY;					/*	前一个按键数据*/

/********************************************************************/
/*							主程序								*/
/********************************************************************/
void		main( void )
{
	Main_Initlization( );						/*	主初始化程序*/
	APP_Initlization( );						/*	应用程序初始化*/

	while( 1 )
	{
		KEY_Process( );						/*	键盘处理*/
		CH_LED_Control( );					/*	通道指示灯*/


		/*	定时器服务*/
		if( System_Timer )
		{
			System_Timer = 0;
			Timer_Flag = 1;
		}

		/*	RUN_LED闪灯程序,正常1s闪烁一次,遥控解码时,快速闪烁*/

		RUN_LED_Control( );

		if( Timer_Flag )
			Timer_Flag = 0;
	}
}

/********************************************************************/
/*		遥控按键解码处理程序								*/
/********************************************************************/
void		KEY_Process( void )				/*	遥控按键解码*/
{
	if( KEY_DECODE_OK )
	{
		KEY_DECODE_OK = 0;					/*	处理结束*/

		switch( KEY_DECODE )					/*	根据键值散转*/
		{
			/*	电源总开关控制*/
			case	KEY_POWER:	if( Fresh_KEY_Flag )
								{
									POWER_FLAG = !POWER_FLAG;
									if( POWER_FLAG )
										CH_Power_ON( );
								}
								break;
			/*	通道电源功率增加*/
			case	KEY_INC:	if( POWER_FLAG )
								{
									if( Current_CH == 0 )		/*	所有通道*/
									{
										CH_Vol[ 0 ]  = VOL_INC( CH_Vol[ 0 ] );
										CH_Vol[ 1 ]  = VOL_INC( CH_Vol[ 1 ] );
										CH_Vol[ 2 ]  = VOL_INC( CH_Vol[ 2 ] );
										CH_Vol[ 3 ]  = VOL_INC( CH_Vol[ 3 ] );
									}
									else
										CH_Vol[ Current_CH -1 ]  = VOL_INC( CH_Vol[ Current_CH -1 ] );
								}
								break;
			/*	通道电源功率减小*/
			case	KEY_DEC:	if( POWER_FLAG )
								{
									if( Current_CH == 0 )		/*	所有通道*/
									{
										CH_Vol[ 0 ]  = VOL_DEC( CH_Vol[ 0 ] );
										CH_Vol[ 1 ]  = VOL_DEC( CH_Vol[ 1 ] );
										CH_Vol[ 2 ]  = VOL_DEC( CH_Vol[ 2 ] );
										CH_Vol[ 3 ]  = VOL_DEC( CH_Vol[ 3 ] );
									}
									else
										CH_Vol[ Current_CH -1 ]  = VOL_DEC( CH_Vol[ Current_CH -1 ] );
								}
								break;
			/*	遥控控制通道切换,循环切换*/
			case	KEY_TONE:	if( Fresh_KEY_Flag )
								{
									Current_CH ++;
									if( Current_CH > 4 )
										Current_CH = 1;
								}
								break;
			/*	通道切换,通过SHIFT + 数字键,0键表示所有*/
			case	KEY_0:		if( Fresh_KEY_Flag )
									if( PRE_KEY == KEY_SHIFT )
										Current_CH = 0;
								break;
			case	KEY_1:		if( Fresh_KEY_Flag )
									if( PRE_KEY == KEY_SHIFT )
										Current_CH = 1;
								break;
			case	KEY_2:		if( Fresh_KEY_Flag )
									if( PRE_KEY == KEY_SHIFT )
										Current_CH = 2;
								break;
			case	KEY_3:		if( Fresh_KEY_Flag )
									if( PRE_KEY == KEY_SHIFT )
										Current_CH = 3;
								break;
			case	KEY_4:		if( Fresh_KEY_Flag )
									if( PRE_KEY == KEY_SHIFT )
										Current_CH = 4;
								break;
			case	KEY_ESC:	if( Fresh_KEY_Flag )
									Current_CH = 0;
								break;					
				
		}

		Fresh_KEY_Flag = 0;
		PRE_KEY = KEY_DECODE;				/*	前一个键值更新*/
	}
}

/********************************************************************/
/*		主初始化程序											*/
/*		初始化定时器,中断模式等							*/
/********************************************************************/
void		Main_Initlization( void )			/*主初始化程序*/
{
	TMOD = 0x19;		 			/*	定时器1用于PWM 定时,定时器0用于遥控信号解码*/
	TCON = 0x55;        				/*	启动两个定时器,外部中断模式为下降沿*/
	TH1  = 0xF9;        					/*	PWM 调节步长*/
	TL1  = 0x7D;
	TH0  = 0x00;        					/*	定时设置,最长约80ms, 24MHz晶振*/
	TL0  = 0x00;
	IE   = 0x8F;       		 			/*	开放中断:INT0-遥控解码,INT1-10ms中断,T0-遥控解码, T1-PWM 发生*/
	IP	= 0x0C;						/*	10ms外部中断优先级最高*/
}


/********************************************************************/
/*		外部中断0服务程序( 遥控解码)					*/
/********************************************************************/
/*	解码输出在RS_DECODE,标志为RS_DECODE_OK,首次按键为Fresh_KEY_Flag  */

void		Interrupt_INT0( void ) interrupt 0
{
	/*	搜索帧头,帧尾,数据*/
	/*	00 22数据为帧头*/
	/*	00 03为数据0,00 0C为数据1*/
	/*	01 38为帧尾*/
	/*	00 11, 02 F1为重复标志*/

	bit	Error_Flag;

	switch( TH0 )
	{
		case	0x02:									/*	数据0	*/
		case	0x03:
		case	0x04:	if( RS_High == 0 )
						{
							RS_CODE.FULL_KEY <<= 1;
							RS_Index ++;
						}
						else
							RS_Index = 0;
						break;
					
		case	0x0B:									/*	数据1	*/
		case	0x0C:
		case	0x0D:	if( RS_High == 0 )
						{
							RS_CODE.FULL_KEY <<= 1;
							RS_CODE.FULL_KEY ++;
							RS_Index ++;
						}
						else
							RS_Index = 0;
						break;
						

⌨️ 快捷键说明

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