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

📄 infrared.c

📁 RM0038红外传感器接收电视机摇控的源码
💻 C
字号:
#include "Infrared.h"
#include "Serial.h"
xdata uchar uSendCount1 = 0;
xdata uchar count = 0;
xdata uchar uRecvCount = 0;
xdata uchar KeyHead = 0;
xdata uchar Data0 = 0;
xdata uchar Data1 = 0;
xdata uchar rKey = 0;
bit bFirstGetKey = 1;

uchar GetKey(void)
{
	if(bFirstGetKey)
	{
		bFirstGetKey = 0;
		T2MOD &= 0xFC; /* T2OE=0;定时器2输出不允许 */ 
		T2MOD |= 0x00; /* DCEN=1;可以设置为向上/下计数:此程序中为向上达到0xff时溢出*/ 
		C_T2 = 0;
		EXF2=0; /* reset flag 定时器2外部标志位清除*/ 
		TCLK=0;RCLK=0; /* disable baud rate generator 不用于波特率发生器*/ 
		TH2=0x00;
		TL2=0x00;
		RCAP2H=0x00;
		RCAP2L=0x00;
		ET2=1;
		IT3 = 1;            // 设置中断触发方式为下降沿触发
		EX3=1;              // 允许外部中断INT0
	}
	if(rKey)
	{
		uchar tKey = rKey;
		rKey = 0;
		return tKey;
	}
	return 0;
}
		
//下面是外部中断INT0的中断服务程序
void Int0IrqHandler (void) interrupt 7 {

	EX3 = 0;
	delay(30);
	if(P4_2 == 0)
	{
		TH2 = 0xFF;
		TL2 = 0x47;
		TR2 = 1;

  		if(uSendCount1 == 0) count = 100;
		uSendCount1++;
		if(count >= 0x05&& count <= 0x18)
		{
			if(uRecvCount < 8)
			{
				KeyHead >>= 1;
				if(count > 0x0C)
				{
					KeyHead |= 0x80;
				}
			}else
			if(uRecvCount >= 0x1A&& uRecvCount < 0x22)
			{
				Data0 >>= 1;
				if(count > 0x0C)
				{
					Data0 |= 0x80;
				}
			}else
			if(uRecvCount >= 0x22&& uRecvCount < 0x2A)
			{
				Data1 >>= 1;
				if(count > 0x0C)
				{
					Data1 |= 0x80;
				}	
			}
			uRecvCount++;
		}
		count = 0;
	}
	EX3 = 1;
  
}

void timer2 (void) interrupt 5
{
	TR2 = 0;
	TF2 = 0;
	TH2 = 0xFF;
	TL2 = 0x47;
	TR2 = 1;
	count ++;

	if((count > 200)&&(uSendCount1 > 1))
	{
		TR2 = 0;
		uSendCount1 = 0;
		uRecvCount = 0;
		if(KeyHead == 0x1F&&(Data0 = ~Data1))
		{
			//Send(Data0);
			rKey = Data0;
		}
		KeyHead = 0;
		Data0 = 0;
		Data0 = 0;
	}
}

⌨️ 快捷键说明

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