红外解码程序,IR1308接收头
红外遥控解码实验报告(3篇)
第1篇一、实验目的本次实验旨在通过搭建红外遥控系统,了解红外遥控的基本原理,掌握红外遥控信号的编码和解码方法,并利用单片机实现对红外遥控信号的解码,实现对红外遥控器的控制。
二、实验原理红外遥控技术是一种无线通信技术,通过发射端发送特定编码的红外信号,接收端接收该信号并进行解码,从而实现对电器的控制。
红外遥控系统主要由发射端和接收端两部分组成。
1. 发射端:由按键矩阵、编码调制电路和红外发射器组成。
按键矩阵根据按键的不同产生不同的编码信号,编码调制电路将这些信号调制在38kHz的载波上,红外发射器将调制后的信号发射出去。
2. 接收端:由红外接收器、前置放大电路、解调电路和指令信号检出电路组成。
红外接收器接收发射端发射的红外信号,前置放大电路对信号进行放大,解调电路将38kHz的载波信号去除,指令信号检出电路从解调后的信号中提取出指令信号。
三、实验设备1. 红外遥控发射器2. 红外接收模块3. 单片机开发板4. 连接线5. 电源6. 红外遥控解码程序四、实验步骤1. 搭建红外遥控系统:将红外接收模块连接到单片机开发板的相应引脚上,确保连接正确无误。
2. 编写红外遥控解码程序:根据红外遥控协议,编写解码程序,实现对红外信号的解码。
3. 程序烧录与调试:将解码程序烧录到单片机中,连接电源,进行程序调试。
4. 测试与验证:使用红外遥控器对单片机进行控制,观察单片机是否能够正确解码红外信号,并实现相应的控制功能。
五、实验结果与分析1. 红外遥控系统搭建成功:通过连接红外接收模块和单片机开发板,成功搭建了红外遥控系统。
2. 解码程序编写与调试:根据红外遥控协议,编写解码程序,实现对红外信号的解码。
在调试过程中,通过观察单片机的输出,验证了程序的正确性。
3. 测试与验证:使用红外遥控器对单片机进行控制,观察单片机是否能够正确解码红外信号,并实现相应的控制功能。
实验结果表明,单片机能够成功解码红外信号,并实现红外遥控器的控制功能。
红外接收解码原理和源程序
上述“0”和“1”构成旳32位二进制码经38kHz旳载频进行二次调制以提升发射效率,到达降低电源功耗旳目旳。然后再经过红外发射二极管产生红外线向空间发射,如图。
UPD6121G产生旳遥控编码是连续旳32位二进制码组,其中前16位为顾客辨认码,能区别不同旳电器设备,预防不同机种遥控码相互干扰。芯片厂商把顾客辨认码固定为十六进制旳一组数;后16位为8位操作码(功能码)及其反码。UPD6121G最多额128种不同组合旳编码。遥控器在按键按下后,周期性地发出同一种32位二进制码,周期约为108ms。一组码本身旳连续时间随它包括旳二进制“0”和“1”旳个数不同而不同,大约在45~63ms之间,图4为发射波形图。当一种键按下超出36ms,振荡器使芯片激活,将发射一组108ms旳编码脉冲,这108ms发射代码由一种起始码(9ms),一种成果码(4.5ms),低8位地址码(9ms~18ms),高8位地址码(9ms~18ms),8位数据码(9ms~18ms)和这8位数据旳反码(9ms~18ms)构成。假如键按下超出108ms仍未松开,接下来发射旳代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)构成。
注:P3.2接旳是外部中断
红外接受头将38K载波信号过虑,得到与发射代码反向接受代码
发射端旳“0”和“1”
红外解码旳关键就是辨认 0和1
Hale Waihona Puke 1. 解码旳关键是怎样辨认“0”和“1”,从位旳定义我们能够发觉“0”、“1”均以0.56ms旳低电平开始,不同旳是高电平旳宽度不同,“0”为0.56ms,“1”为1.68ms,所以必须根据高电平旳宽度区别“0”和“1”。假如从0.56ms低电平过后,开始延时,0.56ms后来,若读到旳电平为低,阐明该位为“0”,反之则为“1”,为了可靠起见,延时必须比0.56ms长些,但又不能超出1.12ms,不然假如该位为“0”,读到旳已是下一位旳高电平,所以取(1.12ms+0.56ms)/2=0.84ms最为可靠,一般取0.84ms左右均可。
红外遥控器软件解码原理和程
红外遥控器软件解码原理和程序红外一开始发送一段13。
5ms的引导码,引导码由9ms的高电平和4。
5ms的低电平组成,跟着引导码是系统码,系统反码,按键码,按键反码,如果按着键不放,则遥控器则发送一段重复码,重复码由9ms的高电平,2。
25ms的低电平,跟着是一个短脉冲,本程序是免费给大家,版权所有,不得用于商业目的,如需用到本程序到商业上请与本人联系,经本人同意后方可用于商业目的,本程序经过试用,能解大部分遥控器的编码!#include "at89x52.h"#defineNULL 0x00//数据无效#defineRESET 0X01//程序复位#defineREQUEST 0X02//请求信号#defineACK 0x03//应答信号,在接收数据后发送ACK信号表示数据接收正确,也位请求信号的应答信号#defineNACK 0x04//应答信号,表示接收数据错误#defineBUSY 0x05//忙信号,表示正在忙#defineFREE 0x06//空闲信号,表示处于空闲状态#defineREAD_IR 0x0b//读取红外#defineSTORE_IR 0x0c//保存数据#defineREAD_KEY 0x0d//读取键值#defineRECEIVE 0Xf400//接收缓冲开始地址#defineSEND 0xfa00//发送缓冲开始地址#defineIR 0x50//红外接收缓冲开始地址#defineHEAD 0xaa//数据帧头#defineTAIL 0x55//数据帧尾#defineSDA P1_7#defineSCL P1_6unsigned char xdata *buf1; //接受数据缓冲unsigned int buf1_length; //接收到的数据实际长度unsigned char xdata *buf2; //发送数据缓冲unsigned int buf2_length; //要发送的数据实际长度bit buf1_flag; //接收标志,1表示接受到一个数据帧,0表示没有接受到数据帧或数据帧为空bit buf2_flag; //发送标志,1表示需要发送或没发送完毕,0表示没有要发送的数据或发送完毕unsigned char state1,state2; //用来标志接收字符的状态,state1用来表示接收状态,state2用来表示发送状态unsigned char data *ir;union{unsigned char a[2];unsigned int b;unsigned char data *p1[2];unsigned int data *p2[2];unsigned char xdata *p3; //红外缓冲的指针unsigned int xdata *p4;}p;//union{ //// unsigned char a[2]; //// unsigned int b;// unsigned char data *p1[2];// unsigned int data *p2[2];// unsigned char xdata *p3;// unsigned int xdata *p4; //地址指针//}q; //union{unsigned char a[2];unsigned int b;}count;union{unsigned char a[2];unsigned int b;}temp;union{unsigned char a[4];unsigned int b[2];unsigned long c;}ir_code;union{unsigned char a[4];unsigned int b[2];unsigned long c;unsigned char data *p1[4];unsigned int data *p2[4];unsigned char xdata *p3[2];unsigned int xdata *p4[2];}i;unsigned char ir_key;bit ir_flag; //红外接收标志,0为缓冲区空,1为接收成功,2为缓冲溢出void sub(void);void delay(void);void ie_0(void);void tf_0(void);void ie_1(void);void tf_1(void);void tf_2(void);void read_ir(void);void ir_jiema(void);void ir_init(void);void ir_exit(void);void store_ir(void);void read_key(void);void reset_iic(void);unsigned char read_byte_ack_iic(void);unsigned char read_byte_nack_iic(void);bit write_byte_iic(unsigned char a);void send_ack_iic(void);void send_nack_iic(void);bit receive_ack_iic(void);void start_iic(void);void stop_iic(void);void write_key_data(unsigned char a);unsigned int read_key_data(unsigned char a);void ie0(void) interrupt 0{ie_0();}void tf0(void) interrupt 1{tf_0();}void ie1(void) interrupt 2{ie_1();}void tf1(void) interrupt 3{tf_1();tf_2();}void tf2(void) interrupt 5{ //采用中断方式跟查询方式相结合的办法解码EA=0; //禁止中断if(TF2){//判断是否是溢出还是电平变化产生的中断TF2=0; //如果是溢出产生的中断则清除溢出位,重新开放中断退出EA=1;goto end;}EXF2=0; //清除电平变化产生的中断位*ir=RCAP2H; //把捕捉的数保存起来ir++;*ir=RCAP2L;*ir++;F0=1;TR0=1; //开启计数器0loop:TL0=0; //将计数器0重新置为零TH0=0;while(!EXF2){//查询等待EXF2变为1if(TF0)goto exit; //检查有没超时,如果超时则退出 };EXF2=0; //将EXF2清零if(!TH0) //判断是否是长低电平脉冲过来了{ //不是长低电平脉冲而是短低电平if(F0)count.b++; //短脉冲数加一temp.a[0]=RCAP2H; //将捕捉数临时存放起来temp.a[1]=RCAP2L;goto loop;//返回继续查询}else{ //是低电平脉冲,则进行处理F0=0;*ir=temp.a[0]; //把连续的短脉冲总时间记录下来ir++;*ir=temp.a[1];ir++;*ir=RCAP2H;//把长电平脉冲时间记录下来ir++;*ir=RCAP2L;ir++;if(ir>=0xda) {goto exit; //判断是否溢出缓冲,如果溢出则失败退出}goto loop; //返回继续查询}exit:ir_flag=1; //置ir_flag为1表示接收成功end:;}void rs232(void) interrupt 4{static unsigned char sbuf1,sbuf2,rsbuf1,rsbuf2; //sbuf1,sbuf2用来接收发送临时用,rsbuf1,rsbuf2用来分别用来存放接收发送的半字节EA=0; //禁止中断if(RI){RI=0; //清除接收中断标志位sbuf1=SBUF; //将接收缓冲的字符复制到sbuf1if(sbuf1==HEAD){ //判断是否帧开头state1=10; //是则把state赋值为10buf1=RECEIVE; //初始化接收地址}else{switch(state1){case 10:sbuf2=sbuf1>>4; //把高半字节右移到的半字节sbuf2=~sbuf2; //把低半字节取反if((sbuf2&0x0f)!=(sbuf1&0x0f)) //判断接收是否正确 { //接收错误,有可能接收的是数据帧尾,也有可能是接收错误if(sbuf1==TAIL) //判断是否接收到数据帧尾{ //是接收到数据帧尾buf1=RECEIVE; //初始化接收的地址if(*buf1==RESET) //判断是否为复位命令{ES=0;sbuf2=SP+1;for(p.p1[0]=SP-0x10;p.p1[0]<=sbuf2;p.p1[0]++)*p.p1[0]=0;}state1=0;//将接收状态标志置为零,接收下一个数据帧buf1_flag=1; //置接收标志为1,表示已经接收到一个数据帧REN=0; //禁止接收}else{ //不是接受到数据帧尾,表明接收错误state1=0; // 将接收状态标志置为零,重新接收buf1=RECEIVE; //初始化发送的地址*buf1=NACK; //把NACK信号存入接收缓冲里buf1_flag=1; //置标志位为1,使主程序能对接收错误进行处理REN=0; //禁止接收}}{ //接收正确rsbuf1=~sbuf1; //按位取反,使高半字节变原码rsbuf1&=0xf0; //仅保留高半字节,低半字节去掉state1=20;//将状态标志置为20,准备接收低半字节}break;case 20:sbuf2=sbuf1>>4; //把高半字节右移到的半字节 sbuf2=~sbuf2; //将低半字节取反if((sbuf2&0x0f)!=(sbuf1&0x0f)) //判断接收是否正确{//接受错误state1=0; // 将接收状态标志置为零,重新接收buf1=RECEIVE; //初始化接收的地址*buf1=NACK; //把NACK信号存入发送缓冲里buf1_flag=1;//置标志位为1,使主程序能对接收错误进行处理REN=0; //禁止接收}else{sbuf1&=0x0f; //仅保留低半字节,去掉高半字节rsbuf1|=sbuf1; //高低半字节合并*buf1++=rsbuf1; //将接收的数据保存至接收缓冲里,并且数据指针加一buf1_length++; //接收数据长度加一state1=10; //将state1置为10,准备接收下个字节的高半字节}}}}else{TI=0; //清除发送中断标志if(buf2_length) //判断发送长度是否为零{//发送长度不为零if(state2==0) //判断是否发送高半字节{ //发送高半字节sbuf2=*buf2; //将要发送的字节送到sbuf2rsbuf2=~sbuf2; //取反,使高半字节变为反码 sbuf2>>=4; //将高半字节右移到低半字节rsbuf2&=0xf0;//保留高半字节,去掉低半字节sbuf2&=0x0f; //保留低半字节,去掉高半字节rsbuf2|=sbuf2; //合并高低半字节SBUF=rsbuf2; //发送出去state2=10; //将state2置为10准备发送下半字节}else{//发送低半字节sbuf2=*buf2; //将要发送的字节送到sbuf2buf2++; //指针加一buf2_length--; //发送数据长度减一rsbuf2=~sbuf2; //取反,使低半字节变为反码 rsbuf2<<=4; //将低半字节反码左移到高半字节rsbuf2&=0xf0;//保留高半字节,去掉低半字节 sbuf2&=0x0f; //保留低半字节,去掉高半字节 rsbuf2|=sbuf2; //合并高低半字节SBUF=rsbuf2; //发送出state2=0;}}else{ //如果发送数据长度为零则发送数据帧尾if(buf2_flag){ //判断是否发过数据帧尾SBUF=TAIL; //将数据帧尾发送出去while(TI==0);TI=0;buf2_flag=0; //置发送标志为零,表示发送完毕}}}EA=1;//开放中断}。
红外解码程序详解
红外遥控解码程序设计——————基于uPD6121红外编码制式红外传感系统是目前应用最为广泛的遥控系统,一个红外遥控系统可分为发射和接收两部分组成,发射端称之为红外遥控器,一般由矩阵键盘,红外编码调制芯片和红外发射管组成;接收端用一体化红外接收头即可,这个东东内置光电放大器和解调部分,信号接收之后一般很微弱须放大后才可解码,为有效发射出去得先托付在载波上所以需经历调制、解调的过程,其实对于发射部分主要工作在于编码,而对于编码方式只有几种主流方式,而目前国内大部分均为uPD6121编码方式(日本NEC公司搞出来的。
),所以我们只须弄清楚这种编码的时序,即可写出万能的红外解码程序,只要是基于这种编码方式的遥控器(家里的电视、空调、电扇遥控器)都可以用该程序来解码(这点也充分证明了C语言的高移植性啊。
)这种编码的格式其实很简单,开头是一个引导码,人家芯片在编码时将其设计成9ms的高电平和4.5ms的低电平,也就是说你必须跳过这段引导码之后才会接收到数据,第一个问题来了:为什么要加这段引导码?因为红外传感是非常容易受到干扰的,如果直接传送数据很可能并非发送端的信号,很可能来自其他辐射,后面设计程序时会遇到这个问题。
所以我们在写程序时在引导码时可以加入检测代码,如果是引导码则继续接收,否则跳出。
第二个问题就是:接收数据时我们用外部中断接收,这是考虑到CPU 的执行效率,如果你在主函数里接收数据,就好比CPU一直在问:你接收到数据没?你接收到没?..很明显不靠谱,和串口通信一样,接收数据用中断这是经验,有利于单片机的执行效率。
第三个要注意的就是红外接收端和编码发送的数据是反向的!这点很重要,我看很多资料没有写明这点,让很多童鞋疑惑不解,也就是说引导码编码时确实是9ms高电平和4.5ms 的低电平,但是到了接收端是9ms的低电平和4.5ms的高电平,所以我们在解码时就得注意引导码高电平出现的顺序。
对于编码格式,引导码后接了4个字节的数据,前两个字节为用户码和用户反码,简单点说就是器件地址;后两字节为操作码和操作反码,就是我们真正需要的数据。
红外遥控解码流程图
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。
红外解码方案
红外解码方案1. 红外发射的原理遥控器部分的工作原理较为简单,主要就是编码IC 通过三极管进行放大调变,然后将此电信号(脉冲波)经有红外发射管(940nm 波长)转变为光信号发射出去。
现在国产遥控器的电路主要有:455kHz 晶振,编码IC ,放大三极管,发射管等主要几个电子原件组成;通常使用38kHz 载波,这样可以提高红外线的抗干扰能力,避免大气中的红外线干扰。
调制载波频率一般在30kHz 到60kHz 之间,大多数使用的是38kHz ,占空比1/3的方波,这是由发射端所使用的455kHz 晶振所决定的。
在发射端要对晶振进行整数分频,分频系数一般取12,所以455kH z÷12≈37.9kH z≈38kHz 。
2.红外接收的原理红外接收头内部结构主要由光电二极管+红外接收IC 组成,工作原理为:光电二极管(俗称接收管)其接收到红外发射管发射出的光信号后转换为电信号(为微安级的电流),此电信号输入到接收IC 内部经过放大--增益--滤波--解调变--整形还原,还原遥控器给出的原始编码,通过接收头信号输出脚输入到后面的代码3. 几种编码格式3.1 NEC 制NEC 制的数据格式分为引导码、16位用户码(地址码)、8位数据码、8位数据反码构成。
用户码或数据码中的每一个位可以是位‘1’,也可以是位‘0’。
区分‘0’和‘1’是利用脉冲的时间间隔来区分,这种编码方式称为脉冲位置调制方式(PPM)(注意NEC每一位的长度不一样,1.125ms或者2.25ms)。
按键保持按下状态时每发送完整的一帧数据后,再发送重复码,再到按键被松开。
此芯片用两种不同的重复码,当用户码的C0位为1时用一种,C0位为0时使用另一种。
3.2RC5制RC5编码相对NEC编码简单一些。
RC5编码有2位起始位(为‘1’)、1位控制、5位系统码(地址码)、6位指令码,一共14位数据。
在这个协议里所有位是平等的长度都等于1.778ms,位时间的一半填满脉冲是36KHz的载波,另外一半被闲置。
红外遥控解码程序
红外遥控解码程序红外接收头的型号有很多HS0038 VS838等功能⼤致相同,只是引脚封装不同。
红外接收有⼏种统⼀的编码⽅式,采样哪种编码⽅式取决于遥控器使⽤的芯⽚,接收头收到的都是⼀样的。
电视遥控器使⽤的是专⽤集成发射芯⽚来实现遥控码的发射,如东芝TC9012,飞利浦AA3010T等,通常彩电遥控信号的发射,就是将某个按键所对应的控制指令和系统码(由0和1组成的序列),调制在38KHz的载波上,然后经放⼤、驱动红外发射管将信号发射出去。
不同公司的遥控芯⽚,采样的遥控码格式也不⼀样,较普遍的有两种,⼀种NEC标准,⼀种是PHILIPS标准。
NEC标准:遥控载波的频率为38KHz(占空⽐1:3)当某个键按下时,系统⾸先发射⼀个完整的全码,如果按键超过108ms仍未松开,接下来发射的代码(连发代码)将由起始码(9ms)和结束码(2.5ms)组成。
⼀个完整的全码 = 引导码 +⽤户码 +⽤户码 + 数据码 + 数据码 + 数据反码。
其中,引导码⾼电平9ms,低电平4.5ms;系统码8位,数据码8位,共32位;其中前16位为⽤户识别码,能区别不同的红外遥控设备,以防⽌不同的机种遥控码互相⼲扰。
后16位为8位的操作码和8位的操作反码,⽤于核对数据是否接收准确。
收端根据数据码做出应该执⾏上⾯动作的判断。
连发代码是在持续按键时发送的码。
它告知接收端。
某键是在被连续的按着。
NEC标准下的发射码表⽰发射数据0时⽤”0.56ms⾼电平 + 0.565ms低电平 = 1.125ms”表⽰;数据1⽤”⾼电平0.56ms + 1.69ms = 2.25ms”表⽰。
遥控器发射信号:需要注意的是:当⼀体化接收头收到38kHz红外信号时,输出端输出低电平,否则为⾼电平。
所以⼀体化接收头输出的波形和发射波形是反向的PHILIPS标准:载波频率38KHz:没有筒,点按键时,控制码1和0之间切换,若持续按键,则控制码不变。
⼀个全码 = 起始码’11’ +控制码 + ⽤户码 + ⽤户码数据0⽤“低电平1.778ms + ⾼电平1.778ms”表⽰;数据1⽤“⾼电平1.778ms + 低电平1.778ms”表⽰。
红外解码说明文档
红外解码说明文档作者: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、如何利用单片机的外设来实现对应的功能红外解码功能:因为红外解码的第一步骤是对电平长度的检测,因而最好是利用单片机的捕获功能来检测电平的长度,然后再根据电平长度来判断其意义(建议:不要检测双边沿,最好是检测一个周期的电平,例如下降沿的时间间隔)。
红外接收头模块的使用
红外接收头模块的使用红外接收头模块是一种常见的电子元件,它具有接收和解码红外信号的功能。
在日常生活中,我们经常会见到红外接收头模块的应用,比如电视遥控器、空调遥控器、无线门铃等等。
它通过接收红外线的信号,并将其转化为电信号,从而实现遥控器与设备之间的通信。
以下将介绍红外接收头模块的使用方法以及其在各个领域中的应用。
我们来了解一下红外接收头模块的基本使用方法。
一般来说,红外接收头模块由三个引脚组成,分别是VCC、GND和OUT。
其中,VCC和GND分别连接电源的正负极,OUT则连接到控制电路。
在使用红外接收头模块之前,我们需要先了解一下它的工作原理。
红外接收头模块是通过接收红外线的信号来实现遥控功能的,所以在使用时需要将其朝向需要控制的设备。
当我们按下遥控器上的按钮时,红外接收头模块会接收到红外线的信号,并将其转化为电信号,然后通过OUT引脚输出给控制电路,从而实现设备的控制。
红外接收头模块在各个领域中都有着广泛的应用。
首先,它在家庭生活中的应用非常广泛。
比如,我们可以通过红外接收头模块与电视遥控器配对,实现对电视的开关、音量、频道等功能的控制。
此外,红外接收头模块还可以与空调遥控器配对,实现对空调的温度、风速、模式等参数的调节。
另外,红外接收头模块还可以用于无线门铃,当有人按下门铃按钮时,红外接收头模块会接收到信号,并触发门铃的响应。
除了家庭生活,红外接收头模块还在工业领域中有着广泛的应用。
比如,在自动化生产线上,红外接收头模块可以用于检测产品的位置和状态,从而实现对生产过程的控制和监测。
此外,红外接收头模块还可以用于安防监控系统,通过接收红外线的信号,实现对入侵者的检测和报警。
总的来说,红外接收头模块是一种非常常见且实用的电子元件。
它通过接收和解码红外信号,实现了设备之间的无线通信。
无论是在家庭生活中还是在工业领域中,红外接收头模块都发挥着重要的作用。
通过了解红外接收头模块的使用方法和应用领域,我们可以更好地理解它的工作原理,并能够更好地应用它来实现各种功能。
所有红外遥控器的解码方法
所有红外遥控器的解码方法已经完成了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.好,希望该方法可以帮助需要的朋友.。
红外遥控器解码程序
//===================================================================== //// 红外遥控器解码程序演示//// 本程序主要将现在比较常用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 的前导低电平信号。
红外接收头工作原理
红外接收头工作原理
红外接收头是用来接收红外线的器件,其作用是将红外线转换成电信号。
红外线由物体辐射出的电磁波谱中的某些部分,红外线可分为近红外和远红外两部分。
近红外波长为0.85~1微米,波长范围在0.03~0.12微米之间,可广泛用于光学仪器中。
远红外波长为3~15微米,可用于工业、医学、国防等方面。
由于它比可见光波长长得多,所以又称为“热光”。
红外接收头由红外光电二极管(Inductor)组成,它是接收红外线的最主要器件。
由于其响应波长不同,可分为近红外(<3微米)、远红外(>15微米)、中红外(<3微米)和长波红外(<5微米)。
短波红外一般是由红外线放大器和分光器组成的,用于接收较长波长的红外线;中、长波红外一般由前级放大器和光敏元件组成,用于接收较短波长的红外线;长波红外一般由后级放大器和光敏元件组成,用于接收较长波长的红外线。
在近、中、远三种距离范围内,由于物体对不同波长的辐射的吸收系数不同,所以在不同距离上接收到的红外线谱也不尽相同。
—— 1 —1 —。
红外线遥控解码接收程序-C语言
红外线遥控解码接收程序-C语言.txt铁饭碗的真实含义不是在一个地方吃一辈子饭,而是一辈子到哪儿都有饭吃。
就算是一坨屎,也有遇见屎壳郎的那天。
所以你大可不必为今天的自己有太多担忧。
红外线遥控解码接收程序-C语言#include <regx51.h>#define uchar unsigned char#define uint unsigned int#define IR_RE P3_2bit k=0; //红外解码判断标志位,为0那么为有效信号,为1那么为无效uchar date[4]={0,0,0,0}; //date数组为存放地址原码,反码,数据原码,反码/*--------------------------延时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);}//**************************************************************//**************************************************************/*----------------------------------------------------------*//*-----------------------红外解码程序(核心)-----------------*//*----------------------------------------------------------*/void IR_decode(){uchar i,j;while(IR_RE==0);delay2400();{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位二进制码接收完毕}}//*****************************************************************//********************************************************************/*------------------------外部中断0程序-------------------------*//*------------------主要用于处理红外遥控键值--------------------*/void int0() interrupt 0{uchar i;k=0;EX0=0; //检测到有效信号关中断,防止干扰for(i=0;i<4;i++){delay1000();if(IR_RE==1){k=1;} //刚开场为9ms的引导码. }if(k==0){// EX0=0; //检测到有效信号关中断,防止干扰IR_decode(); //如果接收到的是有效信号,那么调用解码程序P0=date[1];delay2400();delay2400();delay2400();}EX0=1; //开外部中断,允许新的遥控按键}//*********************************************************************//********************************void main(){SP=0x60; //堆栈指针EX0=1; //允许外部中断0,用于检测红外遥控器按键EA=1; //总中断开while(1);}总结:关于本段程序的准确延时在<<C51中准确的延时与计算的实现>>里的评论有很好的诠释.//在STC12C5410上运用红外线解码程序.主要的问题在于延迟上。
红外遥控解码原理
感谢观看
汇报人:XX
红外遥控解码技 术能够提高智能 家居系统的稳定 性和可靠性
红外遥控解码技 术能够实现智能 家居系统的自动 化控制
红外遥控解码技 术能够提高智能 家居系统的安全 性和隐私保护
04
红外遥控解码的发展趋势
提高解码的准确性和稳定性
采用更先进的 算法和编码技 术,提高解码 的准确性和稳
定性
增加抗干扰能 力,降低外界 因素对解码的
影响
优化硬件设计, 提高接收器的 灵敏度和稳定
性
结合人工智能 技术,实现自 适应学习和优
化解码效果
实现多通道解码和多协议兼容
红外遥控解码技术不断发展,未来将实现多通道解码,提高解码效率和稳定性。 随着不同品牌和型号的红外遥控器不断涌现,多协议兼容将成为解码技术的重要发展方向。 解码芯片厂商将不断推出支持更多协议和通道的解码芯片,以满足市场需求。 未来红外遥控解码技术将更加智能化和人性化,为用户带来更加便捷的使用体验。
灯光:红外遥控解码技术也可以 用于控制灯光,如调节亮度、色 温等,实现智能照明。
在工业控制中的应用
实现远程控制:通过红外遥控解码技术, 工业控制中可以实现设备的远程启动、 停止、调节等功能,提高生产效率。
自动化监控:红外遥控解码技术可以用 于工业控制中的自动化监控,例如对温 度、湿度、压力等参数的实时监测和调 节。
无线通信:红外遥控解码技术可以实现工 业控制中的无线通信,避免了布线的繁琐 和成本,提高了系统的灵活性和可靠性。
安全性:红外遥控解码技术可以用于工 业控制中的安全保护,例如对设备的锁 定、解锁等操作,保证生产过程的安全 可控。
在智能家居系统中的应用
红外遥控解码技 术能够实现智能 家居系统的远程 控制
红外接收头模块的使用
红外接收头模块的使用红外接收头模块是一种常见的电子元件,用于接收红外信号并将其转化为电信号。
它被广泛应用于遥控器、红外传感器等设备中。
使用红外接收头模块的第一步是将其连接到电子设备的电路中。
通常,接收头模块有三个引脚,分别是电源引脚、地引脚和信号引脚。
将电源引脚连接到电源电压,地引脚连接到地线,信号引脚连接到控制芯片或微控制器的输入引脚。
接下来,我们需要编写程序来读取接收到的红外信号。
红外信号通常以脉冲的形式传输,每个脉冲的时长代表不同的编码。
通过读取脉冲的时长,我们可以解码出红外信号携带的信息。
在程序中,我们首先需要对接收头模块进行初始化设置,包括设置输入引脚为输入模式、使能中断等。
然后,在主循环中,我们可以使用中断来检测接收头模块是否接收到了红外信号。
当接收到红外信号时,中断程序会被触发,我们可以在中断程序中读取脉冲的时长并进行解码。
解码红外信号的方法有多种,常见的方法是使用红外协议。
不同的遥控器或传感器可能采用不同的红外协议,因此在解码之前,我们需要确定所使用的红外协议类型。
一旦确定了红外协议类型,我们就可以根据协议规定的时序来解码信号。
解码完成后,我们就可以根据信号的内容来进行相应的操作。
例如,如果我们正在使用遥控器控制一个电视机,解码得到的信号可能包含了控制电视机开关、音量调节等命令。
我们可以根据信号的内容来执行相应的操作,从而实现遥控功能。
总的来说,红外接收头模块的使用相对简单,只需要将其连接到电路中并编写相应的程序即可。
通过解码红外信号,我们可以实现各种功能,如遥控器控制、红外传感等。
红外接收头模块的广泛应用使得我们的生活更加便捷和智能化。
自制红外遥控信号分析仪进行解码.
自制红外遥控信号分析仪进行解码
1、用一体化的红外接收管IR1838制作红外接收部份;
2、用耳机插线如图所示,一头接在红外接收头部份,一头与电脑的话筒输入口连接,这样红外遥控信号分析仪硬件就做成了。
这是我用手机充电器改做的红外接收头图:
3、下载安装声波软件“CoolEdit2.0”
4、打开声波软件“CoolEdit2.0”
5、打开录音按钮,用遥控板对着红外接收头发信号。
以下是SONY遥控板发射的信号。
很清楚吧,这是清楚的看到我们的遥控板发出的信号,可以通过此波形图很容易分析遥控信号进行解码,从而可以用我们遥控板控制其他电器,也可以通过遥控信号的分析进行自制遥控器。
单片机的红外遥控器解码原理与实现
单片机的红外遥控器解码原理与实现红外遥控器是我们日常生活中常见的电子设备,它通过使用红外线信号与接收器进行通信。
而在这个过程中,单片机起到了解码的重要作用。
本文将介绍单片机解码红外遥控器的原理以及实现方法。
一、红外遥控器的工作原理红外遥控器是一种使用红外线进行通信的设备,它主要由发送器和接收器两部分组成。
发送器将指令数据转换为红外脉冲信号并发送出去,接收器通过接收红外线信号并将其转换为电信号,进而解码为可识别的指令。
而单片机则负责接收并解码红外信号,将其转化为具体的操作。
二、单片机解码红外信号的原理单片机解码红外信号主要分为两个步骤:红外信号的接收和信号的解码处理。
1. 红外信号的接收单片机通过外部的红外接收器接收红外信号。
红外接收器可以通过外部电路将接收到的红外信号转换为电压信号,然后通过单片机的IO 口输入。
2. 信号的解码处理接收到的红外信号经过IO口输入后,单片机需要对信号进行解码处理。
解码的过程涉及到红外信号的标准化和解析。
对于常见的红外遥控器协议,单片机需要能够识别其编码方式,确定其协议格式。
这些协议通常包含了引导码、地址码和指令码等信息。
在解析红外信号时,单片机首先需要识别引导码。
引导码是红外信号的起始标志,通常由高、低电平组成,表示编码的开始。
单片机通过判断引导码的时间长度来确定信号的开始。
接下来,单片机需要识别地址码和指令码。
地址码是用来区分不同的红外遥控器设备,指令码则表示具体的操作指令。
单片机通过判断地址码和指令码的高、低电平时间长度来确定具体的操作。
三、单片机解码红外信号的实现方法单片机解码红外信号有多种实现方法,以下是一种简单的实现示例。
首先,需要连接红外接收器到单片机的IO口,将接收到的信号输入到单片机。
接收到的信号可以通过外部中断的方式触发单片机的中断服务程序。
然后,在中断服务程序中,单片机需要根据红外协议的规则,判断引导码、地址码和指令码的时间长度。
利用计时器或延时函数可以实现对信号时间的测量。
红外遥控智能小车设计
红外遥控智能小车设计袁铭【摘要】设计了基于红外无线控制的智能小车,本文主要针对智能小车的系统结构和原理进行探讨和研究.重点研究了以80C51单片机为控制芯片,运用红外控制小车的运动方向,可以自动躲避障碍物.同时还研究了光电传感器的使用方法,使得智能小车具有自动头灯的功能,增加了液晶显示功能,可以显示环境和运动状态参数.【期刊名称】《电子世界》【年(卷),期】2018(000)003【总页数】2页(P124-125)【关键词】红外;单片机;液晶显示【作者】袁铭【作者单位】苏州工业园区工业技术学校【正文语种】中文1 引言物质生活水平的提高,一些比较有危险系数的工作人们越来越不想参与,随着智能设备的发展,这些设备完全可以代替人类去完成一些危险的或者难以到达的位置的工作任务。
当然,设备必须具有一定的智能性,能够独立的判断所处环境的所有有用信息,并加以判断,予以归类,捕捉实时性的信息,然后进行实时反馈,让我们可以更加客观地采取判断,不至于因环境的变化或者不适应等各种外界因素影响我们的主观意识。
这类智能设备很大程度解放了劳动力,并且提高了安全生产方面的安全系数。
智能小车就属于这类智能设备,人们可以通过无线遥控控制小车完成各种前进转弯等动作,同时小车具有环境感知能力,自行作出判断进行下一步动作,完成实时环境数据采集。
目前市面上有各种技术来控制小车,而本小车采用红外线遥控控制,结构简单,成本较低。
本文重点研究了基于单片机控制,红外遥控的小车系统及其硬件系统的设计和软件流程的设计。
2 系统整体结构方案本系统是通过红外线进行远距离控制,当小车的红外接收模块接收到远端发射的红外控制信号后进行信息处理解析,驱动直流电机完成前进、后退、加速和转弯等运行动作;小车安装液晶显示模块,可以显示小车所处的环境、时间和运行状态等参数;同时,当小车具有红外避障模块,当遇到前方的障碍物时可以自动倒退,躲避障碍物。
本系统采用80C51单片机作为小车的控制核心,电路由红外接收模块,红外避障模块,电机驱动模块,液晶显示模块,时钟模块等几部分构成,系统整体框图如图1所示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
TMOD|=0X02;
TH0=0;
TL0=0;
IE|=0x82;
TR0=1;
}
void Timer0_IRQ(void) interrupt 1
{
irtime++;
}
void Int0_Init()
{
ห้องสมุดไป่ตู้IT0=1;
IE|=0x81;
//导致原来i的数据丢失,破坏程序逻辑,不能完成正常储存
if(irstart==1)
{
if(irtime>32&&irtime<64)
i=0;
irdata[i]=irtime;//每次外中断时i会自加1,可见是一个i静态变量
irtime=0;
i++;
void IrWork(void)
{
UINT8 temp[11];
temp[0]=LCD_TAB[irprodata[0]/16];
temp[1]=LCD_TAB[irprodata[0]%16];
temp[2]='-';
temp[3]=LCD_TAB[irprodata[1]/16];
#include<reg52.h>
#include<lcd1602.h>
UINT8 irtime;
UINT8 irdata[33],irprodata[4];
bit irreceive_ok,irpro_ok;
UINT8 code LCD_TAB[]={"0123456789ABCDEF"};
}
void Int_IRQ(void) interrupt 0
{
static bit irstart;//bit变量默认分配一个内存单元,每次调用函数,不改变单元的位置
static UINT8 i;//定义成静态变量,定义时即分配一个内存单元,每次调用时不改变内存单元的位置。
//若不加static修饰,编译结果会节约内存,每次调用中断处理函数时随即分配一个单元给i,
temp[10]=LCD_TAB[irprodata[3]%16];
LCD1602_SendString(5,1,temp);
}
temp[4]=LCD_TAB[irprodata[1]%16];
temp[5]='-';
temp[6]=LCD_TAB[irprodata[2]/16];
temp[7]=LCD_TAB[irprodata[2]%16];
temp[8]='-';
temp[9]=LCD_TAB[irprodata[3]/16];
irprodata[i]=0;
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
irprodata[i]>>=1;
if(irdata[k]>6)
irprodata[i]|=0x80;
k++;
}
}
irpro_ok=1;
}
if(i==33)
{
i=0;
irtime=0;
irreceive_ok=1;
}
}
else
{
irstart=1;
irtime=0;
}
}
void IrPro(void)
{
UINT8 i,j,k;
k=1;
for(i=0;i<4;i++)