红外遥控编解码全攻略

合集下载

红外遥控解码流程图

红外遥控解码流程图

pic12f1822接收红外信号解码流程图单片机初始化
高电平 1.125 2.25低电平表示还在引导码高电平
高电平表示还在引导码9mS高电平结束,4.5mS低电平
高电平上,
高电平表示信号没来继续等待,高电位是红外接收头的电平
解码的关键是如何识别“0”和“1”,从位的定义我们可以
发现“0”、“1”均以0.56ms的低电平开始,不同的是高电
据高电平的宽度区别“0”和“1”。

如果从0.56ms低电平过
后,开始延时,0.56ms以后,若读到 的电平为低,说明该位为“0”,反之则为“1”,为了可靠起见,延时必须比
0.56ms长些,但又不能超过1.12ms,否则如果该位为“0”,
读到的已 是下一位的高电平,因此取(1.12ms+0.56ms)/2=0.84ms最为可靠,一般取0.88ms左右均可。

头的电平
mS。

任务5.4红外遥控解码.

任务5.4红外遥控解码.

* 函数名称: InfraredInit()
* 功能 :定时器测量脉宽功能初始化 * 入口参数:无
* 出口参数:无
* 说明 : ***************************************************************************/
void InfraredInit()
{
uint PulseWidth=0;
//
uchar OriginalCode=0;
//
脉宽 操作码原码
6
5.4 红外遥控器解码
uchar AntiCode=0;
//
按键码反码
static bit FlagStart=0;
//
捕获结果码标志位
static uchar IntrNum=0;
//
中断次数
IntrNum++;
}
if(IntrNum>=32)
//
{
IntrNum=0;
AntiCode=InfraredDecode&0xff; // OriginalCode=(InfraredDecode>>8)&0xff;//
if(AntiCode+ OriginalCode==0xff) //
{
FlagInfraredGet=1;
5.4.3 任务实施
图 5.4.8 是本程序的工程结构图:
图 5.4.8 工程结构框图
4
5.4 红外遥控器解码
( 1)主函数 main.c:
#include<reg52.h>
#include"Infrered.h"

红外解码

红外解码

细说红外编解码现有的红外遥控包括两种方式: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)、五个系统位和六个数据位。

遥控器解码操作方法

遥控器解码操作方法

遥控器解码操作方法
遥控器解码操作方法通常包括以下几个步骤:
1. 确认解码器类型:首先要确定遥控器所使用的编码类型,例如NEC、RC5、SONY等。

2. 获取遥控器编码:使用红外线接收器将遥控器对准解码器,按下任意按钮,解码器会接收到红外信号。

3. 解码红外信号:将接收到的红外信号输入解码器,解码器会将信号转换成数字编码。

4. 进行处理:根据不同的解码器类型,可以进行不同的处理操作,例如将数字编码转换成对应的功能,或者将解码器输出的数字编码发送给其他设备。

总体而言,遥控器解码操作方法是通过红外接收器将遥控器信号转换成数字编码,并进行相应处理,以实现对其他设备的控制。

关于用PIC单片机红外遥控的编码与解码

关于用PIC单片机红外遥控的编码与解码

关于用PIC单片机红外遥控的编码与解码一般常用的红外遥控器编码规则都差不多,基本上都同6221原理一样(可在网上找到)接收时:如果用54,57这类片子做的话有一定的难度(假如要做成实时控制的;比如说你还要驱动显示,驱动步进电机,在加上几个按键)原因就是这类片子没有中断例程如下(用来解6221;分频比为256)RF:BTFSC PORTB,2;;B2口用做接收口GOTO RF1BTFSS DOWNBIT;;检测下降沿标制CLRF RTCCOUNTBSF DOWNBIT;制下降沿标制BTFSS UPBIT;;检测上升沿标制RETLW 0BTFSC IDBIT;;检测码头标制GOTO RF3MOVLW 2AHSUBWF RTCCOUNT,0BTFSS STATUS,0GOTO RF2MOVLW 36HSUBWF RTCCOUNT,0 BTFSC STATUS,0 GOTO RF2BTFSC IDBITGOTO RF3MOVLW .8MOVWF LOOP MOVLW .3MOVWF LOOPCOUNT CLRF DATACOUNT BSF IDBITBSF DOWNBITBCF UPBITCLRF RTCCOUNT RETLW 0RF1:BTFSS DOWNBIT RETLW 0BSF UPBITRETLW 0RF2:BCF DOWNBITBCF IDBITCLRF RTCCOUNT RETLW 0 ;遥控接收RF3:MOVLW 02HSUBWF RTCCOUNT,0 BTFSS STATUS,0 GOTO RF4MOVLW 0CH SUBWF RTCCOUNT,0 BTFSS STATUS,0 GOTO RF4GOTO RF2RF4:MOVLW 08HSUBWF RTCCOUNT,0 BTFSC STATUS,0 BSF 3H,0MOVLW 07HSUBWF RTCCOUNT,0 BTFSS STATUS,0RLF DATACOUNT,1BSF DOWNBITBCF UPBITCLRF RTCCOUNTDECFSZ LOOP,1RETLW 0MOVLW .8MOVWF LOOPDECFSZ LOOPCOUNTRETLW 0BSF RFBIT;;制接收完标制BCF DOWNBITBCF UPBITBCF IDBITCLRF RTCCOUNTRETLW 0////////////////////////////////////////////////////////// TIME:BTFSC TIMEPD1GOTO TIME1MOVF RTCC,0;;(MOVWF TIMEONEBSF TIMEPD1RETLW 0 ;定时查寻TIME1:MOVF RTCC,0SUBWF TIMEONE,0BTFSC STATUS,2RETLW 0BCF TIMEPD1INCF RTCCOUNT,1RETLW 0////////////////////////////////////////////////在这里我是用查询的方式来定时的(RTCCOUNT)只是在解码时不需要去追求时间精度;我是去查RTCC 有没有发生跳变如有则表示时间过了256US---RTCCOUNT加一;这样做有一个好处---你不必去管RTCC 具体的值是多少,(RTCC去做精确的时钟定时;在这个查询的子程序中你可以去判断键扫,显示刷新,驱动步进电机等等)相应的C代码如下:unsigned char rfcount,loop,rftime,//查询定时器k;bit rfbit, //接收完标制lowbit1,lowbit2,downbit,rfgobit;unsigned char dispcount[5];//结果#define rfin RC6//////////////////////////////////////////////////////////////////////////////// rf( )//遥控接收{if(rfbit==0){if((lowbit1==0)&&(rfin==0)){downbit=1;rftime=0;lowbit1=1;return;if((lowbit1==1)&&(rfin==1)){lowbit2=1;return;}if((lowbit1==1)&&(lowbit2==1)&&(RC6==0)) {lowbit1=0;lowbit2=0;if((rftime>=40)&&(downbit==1))//遥控接收;{rfgobit=1;loop=0;rfcount=0;k=1;rftime=0;return;}rfcount=rfcount+1;loop=loop+1;if(rfcount>=31)rfgobit=0;downbit=0;rfcount=0;rfbit=1;loop=0;return;}if((rftime>=7)&&(rfgobit==1)) {dispcount[k]=dispcount[k]|0x80; rftime=0;if(loop==8){k=k+1;loop=0;return;}dispcount[k]=dispcount[k]>>1; return;}if((rftime<5)&&(rfgobit==1))dispcount[k]=dispcount[k]&0x7f;rftime=0;if(loop==8){k=k+1;loop=0;return;}dispcount[k]=dispcount[k]>>1;return;}}}}(查询子程序同汇编)假如用中断的话也可用时间查询的方法,只是接收口改用带中断的口线;RB4--RB7,CCP1,CCP2,都可以。

红外遥控解码完全资料LCD1602

红外遥控解码完全资料LCD1602

红外遥控解码完全资料(LCD1602显示)本帖被一线工人执行置顶操作(2009-06-18)红外遥控解码实验一.实验目的1. 了解红外遥控编码并用单片机捕捉信号及解码2. 熟悉LCD1602的驱动二.红外遥控器编码遥控器编码分好几种,常见的32位编码码和42位编码码,目前我手中遥控器就是42位编码,如图1所示,当有按键时就会产一个9.12ms低电平和4.5ms高电平的起始码,紧接着是26位系统码,此系统码能区别不同的电器设备,防止不同机种遥控码互相干扰,接下来是8位数据码和8位数据反码,间隔23ms的高电平后,再发一个与启始码完全一样的结束码以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”,其波形如图2所示。

图2再回头看图1,大家不难看出,图1是遥控器按键1的一串编码三.硬件连接接收电咱我们使用一化红外接红外接收管1838,不需要任何外接无件,就能完成从红外线接收到输出与TTL电平信号兼容的所有工作,实物如图所示电路图如下:四.解码以上我们了解了红外遥控的编码及硬件连接,现在就对其进行解码,所谓解码就是能用单片机把以不同宽度的脉冲区别开来,一种比较好思路就是计算两次下降沿间隔时间,当单片机外部中断1口有下降沿时中断一次,并启动定时器,定时器定50us,当下次下降沿到来时我们计算定时器中断的次数,这样我们就能很好的区分不同宽度的脉冲了。

大家可能已经迫不急待的要开始解码了,别急,我们先把注意事项先讲一下,实际上,我们红外接收头收到的信号的是有毛刺的,放大后就如下图,所以在下降沿中断触发后,要做延时去抖处理*************************************以下是完整解码程序********************************/***********************************************项目:红外遥控解码(EE01学习板演示程序)**作者:一线工人**网站:电子工程师之家**本程序适合42位码遥控器,即26位系统码,16位数据码,如:57L5,55K2,54B4,KD-29,55K8,5Z26A,等型号的遥控器,转贴请保持代码的完整性*********************************************/#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit ir=P3^3;//红外端口sbit dm=P1^4;//数码管段码控制位sbit wm=P1^5;//数码管位码控制位sbit led_cs=P1^6;//LED控制位sbit rs=P3^5;//1602数据命令选择端sbit en=P3^4;//1602使能信号uchar num;uchar key_code=0;//遥控键值uchar new_code=0;//有无新按键uint buf_key_code=0;//键值暂存uchar key_bit_count=0;//键编码脉冲计数uint count=0;//定时中断次数计数uint buf_count=0;//定时中断计数暂存uchar common_code_count=0;//前导码脉冲计数uchar ir_status=0;//脉冲接收器所处的状态,0:无信号,1:系统码接收区,2:数据编码接收区uchar code table[]="EE01 DEMO:IR";uchar code table1[]="code:";uchar code table2[]={'0','1','2','3','4','5','6','7','8','9',};void delay_10us(unsigned char y)///延时子程序10us{unsigned char x;for(x=y;x>0;x--);}void delay_ms(uint z)//延时子程序1ms{uint x,y;for(x=z;x>0;x--)for(y=113;y>0;y--);}void init(void)/////初始化{ir=1; //红外端口写1led_cs=0; //关闭LEDEA=1; //开总中断TMOD=0x02; //定时器0,模式2,8位自动装载模式TH0=0Xd1; //定时50usTL0=0Xd1;IT1=1; //INT1下降沿触发ET0=1; //允许定时器中断EX1=1; //允许外部中断}/***********************************************定时器中断***********************************************/void time0() interrupt 1///定时器中断{count++;//定时器中断次数累加}/**********************************************外部中断,红外解码程序**********************************************/void int1() interrupt 2///外部中断{TR0=1;//开定时器中断if(count>12&&count<270)//如果信号合法,则放入buf_count,count清0,对下一个脉冲信号计时{buf_count=count;count=0;}delay_10us(10);//延时100us以消除下降沿跳变抖动if(ir==0)//INT1引脚稳定为低电平,则表法确实是信号,count重新计时,因上面延时了50us,故要补偿1次TO中断{count=2;}if(buf_count>12&&buf_count<270)//若收到的信号合法,则再进行信号分析{if(ir_status==0)//如果之前未收到引导码{if(buf_count>210&&buf_count<270)//判断是否引导码13.5ms{ir_status=1;//系统标记buf_count=0;//}}else if(ir_status==1)///收到引导码{if(common_code_count>=25)//若收完26个脉冲{ir_status=2;//数据解码标记common_code_count=0;//系统码计算清零buf_count=0;//中断计数暂存清0}else if((buf_count>40&&buf_count<70)||(buf_count>12&&buf_count<32)){buf_count=0;common_code_count++;//每收到一个信号自加1}}else if(ir_status==2)//进入数据编码接收{if(key_bit_count<8)//收到数据少于8位,则将收到的数据写入buf_key_code {if(buf_count>40&&buf_count<70){buf_count=0;buf_key_code>>=1;buf_key_code|=0x80;//收到1key_bit_count++;//数据脉冲累加}else if(buf_count>12&&buf_count<32)//收到0{buf_count=0;buf_key_code>>=1;//收到0key_bit_count++;}}else //若收完8位数据则做以下处理{ir_status=0;//接收状态返回到空闲key_code=buf_key_code;key_bit_count=0;buf_key_code=0;buf_count=0;TR0=0;new_code=1;}}}}/**********************************************1062驱动程序**********************************************/void wirte_cmd(uchar cmd)//写命令{rs=0;P0=cmd;en=1;delay_ms(5);en=0;}void wirte_data(uchar dat)//写数据{rs=1;P0=dat;en=1;delay_ms(5);en=0;}void wirte_string(const unsigned char *s)//在第二行第5个字开始写字符串{wirte_cmd(0x80+0x40+0x05);while(*s){wirte_data(*s);s++;}}void init_1602()///1602初始化{dm=0;wm=0;led_cs=0;wirte_cmd(0x38);delay_ms(5);wirte_cmd(0x0c);delay_ms(5);wirte_cmd(0x06);}/*************************************主程序*************************************/void main(){init(); ///初始化init_1602(); //1602初始化while(!new_code);//判断是否有新按键,如果有则执行下面程序,没有则一直循环wirte_cmd(0x01);//1602清屏delay_ms(5);wirte_cmd(0x80);//在第一行写入EE01 DEMO:IRfor(num=0;num<12;num++){wirte_data(table[num]);delay_ms(1);}wirte_cmd(0x80+0x40);//在第二行写入code:for(num=0;num<5;num++){wirte_data(table1[num]);delay_ms(1);}if(key_code<10)//如果按鍵小于10则写入相应的数字{wirte_data(table2[key_code]);delay_ms(2);}else if(key_code<50)//大于10则写入字符,与遥控器对应{switch(key_code){case 21:wirte_string("mute");break;case 28:wirte_string("power");break;case 10:wirte_string("-/--");break;case 14:wirte_cmd(0x80+0x40+0x05);wirte_data(0x7f);wirte_data(0x7e);break;//先写字符位置,然后写字符,case 25:wirte_string("SLEEP");break;case 19:wirte_string("P.P");break;case 15:wirte_string("TV/A V");break;case 30:wirte_string("VOL-");break;case 31:wirte_string("VOL+");break;case 27:wirte_string("P+");break;case 26:wirte_string("P-");break;case 16:wirte_string("MENU");break;case 24:wirte_string("A-MODE");break;case 13:wirte_string("SYS");break;case 12:wirte_string("GAME");break;case 20:wirte_string("DISP");break;delay_ms(2);}new_code=0;}}。

红外线遥控编码解码控制

红外线遥控编码解码控制

红外遥控具有结构简单,制作方便,成本低廉,抗干扰能力强,工作可靠性高等一系列优点。

同时,由于红外遥控器件,工作电压低,功耗小,外围电路简单,因此,在日常生活中广泛应用,如彩电,录像机,音响空调,风扇,即其它的小型电器上。

遥控距离在几米到十几米。

波长在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进制数分离,便于数码管显示,分离完毕后显示。

红外解码说明文档

红外解码说明文档

红外解码说明文档作者:ruihuan_vb@时间:2013-12-71、红外遥控的基本原理红外遥控器发出的红外光信号,所以只能产生1 0 信号。

但是,为防止自然光的干扰,同时为了增大红外管的发射功率,正真发出的“1”信号是:38K的载波信号。

(而0 1 信号的区分就在于对发射管的关闭时间)。

红外一体化接收头接收到信号后会对信号进行滤波,所以一体化接收头输出的信号是经过滤波放大后的电平信号,并且对对电平信号进行了反相输出。

2、一般电平编码的结构红外遥控的数据编码是多种多样的,但是一般都会一这这种情况出现:引导码加数据。

引导码由9ms(可能有时候要设置到9.1ms)的低电平和4.5ms的高电平构成。

“0”信号由0.6ms的低电平和0.6ms的高电平组成;“1”信号由0.6的低低电平和1.2ms的高电平组成。

(注:这里说的电平是说的是红外一体化接收头的输出电平)。

红外一体化接收头的输出波形,示波器保存的图片3、红外遥控的电路设计1)发射电路红外遥控的发射电路比较简单,但是要想做的比较好还是有要注意的地方的。

NPN 三极管直接拉红外发射头就可以构成一个红外发射电路了。

但是,要注意的是:驱动红外发射管要加隔离电阻,并且这个隔离电阻不能太大,因这个隔离电阻决定了红外发射的功率。

发射电路的关键就在这里了,这个发射管的隔离电阻的阻值不要超过10欧姆,否则发射距离会非常近的,并且还有注意发射信号的载波的占空比不要设为1/2 最好是1/3 (这个好像是跟一体化接收头的原理有关的,而且将占空白降低方便增大发射功率)。

2)红外接收电路红外接收电路比较简单,一般用一个一体化接收头接到单片机的引脚就可以了。

我们这用过的型号是:HS0038B。

4、如何利用单片机的外设来实现对应的功能红外解码功能:因为红外解码的第一步骤是对电平长度的检测,因而最好是利用单片机的捕获功能来检测电平的长度,然后再根据电平长度来判断其意义(建议:不要检测双边沿,最好是检测一个周期的电平,例如下降沿的时间间隔)。

所有红外遥控器的解码方法

所有红外遥控器的解码方法

所有红外遥控器的解码方法已经完成了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.好,希望该方法可以帮助需要的朋友.。

用单片机解码红外遥控器

用单片机解码红外遥控器

用单片机解码红外遥控器遥控器使用方便,功能多.目前已广泛应用在电视机、VCD、DVD、空调等各种家用电器中,且价格便宜,市场上非常容易买到。

如果能将遥控器上许多的按键解码出来.用作单片机系统的输入.则解决了常规矩阵键盘线路板过大、布线复杂、占用I/O口过多的弊病。

而且通过使用遥控器,操作时可实现人与设备的分离,从而更加方便使用。

下面以TC9012编码芯片的遥控器为例。

谈谈如何用常用的51系统单片机进行遥控的解码。

一、编码格式1、0和1的编码遥控器发射的信号由一串O和1的二进制代码组成.不同的芯片对0和1的编码有所不同。

通常有曼彻斯特编码和脉冲宽度编码。

TC9012的O和1采用PWM方法编码,即脉冲宽度调制,其O码和1码如图1所示(以遥控接收输出的波形为例)。

O码由O.56ms低电平和0.56ms高电平组合而成.脉冲宽度为1.12ms.1码由0.56ms低电平和1.69ms高电平组合而成.脉冲宽度为2.25ms。

在编写解码程序时.通过判断脉冲的宽度,即可得到0或1。

2、按键的编码当我们按下遥控器的按键时,遥控器将发出如图2的一串二进制代码,我们称它为一帧数据。

根据各部分的功能。

可将它们分为5部分,分别为引导码、地址码、地址码、数据码、数据反码。

遥控器发射代码时.均是低位在前。

高位在后。

由图2分析可以得到.引导码高电平为4.5ms,低电平为4.5ms。

当接收到此码时.表示一帧数据的开始。

单片机可以准备接收下面的数据。

地址码由8位二进制组成,共256种.图中地址码重发了一次。

主要是加强遥控器的可靠性.如果两次地址码不相同.则说明本帧数据有错.应丢弃。

不同的设备可以拥有不同的地址码.因此。

同种编码的遥控器只要设置地址码不同,也不会相互干扰。

图中的地址码为十六进制的0EH(注意低位在前)。

在同一个遥控器中.所有按键发出的地址码都是相同的。

数据码为8位,可编码256种状态,代表实际所按下的键。

数据反码是数据码的各位求反,通过比较数据码与数据反码.可判断接收到的数据是否正确。

全自动红外线遥控器解码测试仪使用说明

全自动红外线遥控器解码测试仪使用说明

全自动红外线遥控器解码测试仪使用说明一:基本参数电源 AC 220V,红外载波38K,最大可存储168个按键信息(视不同红外编码格式).二:性能描述1, 技术领先,功能齐全;全自动解码,无须手工操作;显示信息量大,红外编码格式及码值一目了然。

2, 带学习功能,可录入遥控器码值,方便成品测试。

3, 丰富的蜂鸣器声提示,减轻眼睛的疲劳,加快测试进度。

三:面板说明四:操作方法1,全自动解码&指定格式解码全自动解码:把拨动开关拨至“解码”方向,小数码管显示“AUTO”字样,解码仪进入自动解码模式。

使遥控器对着解码仪发码,若解码正确,解码仪则会在小数码管显示遥控器所使用的红外编码格式,下方大数码管则显示客户码及数据码信息,同时解码仪绿色LED闪烁一下,蜂鸣器BEEP一下,提示解码成功。

如果解码不成功,则LED不闪烁,蜂鸣器不响,显示也不改变。

指定格式解码:对于一祯码包含多种编码格式的遥控器,可以通过按“ENTER”键指定格式解码,用以精确捕捉每段码的码值,此时解码仪红色LED亮,小数码管显示的格式表示指定格式解码。

循环按“ENTER”可在多种格式预选。

按“RESET”键则返回全自动解码模式2,录入模式(成品录入)把拨动开关拨至“录入”方向,解码仪红色LED慢闪,小数码管显示“REC.000”字样(REC.000表示录入按键数为000),解码仪进入录入模式。

经测试,无次序按键测试会有大量按键被重复按下,实际花费时间比按按设定顺序按键测试反而要长,所以本产品仍设计为录入及校对须按相同的按键次序进行操作。

因此,在录入模式下,请根据各自遥控器先安排一个方便自己的按键顺序,然后依次按按键录入键码。

若解码仪解码成功,而且判断到接收到码与之前一个按键不同,则绿灯闪烁一下,录入按键号+1,该按键录入成功,效果如下图所示:用户码解码仪录入成功显示:数据码当解码仪无法识别到接收到的红外编码或判断到当前接收到的码与之前一个按键码一样,则解码仪的红灯闪烁一下,数码管显示不改变,不记录此次按键资料。

任务5.4红外遥控解码.

任务5.4红外遥控解码.

任务5.4 红外遥控器解码5.4.1 任务介绍红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中。

本节的任务是:通过51单片机定时器来捕捉红外一体化接收头接收到的遥控编码,并将遥控编码输出到8位LED 上。

5.4.2 知识准备1、红外发射和接收原理红外遥控系统一般由红外发射装置和红外接收设备两大部分组成。

红外发射装置由键盘电路、红外编码芯片、电源和红外发射电路组成。

红外接收设备由红外接收电路、红外解码芯片、电源和应用电路组成。

通常为了使信号能更好的被传输,发送端将基带二进制信号调制为脉冲串信号,通过红外发射管发射。

常用的有通过脉冲宽度来实现信号调制的脉宽调制(PWM )和通过脉冲串之间的时间间隔来实现信号调制的脉时调制(PPM )两种方法。

图5.4.1是红外遥控接收与发射示意图。

图5.4.1 红外遥控器收发示意图 2、调制与解调红外遥控器发射出的红外信号属于无线信号,为了避免被其它无线信号干扰,通常需要把发送的信息(基带信号)调制到一定频率的载波上传输,利用载波的不同频率来避免相互干扰,如我们手机信号的载波频段是900MHz ,蓝牙的频段是2.4GHz ,红外的就是38kHz,保证这些信号在相同的空间传输时相互之间不干扰。

载波频率为一般在30KHz 与60KHz 之间,实际上大多使用的是频率为38KHz ,占空比为1/3的矩形波。

(1)调制红外遥控器的编码调制指的是把编码后的二进制信号调制成频率为频率为38KHz 的间隔脉冲串,相当于用二进制信号的编码乘以频率为38KHz 的脉冲信号得到的间隔脉冲串,图5.4.2所示。

图 5.4.2 红外信号的调制(2)解调 红外接收头接收到信号后,需要将调制信号解调,解调是调制的逆过程。

其过程为当接收到调制信号时,输出高电平,否则为低电平。

图5.4.3 红外信号的解调3、红外遥控器的编码 红外遥控的编码有多种方式,我们的开发板上配套的红外遥控器采用PPM 编码,如果5.4.4所示。

红外遥控器编码大全

红外遥控器编码大全

红外线遥控器已被广泛使用在各种类型的家电产品上,它的出现给使用电器提供了很多的便利。

红外遥控系统一般由红外发射装置和红外接收设备两大部分组成。

红外发射装置又可由键盘电路、红外编码芯片、电源和红外发射电路组成。

红外接收设备可由红外接收电路、红外解码芯片、电源和应用电路组成。

信号调制为脉冲串信号,通过红外发射管发射。

常用的有通过脉冲宽度来实现信号调制的脉宽调制(PWM)和通过脉冲串之间的时间间隔来实现信号调制的脉时调制(PPM)两种方法。

在同一个遥控电路中通常要使用实现不同的遥控功能或区分不同的机器类型,这样就要求信号按一定的编码传送,编码则会由编码芯片或电路完成。

对应于编码芯片通常会有相配对的解码芯片或包含解码模块的应用芯片。

在实际的产品设计或业余电子制作中,编码芯片并一定能完成我们要求的功能,这时我们就需要了解所使用的编码芯片到底是如何编码的。

只有知道编码方式,我们才可以使用单片机或数字电路去定制解码方案。

下面介绍的是笔者所收集整理的一些常用遥控编码芯片的编码方式和常用一体化接收芯片的引脚示意图。

在最后还用实例介绍M50560-001P芯片的解码思路和应用实例程序的编写。

常用红外一体化接收头引脚示意uPD6121,uPD6122,PT2222,SC6121,HS6222,HS6221载波波形使用455KHz晶体,经内部分频电路,信号被调制在37.91KHz,占空比为3分之1。

调制频率(晶振使用455KHz时)f CAR = 1/Tc = f OSC/12 ≈ 38KHzf OSC是晶振频率占空比= T1/Tc = 1/3数据格式.数据格式包括了引导码、用户码、数据码和数据码反码,编码总占32位。

数据反码是数据码反相后的编码,编码时可用于对数据的纠错。

注意:第二段的用户码也可以在遥控应用电路中被设置成第一段用户码的反码。

使用455KHz晶振时各代码所占的时间位定义用户码或数据码中的每一个位可以是位‘1’,也可以是位‘0’。

请收藏详细解析:红外遥控编码与解码

请收藏详细解析:红外遥控编码与解码

请收藏详细解析:红外遥控编码与解码随着家用电器、视听产品的普及,红外线遥控器已被广泛使用在各种类型的家电产品上(如遥控开关、智能开关等)。

其具有体积小、抗干扰能力强、功耗低、功能强、成本低等特点,在工业设备中也得到广泛应用。

一般而言,一个通用的红外遥控系统由发射和接收两大部分组成,如图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”表示。

详解红外遥控器编码解码原理!

详解红外遥控器编码解码原理!

详解红外遥控器编码解码原理!红外遥控器原理介绍红外线遥控是目前使用最广泛的一种通信和遥控手段。

由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。

工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。

红外遥控系统:通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,如图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单片机红外的遥控解码程序的编写

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;}。

红外遥控器编码规则简要说明

红外遥控器编码规则简要说明

红外遥控器编码规则简要说明1、遥控器由红外遥控专用芯片PT2248作为编码及发送部分,PT2248最大可用作18路红外遥控系统的编码,其内部己集成了38kHz的红外载波振荡及相应的数字脉码调制电路,只需外接3×6的矩阵式按键、红外发光二极管及其驱动电路等少量元器件便可完成编码发送的功能。

发送部分电路图如下图所示:2、PT2248组成的十八路遥控发送器其编码规则如下:(1)设a为一个时间单位,时间长度是38kHz的16个时钟周期,即a=1÷38kHz×16=0.421ms编码是以串行形式发送的,在接收端(38kHz一体化红外接收解调器)接收到如下形式的1位的编码时分别表示“0”和“1”:1个a的低电平,3个a的高电平表示编码“0”3个a的低电平,1个a的高电平表示编码“1”编码以串行形式发送,接收端的一体化红外接收解调器输出波形如下图所示:(2)遥控器的每个按键编码由12位按以上编码规则所代表的“0”、“1”组成,时间长度为48a,当按下遥控器的7到18号单击按键,则以12位为一组(48a)发送两次编码,如下图所示:60a为自按下按键到发送编码的等待时间,80a是前后两次发送12位48a编码的高电平时间间隔。

7到18号单击按键无论发送端按键时间持续多长只发送一次这样形式的两组相同的12位编码。

(3)当按下1到6号连续按键时,编码按如下格式连续发送:(4)具体每个12位的串行编码规则如下:C1、C2、C3为用户可通过在遥控器发射电路中是否接入IN4148二极管决定其为“0”或“1”,这里取“111”,H、S1、S2为单击连续按键的标志位,相当于列坐标,D1至D6为按键输入码,相当于行坐标,低9位的按键编码如下表所示:。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

-DYDIY-红外遥控编解码全攻略作者:杜洋2005-9-26红外遥控器的解码并对电器进行遥控一直是广大单片机爱好者的一个心愿。

自己动手实现红外遥控电器也是大家单片机学习提高的一个重要的实验。

现在网上关于红外线遥控器的解码的资料和文章很多,可是我在半年前学习红外遥控的解码时可是费了不少的力气。

因为网上大部分资料和源程序都是针对某一种的红外遥控进行说明,只有买了和文章中一样的遥控器才可以继续实验。

而且网上很少有遥控器的编码资料(用单片机模拟红外遥控器),经过了半年的学习与实践现在终于对红外遥控信号的编解码有了一个微薄的认识,在止写成文章希望对初学红外遥控的朋友有一定的帮助,更渴望有深入了解这方面的高手批评指正,谈谈自己的理解与看法,我就算是抛砖引玉了。

呵呵!红外遥控器的解码:大部分的红外遥控的解码资料都是采用串口或是利用一个专用的单片机解码电路取码,前者的制作麻烦而且还要有专用的软件支持。

后者则必须单独做一块解码板,而且一般只对某一种或一类的红外遥控器有效。

而我有一种方法,只用一条不需要电路板的接线,用声卡测出红外遥控的波型。

经过了长时间的使用效果很好,而且不仅对各种红外遥控的解码,还可以对无线通信或各种低波特率的编码进行分析,相当一个高级的试波器。

红外遥控器声卡波形解码一法:采用我的解码方法需要以下的条件:1,一台有MIC输入的声卡的电脑。

2,一条制作好的红外转换线(自己制作,以下有介绍)3,安装高级音频编辑软件COOL EDIT PRO 2.0(各大下载网均有破解版下载)红外遥控协议说明:一般的,红外遥控的编码由前导码、地址码和数据码组成。

而且有比较精准的时序要求。

遥控码的发射由38KHZ或40KHZ的载波信号,由信号的时间长度来表示二进制数据。

遥控的协议表示方法很多,下面是几种典型的例子:1,1E-mail:dydiy@E-mail :dydiy@2这是某型号长虹电视机遥控器的波形,从图中可以看得出它是用一个4.5毫秒的高电平和4.5毫秒的低电平作为前导码。

之后以0.56毫秒高电平和0.56毫秒低电平表示数据“0”,以0.56毫秒高电平和1.65毫秒低电平表示数据“1”。

一般前导码都是明显比数据码长的信号,我们用COOL EDIT 得到波型图之后可以一眼就看出来。

通过前导码之后有32个数据码(“0”,“1”代码),被分成4个字节,每个字节8位(8个数据)。

数据是由高位到低位排列的,我们可以通过看数据码低电平的长度来看出数据值(长为1)。

写下数据再每8位组成一个字节,我们就可以得出70H ,70H ,1AH ,E5H 这4个字节的数据,前2个字节为地址码,用来区别各个产家或各种型号的遥控器(前导码和数据帧的不同也可以区分不同的遥控器)。

一般第一个字节与第二个字节是校验关系,第二个字节是第一个字节的反码(反码:相反的数据,如果数据为“0”反码则是“1”)或是两个字节相同,上图的字节相同。

后两个字节是数据码,用来区别遥控器的按键值,一般第三个字节与第四个字节也是同码或反码的关系,上图为反码关系。

2,此为SAA3010遥控器的波形,说实话我对这个遥控的协议不了解,不过还是知道一点点,在这里小说一下,让高手见笑大方了。

这种遥控的数据是由T (一定长度,集体没量)表示数据“0”,用数据2T 表示数据“1”。

这种协议是不分高低电平的,不论高还是低只要长度相当就表示数据,这种遥控协议的精度不高容易产生错误。

用T 的高电平表示前导码,后有24个数据码,T 长度为0,2T 长度为1,每8位组成一个字节,共有3个字节。

集体的地址字节和数据字节怎么分我就不了解了。

3,这是SONY-D7C8遥控器的波形,和长虹的遥控相似,它用4T长度高电平表示前导码,用T长度低电平和T长度高电平表示“0”,用T长度低电平和2T 长度高电平表示“1”。

共有12个代码,后4个码都为“0”,可能是地址码,可以不理采。

前8位可以组成一个字节的数据,仅用这一个字节表示数据信息。

以上可以看出遥控的编码各有不同,地址码,数据码也不同,所以我们只要了解了代码的形式(即前导码及数据“0”,“1”的表示方式),就可以完全的玩转红外遥控。

解码思路与方法:我利用电脑的声卡和COOLEDIT软件读出遥控码,首先我们得作一条转接线。

我们可以用红外一体化接收头将38K或40KHZ的调制信号解调、放大、输出TTL数据信号电平。

这里我使用的是红外一体接收集成电路TSOP1738,它有3个引脚,分别为电源VDD,地VSS,信号输出OUT。

TSOP17385V的电源我们可以用稳压电源或是从USB口取电,将输出和地接一条音频线接声卡。

就这么简单,快作吧。

电路图:3E-mail:dydiy@E-mail :dydiy@4下面安装COOL ,这个工作我就不多说了,不然大家说我八卦了。

打开COOL ,在多音轨窗口选择一个音轨,点中R 并单击录音键。

用左上角的音轨窗口转换按钮变到单轨方式。

用放大波形和减少幅度工具调整图像。

就这样,波形出来了。

从图中我们可以看出前导码和代码协议方式。

用下面的标尺还可以算出帧长度,也可以读出代码和字节,一举三得。

知道了波形了,下面我们就开始解码遥控了。

(你可以事先把你手中的遥控器每一个键的波形全5E-mail:dydiy@用COOL录下来,以方便工作)遥控码的解码方法:好了,我们了解了遥控码的协议方式了,可是我们怎么用单片机读这个码,并对电器进行遥控呢?下面就说说单片机解码的原理。

我们的单片机解码电路采用SOTP1738作为红外信号的前期检波、放大、输出TTL电平。

将1738的OUT(输出引脚)直接接到单片机的一个I/O口,再接一个单片机的最小系统(由振荡电路、复位电路、稳压电源电路组成),我们的解码硬件电路就准备好了。

为了读取数据的方便,可以在P1口接8个LED用于显示二进制数据,在一般的51单片机学习板都有这个硬件结构。

好像已经成了一个学习板的标准了。

晶振采用12MHZ和11.0592MHZ都可以,只是在延时读数上我一定的区别。

SOTP1738的输出脚(OUT)在没有信号输入时为高电平(=Vdd),当有38KHZ 的调制信号时则呈低电平(=Vss),我们用单片机的I/O口查寻电平的高低,并查寻某一电平的时间长度,就可以读出数据了。

我们以长虹遥控器为例,说说遥控码的读取:遥控码发射是由9毫秒的高电平和4.5毫秒低电平表示前导码。

用560微秒高电平和1120微秒低电平表示数据“1”,用560微秒高电平和560微秒低电平表示数据“0”。

前导码后共4个字节。

判断数据中低电平的长度是读出数据的要点,这里我们用882US(560~1120US之间)作为标尺,如果882uS之后P3.2还是低电平则表示数据1,将1写入寄存器就可以了(数据为一时还需要再延时一小段时间使电平变为高,以用来检测下一个低电平的起始)。

882US后的电平为高则将0写入寄存器。

之后程序等待下一个低电平的到来。

(发射电路发射的高电平信号被1738接收并输入单片机的是低电平,编程6E-mail:dydiy@时一定要注意。

在COOL的读码时上沉是低电平,下沉是高电平。

)仅对长虹遥控器用查寻方式解码的流程图如下:这是比较常用的解码原程序,其中还加上了正码反码校验(流程图上没有)。

7E-mail:dydiy@系统晶振为12MHZ,如果用11.0592MHZ则需要改动延时子程序。

如果用中断法的程序相似,请大家自己写吧。

JB P3.2,$ ;查寻等待低电平MOV R6,#10SB: ACALL YS1 ;调用882微秒延时子程序JB P3.2,EXIT ;延时882微秒后判断P3.2脚是否出现高电平如果有就退出解码程序DJNZ R6, SB ;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序;以上完成对遥控信号的9000微秒的初始低电平信号的识别。

JNB P3.2, $ ;等待高电平避开9毫秒低电平引导脉冲ACALL YS2 ;延时4.74毫秒避开4.5毫秒的结果码MOV R7,#16 ;忽略前26位系统识别码JJJJA:JNB P3.2,$ ;等待地址码第一位的高电平信号LCALL YS1 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态MOV C,P3.2 ;将P3.2引脚此时的电平状态0或1存入C中JNC UUUA ;如果为0就跳转到UUUALCALL YS3 ;检测到高电平1的话延时1毫秒等待脉冲高电平结束UUUA: DJNZ R7,JJJJAMOV R1,#1AH ;设定1AH为起始RAM区MOV R2,#4 ;接收从1AH到1DH的4个内存,用于存放操作码和操作反码PP: MOV R3,#8 ;每组数据为8位JJJJ: JNB P3.2,$ ;等待地址码第一位的高电平信号LCALL YS1 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态MOV C,P3.2 ;将P3.2引脚此时的电平状态0或1存入C中JNC UUU; ; ;如果为0就跳转到UUULCALL YS3 ; ;检测到高电平1的话延时1毫秒等8E-mail:dydiy@待脉冲高电平结束UUU: MOV A,@R1 ;将R1中地址的给ARRC A ;将C中的值0或1移入A中的最低位MOV @R1,A ;将A中的数暂时存放在R1数值的内存中DJNZ R3,JJJJ ;接收满8位换一个内存INC R1 ;对R1中的值加1,换下一个RAM DJNZ R2,PP ;接收完8位数据码和8位数据反码,存放在1AH/1BH中MOV A,1AHCJNE A,1BH,EXIT ;如果不等表示接收数据发生错误,放弃MOV A,1CHCPL A ;对1AH取反后和1BH比较CJNE A,1DH,EXIT ;如果不等表示接收数据发生错误,放弃;1A为遥控地址码正码1B为反码MOV A,1CH;CJNE A,#10H,EXIT; ;10H为遥控器的Power键的值SETB P0.0 (设P0.0口接一个控制电器)即当键值为10H时执行相应功能MOV P1,A ;显示键值;-----------------延时子程序--------------;YS1: MOV R4,#20 ;延时子程序1,精确延时882微秒D1: MOV R5,#20DJNZ R5,$DJNZ R4,D1RETYS2: MOV R4,#10; ;延时子程序2,精确延时4740微秒D2: MOV R5,#235DJNZ R5,$DJNZ R4,D2RETYS3: MOV R4,#2 ;延时程序3,精确延时1000微秒D3:MOV R5,#2489E-mail:dydiy@DJNZ R5,$DJNZ R4,D3RETYS4: MOV R4,#2 ;延时程序3,精确延时??微秒D4:MOV R5,#200D5:MOV R6,#250DJNZ R6,$DJNZ R5,D5DJNZ R4,D4RETEND(此程序仅为参考程序,并不实用,如要使用,请自行修改)可以了,我们用单片机读出了数据值(从P1口的二进制数读出,由高位到低位),之后我们就可以比对这个值控制电器了。

相关文档
最新文档