红外遥控软件编解码简析
红外遥控芯片BA5104的软件解码方法探讨
红外遥控芯片BA5104的软件解码方法探讨摘要:根据红外遥控芯片BA5104的编码格式,探讨使用AVR单片机ATmega16进行软件解码的两种方法:外部中断解码法和输入捕获功能解码法。
详细阐述这两种解码方法的思路,并给出相应的解码中断服务子程序。
分析这两种解码方法的优缺点,得出输入捕获功能解码法比外部中断解码法效率更高、解出的遥控码更稳定、可靠的结论。
关键词:AVR单片机;捕获模式;解码;红外遥控芯片用BA5104芯片构成的红外遥控发射器电路具有外接元件少、成本低廉、器件本身功耗低、电源电压适应范围宽、工作稳定可靠等特点,因此广泛应用于遥控风扇、灯器、电热水器等各类家用电器中。
BA5104芯片解码常用BA5204、BA820X系列、SM5032C等芯片进行硬件解码,这种解码方法缺乏灵活性。
目前许多电子产品和电气设备以单片机作为核心控制器且逐渐采用红外遥控器进行操作,采用软件解码代替硬件解码,对于设备的升级和改造提供极大的灵活性,降低开发成本。
1 BA5104芯片构成的红外遥控发射器电路由红外遥控芯片BA5104构成的红外遥控发射器电路如图1所示。
K1~K8为遥控器的输入按键,由于BA5104的按键输入端内接有上拉电阻无键按下时,电路没有电流流通,无编码信号输出。
当电路中有任一键按下时,振荡电路起振,产生455 kHz 的振荡信号,经BA5104内部电路进行12分频,得到38 kHz的载波信号。
按键的绾码信息和C1、C2的状态信息经内部电路进行编码调制,由15脚串行输出,经三极管Q1,Q2构成的达灵顿电路放大,驱动经外发射管发射38 kHz的已调制红外载波信号。
14脚输出高电平,点亮发射状态指示灯LED1。
2 BA5104芯片的编码格式BA5104的编码格式瑚为:每一帧遥控码的长度为12位,包括3位起始码位、2位用户码位、7位指令码位。
每一帧遥控码的时间间隔为4T,其中T=1.687 9 ms为每一位遥控码的周期。
红外解码
细说红外编解码现有的红外遥控包括两种方式:PWM(脉冲宽度调制)和PPM(脉冲位置调制)。
两种形式编码的代表分别为NEC、CX6122和PHILIPS的RC-5、RC-6以及将来的RC-7。
PWM(脉冲宽度调制):以发射红外载波的占空比代表“0”和“1”。
引导码为载波发射9ms,关断4.5ms。
“0”为载波发射0.56ms,关断时间0.565ms;“1”为载波发射0.56ms,关断时间1.685ms;调制频率fCAR=1/Tc=fOSC/12=37.91K,fOSC是晶振频率(455K陶瓷晶体);占空比=T1/Tc=1/3。
使用38kHz载波频率头码间隔为9ms + 4.5ms使用16位客户代码使用8位数据代码和8位取反的数据代码数据格式包括引导码、用户码、数据码及数据码反码,编码一共是32位。
红外遥控信号从引导码开始,接下来是16位客户代码,然后是8位数据代码和取反的二进制8位代码,最后的是1位结束位。
此种编码方式可以使用MCU的捕获功能实现,通过比较两次捕获的时间,来判断发射码,参考程序:/s/blog_51f1a4130100azwv.html但并不是所有的编码器都是如此,比如TOSHIBA的TC9012,其引导码为载波发射4.5ms,关断时间4.5ms,其“0”为载波发射0.52ms,关断0.52ms,其“1”为载波发射0.52ms,关断1.04ms。
另一种编码方式是PPM(脉冲位置调制):以发射载波的位置表示“0”和“1”。
用从发射载波到关断载波为“0”,从关断载波到发射载波为“1”。
其发射载波和不发射载波的时间相同,都为0.889ms,也就是每位的时间是固定的。
调制频率fCAR=1/Tc=fOSC/12=36K,fOSC是晶振频率(432K陶瓷晶体);占空比=T1/Tc=1/3。
使用36 kHz载波频率双相编码(又名曼彻斯特编码)5位地址码,6位数据码1.778ms的恒定的位时间(即在36K载波下占64时钟周期)数据格式包括一个开始位(Start bit)、一个扩展位(Enlarge bit)、一个触发位(Toggle bit)、五个系统位和六个数据位。
红外遥控器软件解码及其应用
红外遥控器软件解码及其应用红外遥控器软件解码及其应用摘要:通过对红外遥控器各按键发送冲波形的分析可以识别码型,从而为软件解码提供依据。
本文以实例介绍红外遥控器与单片机的硬件接口,并从原理出发给出软件解码的方法。
这是一个可以直接引用的成功例子,同时也为各类红外遥控器在单片机控制产品中的开发应用提供了一个非常实用的参考。
关键词:遥控器软件解码单片机在单片机控制产品的开发应用中,为了向控制系统软件控制命令,键盘往往是不可缺少的。
传统方法是利用并行输入/输出接口芯片扩展一个键盘接口,或者直接利用单片机的并行端口进行扩展。
在某些应用环境下,这种方式2个弊端:①键盘和控制系统连在一起,不灵活,环境适应性差;②浪费单片机的端口,且硬件成本较高。
使用红外遥控器作为控制系统的输入设备,具有成本低、灵活方便的特点。
本文目的就在于介绍软件解码研究的一般方法和红外遥控器进行二次开发的应用技术。
该方法已在多个应用系统设计中成功地实现,效果良好。
红外遥控器是一种非常容易买到,且价格便宜的产品,种类很多,但它们都是配合某种特定电子产品的(如各种电视机、VCD、空调器等),由专用CPU解码,作为一般的单片机控制系统能直接使用。
使用现成遥控器作为控制系统的输入,需要解决如下几个问题:如何接收红外遥控信号;如何识别红外遥控信号;解码软件的设计。
其它的问题都是非本质的,例如遥控器面板功能键标注的问题,可自行设计、重印即可。
1红外遥控信号的接收接收电路可以使用集成红外接收器成品。
接收器包括红外接收管和信号处理IC.接收器对外只有3个引脚:Vcc、GND和1个脉冲信号输出PO.与单片机接口非常方便,如图1所示。
①Vcc接系统的电源正极(+5V);②GND接系统的地线(0V);③脉冲信号输出接CPU的中断输入引脚(例如8031的13脚INT1)。
采取这种连接方法,软件解既可工作于查询方式,也可工作于中断方式。
2脉冲流分析要了解一个未知的遥控器,首先要分析其脉冲流,从而了解其脉冲波形特征(以何种方式携带“0”、“1”信息),进而了解其编码规律。
红外解码程序详解
红外遥控解码程序设计——————基于uPD6121红外编码制式红外传感系统是目前应用最为广泛的遥控系统,一个红外遥控系统可分为发射和接收两部分组成,发射端称之为红外遥控器,一般由矩阵键盘,红外编码调制芯片和红外发射管组成;接收端用一体化红外接收头即可,这个东东内置光电放大器和解调部分,信号接收之后一般很微弱须放大后才可解码,为有效发射出去得先托付在载波上所以需经历调制、解调的过程,其实对于发射部分主要工作在于编码,而对于编码方式只有几种主流方式,而目前国内大部分均为uPD6121编码方式(日本NEC公司搞出来的。
),所以我们只须弄清楚这种编码的时序,即可写出万能的红外解码程序,只要是基于这种编码方式的遥控器(家里的电视、空调、电扇遥控器)都可以用该程序来解码(这点也充分证明了C语言的高移植性啊。
)这种编码的格式其实很简单,开头是一个引导码,人家芯片在编码时将其设计成9ms的高电平和4.5ms的低电平,也就是说你必须跳过这段引导码之后才会接收到数据,第一个问题来了:为什么要加这段引导码?因为红外传感是非常容易受到干扰的,如果直接传送数据很可能并非发送端的信号,很可能来自其他辐射,后面设计程序时会遇到这个问题。
所以我们在写程序时在引导码时可以加入检测代码,如果是引导码则继续接收,否则跳出。
第二个问题就是:接收数据时我们用外部中断接收,这是考虑到CPU 的执行效率,如果你在主函数里接收数据,就好比CPU一直在问:你接收到数据没?你接收到没?..很明显不靠谱,和串口通信一样,接收数据用中断这是经验,有利于单片机的执行效率。
第三个要注意的就是红外接收端和编码发送的数据是反向的!这点很重要,我看很多资料没有写明这点,让很多童鞋疑惑不解,也就是说引导码编码时确实是9ms高电平和4.5ms 的低电平,但是到了接收端是9ms的低电平和4.5ms的高电平,所以我们在解码时就得注意引导码高电平出现的顺序。
对于编码格式,引导码后接了4个字节的数据,前两个字节为用户码和用户反码,简单点说就是器件地址;后两字节为操作码和操作反码,就是我们真正需要的数据。
红外遥控器软件解码及其应用
红外遥控器软件解码及其应用随着现代科技的不断发展,红外遥控器已经成为人们日常生活中的必备工具之一。
不过,很多人并不了解红外遥控器的工作原理以及它是如何通过软件解码来实现遥控效果的。
本文将详细介绍红外遥控器软件解码的相关知识,以及其在实际应用中的作用。
一、红外遥控器的工作原理首先,我们需要了解红外遥控器的工作原理。
简单来说,红外遥控器是一种利用红外线光谱来传输指令的设备,通过在发射端发送编码的红外信号,再在接收端解码后执行相应的指令。
通常,红外遥控器由发射部分与接收部分两个部分组成。
发射部分由红外LED发射器构成,它会通过红外发射现象来发送编码的红外信号。
在接收端,红外接收器则会接收到这些信号,并将其转换成电信号进行解码。
之后,解码器会解析出信号的编码含义,然后执行相应的指令。
这就是红外遥控器的基本工作原理。
二、红外遥控器软件解码的实现在红外遥控器的工作中,软件解码起到了重要的作用。
所谓软件解码,就是在终端设备中运行的一种程序,能够将遥控器发射的红外编码转换成可读的指令。
而这些指令就可以用于控制各种家电、设备等。
软件解码的实现主要有两种方式。
第一种是使用硬件解码器,这需要在终端设备上安装一个专门的硬件解码器,用于解析红外信号,并输出相应的指令。
第二种方法则是使用软件解码器,这需要在终端设备上安装一个软件程序,用于解析红外信号并输出指令。
在软件解码的实现中,最常见的是使用赛贝尔红外编解码库。
这个库已经成为了广泛使用的一种红外编解码方案。
它可以用于各种嵌入式设备、物联网设备、手机、电视机顶盒等多种应用场景中。
三、红外遥控器软件解码的应用目前,红外遥控器软件解码已广泛应用于各种智能家居、物联网设备、工控设备等领域。
下面列举一些具体的应用案例:1、智能家居:通过使用红外遥控器软件解码,可以实现对家中的各种电器、设备的遥控控制。
如电视、空调、照明设备等。
2、物联网设备:红外遥控器软件解码还可以用于物联网设备中,如智能家居中的智能门锁、智能家电等。
红外线遥控编码解码控制
红外遥控具有结构简单,制作方便,成本低廉,抗干扰能力强,工作可靠性高等一系列优点。
同时,由于红外遥控器件,工作电压低,功耗小,外围电路简单,因此,在日常生活中广泛应用,如彩电,录像机,音响空调,风扇,即其它的小型电器上。
遥控距离在几米到十几米。
波长在0.76um~1000um的光波为红外光(线),红外光为不可见光。
红外光按波长范围分为近红外、中红外、远红外、极红外4类。
红外线遥控是利用近红外光传送遥控指令的,波长为0.76um~1.5um。
用近红外作为遥控光源,是因为目前红外发射器件(红外发光管)与红外接收器件(光敏二极管、三极管及光电池)的发光与受光峰值波长一般为0.8um~0.94um,在近红外光波段内,二者的光谱正好重合,能够很好地匹配,可以获得较高的传输效率及较高的可靠性。
一、红外遥控系统的构成:主要由两大部分构成: 红外编码发射部分,红外解码接收部分。
红外发射部分主要由,键盘,红外编码芯片(sc6122/ht6122),电源,红外发射管组成。
红外解码部分:由红外接收电路、红外解码、电源和应用电路组成。
红外遥控接收器的主要作用是将遥控发射器发来的红外光信好转换成电信号,再放大、限幅、检波、整形,形成遥控指令脉冲,输出至遥控微处理器。
其中红外接收电路主要是接收部分的红外接收管是一种光敏二极管(现在常用一体化红外接收头)。
三、红外遥控的编码与解码常用的编码芯片HT6122,遥控器的按键信息由编码芯片编码后,以38KHZ的载频,经红外发射管,向外发射。
有引导码,16为用户编码,按键编码,按键反码构成。
引导码:引导码,也称引导脉冲,一般由高电平1和低电平0的脉冲组成,高电平9ms,低电平4.5ms用来标志遥控编码脉冲信号的开始,使遥控接收器能由此判断出所接收的信号是干扰还是系统的遥控代码。
用户码:通常由8位原码和8位反码组成。
它用来指示遥控系统的种类,以区别其它遥控系统,防止各遥控系统的误动作。
红外解码程序
红外解码程序本篇介绍红外解码的原理和程序的写法。
下面来看一下,红外线是如何编码的。
下面来具体说一下,解码的原理,每按一下遥控器的一个按键,遥控器就会发出32个“0”“1”代码(当然是通过高低电平的占空比来判断是0还是1的),具体是0,1是如何编码的上面图片中有介绍,和一个引导码,引导码的作用是告诉处理器,接下来将要开始发送代码,我们在编写程序时,当检测到引导码时,就应该准备接受数据了。
32位代码中的前16位是用户识别码,不同的遥控器不相同,防止互相干扰的,后16是8为数据码,和8位数据反码。
接下来开始介绍如何解码程序的编写。
程序中用到了两个中断,一个是定时器中断,一个是外部中断。
定时器中断用来准确计时,判断接受的代码是0还是1,外部中断用来准确确定定电平到来的时刻,然后开始计时。
/*********************************************************函数功能:红外解码,用八位数码管显示红外线的按键码,便于红外控制测试环境:hot 51学习板编译环境:keil4整理人:张家越QQ:435835181整理时间:2011-04-03************************************************************/#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar code seg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0 x6f,0x77,0x7c,0x39,0x5E,0x79,0x71 };//0-f的段选码unsigned char code seg_we[]={0,1,2,3,4,5,6,7};uchar irtime,startflag,bitnum,irreceok;uchar irdata[33];uchar irprosok;uchar display[8];uchar ircode[8] ;sbit led1=P0^1;sbit led2=P0^2;/******************************************************************** ****函数功能:延时函数,在数码管显示时使用,不需要很精确********************************************************************* ****/void delay_50us(uint t){uchar j;for(;t>0;t--)for(j=19;j>0;j--);}/******************************************************************** ******函数的功能:定时器0的初始化********************************************************************* *****/void timer0init(){TMOD=0x02; //设置定时器工作在方式2TH0=0x00; //TL0=0x00; //设置定时器的初值ET0=1; //开定时器中断TR0=1; // 打开定时器EA=1; //开总中断}/******************************************************************** ****外部中断1的初始化********************************************************************* **/void int1init(){IT1=1; //设置触发方式为上升沿EX1=1; //开外部中断1EA=1; //开总中断}/******************************************************************** **定时器0的功能函数,每中断一次irtime++,用于计时********************************************************************* **/void timer0() interrupt 1{irtime++; //定时器中断一次irtime++,用于计时}/******************************************************************** ***外部中断0的处理函数,每当有低电平数据过来时,中断一次,(使用次中断的前提是,信号线必需接在外部中断0上面,也就是P3^2口),函数功能是,把信号从高低电平变成时间的代码放入irdata【】中********************************************************************* ***/void int1() interrupt 2{if(startflag){if(irtime>32) //一组代码检测完毕{bitnum=0;}irdata[bitnum]=irtime; //把检测到的时间送到数组irdata【】中去irtime=0;bitnum++;if(bitnum==33) //如果检测到bitnum=33,说明32位用户码已经检测完毕{bitnum=0; //将bitnum清零以便重新计数irreceok=1; //接收完毕标志位置一}}else //(此函数先进入else语句,跳过引导码的检测){startflag=1; //将开始标志位置一irtime=0; //设置时间初值为零irreceok=1; //接收完毕标志位置一}}/******************************************************************** *****函数功能:把irdata【】中的时间代码转换成二进制代码存放在ircode【】中********************************************************************* *****/void irpros(){uchar k=1,value,j,i;for(j=0;j<4;j++){for(i=0;i<8;i++){value=value>>1; //右移7次(第一次是00,相当于没有移位)if(irdata[k]>6) //循环8次{value=value|0x80;}k++;}ircode[j]=value;}irprosok=1;}/******************************************************************** ********函数的功能是:将ircode【】中的二进制代码转换成为16进制代码便于在数码管上显示******************************************************************* ********/void irwork(){display[0]=ircode[0]/16;display[1]=ircode[0]%16;display[2]=ircode[1]/16;display[3]=ircode[1]%16;display[4]=ircode[2]/16;display[5]=ircode[2]%16;display[6]=ircode[3]/16;display[7]=ircode[3]%16;}/******************************************************************** ****函数功能:用数码管显示解码结果********************************************************************* ***/void display1(){uchar i;for(i=0;i<8;i++){P2=seg_we[i];P0=seg_du[display[i]];delay_50us(40);}}void main(){timer0init(); //定时器初始化int1init(); //外部中断初始化while(1){if(irreceok) //判断数据接收完毕(数组中存储的是高低电平的时间){irpros(); //执行处理函数,将高低电平时间转化成16进制的0,1代码,存放在数组中irreceok=0; //标志清零}if(irprosok) //处理函数执行完毕,{irwork(); //将存储的16进制代码分离,便于数码管显示irprosok=0; //标志清零}display1();}}//在最后我再分析一下程序的编写思路,便于大家理解,一旦有按键按下,接受管接收到引导码,进入外部中断,并将高低电平的时间放入irdata【】数组中,接受完毕标志位置一,判断接受标志位,为1,进行处理函数,将高低电平转换成16进制数,处理标志位置一,判断处理标志位,为1,执行分离函数,将16进制数分离,便于数码管显示,分离完毕后显示。
所有红外遥控器的解码方法
所有红外遥控器的解码方法已经完成了DS1302,18B20,RS232通讯,24C02存储,红外遥控等.现只将红外遥控的解码方法贴出,希望能与大家交流,起到抛砖引玉的作用.我的开发环境是IAR FOR AVR 5.11, CPU为M8,晶振 11.0592.红外遥控解码原理是通过AVR的输入捕获功能,捕获信号后进行宽度判断,并通过串口在电脑中显示出来.下面是捕获的程序,数据未经处理,只是捕获后进行编码的解码.通过这个捕获程序,原则上能解所有线外遥控编码,我已经解了格力和中星九B的遥控编码,代码未优化,只是测试.#include <iom8.h>#include "MyDelay.h" //在此未提供我的延时程序,如果有需要的我再贴出#include "MyUSART.h"//在此未提供我的串口配置程序,如果有需要的我再贴出#ifndef uchar#define uchar unsigned char#endif#ifndef uint#define uint unsigned int#endifvoid ini(void){//配置输入捕获TCCR1A = 0x00;//普通端口模式,OC1A/B未连接TCCR1B = 0x81;//位7与位6是输入捕获允许和触发方式,BIT2-0,分频选择TCNT1H = 0x00;//计数器起始值高8位TCNT1L = 0x00;//计数器起始值低8位ICR1 = 0x0000;//输入捕获发生时,将该值写入TCNTTIMSK |= 0x20;//输入捕捉中断使能 BIT5 =1TIFR &= 0xdf;//输入捕捉标志,外部引脚 ICP1 出现捕捉事件时 ICF1置位}#pragma vector = TIMER1_CAPT_vect //定时器0溢出中断入口__interrupt void TimeINT0(void){uint r;uchar h,l;r = ICR1;//接收时序if(TCCR1B &= 0x40) //更改触发方式TCCR1B = 0x81; //下降沿触发elseTCCR1B = 0xc1;//上升沿触发TCNT1H = 0x00;//计数器起始值高8位TCNT1L = 0x00;//计数器起始值低8位TIFR |= 0x20;//输入捕捉标志,外部引脚 ICP1 出现捕捉事件时 ICF1置位h = (uchar)(r>>8);l = (uchar)r;USART_Send(h); //串口显示高八位USART_Send(l);//串口显示低八位}void main(void){ini();}以下是由串口调试助手显示的数据.说明:1.时间未用,我的程序也通过串口显示了,2.前两个字节无意义,是因为捕获到低电平后,16位计数器一直在计数,所以,前面的计数值无用.3.编码原理不管是曼彻斯特_码/日立的通用红外编码/PT2272码等,差不多都由(异步) 码头+引导+编码+停止位组成,大同小异,所以根据这个原理,解出了上述数据的码头,引导和键编码.再根据解出的码画出频率图.4.计算时要将显示的数据转换成10进制再计算.5.未知部分估计是停止位,不过只要能检测到码头,引导和编码就可以了.6.解码后,可以将该数据进行处理, 这时,这个遥控器就可以赋与功能,和开发板互动了.呵呵,7.为什么选中九B,因为中9B的遥控器不用花钱,中9老是升级,好多客户都不用了,所以又省了10元钱,一块敷铜板的钱,哈哈哈.8.题外话,中9想升级的可以和我交流,我已经升了很多了.9.好,希望该方法可以帮助需要的朋友.。
一种基于单片机的红外遥控软件解码方法
低脉冲的时间是0.565,间隔0.56为0,低脉冲的时间是0.565,间隔为1.685的为1在开始时是9MS的高脉冲间隔4.5的低脉冲后经过接收的取反后就为9MS的低脉冲间隔为4.5的高脉冲了!一种基于单片机的红外遥控软件解码方法摘要:文章详细论述了红外遥控数据的调制与编码方式,设计了一种基于MCS- 51单片机的红外遥控解码方案,并简要介绍了红外通信抗十扰措施并给出软件设计实例。
关键词:单片机红外遥控编码解码ABSTRACT: This paper mainly discuss the cx>ncx>ct and cx>ding method of infrared remote control, and the d,-sign of decode system base on the MCS一51 singlachip is put forward; at the scone tune a brief introduction of resist-ing inten}erence of software and an example is given。
KEYWORDS: Singlechip Infrared remote cx>ntrol Coding Decx>de 0引言红外线遥控是日前使用广泛的一种通信和遥控乎段。
由于红外线遥控装置具有体积小、功耗低、功能强J戊本低等特点广泛应用于各种家用电器产品。
市场上的各种家电红外遥控系统技术成熟、成本低廉,但都是针对各自的遥控对象(彩电、冰箱、空调等),为了能将性能稳定价格低廉、功能较多的电视机遥控器应用于其它控制场合,本文以MCS- 51单片机W78E58为核心,设计了一套红外遥控信号解码的软件系统,通过驱动电路的扩展,能使智能仪器实现功能较复杂的遥控控制。
1红外遥控的基本组成和接收解码电路红外遥控系统一般由红外遥控信号发射器、红外遥控信号接收器和微控制器及其外围电路3部分组成,如图1所示:、当遥控信号发射器的某个按键被按下,其内部的信号发射器就产生遥控编码脉冲,经载波调制后由红外发射竹串行输出;遥控接收头完成对遥控信号的接收放大、检波、整形、再送给微控制器,由微控制器解调出编码脉冲并执行相应的遥控功能。
红外编码和解码原理
一、编码遥控发射器专用芯片很多,根据编码格式可以分成两大类,这里我们以运用比较广泛,解码比较容易的一类来加以说明,现以日本NEC的uPD6121G组成发射电路为例说明编码原理。
当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。
这种遥控码具有以下特征:采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”,其波形如下图所示。
上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。
然后再通过红外发射二极管产生红外线向空间发射。
编码数据,载波,发射,接收解码如下图所示:UPD6121G产生的遥控编码是连续的32位二进制码组,其中前16位为用户识别码,能区别不同的电器设备,防止不同机种遥控码互相干扰。
该芯片的用户识别码固定为十六进制01H;后16位为8位操作码(功能码)及其反码。
UPD6121G最多额128种不同组合的编码。
遥控器在按键按下后,周期性地发出同一种32位二进制码,周期约为108ms。
一组码本身的持续时间随它包含的二进制“0”和“1”的个数不同而不同,大约在45~63ms之间,发射波形图如下图所示。
当一个键按下超过36ms,振荡器使芯片激活,将发射一组108ms的编码脉冲,这108ms发射代码由一个起始码(9ms),一个结果码(4.5ms),低8位地址码(9ms~18ms),高8位地址码(9ms~18ms),8位数据码(9ms~18ms)和这8位数据的反码(9ms~18ms)组成。
如果键按下超过108ms仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)组成。
红外遥控器解码程序
//===================================================================== //// 红外遥控器解码程序演示//// 本程序主要将现在比较常用TX1300遥控器进行解码,将解码后的数据通过P2端////口的数码管显示出来,为了更好的看到运行过程,特加了三个指示灯用来指示当////前运行状态.P10主要用来闪亮,表示程序正在运行,P11则用来表示接收到数据, ////P12表示触发内部的定时器操作.P13的闪亮表示正确接收完一个数据. //// 程序运行效果: 打开本机电源开关,可以看到P10不停的闪动,按下遥控器的数////字键,数码管则显示相应的数字键(1-9).可以看到P11,P12在显示后呈亮状态.则////可以接收下一个数据,在上面过程中可以看到P13闪亮了一下.表明上次正确接收////到数据. ////---------------------------------------------------------------------//// 开发日期: 2009/01/30 研发单位:上海腾芯实业有限公司//#include <reg52.h> //包含51单片机相关的头文件#define uint unsigned int //重定义无符号整数类型#define uchar unsigned char //重定义无符号字符类型uchar code LedShowData[]={0x03,0x9F,0x25,0x0D,0x99, //定义数码管显示数据0x49,0x41,0x1F,0x01,0x19};//0,1,2,3,4,5,6,7,8,9uchar code RecvData[]={0x07,0x0A,0x1B,0x1F,0x0C,0x0D,0x0E,0x00,0x0F,0x19};uchar IRCOM[7];static unsigned int LedFlash; //定义闪动频率计数变量unsigned char RunFlag=0; //定义运行标志位bit EnableLight=0; //定义指示灯使能位/***********完成基本数据变量定义**************/sbit S1State=P1^0; //定义S1状态标志位sbit S2State=P1^1; //定义S2状态标志位sbit B1State=P1^2; //定义B1状态标志位sbit IRState=P1^3; //定义IR状态标志位sbit RunStopState=P1^4; //定义运行停止标志位sbit FontIRState=P1^5; //定义FontIR状态标志位sbit LeftIRState=P1^6; //定义LeftIR状态标志位sbit RightIRState=P1^7; //定义RightIRState状态标志位/*************完成状态指示灯定义*************/sbit S1=P3^2; //定义S1按键端口sbit S2=P3^4; //定义S2按键端口/*************完成按键端口的定义*************/sbit LeftLed=P2^0; //定义前方左侧指示灯端口sbit RightLed=P0^7; //定义前方右侧指示灯端口/*************完成前方指示灯端口定义*********/sbit LeftIR=P3^5; //定义前方左侧红外探头sbit RightIR=P3^6; //定义前主右侧红外探头sbit FontIR=P3^7; //定义正前方红外探头/*************完成红外探头端口定义***********/sbit M1A=P0^0; //定义电机1正向端口sbit M1B=P0^1; //定义电机1反向端口sbit M2A=P0^2; //定义电机2正向端口sbit M2B=P0^3; //定义电机2反向端口/*************完成电机端口定义***************/sbit B1=P0^4; //定义话筒传感器端口sbit RL1=P0^5; //定义光敏电阻端口sbit SB1=P0^6; //定义蜂鸣端口/*********完成话筒,光敏电阻,蜂鸣器.端口定义**/sbit IRIN=P3^3; //定义红外接收端口/*********完成红外接收端口的定义*************/#define ShowPort P2 //定义数码管显示端口extern void ControlCar(uchar CarType); //声明小车控制子程序void delayms(unsigned char x) //0.14mS延时程序{unsigned char i; //定义临时变量while(x--) //延时时间循环{for (i = 0; i<13; i++) {} //14mS延时}}void Delay() //定义延时子程序{ uint DelayTime=30000; //定义延时时间变量while(DelayTime--); //开始进行延时循环return; //子程序返回}void IR_IN() interrupt 2 using 0 //定义INT2外部中断函数{unsigned char j,k,N=0; //定义临时接收变量EX1 = 0; //关闭外部中断,防止再有信号到达delayms(15); //延时时间,进行红外消抖if (IRIN==1) //判断红外信号是否消失{EX1 =1; //外部中断开return; //返回}while (!IRIN) //等IR变为高电平,跳过9ms 的前导低电平信号。
红外线遥控解码原理
红外线遥控解码原理一、引言红外线遥控解码是一种常见的电子技术应用,广泛用于电视、空调、音响等家电产品中。
通过红外线遥控解码技术,可以实现遥控器与设备之间的无线通信,方便人们对设备进行远程操控。
本文将介绍红外线遥控解码的原理和实现方式。
二、红外线遥控解码原理红外线遥控解码的原理是利用红外线信号的特点进行解码。
遥控器通过按键操作产生一系列的红外信号,这些信号被红外发射器发射出去,然后被接收器接收并解码。
下面将详细介绍红外线遥控解码的原理。
1. 红外线信号的特点红外线是一种电磁波,波长在0.75微米到1000微米之间。
在这个波长范围内,红外线具有较好的穿透性,能够穿透一些物体,比如空气、玻璃等。
同时,红外线的波长也决定了它能够被人眼所感知。
2. 红外线遥控信号的编码方式红外线遥控信号一般采用脉冲宽度编码(Pulse Width Encoding)的方式进行编码。
即通过调节红外线信号的脉冲宽度来表示不同的信息。
通常会将一个编码周期分为若干个时间单位,每个时间单位内的脉冲宽度决定了信号的状态,比如高电平表示1,低电平表示0。
3. 红外线遥控信号的解码方式红外线遥控信号的解码一般分为两个步骤:解调和解码。
解调是指将接收到的红外线信号转换为电信号,解码是指将解调后的电信号转换为对应的按键信息。
解调通常采用红外线接收头来完成,红外线接收头是一种能够感知红外线信号并将其转换为电信号的传感器。
红外线接收头内部含有一个光电二极管,当红外线信号照射到光电二极管上时,会产生一个电压信号。
通过对这个电压信号进行放大和滤波处理,可以得到解调后的电信号。
解码是将解调后的电信号转换为对应的按键信息。
解码一般采用红外线遥控解码芯片来完成,这些芯片内部包含了一系列的逻辑电路和存储器,能够根据输入的电信号解码出对应的按键信息。
不同的遥控器厂商和设备类型会使用不同的解码协议,因此解码芯片需要根据具体的解码协议来进行解码。
三、红外线遥控解码的实现方式红外线遥控解码可以通过硬件电路和软件算法两种方式来实现。
红外解码讲解
红外解码一直是单片机中应用较多的,需要设备加装专用解码芯片,这就大大减轻了单片机的负担。
需要单片机样例使用延时做红外解码,比较容易理解,但是由于在主程序中使用,当存在许多中断时就可能造成误码,很多时候误码率较高,成品中则一般使用中断方式。
下面通过TC9012和uPD6121芯片为例大致讲解解码原理:先看一些遥控器发射波形图从上图可以看出 4.5ms高电平+4.5ms低电平称为头码,用于识别是否遥控码开始,uPD6121的头码是9ms+4.5ms,其他的一样,一些datasheet会提及连续发射码的波形图(就是一直按下某一遥控器按键),这里我们不做分析,仅分析单次按键发射的正个码的波形图。
头码过后可以看到4个8位的数据,我们最终目的就是要把这个 32位(4x8)从一体化红外接收头提取出来,并转换成16进制数,用于区分不同按键按下得出的不同数值。
在遥控器发射波形中,可以看出,8位数中的0或者1不是用高低电平表示,而是用不同的低电平的宽度表示,0.565ms表示0,1.69ms表示1,2个位中间还会有一个0.56ms的高电平(上图阴影部分)。
这个是红外遥控器发射的波形,图中看到的阴影高电平表示载波,一般使用38KHz,遥控器发射出去的含有载波的红外信号通过一体化红外接收头处理后得到的是含有载波的反向的波形,也就是没有上图中的阴影部分。
大致如下图一体化红外接收头内部集成了选频放大(38KHz左右频率增益最大),检波(把38KHz的载波滤除),放大整形(变成容易检测的矩形波)。
看到如上图波形,表示单片机引脚可以接收到的波形,我们只要通过单片机读取波形并分析波形的宽度,然后分辨出是头码,还是0或者1,最后整理出这组码的16进制组合。
正确的解码结果是按同一个按键得出的16进制数值是不变化的。
通过这个原理,我们可以分辨出每个按键的键值。
mini80/mini80e样例程序中使用的红外解码程序,应用了外部中断,平时从书上或者网络上看到的解码一般是单纯解码,整个程序不做其他工作,这种方式可以使用普通io口,用延时等待的方法判断接收到的是高电平还是低电平,从而判断码值。
详细解析:红外遥控编码与解码
详细解析:红外遥控编码与解码随着家用电器、视听产品的普及,红外线遥控器已被广泛使用在各种类型的家电产品上(如遥控开关、智能开关等)。
其具有体积小、抗干扰能力强、功耗低、功能强、成本低等特点,在工业设备中也得到广泛应用。
一般而言,一个通用的红外遥控系统由发射和接收两大部分组成,如图1 所示:其中发射部分主要包括键盘矩阵、编码调制、红外发射管;接收部分包括光、电信号的转换以及放大、解调、解码电路。
举例来说,通常我们家电遥控器信号的发射,就是将相应按键所对应的控制指令和系统码( 由0 和1 组成的序列),调制在32~56kHz 范围内的载波上,然后经放大、驱动红外发射管将信号发射出去。
此外,现在流行的控制方法是应用编/ 解码专用集成电路芯片来实现。
不同公司的遥控芯片,采用的遥控码格式也不一样。
在此介绍目前广泛使用较普遍的两种,一种是NEC Protocol 的PWM( 脉冲宽度调制) 标准,一种是Philips RC-5 Protocol 的PPM( 脉冲位置调制) 标准。
NEC 标准(代表芯片WD6122):遥控载波的频率为38kHz( 占空比为1:3) ;当某个按键按下时,系统首先发射一个完整的全码,然后经延时再发射一系列简码,直到按键松开即停止发射。
简码重复为延时108ms,即两个引导脉冲上升沿之间的间隔都是108ms。
如图2所示即为完整的NTC编码。
对于NTC编码,由引导码、用户编码低位,用户编码高位、键数据编码、键数据编码五部分组成,引导码由一个9ms的载波波形和4.5ms的关断时间构成,它作为随后发射的码的引导,这样当接收系统是由微处理器构成的时候,能更有效地处理码的接收与检测及其它各项控制之间的时序关系。
编码采用脉冲位置调制方式(PPM)。
利用脉冲之间的时间间隔来区分“0”和“1”。
每次8位的码被传送之后,它们的反码也被传送,减少了系统的误码率。
数据0 可用“高电平0.56ms +低电平0.56ms”表示,数据1 可用“高电平0.56ms +低电平1.68ms”表示。
红外遥控解码原理
感谢观看
汇报人:XX
红外遥控解码技 术能够提高智能 家居系统的稳定 性和可靠性
红外遥控解码技 术能够实现智能 家居系统的自动 化控制
红外遥控解码技 术能够提高智能 家居系统的安全 性和隐私保护
04
红外遥控解码的发展趋势
提高解码的准确性和稳定性
采用更先进的 算法和编码技 术,提高解码 的准确性和稳
定性
增加抗干扰能 力,降低外界 因素对解码的
影响
优化硬件设计, 提高接收器的 灵敏度和稳定
性
结合人工智能 技术,实现自 适应学习和优
化解码效果
实现多通道解码和多协议兼容
红外遥控解码技术不断发展,未来将实现多通道解码,提高解码效率和稳定性。 随着不同品牌和型号的红外遥控器不断涌现,多协议兼容将成为解码技术的重要发展方向。 解码芯片厂商将不断推出支持更多协议和通道的解码芯片,以满足市场需求。 未来红外遥控解码技术将更加智能化和人性化,为用户带来更加便捷的使用体验。
灯光:红外遥控解码技术也可以 用于控制灯光,如调节亮度、色 温等,实现智能照明。
在工业控制中的应用
实现远程控制:通过红外遥控解码技术, 工业控制中可以实现设备的远程启动、 停止、调节等功能,提高生产效率。
自动化监控:红外遥控解码技术可以用 于工业控制中的自动化监控,例如对温 度、湿度、压力等参数的实时监测和调 节。
无线通信:红外遥控解码技术可以实现工 业控制中的无线通信,避免了布线的繁琐 和成本,提高了系统的灵活性和可靠性。
安全性:红外遥控解码技术可以用于工 业控制中的安全保护,例如对设备的锁 定、解锁等操作,保证生产过程的安全 可控。
在智能家居系统中的应用
红外遥控解码技 术能够实现智能 家居系统的远程 控制
详解红外遥控器编码解码原理!
详解红外遥控器编码解码原理!红外遥控器原理介绍红外线遥控是目前使用最广泛的一种通信和遥控手段。
由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。
工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。
红外遥控系统:通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,如图1所示。
发射部分包括键盘矩阵、编码调制、 LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路。
红外的简单发射接收原理:在发射端,输入信号经放大后送入红外发射管发射,在接收端,接收管收到红外信号后,由放大器放大处理后还原成信号,这就是红外的简单发射接收原理。
1、红外遥控系统结构红外遥控系统的主要部分为调制、发射和接收,如图1所示:打开今日头条,查看更多精彩图片红外遥控是以调制的方式发射数据,就是把数据和一定频率的载波进行“与”操作,这样既可以提高发射效率又可以降低电源功耗。
调制载波频率一般在30khz到60khz之间,大多数使用的是38kHz,占空比1/3的方波,如图2所示,这是由发射端所使用的455kHz晶振决定的。
在发射端要对晶振进行整数分频,分频系数一般取12,所以455kHz÷12≈37.9kHz≈38kHz。
目前有很多种芯片可以实现红外发射,可以根据选择发出不同种类的编码。
由于发射系统一般用电池供电,这就要求芯片的功耗要很低,芯片大多都设计成可以处于休眠状态,当有按键按下时才工作,这样可以降低功耗芯片所用的晶振应该有足够的耐物理撞击能力,不能选用普通的石英晶体,一般是选用陶瓷共鸣器,陶瓷共鸣器准确性没有石英晶体高,但通常一点误差可以忽略不计。
红外线通过红外发光二极管(LED)发射出去,红外发光二极管(红外发射管)内部构造与普通的发光二极管基本相同,材料和普通发光二极管不同,在红外发射管两端施加一定电压时,它发出的是红外线而不是可见光。
红外编解码彻底解析
黑-月人在江湖!红外编解码彻底解析1、编码格式现有的红外遥控包括两种方式:PWM(脉冲宽度调制)和PPM(脉冲位置调制)。
两种形式编码的代表分别为NEC和PHILIPS的RC-5、RC-6以及将来的RC-7。
PWM(脉冲宽度调制):以发射红外载波的占空比代表“0”和“1”。
为了节省能量,一般情况下,发射红外载波的时间固定,通过改变不发射载波的时间来改变占空比。
例如常用的电视遥控器,使用NEC upd6121,其“0”为载波发射0.56ms,不发射0.56ms;其“1”为载波发射0.56ms,不发射1.68ms;此外,为了解码的方便,还有引导码,upd6121的引导码为载波发射9ms,不发射4.5ms。
upd6121总共的编码长度为108ms。
但并不是所有的编码器都是如此,比如TOSHIBA的TC9012,其引导码为载波发射4.5ms,不发射4.5ms,其“0”为载波发射0.52ms,不发射0.52ms,其“1”为载波发射0.52ms,不发射1.04ms。
PPM(脉冲位置调制):以发射载波的位置表示“0”和“1”。
从发射载波到不发射载波为“0”,从不发射载波到发射载波为“1”。
其发射载波和不发射载波的时间相同,都为0.68ms,也就是每位的时间是固定的。
通过以上对编码的分析,可以得出以某种固定格式的“0”和“1”去学习红外,是很有可能不成功的。
即市面上所宣传的可以学习64位、128位必然是不可靠的。
另外,由于空调的状态远多于电视、音像,并且没有一个标准,所以各厂家都按自己的格式去做一个,造成差异更大。
比如:美的的遥控器采用PWM编码,码长120ms左右;新科的遥控器也采用PWM编码,码长500ms左右。
如此大的差异,如果按“位”的概念来讲,应该是多少位呢?64?128?显然都不可能包含如此长短不一的编码。
2、学习模式现在用来学习红外的CPU,无外乎以下几种:MCS-51系列、microchip pic16系列、winbond w741系列、holtek ht48系列,以上的CPU由于价格便宜、使用量大,被广泛使用在遥控器上。
51单片机红外的遥控解码程序的编写
51单片机红外的遥控解码程序的编写下面把这次红外编程的解码的经历简要的写一下,以便以后回顾总结:红外遥控过程是这样的:红外遥控器的矩阵键盘按键,接着专用芯片编码调制然后红外发射;红外接受头经过光电放大,解调,最后解码编程。
我的遥控专用芯片是UPD6122G-001.解码晶振是455kHz,调制载波频率是455kHz/12=38kHz。
此外调制信号是PWM进行调制的,0是脉冲波形位0.5625ms的高电平跟0.5625ms的低电平组成,1则是0.5625ms的高电平跟1.6785ms的低电平组成。
跟其他通用的波形一样,有键按下时,先是9ms的高电平的起始码,接着是一个4.5ms结果码,接下来就是数据了。
用户码的高8位,用户码的低8位,8位数据码,8位数据反码,最后还有一个停止位。
如果按键一直没松,则接下来就只是发送起始码(9ms高电平),接着是一个2.2ms的低电平,再接着是一个停止位。
我的红外接在单片机p3.7引脚上面,从网上收集了一些程序,基本上如同一则,汇编编写,跟外部中断还有关系。
于是便萌生了自己写一下的想法。
我的思路是用定时器进行计数,然后编程。
刚开始编写程序是,由于忘了对定时器的标志位进行置为,结果定时中断根本就没有执行,手头上又没有用仿真芯片,搞得我下载调试了十来次才发现了这个问题。
还有一个问题刚开始遥控能够解码的时候,可是一直按某个键,你按一次,她就变化一次,搞得我很是郁闷,差点儿没晕过去。
怎么找都不知道问题的所在,心里不断地打算放弃,不过最后还是坚持了下来,原来电路的实际解码电平跟资料上是相反的。
遥控器的实际电平由高变低,而电路板上却是由低变高。
这点确好相反。
总结:一要自信,二要坚持,才有可能完成你想做的事件。
#include"reg51.h"#include"2-16.h"#include"address.h"//需要显示的信息uchar code hello[] = "Hello,PengSen!";//变量uchar data psCount; //定时器计数器uchar data i;uchar data j;uchar data temp;uchar data dp[4]; //用来保存红外遥控的码值uchar data dp2[12];//用来显示红外遥控的码值sbit HW = P3^7;void delay(unsigned int y);void main(){//初始化initlcd();dp[0] = 0x0;dp[1] = 0x0;dp[2] = 0x0;dp[3] = 0x0;TMOD = 0x11; // 定时器0, 1工作模式1, 16位定时方式TH1 = 0xfe; //定时500uSTL1 = 0x33;TCON = 0x01;IE = 0x80;TR1 = 1;printf(hello,13);while(1){//报文头ET1 = 0;psCount = 0;while(HW == 1); //初始状态下,红外输出脚一直是高电平,等待遥控按键ET1 = 1;while(HW == 0);if( psCount > 17)//0.5* 17 = 8.5ms约为9.0ms{ET1 = 0;psCount = 0;ET1 = 1;while(HW == 1);if(psCount > 5)//超过0.5*5 = 2.5毫米,检查一下遥控命令是不是连发,不是则执行下面的程序{ET1 = 0;psCount = 0;dp[0] = 0x0;dp[1] = 0x0;dp[2] = 0x0;dp[3] = 0x0;//数据for(i = 0 ; i < 4; i++){for(j = 0; j < 8; j++){while(HW == 0);ET1 = 0;psCount = 0;ET1 = 1;while(HW == 1);if(psCount > 2)//根据波形长度判定码值为0或1temp = 0;elsetemp = 1;dp[i] |= (temp<<="">}}}}//停止位while(HW == 1);//数据显示delay(20);dp2[0] = dp[0]/100 + 0x30;dp2[1] = dp[0]%100/10 + 0x30;dp2[2] = dp[0]%10 + 0x30;dp2[3] = dp[1]/100 + 0x30;dp2[4] = dp[1]%100/10 + 0x30;dp2[5] = dp[1]%10 + 0x30;dp2[6] = dp[2]/100 + 0x30;dp2[7] = dp[2]%100/10 + 0x30; dp2[8] = dp[2]%10 + 0x30; dp2[9] = dp[3]/100 + 0x30;dp2[10] = dp[3]%100/10 + 0x30; dp2[11] = dp[3]%10 + 0x30; printf(dp2,12);delay(20);}}//延时子程序void delay(unsigned int y){uchar x;for(;y!=0;y--)for(x=200;x!=0;x--); }//定时器1中断void timer1() interrupt 3 {psCount++;TH1 = 0xfe; //定时500uS TL1 = 0x33;}。
红外遥控器软件解码及其应用汇编语言程序
《红外遥控器软件解码及其应用》汇编语言程序——网络补充版;===========================================;遥控器软件解码子程序,入口标号:TKEY;影响4BH、4CH单元;4BH为循环计数器。
;位地址00H为读键标志:“1”为成功,“0”为读;键无效, 若成功, 键值在4C单元中。
;位地址04H为键值类型标志:;“1” 实际值,“0” 映射值。
;以下2个参数是红外遥控信号的软件解;码参数,视CPU时钟频率而定,若晶振为6M,则;===========================================#HW EQU #08H ;引导脉冲特征宽度#PW EQU #02H ;信号脉冲特征宽度#ZGZQ EQU #90H;主工作区高位地址;TKE2: LJMP TKE;接力跳转;TKEY: PUSH A ;子程序入口PUSH PSWPUSH DPHPUSH DPLPUSH 00HPUSH 01HMOV TMOD,#01HMOV PSW, #00HMOV P2, #ZGZQMOV R0, #70HMOV R1, #21H ;有效脉冲只有33个CLR 00HTK3: MOV TH0,#0MOV TL0,#0AH;测低电平宽度SETB TR0TK4: JB TF0, TKE2;超时无效转结束JNB P3.3, TK4CLR TR0MOV A, TH0MOVX @R0, AINC R0MOV A, TL0MOVX @R0, AINC R0MOV TH0, #00HMOV TL0, #0AH;测高电平宽度SETB TR0TK5: JB TF0, TKE2;超时无效转结束JB P3.3, TK5CLR TR0MOV A, TH0MOVX @R0, AINC R0MOV A, TL0MOVX @R0, AINC R0DJNZ R1, TK3;循环;分析脉冲流;脉冲波形数据存放在70H开始的连续84H个单元内, ;每个脉冲由一个低电平脉宽和高电平脉宽组成;每个脉宽数据占两个字节,前一个字节为高8位;后一个字节为低8位;;判引导脉冲是否有效MOV R0, #70HMOVX A, @R0CLR CSUBB A, #HWJC TKE ;低电平引导脉冲无效转结束INC R0INC R0MOVX A, @R0SUBB A, #HWJC TKE ;高电平引导脉冲无效转结束;分析键码;键码值在片内4CH单元 !;判9012遥控芯片特征码是否有效,;特征码是连续两个字节的0EH;首先译码第1个特征码,并判断是否为“0EH”MOV 4BH, #8MOV 4CH, #0INC R0INC R0TK6: INC R0INC R0MOVX A, @R0CLR CSUBB A, #PWMOV A, 4CHRRC AMOV 4CH, AINC R0INC R0DJNZ 4BH, TK6 ;循环MOV A, 4CHCPL ACJNE A, #0EH, TK7MOV A, R0 ;是9012芯片的特征码ADD A, #20H;跳过后一个特征码的MOV R0, A ;判断,去译码键值-----LJMP TK9 ;--转TK9;第1个特征码无效;再译码第2个特征码,并判断是否为“0EH”TK7: MOV 4BH, #8MOV 4CH, #0TK8: INC R0INC R0MOVX A, @R0CLR CSUBB A, #PWMOV A, 4CHRRC AMOV 4CH, AINC R0INC R0DJNZ 4BH, TK8MOV A, 4CHCPL ACJNE A, #0EH, TKE;无效退出;; 特征码有效,进行键值译码TK9: MOV 4BH, #8MOV 4CH, #0TK10: INC R0INC R0MOVX A, @R0CLR CSUBB A, #PWMOV A, 4CHRRC AMOV 4CH, AINC R0INC R0DJNZ 4BH, TK10MOV A, 4CH;CPL A ;得键码JB 04H, TKE1MOV DPTR, #TAB ;键码到键值MOVC A, @A+DPTR;的查表映射TKE1: MOV 4CH, A;或4CH中SETB 00H ;置读键有效标志TKE: POP 01HPOP 00HPOP DPL ;返回POP DPHPOP PSWPOP AMOV P2, #0FFHRET;以下是针对某一具体应用的“重定义按键”映射表TAB: DB 01H,02H,03H,04H,05H,06H,07H,08HDB 09H,00H,20H,20H,20H,20H,20H,20HDB 0EH,11H,14H,13H,0AH,0BH,0FH,20HDB 0CH,0DH,15H,20H,10H,12H,0FH,20HDB 20H,20H,20H,20H,20H,20H,20H,20H;以上是软件译码的子程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
红外遥控软件编解码简析
摘要:
介绍如何用SONIX单片机实现红外编解码,并讨论SONIX系列芯片在实现红外遥控中的优势所在。
文中给出红外发射和接收硬件原理图,并给出相应程序。
关键词:Buzzer输出,外部电平变化中断
引言:
红外线遥控是目前应用最广泛的一种通信和遥控手段。
由于红外线遥控器具有体积小、功耗低、功能强、成本低等特点。
因此在家电产品中有着广泛的应用。
相比与专用的控制芯片,微控制器具有开发灵活的特点,用户可以随意制定编解码格式。
SONIX 8bit MCU中的
1、1K的ROM,48bit的RAM完全可以用来开发普通的红外遥控产品,4K的ROM,128bit
的RAM可用做高端复杂的红外遥控产品。
2、Buzzer输出功能可以方便的实现38K载波,1/2个计时计数器,上升下降沿可选的
外部中断便于灵活接收和解码。
3、5V/4MHz条件下,正常工作电流2~3mA,睡眠电流小于1uA,便于电池供电系统。
一、红外编码格式说明
用户采用红外模块时,编码格式非常灵活。
目前市场上的红外编码格式非常多,每家公司都可以自己定义一种编解码格式。
下面以一种比较常用的格式来做分析说明(示意图中高电平代表38K载波输出):
上面的波形格式包括前导码(Load Code)、身份码和身份反码(ID Code)、数据码和数据反码(Data Code)。
导航码(Load Code):导航码用来通知接受器其后为遥控数据,解码部分在接受到这个信号后就可以开始解码。
系统码(ID Code):系统码用来区分是哪一机型的数据,接收端依此来判断后续的数据是否为须执行的指令。
数据码(Data code):数据码用来区分是哪一个键被按下,接收端根据数据码做出应该执行什么动作的判断。
数据帧间的空闲时间:有用信号中两帧数据间的空闲时间。
红外遥控数据传输系统中的关键是数据传输的可靠性。
因此有些公司也会在系统码和数据码后面分别再传送一个同样的码或反码,供误码校验用。
在红外遥控编码中数据位的格式一般如下图所示,通过低电平的时间不同,来区别0和1。
在解码的时候既可以根据总的时间长度不同来解码,也可以根据低电平时间的不同来解码。
Bit 0 Bit 1
二、红外发射接收硬件电路部分
红外遥控的发射接收电路比较简单,其中接收电路可以使用集成红外接收器成品。
接收器包括红外接收管和信号处理IC。
接收器对外只有3个引脚:Vcc、GND和1个脉冲信号输出PO。
与单片机接口非常方便,如图所示。
①Vcc接系统的电源正极(+5V);
②GND接系统的地线(0V);
③脉冲信号输出接CPU的中断输入引脚。
采取这种连接方法,软件解既可工作于查询方式,也可工作于中断方式。
但需要注意的两点:一是注意发射接收管的驱动电流;二是要注意接收部分的滤波措施,上图中C2就是用做稳定输出波形,但注意C2不可太大。
三、红外编码发射接收软件实现部分
1、红外编码发射部分软件实现方法:
红外发射管需要靠38K的载波驱动,才能将信号发送出去。
有的MCU没有BUZZER
输出功能,不能靠硬件实现38K载波,就必须用软件模拟38K载波的输出。
而我们SN8P25XX,SN8P26XXS系列的BUZZER输出功能配合适当的震荡频率,可以很方便的实现38K载波的输出。
红外发射部分的软件实现一般可以分为两种:纯软件编码发射,计时器编码发射。
纯软件编码发射:根据编码格式,利用延时取得适当的时间段来控制载波的输出时间和输出间隔时间,达到编码正确发送的目的。
这种方式思路简单容易实现,但比较浪费资源,实时性不高,也不利于程序的移植。
计时器编码发射:根据编码格式,采用计时器中断取得合适的时间段来控制载波的输出时间和输出间隔时间。
这种方法充分利用了系统的资源,执行效率很高,并很容易实现程序的移植。
现采用SN8P2602A,外部晶振为3.58MHz所做的一款简单的遥控器,其编码发射流程图见图1。
图1
2、红外编码接收部分软件实现方法:
根据数据帧中不同的数据位格式和MCU中的资源,重要数据解码接收在程序设计中存在很大差别。
一般有几种情况:纯软件解码、计时器解码、外部中断和计时器配合解码等。
纯软件解码:根据数据格式采用延时方式来取得合理的采样时间,每到达一次采样时间就测电平变化以确定解码数值。
此种方法对MCU资源要求不高,无需计时器,也无需外部电平变换中断源,其实现方法也比较简单,并可以进行软件滤波处理。
但此方法在解码过程中不能并行处理其他事,所以在比较复杂的系统中不推荐应用。
计时器解码:可以有两种思路来实现解码:一种方式是根据数据位格式利用计时器取得合理的采样时间,每达到一次采样时间就检测电平变化,根据在设定的时间内检测到高电平(或低电平)的次数来确定解码数值。
另一种方法是累计电平变化的时间,计算两次电平变化之间的时间,再根据时间的长短来确定解码数值。
外部中断和计时器配合解码:利用外部中断的下降沿中断功能侦测编码信号的电平变化,利用计时器采样检测电平,累计时间以确定解码数值。
此种方式效率高,解码灵敏,可以实现各种复杂系统中的准确解码。
但在应用外部中断做信号变化侦测的时候,要注意外部干扰信号,需要在外部电路中做好滤波措施。
在SONIX的SN8P25XX,SN8P26XX系列中都有电平变化的外部中断源,因此非常适合各种编码格式的解码。
下面为采用方式三解码的程序流程图,如下图。
解码子程序主程序模块
四、红外编解码设计中的注意点
1、红外产品中遥控部分工作系统一般比较简单,并且实现准确的波形也相对比较简单。
因此在确定编码格式的时候要充分考虑到解码的方便性,准确性。
这主要要从数据码0和1的编码时间长短方面来考虑。
一般说来,时间T不宜过短,越短对解码部分MCU的工作速度要求越高,误码率也会随之增加。
但如果T的时间过长,将降低数据传输速率。
下面为NEC格式采用的编码时间,可做参考。
Bit 0 Bit 1
2、红外编码信号的发射一般是通过按键输入来发射相应的信息码。
因此,在检测到按键按下后,一般有两种处理方法:一种是在按键按下的过程中一直发送数据,按键弹起发送完最后一帧完整数据后便停止发送或直接停止发送。
这样一般不会出现误码的情况。
另一种是在检测到按键按下后,固定发送几帧数据,然后停止发射。
但此方法不能保证接收方每次都完整收码,误码率较高。