红外编码的解码的一些学习经验(附代码)

作者&投稿:况独 (若有异议请与网页底部的电邮联系)
~ 红外遥控技术因其无线、非接触、抗干扰强、信息传输可靠、功耗低、成本低、易于实现等优点,被广泛应用在各种电子设备,尤其是家用电器上,并逐渐拓展至计算机系统。由于红外线遥控无法穿透障碍物控制目标设备,因此设计红外遥控器时无需为每套发射器和接收器配置不同的频率或编码,同类产品可以共享相同的遥控频率或编码,避免了遥控信号“串门”的问题,为大批量生产和普及红外线遥控提供了便利。红外线为不可见光,对环境影响较小,且波长远小于无线电波,不会干扰其他家用电器或临近的无线电设备。

红外遥控编码方式主要包括PWM(脉冲宽度调制)的NEC协议和Philips PPM(脉冲位置调制)的RC-5协议。大部分遥控器采用NEC协议,其特征包括:在100ms后,接收器会收到连续几个脉冲,作为连发码,由9ms低电平、2.5ms高电平、0.56ms低电平、97.94ms高电平组成。若按键在数据发送完成后仍未释放,发射器会重复发送连发码,接收器可通过统计连发码次数标记按键按下的长短或次数。

红外接收电路连接如下:当红外接收二极管接收到38KHz的红外信号,输出低电平;若未收到信号,输出高电平。

发射方使用38KHzPWM波信号驱动红外发射二极管,输出低电平,二极管不工作;接收方收到低电平时,输出高电平。

为了实现红外信号的解码和编码,可以使用STM32的定时器实现输入捕获功能,解码红外信号;同时,使用STM32的定时器PWM输出实现红外信号的编码功能。

红外解码的代码示例如下:

//遥控器接收状态
//bit7:收到了引导码标志
//bit6:得到了一个按键的所有信息
//bit5:保留
//bit4:标记上升沿是否已经被捕获
//bit[3:0]:溢出计时器
u8 remoteState=0;
u16 capturevalue;//下降沿时计数器的值
u32 remoteCode=0;//红外接收到的数据
u8 remoteCnt=0;//按键按下的次数

void TIM2_IRQHandler(void)
{
u16 state;
if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
{
if(remoteState&0x80)//上次有数据被接收到了
{
remoteState&=~0X10;//取消上升沿已经被捕获标记
if((remoteState&0X0F)==0X00)remoteState|=1<<6;//标记已经完成一次按键的键值信息采集
if((remoteState&0X0F)<14)remoteState++;
else
{
remoteState&=~(1<<7);//清空引导标识
remoteState&=0XF0;//清空计数器
}
}
}
if(TIM_GetITStatus(TIM2,TIM_IT_CC2)!=RESET)
{
if(RDATA)//上升沿捕获
{
TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Falling);//CC1P=1 设置为下降沿捕获
TIM_SetCounter(TIM2,0); //清空定时器值
remoteState|=0X10;//标记上升沿已经被捕获
}
else //下降沿捕获
{
capturevalue=TIM_GetCapture2(TIM2);//读取CCR2也可以清CC1IF标志位
TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Rising); //CC4P=0设置为上升沿捕获
if(remoteState&0X10)//完成一次高电平捕获
{
if(remoteState&0X80)//接收到了引导码
{
if(capturevalue>300&&captureva lue<800)//560为标准值,560us
{
remoteCode<<=1;//左移一位.
remoteCode|=0;//接收到0
}
else if(captureva lue>1400&&captureva lue<1800)//1680为标准值,1680us
{
remoteCode<<=1;//左移一位.
remoteCode|=1;//接收到1
}
else if(captureva lue>2200&&captureva lue<2600)//得到按键键值增加的信息 2500为标准值2.5ms
{
remoteCnt++; //按键次数增加1次
remoteState&=0XF0;//清空计时器
}
}
else if(captureva lue>4200&&captureva lue<4700)//4500为标准值4.5ms
{
remoteState|=1<<7;//标记成功接收到了引导码
remoteCnt=0;//清除按键次数计数器
}
}
remoteState&=~(1<<4);
}
}
TIM_ClearFlag(TIM2,TIM_IT_Update|TIM_IT_CC2);
}

u8 Remote_Scan(void)
{
u8 state=0;
u8 t1,t2;
if(remoteState&(1<<6))//得到一个按键的所有信息了
{
printf("收到的数据是:0x%X\r ",remoteCode);
t1=remoteCode>>24;//得到地址码
t2=(remoteCode>>16)&0xff;//得到地址反码
if((t1==(u8)~t2)&&t1==REMOTE_ID)//检验遥控识别码(ID)及地址
{
t1=remoteCode>>8;
t2=remoteCode;
if(t1==(u8)~t2)state=t1;//键值正确
}
if((state==0)||((remoteState&0X80)==0))//按键数据错误/遥控已经没有按下了
{
remoteState&=~(1<<6);//清除接收到有效按键标识
remoteCnt=0;//清除按键次数计数器
}
}
return state;
}

红外编码示例代码如下:

void remote_repeat(u8 cnt)
{
for(;cnt;cnt--)
{
Remote_H;
Delay_ms(97);
Delay_us(940); //97.94ms高电平
Remote_L;
Delay_ms(9); //9ms低电平
Remote_H;
Delay_us(2500); //2.5ms高电平
Remote_L;
Delay_us(560); //560us低电平
}
}

/*

u8 addr:地址码

u8 cmd :控制码

u8 cnt :连发码个数

*/

void remote_send(u8 addr,u8 cmd,u8 cnt)
{
remote_start();
remote_send_byte(addr);
remote_send_byte(~addr);
remote_send_byte(cmd);
remote_send_byte(~cmd);
remote_repeat(cnt);
remote_end();
}

void remote_init(void)
{
RCC->AHB1ENR |=1<<0; //GPIOA时钟使能
GPIOA->MODER &=~(0x3<<(1*2)); //GPIOA1模式配置
GPIOA->MODER |=1<<(1*2); //输出模式
GPIOA->OTYPER &=~(1<<1); //

GPIOA->OSPEEDR &=~(0x3<<(1*2));

GPIOA->OSPEEDR |=1<<(1*2); //25MHz

GPIOA->PUPDR &=~(0x3<<(1*2)); //无上下拉

GPIOA->ODR &=~(1<<1);

}

void remote_start(void) //红外同步码头
{
Remote_L;
Delay_ms(9); //9ms低电平 (发送端脉冲 )
Remote_H;
Delay_ms(4); //4.5ms高电平 (发送端低电平)
Delay_us(500);
Remote_L;
Delay_us(560); //560us脉冲 //没有这560us码值会错OK?
}

void remote_end(void)
{
Remote_H;
}

//高位在前你敢信?

void remote_send_byte(u8 byte)
{
u8 i=0;
for(i=0;i<8;i++)
{
Remote_H;
if( byte & (0x80>>i) ) Delay_us(1680); //1680us低电平
else Delay_us(560); //1680us低电平
Remote_L;
Delay_us(560); //560us脉冲
}
}


transfomer的组成-Encoder-Decoder
在softmax步骤前,它会把后面的位置给隐去(把它们设为-inf)。这个“编码-解码注意力层”工作方式基本就像多头自注意力层一样,只不过它是通过在它下面的层来创造查询矩阵,并且从编码器的输出中取得键\/值矩阵。解码组件最后会输出一个实数向量。我们如何把浮点数变成一个单词?这便是线性变换层要做...

编码原则是什么意思
25个键名汉字与25个字母键相应,这些字的编码相当简单,它们的编码就是4个所在字母键字母,如:言字的编码为YYYY,纟字的编码为XXXX,等等。输入键名汉字时,只要连续击四次该字所在的字母键即可。 三、成字字根的编码规则 在五笔字型字根键盘的每个字母键上,除了一个键名字根外,还有一些其它类型的字根。有些字根其...

什么是信道编码?
为了抑制信道噪声对信号的干扰,往往还需要对信号进行再编码。形成不宣受干扰并适合与在 特定的信道中传输的形式,这称为信道编码,其目的是提高传输的可靠性。参考资料:http:\/\/linjian001.bokee.com\/2122953.html

Codec详细资料大全
Codec编码解码器主要作用是对视频信号进行压缩和解压缩。计算机工业定义通过24位测量系统的真彩色,这就定义了近百万种颜色,接近人类视觉的极限。这意味着如果视频需要以每秒30帧的速度播放,则每秒要传输高达27MB的信息,1GB容量的硬碟仅能存储约37 秒的视频信息。因而必须对信息进行压缩处理。通过抛弃一些数字信息或容易被...

url的编码和解码方式
url的在线编码和解码工具: http:\/\/tool.chinaz.com\/tools\/urlencode.aspx 1、基本知识 URLEncode:是指针对网页url中的中文字符的一种编码转化方式,最常见的就是Baidu、 Google等搜索引擎中输入中文查询时候,生成经过 Encode过的网页URL。URLEncode的方式一般有两种一种是传统的基于GB2312的Encode(Baidu...

传播学问题:信息,符号,编码和解码三者有什么关系?急!
因为信息是含有某中目的的,所以,采编人员通过对符号的“编码”来实现他们的目的,这样的目的对于受众,可能是明显的,也可能是隐藏的。但无论如何,受众对信息的理解过程,就是一次“解码”的过程。 要强调的是,每个人的解码过程不一样,也就是说,编码和解码并非完全相反对应的过程。因为人和人的...

调制解调 与 编码解码 有何区别?
调制解码和编码解码的区别 编码是指将语音或视频模拟信号改编成数字信号的过程。解码是指将数字信号转换成模拟信号的过程。编解码器是指具备了以上2种功能的装置。除语音信息外,还有很多视频信息都由模拟信号构成。换句话说,调制(编号、编码)是为了通过数字传输线传送这些电信号,将模拟信号转换成数字...

(推荐阅读)H264, H265硬件编解码基础及码流分析
编码数据裸流处理 在编码后的数据中,需要添加起始码以区分不同NALU单元。在iOS中,使用VTCompressionSession编码的数据可能缺少起始码,需要在推流前自行添加。将H.264裸流解码为CMSampleBuffer 从H.264码流中提取关键信息(SPS、PPS和VPS)并转换为CMSampleBuffer格式,以便于解码工作。CMSampleBuffer包含时间...

二、视频编解码基础知识
视频编码 是压缩和可能改变视频内容格式的过程,有时甚至将模拟源更改为数字源。在压缩方面,目标是减少占用空间。这是因为它是一个有损的过程,会抛弃与视频相关的信息。在解压缩以进行回放时,创建原始的近似值。应用的压缩越多,抛出的数据越多,近似值与原始数据相比越差。视频编解码器是通过软件或...

解码的结构解码的结构是什么
拼音是:jiěmǎ。解码的具体解释是什么呢,我们通过以下几个方面为您介绍:一、词语解释【点此查看计划详细内容】解码jiěmǎ。(1)把数码还原成它所代表的内容;把信号转换成它所代表的信息。二、国语词典将电波讯号转换成它所代表的讯息。例如在无线电及通讯方面,经常需要将欲传输的内容加以编码保密,...

贵定县15862987284: 学习红外解码与控制应该怎么去学 -
万瑗立健: 红外线遥控是目前使用最广泛的一种通信和遥控手段.由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控.工业...

贵定县15862987284: 请问红外遥控是怎么解码的? -
万瑗立健: 以日本NEC 的uPD6121G 组成发射电路为例说明编码原理(一般家庭用的DVD、VCD、音响都使用这种编码方式).当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同.这种遥控码具有以下特征:采用脉宽调制的串行码,...

贵定县15862987284: 关于红外遥控器解码 -
万瑗立健: 嗯,有这个想法很不错,我提几个我的思路,你参考下:1. 一般红外发送与红外接收,它们都是配套的,就是发送的频率必须接收的频率相同,否则接收不成功,我们大都使用的是HT6221,它发送的是38KHz的红外信号频率,接收头也只能接...

贵定县15862987284: 红外线遥控器解码,是解遥控器的码,还解接收头的码呢? -
万瑗立健: 其实红外遥控器里面是一个编码芯片,他必须用相应的解码芯片来解码,这里所解的码是红外遥控器内部芯片外围设置的码,你只需把红外遥控器的地址码知道,然后再自己的编码电路中设置合适的地址码,就OK了.

贵定县15862987284: 怎样更改红外解码的时序
万瑗立健: 修改你程序的“红外键码值处理函数”和“外部中断0”那一部分,不同的芯片时序不同,判断位0和位1延时的时间也不同,当你决定用一款芯片时,看那块芯片的资料,会给有出数据格式,位定义,按键输出波形,还有相应的时序都会有给出...

贵定县15862987284: 用单片机怎么做红外解码使用普通中断可以解出红外遥控的码值
万瑗立健: 用中断配合定时器,红外解码实际上通俗点说你只要检测到脉冲时间就好,所以中断配合定时器很容易就搞定了,边沿触发

贵定县15862987284: 红外接收解码的编程? -
万瑗立健: 你需要做一下工作: 1. 选择高速单片机.以前的老式单片机速度太低,不能完成多路解码任务.所以需要采用较新的高速单片机,价格也很低. 2. 4个接收管若是集成带接收处理电路的,则可以直接接到单片机的4个引脚上,另外将这4个信号经过一个4输入的门电路综合(与门/与非门/或门/或非门,根据逻辑处理)后接到一个外部中断引脚.若4个接收管是简单的二极管或者三极管,则需要分别作复杂的38kHz窄带滤波、RC滤波、比较器比较才能做成与上述集成带接收处理电路的接收管.后面的处理办法与上述一样. 3. 编程上采用外部中断与内部定时器结合完成解码.

贵定县15862987284: 单片机红外解码程序中关于接收时间的设定是怎么计算的呢? -
万瑗立健: 你用的是HT6221吗,一般学习应该都用这个红外芯片.根据你在问题中提的问题和与别人的交流,我说两点:1. 时间的计算,在接收和解码红外线是,要用到单片机的两个内部功能,外部中断和定时器,定时器用于捕捉红外接收时间,外部中...

贵定县15862987284: 请问专用解码是什么意思,怎么解开专用码 -
万瑗立健: 你要明白,你按数字键1,其实它是发射一个红外代码.一个遥控器的红外代码应由以下三部分组成:引导码,前16为用户识别码(即不同产家不用型号不同遥控有不同用户码),后16位为操作码(里面8位功能码及8位功能反码,这16位就是遥控器上不同按键的区分).上面32位码都是二进制数,即“0”、“1“.程序中第一个for语句,是把用户识别码和操作码一起分成4部分,每部分8位(1个字节),接下来的for语句是对每一位进行判断,判断是0还是1,然后用value通过与来记住一个字节里面的每一位,最后再将value赋给date【】.

贵定县15862987284: 红外解码原理是什么呀 -
万瑗立健: 红外遥控器: 遥控器:按键值转换成键码,再经过编码,然后调制到38K载波上 发送 接收器:接受调制信号,解码以后还原呈按键值,做相应处理 编码解码过程

你可能想看的相关专题

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网