红外遥控器按键编码测试
- 格式:pdf
- 大小:67.59 KB
- 文档页数:3
第1篇一、实验目的本次实验旨在通过搭建红外遥控系统,了解红外遥控的基本原理,掌握红外遥控信号的编码和解码方法,并利用单片机实现对红外遥控信号的解码,实现对红外遥控器的控制。
二、实验原理红外遥控技术是一种无线通信技术,通过发射端发送特定编码的红外信号,接收端接收该信号并进行解码,从而实现对电器的控制。
红外遥控系统主要由发射端和接收端两部分组成。
1. 发射端:由按键矩阵、编码调制电路和红外发射器组成。
按键矩阵根据按键的不同产生不同的编码信号,编码调制电路将这些信号调制在38kHz的载波上,红外发射器将调制后的信号发射出去。
2. 接收端:由红外接收器、前置放大电路、解调电路和指令信号检出电路组成。
红外接收器接收发射端发射的红外信号,前置放大电路对信号进行放大,解调电路将38kHz的载波信号去除,指令信号检出电路从解调后的信号中提取出指令信号。
三、实验设备1. 红外遥控发射器2. 红外接收模块3. 单片机开发板4. 连接线5. 电源6. 红外遥控解码程序四、实验步骤1. 搭建红外遥控系统:将红外接收模块连接到单片机开发板的相应引脚上,确保连接正确无误。
2. 编写红外遥控解码程序:根据红外遥控协议,编写解码程序,实现对红外信号的解码。
3. 程序烧录与调试:将解码程序烧录到单片机中,连接电源,进行程序调试。
4. 测试与验证:使用红外遥控器对单片机进行控制,观察单片机是否能够正确解码红外信号,并实现相应的控制功能。
五、实验结果与分析1. 红外遥控系统搭建成功:通过连接红外接收模块和单片机开发板,成功搭建了红外遥控系统。
2. 解码程序编写与调试:根据红外遥控协议,编写解码程序,实现对红外信号的解码。
在调试过程中,通过观察单片机的输出,验证了程序的正确性。
3. 测试与验证:使用红外遥控器对单片机进行控制,观察单片机是否能够正确解码红外信号,并实现相应的控制功能。
实验结果表明,单片机能够成功解码红外信号,并实现红外遥控器的控制功能。
电源和红外发射电路组成。
信号调制为脉冲串信号,通过红外发射管发射。
常用的有通过脉冲宽度来实现信号调制的脉红外线遥控器已被广泛使用在各种类型的家电产品上,它的出现给使用电器提供了很多的便利。
红外遥控系统一般由红外发射装置和红外接收设备两大部分组成。
红外发射装置又可由键盘电路、红外编码芯片、红外接收设备可由红外接收电路、红外解码芯片、电源和应用电路组成。
通常为了使信号能更好的被传输发送端将基带二进制宽调制(PWM )和通过脉冲串之间的时间间隔来实现信号调制的脉时调制(PPM )两种方法。
在同一个遥控电路中通常要使用实现不同的遥控功能或区分不同的机器类型,这样就要求信号按一定的编码传送,编码则会由编码芯片或电路完成。
对应于编码芯片通常会有相配对的解码芯片或包含解码模块的应用芯片。
在实际的产品设计或业余电子制作中,编码芯片并一定能完成我们要求的功能,这时我们就需要了解所使用的编码芯片到底是如何编码的。
只有知道编码方式,我们才可以使用单片机或数字电路去定制解码方案。
下面介绍的是笔者所收集整理的一些常用遥控编码芯片的编码方式和常用一体化接收芯片的引脚示意图。
在最后还用实例介绍M50560-001P 芯片的解码思路和应用实例程序的编写。
常用红外一体化接收头引脚示意uPD6121,uPD6122,PT2222,SC6121,HS6222,HS6221载波波形 使用455KHz 晶体,经内部分频电路,信号被调制在37.91KHz ,占空比为3分之1。
数据格式. 数据格式包括了引导码、用户码、数据码和数据码反码,编码总占32位。
数据反码是数据码反相后的编码,编码时可用于对数据的纠错。
注意:第二段的用户码也可以在遥控应用电路中被设置成第一段用户码的反码。
使用455KHz 晶振时各代码所占的时间位定义 用户码或数据码中的每一个位可以是位‘1’,也可以是位‘0’。
区分‘0’和‘1’是利用脉冲的时间间隔来区分,这种编码方式称为脉冲位置调制方式,英文简写PPM 。
程序可以用来查看每个遥控按键的编码,以便于开发利用遥控每一个按键。
#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit en=P3^4;sbit rs=P3^5; //用于控制1602sbit rw=P3^6;sbit dula=P2^6;sbit wela=P2^7; //用于控制晶体管sbit IRIN=P3^2; //红外接收器数据线IO 口uchar IRCOM[4]=0;//定义数组IRCOM,分别装解码后得到的数据//IRCOM[0] 低8位地址码//IRCOM[1] 高8位地址码//IRCOM[2] 8位数据码//IRCOM[3] 8位数据码的反码uchar code table[]="MAKE BY HEIQISHI"; uchar code table1[]="The code is 0x";uchar code table2[]="0123456789abcdef";//////////////显示程序///////////////////void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=112;y>0;y--); //大约是1ms,因为单片机的时钟周期为11.0592mhz。
}void Write_com(uchar com){rs=0; //指令P0=com; //写指令函数delay(5);en=1;delay(5);en=0;}void Write_data(uchar dat){rs=1; //数据P0=dat; //写指令函数delay(5);en=1;delay(5);en=0;}void _1602Init(){wela=0;dula=0; //用于关闭晶体管,因为都是用P0en=0; //初始时使能为0rw=0;Write_com(0x38); //显示屏模式设置为1602方案Write_com(0x0c); //显示开关/光标设置Write_com(0x06);Write_com(0x01); //清屏Write_com(0x80); //指针置零}//////////////////////////////////////////////////////////////////////解码程序///////////////////void delay014ms(uchar x) //x*0.14MS STC10F04延时约0.15MS{uchar i;while(x--){for(i=0;i<15;i++) //13;}}//////////////初始化////////////void IR_init(void){EA=1;EX0=1; //允许总中断中断,使能INT0 外部中断IT0=1; //触发方式为脉冲负边沿触发IRIN=1; //I/O口初始化}////////////解码过程//////////////void IR_CODE(void) interrupt 0 //在外部中断子程序中解码{uchar j,k,N=0,shi,ge;EX0=0; //防止干扰delay014ms(15); //延时2.1msif (IRIN) //2.1ms能够检测出各种错误信号{EX0 =1;return;} //确认IR信号出现while(!IRIN); //等IR变为高电平,跳过9ms的前导低电平信号。
红外遥控实验结果1.通过遥控解码检测各按键键值:用户码:00EF数据码:1C 数据反码:E3 数据码:1D数据反码:E2数据码:1E数据反码:E1数据码:1F数据反码:E0数据码:00 数据反码:FF 数据码:01数据反码:FE数据码:02数据反码:FD数据码:03数据反码:FC数据码:04 数据反码:FB 数据码:05数据反码:FA数据码:06数据反码:F9数据码:07数据反码:F8数据码:08 数据反码:F7 数据码:09数据反码:F6数据码:0A数据反码:F5数据码:0B数据反码:F4数据码:0C 数据反码:F3 数据码:0D数据反码:F2(左前进)数据码:0E数据反码:F1(前进)数据码:0F数据反码:F0(右前进)数据码:10 数据反码:EF 数据码:11数据反码:EE(原地左转)数据码:12数据反码:ED数据码:13数据反码:EC(原地右转)数据码:14 数据反码:EB 数据码:15数据反码:EA(左后退)数据码:16数据反码:E9(后退)数据码:17数据反码:E8(右后退)数据码:18 数据反码:E7 数据码:19数据反码:E6数据码:1A数据反码:E5数据码:1B数据反码:E42.红色数据部分为功能键,对红色按键部分进行进行功能键定义,以下为各功能键定义: (1)功能键前进:set_speed(200,200); (2)功能键后退:set_speed(-200,200); (3)功能键原地左转:set_speed(100,-100); (4)功能键原地右转: set_speed(-100,100); (5)功能键左前进: set_speed(200,30); (6)功能键右前进: set_speed(30,200); (7)功能键左后退:set_speed(-200,-30);(8)功能键右后退:set_speed(-30,-200); 功能键实际速度测量:新遥控器:用户码:00FF功能键号 1 2 3 4 5 6 7 8 左轮速度(m|min ) 53 52 48 45 16 54 18 52.5 右轮速度 (m|min )535447.54853145618.5数据码:0C 数据反码:F3 (左前进) 数据码:18 数据反码:E7 (前进) 数据码:5E 数据反码:A1 (右前进) 数据码:08 数据反码:F7 (原地左转) 数据码:1C 数据反码:E3 数据码:5A 数据反码:A5 (原地右转)数据码:15 数据反码:BD (左后退)数据码:52 数据反码:AD (后退) 数据码:4A 数据反码:B5 (右后退)。
通过Arduino程序获取红外遥控器按键键值编码一、以如下遥控器举例:二、检测按键键值的Arduino程序:#include<IRremote.h>//红外遥控库文件网上有,亦可通过百度账号给我留言int REC_PIN=11; //接收端引脚IRrecvirrecv(REC_PIN);decode_results results;void setup(){Serial.begin(9600); //键值在串口通信窗口中查看irrecv.enableIRIn(); //红外接收端初始化}void loop(){if(irrecv.decode(&results)) //是否收到键值编码{Serial.println(results.value,HEX);//通过串口打印十六进制的键值delay(500);irrecv.resume(); //接收下一个值}}三、检测到的十六进制按键键值(在串口监视器中查看):四、Arduino的红外遥控器控制LED例程:include <IRremote.h>int RECV_PIN = 11;IRrecvirrecv(RECV_PIN);decode_results results;void setup(){Serial.begin(9600);irrecv.enableIRIn(); //初始化红外遥控PinMode(13,1); LED初始化,点亮}void loop() {if (irrecv.decode(&results)){if(results.value==0xFFA25D) //确认接收到按键(1)的编码,此码是预先读出来的按键编码。
{digitalWrite(13,1); //点亮LEDSerial.println("turn on LED"); //串口显示开灯}else if(results.value==0xFF629D) //确认接收到的按键(2)的编码{digitalWrite(13,0); //熄灭LEDSerial.println("turn off LED"); //串口显示关灯}irrecv.resume(); // 接收下一个值}}。
红外解码程序本篇介绍红外解码的原理和程序的写法。
下面来看一下,红外线是如何编码的。
下面来具体说一下,解码的原理,每按一下遥控器的一个按键,遥控器就会发出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进制数分离,便于数码管显示,分离完毕后显示。
第1篇一、实验目的1. 了解红外遥控的基本原理和组成。
2. 掌握红外遥控信号的发射和接收技术。
3. 评估红外遥控系统的性能,包括遥控距离、角度和抗干扰能力。
4. 分析实验过程中遇到的问题,并提出相应的解决方案。
二、实验原理红外遥控技术是一种无线通信技术,通过发射端发送红外信号,接收端接收并解析红外信号,从而实现对设备的控制。
红外遥控系统主要由发射端、传输介质和接收端组成。
三、实验器材1. 红外遥控器2. 红外接收模块3. 逻辑分析仪4. 万用表5. 电源6. 调试工具四、实验步骤1. 搭建实验平台:将红外遥控器和红外接收模块连接到逻辑分析仪,并将逻辑分析仪与电脑连接,以便实时观察和分析信号。
2. 测试遥控距离:在实验室内,保持红外遥控器和红外接收模块之间距离不变,逐步增加距离,记录不同距离下的遥控效果。
3. 测试遥控角度:在实验室内,保持红外遥控器和红外接收模块之间距离不变,改变红外遥控器与红外接收模块之间的角度,记录不同角度下的遥控效果。
4. 测试抗干扰能力:在实验室内,向红外遥控器和红外接收模块之间添加干扰信号,观察红外遥控系统的抗干扰能力。
五、实验结果与分析1. 遥控距离测试:在实验过程中,当红外遥控器和红外接收模块之间距离为5米时,遥控效果良好;当距离增加到10米时,遥控效果有所下降;当距离增加到15米时,遥控效果基本失效。
这表明红外遥控系统的遥控距离与发射端和接收端之间的距离有关,距离越远,遥控效果越差。
2. 遥控角度测试:在实验过程中,当红外遥控器和红外接收模块之间距离为5米时,在正前方角度范围内,遥控效果良好;当角度增加到45度时,遥控效果有所下降;当角度增加到90度时,遥控效果基本失效。
这表明红外遥控系统的遥控角度与发射端和接收端之间的角度有关,角度越大,遥控效果越差。
3. 抗干扰能力测试:在实验过程中,向红外遥控器和红外接收模块之间添加干扰信号,发现当干扰信号强度较高时,红外遥控系统的抗干扰能力较差,容易导致遥控失效。
通过Arduino程序获取红外遥控器按键键值编码一、以如下遥控器举例:二、检测按键键值的Arduino程序:#include<IRremote.h>//红外遥控库文件网上有,亦可通过百度账号给我留言int REC_PIN=11; //接收端引脚IRrecvirrecv(REC_PIN);decode_results results;void setup(){Serial.begin(9600); //键值在串口通信窗口中查看irrecv.enableIRIn(); //红外接收端初始化}void loop(){if(irrecv.decode(&results)) //是否收到键值编码{Serial.println(results.value,HEX);//通过串口打印十六进制的键值delay(500);irrecv.resume(); //接收下一个值}}三、检测到的十六进制按键键值(在串口监视器中查看):四、Arduino的红外遥控器控制LED例程:include <IRremote.h>int RECV_PIN = 11;IRrecvirrecv(RECV_PIN);decode_results results;void setup(){Serial.begin(9600);irrecv.enableIRIn(); //初始化红外遥控PinMode(13,1); LED初始化,点亮}void loop() {if (irrecv.decode(&results)){if(results.value==0xFFA25D) //确认接收到按键(1)的编码,此码是预先读出来的按键编码。
{digitalWrite(13,1); //点亮LEDSerial.println("turn on LED"); //串口显示开灯}else if(results.value==0xFF629D) //确认接收到的按键(2)的编码{digitalWrite(13,0); //熄灭LEDSerial.println("turn off LED"); //串口显示关灯}irrecv.resume(); // 接收下一个值}}。
红外脉冲编码IC的键值和用户码测试和分析版权归作者所有,不得抄袭,转载请注明作者和出处,否则追究法律责任!作者:李海林2010.6月在网络上查找了一下红外脉冲编码IC的键值和用户码是怎样定义的,没找到一个清楚明了的资料,少许英文资料又不太看得懂,中文资料更少。
总之没找到一看就懂的资料。
我决定自己找一个红外脉冲编码IC,测试和分析它的键值和用户码。
找了一个DVD最常用的红外脉冲编码IC PT2222。
引脚定义图,图1:应用原电路图,图2:自己修改了的电路图,图3:下图是我用测码软件测得的64个遥控键值(注:实际应用电路没虚线内电路,测试的用户码是00 FF),图4:将IC的9脚接地,测试用户码仍然是00 FF,不过按键码值变了,按键值是在9脚接高电平测试时的16进制数值加16进制数80。
比如:00+80变成80,51+80变成D1,1B+80变成9B。
HT2222的9脚设置不同键值比较,图5:测试发现改变K1-K16的闭合状态(见图3),可以得到不同的用户码,但是遥控器按键值只有9脚状态有关,跟K1-K16没关系,由K1-K16组合的状态很多,大家可以计算一下看有多少。
下面测试的是部分状态,表1:闭合的开关测得的用户码(其它的都断开)全部断开00FFK1 01FEK2 02FDK3 04FBK4 08F7K5 10EF K6 20DF K7 40BF K8 807F K9 00FE K10 00FD K11 00FB K12 00F7 K13 00EF K14 00DF K15 00BF K16 007F K12 K4 08FF K9 K1 01FF K16 K8 80FF K12 K4 K16 087F K14 K6 K16 207F K12 K4 K16 K8 88FFK14 K6 K16 K8 A0FF………………………. ………………..……………………….. …………………下面说说我经过分析,计算,测试核对的用户码计算方法(开关闭合为1,断开为0)。
红外遥控器编码规则简要说明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位的按键编码如下表所示:。