51单片机红外遥控

发送部分硬件电路如下,需要调制。

上图为调制前和调制后的波形。

发送协议:NEC编码

Start

DATA

Repeat(遥控按键按下不放时的信号)

DATA = 遥控器地址 + 遥控地址反码 + 控制码(遥控键码)+ 控制码反码,共4个Byte.

下图为遥控键码值。

接受部分如下图,内部集成有滤波电路和解调电路,直接由OUT口输出

在检测并接收数据时,采用外部中断来检测下降沿,用定时器来计时判断,当中断下降沿来后,启动定时器,到下一次中断,记录时间,判断是开始信号还是重发信号,若为开始信号,则准备接受数据,下面32个下降沿就是数据信号,判断时间来确定是0还是1,读取数据,然后检查读取的数据是否正确(DATA = 遥控器地址 + 遥控地址反码 + 控制码(遥控键码)+ 控制码反码),正确后将DataFlag = 1,并回到空闲状态等待下一次的信号。

代码如下:

cpp 复制代码
#include <REGX52.H>
unsigned char IR_State;
unsigned int IR_Time;
unsigned char IR_RepeatFlag;
unsigned char IR_DataFlag;
unsigned char IR_Data[4];
unsigned char IR_LData;
unsigned char IR_Address;
unsigned char IR_Command;


unsigned char get_IR_DataFlag()
{
	if(IR_DataFlag)
	{
		IR_DataFlag = 0;
		return 1;
	}
	return 0;
}


unsigned char get_IR_RepeatFlag()
{
	if(IR_RepeatFlag)
	{
		IR_RepeatFlag = 0;
		return 1;
	}
	return 0;
}


unsigned char get_IR_Address()
{
	return IR_Address;
}


unsigned char get_IR_Command()
{
	return IR_Command;
}


void Timer0_Init(void)		
{
	TMOD &= 0xF0;			
	TMOD |= 0x01;		
	TL0 = 0;				
	TH0 = 0;			
	TF0 = 0;				
	TR0 = 0;				
}


void INT0_Init()
{
	IT0 = 1;
	IE0 = 0;
	EA = 1;
	EX0 = 1;
	PT0 = 1;
}


void IR_Init()
{
	Timer0_Init();
	INT0_Init();
}


void Timer_Start()
{
	TR0 = 1;
}




void Time_counter(unsigned int count)
{
	TH0 = count/256;
	TL0 = count%256;
}


void Timer_Stop()
{
	TR0 = 0;
}


unsigned int GetTime()
{
	return (TH0<<8) | TL0;
}






void INT0_Routine() interrupt 0
{
	if(IR_State == 0)
	{
		Time_counter(0);
		Timer_Start();
		IR_State = 1;
	}
	else if(IR_State == 1)
	{
		
		IR_Time = GetTime();
		Time_counter(0);
		if(IR_Time >= 13500-1000 && IR_Time <= 13500+1000)
		{
			
			IR_State = 2;
		}
		else if(IR_Time >= 11250-400 && IR_Time <= 11250+400)
		{
			
			IR_RepeatFlag = 1;
			IR_State = 0;
		}
		else
		{
			IR_State = 1;
		}
	}
	else if(IR_State == 2)
	{
		
		IR_Time = GetTime();
		Time_counter(0);
		if(IR_Time >= 1120-500 && IR_Time <= 1120+500)
		{
			
			IR_Data[IR_LData/8] &= ~(0x01<<(IR_LData%8));
			IR_LData++;
		}
		else if(IR_Time >= 2250-500 && IR_Time <= 2250+500)
		{
			IR_Data[IR_LData/8] |= (0x01<<(IR_LData%8));
			IR_LData++;
		}
		else
		{
			IR_LData = 0;
			IR_State = 1;
		}
		if(IR_LData>=32)
		{
			IR_LData = 0;
			if(IR_Data[0] == ~IR_Data[1] && IR_Data[2] == ~IR_Data[3])
			{
				IR_DataFlag = 1;
				IR_Address = IR_Data[0];
				IR_Command = IR_Data[2];
			}
			Timer_Stop();
			IR_State = 0;
		}
	}
	
}
相关推荐
悠哉悠哉愿意7 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
Lester_11017 天前
STM32霍尔传感器输入口设置为复用功能输入口时,还能用GPIO函数直接读取IO的状态吗
stm32·单片机·嵌入式硬件·电机控制
LCG元7 天前
低功耗显示方案:STM32L0驱动OLED,动态波形绘制与优化
stm32·嵌入式硬件·信息可视化
三佛科技-187366133977 天前
120W小体积碳化硅电源方案(LP8841SC极简方案12V10A/24V5A输出)
单片机·嵌入式硬件
z20348315207 天前
STM32F103系列单片机定时器介绍(二)
stm32·单片机·嵌入式硬件
Alaso_shuang7 天前
STM32 核心输入、输出模式
stm32·单片机·嵌入式硬件
脚后跟7 天前
AI助力嵌入式物联网项目全栈开发
嵌入式硬件·物联网·ai编程
2501_918126917 天前
stm32死锁是怎么实现的
stm32·单片机·嵌入式硬件·学习·个人开发
z20348315207 天前
STM32F103系列单片机定时器介绍(一)
stm32·单片机
星马梦缘7 天前
驱动层开发——蜂鸣器驱动
stm32·单片机·嵌入式硬件·hal·驱动