STM32-红外遥控
通常红外遥控为了提高抗干扰性能和降低电源消耗,红外遥控器常用载波的方式传送二进制编码,常用的载波频率为38kHz,这是由发射端所使用的455kHz晶振来决定的。也有一些遥控系统采用36kHz、40 kHz、56 kHz等,一般由发射端晶振的振荡频率来决定。所以,通常的红外遥控器是将遥控信号(二进制脉冲码)调制在38KHz的载波上,经缓冲放大后送至红外发光二极管,转化为红外信号发射出去的。
二进制脉冲码的形式有多种,其中最为常用的是NEC Protocol 的 PWM码(脉冲宽度调制)和 Philips RC-5 Protocol 的 PPM码(脉冲位置调制码,脉冲串之间的时间间隔来实现信号调制)。如果要开发红外接收设备,一定要知道红外遥控器的编码方式和载波频率,我们才可以选取一体化红外接收头和制定解码方案。我们的红外遥控器使用****的是NEC协议
NEC协议:
code:
/*******************************************************************************
* 函 数 名 : HW_jssj
* 函数功能 : 高电平持续时间,将记录的时间保存在t中返回,其中一次大约20us
* 输 入 : 无
* 输 出 : t
*******************************************************************************/
u8 HW_jssj()
{
u8 t=0;
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)==1)//高电平
{
t++;
delay_us(20);
if(t>=250) return t;//超时溢出
}
return t;
}
void EXTI9_5_IRQHandler(void) //红外遥控外部中断
{
u8 Tim=0,Ok=0,Data,Num=0;
while(1)
{
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)==1)
{
Tim=HW_jssj();//获得此次高电平时间
if(Tim>=250) break;//不是有用的信号
if(Tim>=200 && Tim<250)//4.5ms是起始信号
{
Ok=1;//收到起始信号
}
else if(Tim>=60 && Tim<90)//1680us
{
Data=1;//收到数据 1
}
else if(Tim>=10 && Tim<50)//560us
{
Data=0;//收到数据 0
}
if(Ok==1)//32位,由高到低
{
hw_jsm<<=1;
hw_jsm+=Data;
if(Num>=32)
{
hw_jsbz=1;
break;
}
}
Num++;
}
}
EXTI_ClearITPendingBit(EXTI_Line8);
}