红外遥控器软件解码原理和程序1 (dhd0)
红外遥控解码实验报告(3篇)

第1篇一、实验目的本次实验旨在通过搭建红外遥控系统,了解红外遥控的基本原理,掌握红外遥控信号的编码和解码方法,并利用单片机实现对红外遥控信号的解码,实现对红外遥控器的控制。
二、实验原理红外遥控技术是一种无线通信技术,通过发射端发送特定编码的红外信号,接收端接收该信号并进行解码,从而实现对电器的控制。
红外遥控系统主要由发射端和接收端两部分组成。
1. 发射端:由按键矩阵、编码调制电路和红外发射器组成。
按键矩阵根据按键的不同产生不同的编码信号,编码调制电路将这些信号调制在38kHz的载波上,红外发射器将调制后的信号发射出去。
2. 接收端:由红外接收器、前置放大电路、解调电路和指令信号检出电路组成。
红外接收器接收发射端发射的红外信号,前置放大电路对信号进行放大,解调电路将38kHz的载波信号去除,指令信号检出电路从解调后的信号中提取出指令信号。
三、实验设备1. 红外遥控发射器2. 红外接收模块3. 单片机开发板4. 连接线5. 电源6. 红外遥控解码程序四、实验步骤1. 搭建红外遥控系统:将红外接收模块连接到单片机开发板的相应引脚上,确保连接正确无误。
2. 编写红外遥控解码程序:根据红外遥控协议,编写解码程序,实现对红外信号的解码。
3. 程序烧录与调试:将解码程序烧录到单片机中,连接电源,进行程序调试。
4. 测试与验证:使用红外遥控器对单片机进行控制,观察单片机是否能够正确解码红外信号,并实现相应的控制功能。
五、实验结果与分析1. 红外遥控系统搭建成功:通过连接红外接收模块和单片机开发板,成功搭建了红外遥控系统。
2. 解码程序编写与调试:根据红外遥控协议,编写解码程序,实现对红外信号的解码。
在调试过程中,通过观察单片机的输出,验证了程序的正确性。
3. 测试与验证:使用红外遥控器对单片机进行控制,观察单片机是否能够正确解码红外信号,并实现相应的控制功能。
实验结果表明,单片机能够成功解码红外信号,并实现红外遥控器的控制功能。
红外遥控解码

红外线遥控是目前使用最广泛的一种通信和遥控手段。
由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。
工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。
在做单片机作品的时候如果对这红外方面的知识理解了很容易把红外的功能加上去!我就觉得这是一个很不错的工具,所以拿出来跟大家分享。
当然网上是很多资料的,我也参考过不少人的程序,现在也贡献出我的一点,也是我自己最常用的,适不适合用就请多多包涵了。
遥控发射器专用芯片很多,根据编码格式可以分成两大类,这里我们以运用比较广泛,解码比较容易的一类来加以说明,现以日本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)组成。
红外解码程序详解

红外遥控解码程序设计——————基于uPD6121红外编码制式红外传感系统是目前应用最为广泛的遥控系统,一个红外遥控系统可分为发射和接收两部分组成,发射端称之为红外遥控器,一般由矩阵键盘,红外编码调制芯片和红外发射管组成;接收端用一体化红外接收头即可,这个东东内置光电放大器和解调部分,信号接收之后一般很微弱须放大后才可解码,为有效发射出去得先托付在载波上所以需经历调制、解调的过程,其实对于发射部分主要工作在于编码,而对于编码方式只有几种主流方式,而目前国内大部分均为uPD6121编码方式(日本NEC公司搞出来的。
),所以我们只须弄清楚这种编码的时序,即可写出万能的红外解码程序,只要是基于这种编码方式的遥控器(家里的电视、空调、电扇遥控器)都可以用该程序来解码(这点也充分证明了C语言的高移植性啊。
)这种编码的格式其实很简单,开头是一个引导码,人家芯片在编码时将其设计成9ms的高电平和4.5ms的低电平,也就是说你必须跳过这段引导码之后才会接收到数据,第一个问题来了:为什么要加这段引导码?因为红外传感是非常容易受到干扰的,如果直接传送数据很可能并非发送端的信号,很可能来自其他辐射,后面设计程序时会遇到这个问题。
所以我们在写程序时在引导码时可以加入检测代码,如果是引导码则继续接收,否则跳出。
第二个问题就是:接收数据时我们用外部中断接收,这是考虑到CPU 的执行效率,如果你在主函数里接收数据,就好比CPU一直在问:你接收到数据没?你接收到没?..很明显不靠谱,和串口通信一样,接收数据用中断这是经验,有利于单片机的执行效率。
第三个要注意的就是红外接收端和编码发送的数据是反向的!这点很重要,我看很多资料没有写明这点,让很多童鞋疑惑不解,也就是说引导码编码时确实是9ms高电平和4.5ms 的低电平,但是到了接收端是9ms的低电平和4.5ms的高电平,所以我们在解码时就得注意引导码高电平出现的顺序。
对于编码格式,引导码后接了4个字节的数据,前两个字节为用户码和用户反码,简单点说就是器件地址;后两字节为操作码和操作反码,就是我们真正需要的数据。
红外 遥控 原理

红外遥控原理
红外遥控原理是通过发射红外线信号来遥控设备的一种技术。
红外线是一种电磁波,其频率高于可见光,人眼无法直接看到。
通过使用红外发射器将电信号转换为红外光信号,然后使用红外接收器将红外光信号转换回电信号,实现设备的控制。
在红外遥控中,发射器通常由红外发光二极管组成。
当发射器接收到电信号时,它会驱动红外发光二极管产生红外光信号。
这些红外光信号具有特定的编码,可以指示不同的操作。
接收器通常由红外接收二极管和解码器组成。
红外接收二极管可以接收到发射器发出的红外光信号,并将其转换为电信号。
解码器会对接收到的电信号进行解码,将其转换为对应的操作指令。
解码器根据设定的协议,解析红外信号中的编码,以确定应该执行的操作。
在红外遥控中,发射器和接收器之间需要进行频道匹配,确保发射的红外信号能够被接收器正确解码。
此外,遥控设备通常具有不同的按键,每个按键对应着一种操作。
当用户按下按键时,发射器会发送相应的红外信号,接收器接收到信号后将其解码,并执行相应的操作。
红外遥控技术广泛应用于电视、空调、音响、家电等各种设备,为用户提供了方便的操作方式。
红外遥控原理简单而有效,因此被广泛采用。
单片机红外线遥控器解码程序

单片机红外线遥控器解码程序
红外线遥控是目前使用最广泛的一种通信和遥控手段。
由于红外线遥控装
置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外
线遥控。
现在工业设备中,也已经广泛在使用。
1 红外遥控系统
通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯
片来进行控制操作,如图1 所示。
发射部分包括键盘矩阵、编码调制、LED 红
外发送器;接收部分包括光、电转换放大器、解调、解码电路。
2 遥控发射器及其编码
遥控发射器专用芯片很多,根据编码格式可以分成脉冲宽度调制和脉冲相位
调制两大类,这里我们以运用比较广泛,解码比较容易的脉冲宽度调制来加以
说明,现以3310 组成发射电路为例说明编码原理。
当发射器按键按下后,即
有遥控码发出,所按的键不同遥控编码也不同。
这种遥控码具有以下特征:
采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms 的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms 的组合表示二进制的“1”
上述“0”和“1”组成的42 位二进制码经38kHz 的载频进行二次调制以提高发
射效率,达到降低电源功耗的目的。
然后再通过红外发射二极管产生红外线向
空间发射,
3310 产生的遥控编码是连续的42 位二进制码组,其中前26 位为用户识别码,能区别不同的红外遥控设备,防止不同机种遥控码互相干扰。
后16 位为8 位
的操作码和8 位的操作反码用于核对数据是否接收准确。
红外遥控原理及应用课件

恶意用户可以通过发送干扰信号或恶意代码来干扰或控制受控设 备的正常工作。
安全防护措施
设置密码或身份验证
在红外遥控设备上设置密码或身份验证机制,确保只有授权用户 能够进行操作。
加密传输信号
采用加密技术对红外遥控信号进行加密,防止信号被窃取和破解。
定期更新和升级
及时更新和升级红外遥控设备的固件或软件,以修复可能存在的安 全漏洞。
RC-5协议
由Philips公司开发,主要用于电视机的遥控,采 用脉冲宽度调制(PWM)方式,具有高速抗干 扰能力。
Philips RC-6协议
Philips公司开发的另一种红外遥控编码方式,采 用PPM方式,具有高可靠性和快速响应的特点。
抗干扰技术
扩频技术
频域滤波技术
通过扩展信号的频谱来减小干扰的影 响,常用的有直接序列扩频和跳频扩 频两种。
3. 上传代码
将编写好的代码上 传到红外接收器中 。
5. 调试与优化
根据实验结果,对 代码进行调试和优 化。
实验结果与分析
功能实现
通过实验,实现了红外遥控的基本功 能,如开关、音量调节等。
性能评估
对实验结果进行性能评估,如响应速 度、稳定性等。
问题与解决方案
在实验过程中遇到的问题及相应的解 决方案。
车门控制
红外遥控器可以用来远程控制 车门的开关。
灯光控制
红外遥控器可以用来控制车灯 的开关,如前大灯、雾灯等。
其他
如车载音响、导航系统等也可 以通过红外遥控器进行控制。
04
红外遥控发展前景
技术创新与改进
编码方式的优化
随着技术的进步,红外遥控的编码方式也在不断优化,以提高信 号传输的稳定性和抗干扰能力。
红外编码和解码原理
一、编码遥控发射器专用芯片很多,根据编码格式可以分成两大类,这里我们以运用比较广泛,解码比较容易的一类来加以说明,现以日本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)组成。
红外遥控解码程序
1./*************************************************************************2.** 红外遥控器解码程序(采用中断)----基于SM0038接收芯片3.**说明:采用P2.0口中断,可通过修改IR_IN和P2来切换中断口的选择.4.**使用方法: 当IR_FLAG==1时,表示有键按下,全局变量IR_KeyValue是键号.5.** IR_KeyValueN--按键非码;IR_KeyValueSB--遥控器识别码6.** IR_UK--用户自定义的键号7.** 使用此模块时应先执行 IR_Init()8.**使用示例: if(IR_FLAG==1)9.** {10.** IR_FLAG=0;//每次使用时须将标志位清零.11.** Display_Int(IR_KeyValue,0x90);12.** }13.*************************************************************************/14.15.16.#include "ir_key.h"17.#include "delay.h"18./**********************以下是本程序中使用到的全局变量********************/19.unsigned char IR_BitCnt=0;20.unsigned char IR_KeyValue=10; //按键码(始值不能为按键号中包含的值)21.unsigned char IR_UK=0; //用户定义的键号22.unsigned char IR_KeyValueN=0; //按键非码;按键码+按键非码=0xff23.long int IR_KeyValueSB=0; //遥控器识别码.24.unsigned char IR_FLAG = 0; //有键按下时此标志为125.26./*****************************************************************************27.**此结构休是为键号转换用,IR_KV为遥控器本身的键号,IR_UK为用户自定义的按键号28.*****************************************************************************/29. struct IR_KEY30.{31. unsigned char IR_KV;//遥控器自身键码32. unsigned char IR_UV;//user's value33.};34./*****************************************************************************35.**通过修改结构体数组中的值来设定遥控器的键号.36.*******************************************************************************/37.struct IR_KEY IR_UserKEY[IR_NUM]=38.{39. {68,1},{71,2},{14,3},{72,4},{73,5},{81,6},{10,7},{80,8},{74,9},{83,10},40. {18,11},{84,12},{78,13},{75,14},{3,15},{21,16},{86,17},{67,18},{2,19},{76,20},41. {82,21},{79,22},{70,23},{77,24},{69,25},{6,26},{66,27},{65,28},{64,29},{22,30},42. {85,31},{23,32},{9,33},{13,34},{87,35},{15,36},{8,37},{25,38},{24,39},{11,40},43. {0,41},{4,42},{16,43},{19,44},{5,45},{1,46},{17,47},{95,48},{94,49},{30,50},{26,51}44.};45.46.47./*************************************************************************48.**函数名称: IR_DELAY49.**功能描述: 用于延时.50.**调用模块: delay.h51.**全局变量: 无52.****************************************************************************/53.void IR_DELAY(unsigned int delayTime)54.{55. DELAY(delayTime);//延时8MS56.}57.58.59./*************************************************************************60.**函数名称: IR_Init61.**功能描述: 端口初始化设置,在main函数里面应先执行此函数62.**输入变量:无63.**返回值:无64.**调用模块:无65.**全局变量: IR_IN66.****************************************************************************/67.void IR_Init(void)68.{69. P2DIR &=~IR_IN; //端口设置为输入方向70. P2IE |= IR_IN; //使能中断71. P2IES |= IR_IN; //下降沿中断72. P2IFG &=~IR_IN; //为避免程序运行后直接进中断,此处需先将中断标志位清零73. _EINT();74.}75.76.77./*************************************************************************78.**函数名称: IR_getkey79.**功能描述: 读取遥控器键值,包括识别码,非码80.**输入变量: 无81.**返回值: 无82.**调用模块: IR_DELAY();83.**全局变量: IR_Delay_8MS,IR_Delay8MS,IR_IN84.****************************************************************************/85.void IR_getkey(void)86.{87. P2IFG &=~IR_IN;88. P2IE &=~IR_IN;89. /**********以下是判断中断是由按键引起的***************/90. IR_DELAY(IR_Delay_8MS); //延时0.8MS91. if(P2IN & IR_IN) goto IR_NXT;92. IR_DELAY(IR_Delay8MS); //延时8MS93. if(!(P2IN & BIT0)) goto IR_NXT;94. while(!(P2IN & IR_IN));//等待变高95. IR_DELAY(8900); //延时5MS左右96. if(P2IN & IR_IN) goto IR_NXT;97. IR_FLAG = 0;98. /********以下是读取16位识别码*******************/99. IR_KeyValueSB=0;100. for(IR_BitCnt=0;IR_BitCnt<16;IR_BitCnt++)101. {102. while(!(P2IN & IR_IN));//WAIT HIGH103. IR_KeyValueSB >>=1;104. IR_DELAY(IR_Delay_8MS);105. if(P2IN & IR_IN)106. IR_KeyValueSB |=0x80;107. else108. IR_KeyValueSB &=0x7f;109. while(P2IN & IR_IN);//WAIT LOW110. }111. /***********以下是读取8位的键码*******************/ 112. IR_KeyValue=0;113. for(IR_BitCnt=0;IR_BitCnt<8;IR_BitCnt++)114. {115. while(!(P2IN & IR_IN));//WAIT HIGH116. IR_KeyValue >>=1;117. IR_DELAY(IR_Delay_8MS);118. if(P2IN & IR_IN)119. IR_KeyValue |=0x80;120. else121. IR_KeyValue &=0x7f;122. while(P2IN & IR_IN);//WAIT LOW123.124. }125. /************以下是读取8位的非码****************/ 126. IR_KeyValueN=0;127. for(IR_BitCnt=0;IR_BitCnt<8;IR_BitCnt++)128. {129. while(!(P2IN & IR_IN));//WAIT HIGH130. IR_KeyValueN >>=1;131. IR_DELAY(IR_Delay_8MS);132. if(P2IN & IR_IN)133. IR_KeyValueN |=0x80;134. else135. IR_KeyValueN &=0x7f;136. while(P2IN & IR_IN);//WAIT LOW137.138. }139. for(unsigned char i=0;i<20;i++)140. IR_DELAY(IR_Delay8MS);141.IR_NXT:P2IFG &=~IR_IN;142.P2IE |=IR_IN;143.144.IR_FLAG=1;145.}146.147.148./********************************************************* ****************149.**函数名称: IR_getUK150.**功能描述: 根据得到的IR_KeyValue从IR_UserKEY表中查出对应的用户自定义的键值151.**输入变量: 无152.**返回值: 无153.**调用模块: 无154.**全局变量: IR_BitCnt,IR_NUM,IR_UserKEY,IR_KeyValue,IR_UK155.********************************************************** ******************/156.void IR_getUK(void)157.{158.159. for(IR_BitCnt=0;IR_BitCnt<IR_NUM;IR_BITCNT++) pre < **** *************************************************************** ********** **以下是SM0038输入信号引脚的中断函数. *********************************************************** ***************** } IR_UK="IR_UserKEY[IR_BitCnt].IR_UV;" if(IR_ BitCnt="=IR_NUM)" return; { if(IR_KeyValue="=IR_UserKEY[IR_BitC nt].IR_KV)">160.<SCRIPT src="/inc/gg_read2.js"></SCRIPT>。
红外线解码心得和解码程序
试用期小结尊敬的江苏三恒科技集团领导:您好!我叫程克辉,毕业于西北师范大学知行学院,电子信息工程专业。
在试用期的两个多月里,我在工程中心软件项目部实习工作,我很荣幸,能跟着***副总经理学习与专业相关的电子知识,收获不少!这两个多月在任总的指导下,我成功的了解、计算了:BT151可控硅、LM2940(1安恒流调节器)、LM317三端可调正稳压器集成电路、LM2674电源高效降压稳压转换器、13F-11网络隔离变压器、光耦开关、继电器、SC50462红外遥控发射模块、SM3XX0/3XX1红外接收头等电子元器件。
在任总的指导下和上面的学习我跟着任总学习“煤矿防爆显示系统”的电路设计、模块学习,也成功的用c语言成功的编写控制该系统的c程序,由于公司没有人用c对红外解码程序的编写,故在任总的悉心指导下,几经努力终于编写成功并且能稳定的通过硬件的测试。
硬件部分:1、外部12V电源转换成5V模块。
由LM2674器件实现2、外部1A恒流源模块。
由LM317和LM2940实现3、五个独立按键控制继电器模块。
由光耦开关实现4、继电器动作模块。
5、红外接收模块。
由SM3XX0/3XX1红外接收头实现6、外部的四路光端机、视频转换器、光缆传输、摄像头、画面分割器、网络视频等模块试用期的期间,由于刚来啥器件都没有,每每遇到困难的时候我就及时向***主任汇报,在张主任积极帮助下我的问题往往能很快的得到解决。
特别感谢张主任的无私支持和关怀!在红外线解码的c程序设计上,我面临着很大的困难,在学校根本就没有接触过红外线的解码,因为红外线是一种看不到摸不着的东西,且我们公司的红外线发射器用的是杭州士兰电子的器件很特殊。
它没有引导码只有16位的用户码和按键的数据码,这样写出来的c 解码程序就很容易受到外部红外线的干扰。
在程序初始化和有红外脉冲时能接收16位的0脉冲,即使解码出错也能有00H的码进入。
还好最后在我用数码管把红外线解出来的码显示出来,这样一切问题就迎刃而解了!程序能成功调试并通过硬件测试。
红外线遥控器的原理
红外线遥控器的原理红外线遥控器是一种常用的遥控设备,可以控制家电、汽车等设备。
它的工作原理是利用红外线传输数据信号,使接收器接收到信号后执行相应的操作。
红外线红外线是一种电磁波。
它的波长较长,无法被人眼所看见,但可以被红外线接收器感知。
红外线是一种常见的通信方式,常用于遥控器、无线键盘、无线鼠标等设备。
遥控器的工作原理遥控器内置有一个发射器,发射出一定频率的红外线信号。
接收器则接收到这个红外信号之后,识别出信号中的数据信息,并执行相应的操作。
遥控器发射器通过电路控制红外线二极管发射出红外线。
信号由二极管内部的电路产生,然后通过二极管转化为红外线信号发射出去。
因为红外线的传输距离比较短,所以红外线遥控器通常被设计成使用电池供电,这样可以更方便地携带和使用。
接收端主要由一颗红外线接收器和一颗解码器芯片组成。
当接收器接收到红外线信号后,解码器芯片将会对这个信号进行解码,解码出信号中的数据信息,并将其进行转换和处理,然后将操作信号传输给被控制的设备。
这样就完成了遥控器对被控制设备的操作。
红外线遥控器的优缺点和其他通信方式相比,红外线遥控器有以下优缺点:优点1.通信速度快 - 这种遥控器可以实现即时通信,保证了用户能够快速地操纵被控制的设备,提高了用户的使用体验。
2.成本低廉 - 使用红外线通信方式的设备通常价格比较低,这使得该种设备在市场上较为流行。
3.安全可靠 - 红外线的传输距离非常有限,所以可以避免一些非法用户或干扰信号的干扰因素,从而提高了系统的安全性和可靠性。
缺点1.传输距离有限 - 红外线只能在一定范围内传输信号,如果超出这个范围,信号会丢失或变得不稳定。
2.安装位置受限 - 遥控设备需要安装在发送人所在的快捷路线上,这对一些使用要求比较苛刻的场合(如机房)会造成影响。
3.易受干扰 - 在强阳光、花哨的散热器、性能欠佳的红外线传输设备等情况下,红外线遥控器会变得不稳定,影响通信质量。
结论红外线遥控器是一种常见的遥控设备,通常用于控制家电、汽车等设备。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
红外遥控器软件解码原理和程序1 (dhd0).txt年轻的时候拍下许多照片,摆在客厅给别人看;等到老了,才明白照片事拍给自己看的。当大部分的人都在关注你飞得高不高时,只有少部分人关心你飞得累不累,这就是友情!『关闭窗口』
红外遥控器软件解码原理和程序1 (dhd0)
红外一开始发送一段13。5ms的引导码,引导码由9ms的高电平和4。5ms的低电平组成,跟着 引导码是系统码,系统反码,按键码,按键反码,如果按着键不放,则遥控器则发送一段重 复码,重复码由9ms的高电平,2。25ms的低电平,跟着是一个短脉冲,本程序是免费给大 家,版权所有,不得用于商业目的,如需用到本程序到商业上请与本人联系 jiang_xi_sheng@163.com,经本人同意后方可用于商业目的,本程序经过试用,能解大部分 遥控器的编码!
#include "at89x52.h" #define NULL 0x00//数据无效 #define RESET 0X01//程序复位 #define REQUEST 0X02//请求信号 #define ACK 0x03//应答信号,在接收数据后发送ACK信号表示数据接收正确, 也位请求信号的应答信号 #define NACK 0x04//应答信号,表示接收数据错误 #define BUSY 0x05//忙信号,表示正在忙 #define FREE 0x06//空闲信号,表示处于空闲状态 #define READ_IR 0x0b//读取红外 #define STORE_IR 0x0c//保存数据 #define READ_KEY 0x0d//读取键值 #define RECEIVE 0Xf400//接收缓冲开始地址 #define SEND 0xfa00//发送缓冲开始地址 #define IR 0x50//红外接收缓冲开始地址 #define HEAD 0xaa//数据帧头 #define TAIL 0x55//数据帧尾 #define SDA P1_7 #define SCL P1_6
unsigned 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; //开启计数器0 loop: TL0=0; //将计数器0重新置为零 TH0=0; while(!EXF2){ //查询等待EXF2变为1 if(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; //将接收缓冲的字符复制到sbuf1 if(sbuf1==HEAD){ //判断是否帧开头 state1=10; //是则把state赋值为10 buf1=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; //禁止接收 }