红外遥控器按键编码测试

合集下载

红外遥控解码实验报告(3篇)

红外遥控解码实验报告(3篇)

第1篇一、实验目的本次实验旨在通过搭建红外遥控系统,了解红外遥控的基本原理,掌握红外遥控信号的编码和解码方法,并利用单片机实现对红外遥控信号的解码,实现对红外遥控器的控制。

二、实验原理红外遥控技术是一种无线通信技术,通过发射端发送特定编码的红外信号,接收端接收该信号并进行解码,从而实现对电器的控制。

红外遥控系统主要由发射端和接收端两部分组成。

1. 发射端:由按键矩阵、编码调制电路和红外发射器组成。

按键矩阵根据按键的不同产生不同的编码信号,编码调制电路将这些信号调制在38kHz的载波上,红外发射器将调制后的信号发射出去。

2. 接收端:由红外接收器、前置放大电路、解调电路和指令信号检出电路组成。

红外接收器接收发射端发射的红外信号,前置放大电路对信号进行放大,解调电路将38kHz的载波信号去除,指令信号检出电路从解调后的信号中提取出指令信号。

三、实验设备1. 红外遥控发射器2. 红外接收模块3. 单片机开发板4. 连接线5. 电源6. 红外遥控解码程序四、实验步骤1. 搭建红外遥控系统:将红外接收模块连接到单片机开发板的相应引脚上,确保连接正确无误。

2. 编写红外遥控解码程序:根据红外遥控协议,编写解码程序,实现对红外信号的解码。

3. 程序烧录与调试:将解码程序烧录到单片机中,连接电源,进行程序调试。

4. 测试与验证:使用红外遥控器对单片机进行控制,观察单片机是否能够正确解码红外信号,并实现相应的控制功能。

五、实验结果与分析1. 红外遥控系统搭建成功:通过连接红外接收模块和单片机开发板,成功搭建了红外遥控系统。

2. 解码程序编写与调试:根据红外遥控协议,编写解码程序,实现对红外信号的解码。

在调试过程中,通过观察单片机的输出,验证了程序的正确性。

3. 测试与验证:使用红外遥控器对单片机进行控制,观察单片机是否能够正确解码红外信号,并实现相应的控制功能。

实验结果表明,单片机能够成功解码红外信号,并实现红外遥控器的控制功能。

红外遥控解码实验报告

红外遥控解码实验报告
{
if(buf_count>40&&buf_count<70)
{
buf_count=0;
buf_key_code>>=1;
buf_key_code|=0x80;//收到1
key_bit_count++;//数据脉冲累加
}
else if(buf_count>12&&buf_count<32)//收到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',};
1.6实验步骤
将JP21的8个短接子全部用短接帽短接,使DG0-DG7与P2端口接通
将JP22的9个短接子全部用短睫毛短接,使A-DP与P0端口接通,VCC向数码管模块供电
将JP10的短接子用短接帽短接,使红外接头U16的数据线与P3.2端口接通。
将JP24的短接子用短接帽短接,禁止LCD1602显示功能,否则数码管将不能正常显示。
第一次使用遥控器要去下电池盖下的隔离胶片。
1.7实验电路原理分析
ME850选用T1838一体化红外接收头,接受来自红外遥控器的红外遥控信号。T1838集成红外接收二极管、放大、解调、整形等电路在同一封装上。T1838负责红外遥控信号的解调,将调制在38KHZ上的红外脉冲信号解调并倒相输入到单片机的P3.2引脚,由单片机进行高电平与低电平宽度的测量

常见红外遥控器编码与格式

常见红外遥控器编码与格式

电源和红外发射电路组成。

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

常用的有通过脉冲宽度来实现信号调制的脉红外线遥控器已被广泛使用在各种类型的家电产品上,它的出现给使用电器提供了很多的便利。

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

红外发射装置又可由键盘电路、红外编码芯片、红外接收设备可由红外接收电路、红外解码芯片、电源和应用电路组成。

通常为了使信号能更好的被传输发送端将基带二进制宽调制(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的前导低电平信号。

红外遥控器按键编码

红外遥控器按键编码
P4M1 = 0X00; P4M0 = 0XFF; P44 = 0; P50=0;
EA = 1;
//允许全局中断
EX0 = 1;
//允许 INT0 中断
PX0 = 0;
//INT0 的中断级别为低
IT0 = 0;
//设定 INT0 上升沿和下降沿都可以中断
/*初始化 T0:16 位自动重装填模式*/
{LED1=ON;LED2=OFF;LED3=OFF;LED4=OFF;LED5=OFF;}
if(temp==IR_2)
{LED1=OFF;LED2=ON;LED3=OFF;LED4=OFF;LED5=OFF;}
if(temp==IR_3)
{LED1=OFF;LED2=OFF;LED3=ON;LED4=OFF;LED5=OFF;}
break;
}
case IR_WordA: {
if((IR_Num%2)==0&&InfraredRayPin==1) {
TH0 = 0x00; TL0 = 0x00; TimeStart; break; } if((IR_Num%2)==1&&InfraredRayPin==0) { TimeStop; IR_Time=TH0; IR_Time<<=8; IR_Time|=TL0; IR_DataA<<=1; if(IR_Time<800) {
1
#define IR_WordB
2
#define IR_End
3
#define TimeStart (TR0=1)
#define TimeStop (TR0=0)
void InfraredRay_Init(void);

红外遥控实验

红外遥控实验

红外遥控实验结果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程序获取红外遥控器按键键值编码

通过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. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/chenjunglp
红外遥控器按键编码测试
#include <regx51.h> #define uchar unsigned char #define uint unsigned int #define IR_RE P3_2 bit k=0; 位,为 0 则为有效信号,为 1 则为无效 uchar date[4]={0,0,0,0}; 原码,反码,数据原码,反码 /*--------------------------延时 1ms 程子程序-----------Байду номын сангаас-----------*/ delay1000() { uchar i,j; i=5; do{j=95; do{j--;} while(j); i--; }while(i); } /*---------------------------延时 882us 子程序-----------------------*/ delay882() { uchar i,j; i=6; do{j=71; do{j--;} while(j); i--; }while(i); } /*--------------------------延时 2400us 程子程序-----------------------*/ delay2400() { uchar i,j; i=5; do{j=237; do{j--;} while(j); i--; }while(i);
//红外解码判断标志 //date 数组为存放地址
/chenjunglp
} //************************************************************** //************************************************************** /*----------------------------------------------------------*/ /*-----------------------红外解码程序(核心)-----------------*/ /*----------------------------------------------------------*/ void IR_decode() { uchar i,j; while(IR_RE==0); delay2400(); if(IR_RE==1) //延时 2.4ms 后如果是高 电平则是新码 { delay1000(); delay1000(); for(i=0;i<4;i++) { for(j=0;j<8;j++) { while(IR_RE==0); // 等待地址码第 1 位高电平到来 delay882(); //延时 882us 判断此时 引脚电平 ///CY=IR_RE; if(IR_RE==0) { date[i]>>=1; date[i]=date[i]|0x00; } else if(IR_RE==1) { delay1000(); date[i]>>=1; date[i]=date[i]|0x80; } } //1 位数据接收结束 } //32 位二进制码接收结 束 } } //*****************************************************************
/chenjunglp
//******************************************************************** /*------------------主要用于处理红外遥控键值--------------------*/ void jiema() { uchar i; k=0; for(i=0;i<8;i++) { delay1000(); if(IR_RE==1) //刚开始为 9ms 的引导码. { k=1; break; } } if(k==0) { IR_decode(); //如果接收到的是有效信号, 则调用解码程序 P2=~date[3]; delay2400(); delay2400(); delay2400(); } } //********************************************************************* //******************************** void main() { SP=0x60; while(1) { while(IR_RE==0) jiema(); } } //********************************************
//堆栈指针
相关文档
最新文档