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

📄 telecontrol.c

📁 红外遥控解码
💻 C
字号:
/*11.0592MHz晶振*/
#include<at89x52.h>
#define uchar unsigned char
#define uint unsigned int
#include"led.h"

sbit beep=P3^5;
sbit inf=P3^3;
sbit led1=P1^3;

uchar key_code=0;/*key_code:遥控键值*/
uint  buf_key_code=0;/*键值暂存对应功能看主函数*/
uchar key_bit_count=0;/*键编码脉冲计数*/
uint  count_T=0,buf_CT=0;/*count_T:定时器中断次数计数,buf_CT用来截获某一时间的count_T值以供判断*/
uchar common_code_count=0;/*前导码脉冲计数*/
uchar inf_status=0;/*inf_status:脉冲接收器所处的状态,0:无信号,1:前导码接收区,2:数据编码接收区*/

void main()
{
	EA=1;	  //开全局中断
	ET0=1;	  //开定时器0中断
	TMOD=0x02;//T0设置为8位自动装载模式
	TH0=0xCA; //自动装载值为202,中断间隔为50us
	TL0=0xCA; //初值为202
	IT1=1;	  //INT1为下降沿触发
	EX1=1;	  //开外部中断
	TR0=1;	  //启动定时器计数
	while(1)
	{	 
		/*收到数字键则显示数字*/
		if(key_code<10)
		{
			beep=0;//响蜂鸣器
		//CLEARSCREEN;
			led_display(key_code);//其它数字和编码值相同,直接显示键值
			key_code=255;//清键值
			delay_ms(20);
			beep=1;
		}
		/*收到功能键则显示相应的功能*/ 
		else if(key_code<50)
		{
			beep=0;
		//	CLEARSCREEN;//清屏
			led_display(key_code);
			key_code=255;//清键值
			delay_ms(30);
			beep=1; 
		}
		delay_ms(50);							 		
	}
}

void Time0(void) interrupt 1
{ 
    count_T++;//周期累加
	/*如果外部中断处于无信号区,则滤除前导宽脉冲中间的跳变毛刺*/
	if(inf_status==0&&count_T<160)
	{
		EX1=0;
	}
	/*如果外部中断处于信号区,则滤除宽脉冲中间的跳变毛刺*/
	else if((inf_status==1||inf_status==2)&&count_T<12)
	{
		EX1=0;
	}
	/*渡过上升沿后重新开放外部中断*/
	else
	{
		EX1=1;
	}
	/*超过25ms,则锁定count_T值,等待下一次信号脉冲下降沿来解开*/
	if(count_T>500)
	{
		inf_status=0;
		count_T=600;
	}
}

/***************************************************************
		外部中断1,用于捕获红外脉冲信号
****************************************************************/
void int_1(void) interrupt 2
{
	led1=0;
	TR0=1;
	if(count_T>15&&count_T<250)//如果信号合法,则捕进buf_CT,count_T清0,对下一个脉冲信号计时
	{
		buf_CT=count_T;
		count_T=0;
	}
	delay_ms(1);//延时100us以消除下降沿跳变抖动
	if(inf==0)//INT1引脚稳定为低电平,则表示确实是信号,count_T重新计时,因上面延时了100us,故要补偿2次T0中断
	{
		count_T=10;
	}
	if(buf_CT>15&&buf_CT<250)//若收到的信号合法,则再进行以下的信号分析
	{
		if(inf_status==0)//若当前信号接收系统处于空闲状态,则标志进入前导码接收区
		{
			if(buf_CT>210&&buf_CT<250)//捕捉前导码
			{
				inf_status=1;//标志进入前导码接收区
				buf_key_code=0;
				key_bit_count=0;					
				buf_CT=0;
			}
		}
		else if(inf_status==1)//前导码接收区(收到的脉冲全部忽略)
		{
			if((buf_CT>15&&buf_CT<25)||(buf_CT>32&&buf_CT<45))//脉冲接收
			{								
				common_code_count++;//脉冲数计算
				if(common_code_count>=26)//若收够了26个脉冲
				{
				 	inf_status=2;//则标志进入数据接收区
					common_code_count=0;//脉冲计数清0
					key_bit_count=0;
					buf_key_code=0;
				}	
			}
		}
		else if(inf_status==2)//数据接收区
		{
			if(buf_CT>15&&buf_CT<25)//窄脉冲接收
			{
				buf_key_code>>=1;//接收0
				key_bit_count++;
								 
			}
			else if(buf_CT>32&&buf_CT<45)//宽脉冲接收
			{
				buf_key_code>>=1;
				buf_key_code|=0x80;//接收1
				key_bit_count++;//数据脉冲数累加,一共有8个
			} 
			if(key_bit_count>=8)//若收完8位个数据脉冲,则进行以下的处理
			{
				inf_status=0;//标志接收系统返回空闲状态
				key_bit_count=0;
				key_code=buf_key_code;
				buf_key_code=0;
				TR0=0;
				count_T=600;					
			}			
		}
		buf_CT=0;
	} 
	led1=1;
	EX1=1;	
}








⌨️ 快捷键说明

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