请教大神们一个问题,四根网线,四台电脑网线连接器全部

第31卷第2期2008牟2月;合肥工业大学学报(自然科学版);JOURNALOFHEFEIUNIVERSITY;VoL31No.2;Feb.2008;一种16位码红外遥控器的解码方法;张建军1,;穆远祥1,;韩江洪2;(1.合肥工业大学机械与汽车工程学院,安徽合肥2;摘要:文章从实际应用角度出发,详细分析了16位码;文献标识码:A;文章编号:1003―506
第31卷第2期2008牟2月
合肥工业大学学报(自然科学版)
JOURNALOFHEFEIUNIVERSITYOFTECHNOLOGY
VoL31No.2
Feb.2008
一种16位码红外遥控器的解码方法
张建军1,
穆远祥1,
(1.合肥工业大学机械与汽车工程学院,安徽合肥230009;2.合S-f-业大学计算机与信息学院,安徽合肥230009)
摘要:文章从实际应用角度出发,详细分析了16位码红外遥控器的编码原理,提出了一种16位码红外遥控器的单片机解码及连发码处理方法,并给出了遥控器信号接收电路和详细的解码以及连发码处理软件流程;该方法在实际应用过程中取得了良好的效果。关键词:PIC单片机;编码方式;遥控器解码;连发码中图分类号:TNl29
文献标识码:A
文章编号:1003―5060{2008}02―0171-04
Adecodingmethodfor16一bitcodeinfraredremotecontrol
ZHANGJian-junl,MUYuan-xian91,HAN
InformationtHefeiUniversityofTechnology,Hefei230009,Chim)
Jiang-hon92
(1.SchoolofMachineryandAutomobileEngineering,HefeiUniversityofTechnology,Hefei230009,China;2.SchoolofComputerand
Abstract:Fromthepracticalpointofview,adetailedanalysisisdoneabouttheencodingmodeforthe16-bitcodeinfraredremotecontrol
decodingmethodfor16一bitcodeinfraredremotecontrol
withPICmicroprocessorandfirecodeisgivenbased
tures
MCU.According
betterresult.
itscodeandfirecodefea―
theremotecontrolreceivercircuitand
detaileddecodingsoftwareprocesseforthefirecode
alsooffered.Inpracticalapplications,thismethodobtains
Keywords:PICmicroprocessor;encodingmode;remotecontroldecoding;firecode
坏才是系统能否可靠工作的关键。32位码的连
发码和16位码的连发码的编码方式均不相同,32位码的连发码处理目前有很多相关资料可查,相
红外遥控器以其体积小、重量轻、价格低廉、使用灵活、功耗低及抗干扰能力强等特点,在单片
机系统中应用越来越广泛。
目前,常用的红外遥控器编码原理主要有2种:32位码红外遥控器[1]和16位码红外遥控器。32位码和16位码红外遥控器编码中的“0”和“1”表示方式相同,所不同的只是高低电平的宽度,因此解码可以采用同一种方法。需要单独处理的是
对来说也比较容易处理,因此本文只分析16位码
红外遥控器的编码原理,并给出一种可靠的解码及连发码的处理方法。
1编码原理分析
要想对遥控器解码,首先要知道所选遥控器
的编码原理。在不知道遥控器的编码原理时,可以采用示波器观察遥控器的编码方式及连发码的
32位码的每帧代码都有一个9ms高电平的起始
码和4.5ms低电平的结果码,处理起始码和结果码的方法比较简单,只需要两段延时即可。
要想把一个红外遥控器可靠的应用到单片机
编码波形,测出高、低电平的脉宽[2],从而可以更
快地编写解码的单片机程序,实现解码及连发码处理。下面以熊猫牌16位码红外遥控器为例,详细介绍其编码原理。
16位码遥控器发送的一帧数据中含有16位
系统中,能正确解出遥控器的按键代码可以说只是其中的一小部分工作,遥控器连发码处理的好
收稿日期:2007-01―30;修改日期:2007-03―19
作者简介:张建军(1963一),男,浙江宁波人,合肥工业大学教授,硕士生导师,
韩江洪(1954--),男,安徽泾县人,合肥工业大学教授,博士生导师.
合肥工业大学学报(自然科学版)
信息码,包含8位用户码和8位数据码及最后位的同步位。用户码用于区别不同型号的遥控器,防止不同类型的遥控器对控制设备的相互干扰或控制错误[31;数据码用于区别同一遥控器上不同的按键;同步位(sY)是标志最后一位编码是“0”或“1”的标识位,它只有0.26ms的载波信号构成,没有引导码。发射码的格式如图1所示。
图1发射码的格式
“o”和“1”的区分取决于脉冲之间的时间宽度,称之为脉冲位置调制方式(PPM)。16位码遥控器的“0”和“1”波形如图2所示。
二进制的“0”由0.26ms的间隔和0.79ms宽的脉冲构成;二进制的“1”由0.26ms的间隔和
ms宽的脉冲构成。
图2。0”和。1”的波形
在按键持续按下的时候,每过46.4ms会重复发送相同的编码波形,直至按键抬起为止;在第一个46.4ms过后的发射代码称为连发码。
16位码红外遥控器的连发码的发送波形和第一次发送波形一样,是一帧相同的且完整的编码,如图3所示。
图3连发码波形
值得注意的是:每帧数据中携带信息部分的时间长度根据按键中“0”和“1”的个数的不同而不同。这也是与32位码遥控器的编码特点的一个不同之处,因为32位码遥控器的32位信息码中有8位的用户反码和8位的按键反码,这就使得32位信息码中一定有16个“0”和16个“1”,这样32位码的每帧数据中携带信息部分的时间长度就是相等的。
2解码及连发码处理方法
2.1解码方法
解码的关键是如何识别“0”和“1”,从按键代码位的定义可以发现“0”和“1”均以0.26ms的低电平开始,不同的是高电平的宽度不同,“o”为
ms,“1”为1.85ms,所以必须根据高电平的
宽度区别“0”和“1”。如果从0.26ms低电平过后,开始延时0.79Ins以后,若读到的电平为低,说明该位为“0”,反之则为“1”,为了可靠起见,延时应该比0.79ms稍长一些,但不能超过
ms,否则如果该位为“0”,读到的已是下一位的高电平,因此延时时间取(1.31ms+
ms)/2=1.05ms最可靠,一般取1.05ms
左右均可。
2.2连发码处理方法
若想把红外遥控器应用到单片机系统中,对于遥控器的连发码处理非常重要,如果连发码处理不好,即使解码程序再成功,也可能出现程序在解码程序里死循环或解码错误等问题,从而导致系统不能正常工作。
作者通过做大量的试验得出一种可靠的连发码处理方法,即采用软件延时及定时器定时相结
合的方法来处理连发码。因为不同按键的每帧数据中携带信息部分的时间长度不等,所以在每帧数据周期内不携带信息那部分的时间长度也不相等。软件延时的目的是处理所用遥控器所有按键中那部分不带信息的最短时间,而定时器定时的目的是避开不携带信息的最长时间,其关系图如图4所示。
这部分时间处理也可以只采用定时器定时实现,但如果用的是8位定时器,并且系统频率比较高时,一次定时时间就不能满足要求,则需要对定时器多次重新设置。为了方便及不失一般性,作者采用软件延时及定时器定时相结合的方法来处
理连发码。
图4所示中,水平虚线部分代表可能有连发码,也可能没有连发码;Tdeall为一帧发码的最长时间;Tdeals为一帧发码的最短时间;Tset为定时器定时时间;Tdelay为软件延时的最长时间。其相互关系应满足的条件为Tdeall+Tdelay<
ms;Tdeals+Tset+Tdelay>46.4ms。延时及定时时间计算:延时时间要由遥控器
上所有按键代码中处理时间最长的代码值决定,本文所选的遥控器最长代码处理时间的按键为
第2期张建军,等:一种16位码红外遥控器的解码方法
“亮度减小键”,其按键代码为473BH,换算成二进制为01000111001110111,那么代码处理最长时间就为Tdeall=1.05×7+2.11×10+0.26―
28.71
共同决定,所选用的遥控器最短代码处理时间为数字键“1”,代码为4700H,换算成二进制为0100011100000000,则代码处理最短时间
Tdeals=1.05×12+2.11×4+0.26―21.3ms。
ms,则延时的极限最长时间,Tdelaymax=
ms,设置的延时时间
46.4ms一28.71ms一17.69
因此最短的定时时间:Tsetmin一46.4ms―
z1.3ms一16ms=9.1
Tdelay=16ms定时时间要由遥控器上所有按键ms,设定的定时时间为
代码中处理时间最短的代码值和上述的延时时间
Tset=10ms。
圈4连发码处理时定时时间关系
综合以上分析可以概括连发码处理过程为:当单片机解出第一帧数据的携带信息部分后,进入软件延时,软件延时时间设置依据是保证在结束延时前第2帧的数据还没有到来,也就是保证软件延时时间加上代码处理时间的时间和小于
确则打开中断返回主程序。
限于篇幅,应用部分只给出了遥控器信号接收电路和解码软件处理框图。3.1遥控器信号接收电路
遥控信号接收电路,如图5所示。采用Mi―crochip公司的PICl6F876A单片机作为处理器,红外信号的接收使用的是一体化红外接收器TSOPl838,此接收器的功能是完成红外线的接收、放大及解调,还原成同发射格式相同(但高、低电位刚好相反)的脉冲信号[I叫]。电容Cz用于一,体化红外接收器的电源退耦,一体化红外接收器的信号输出脚接单片机的中断引脚RB0/INT,操作遥控器时,红外信号接收器有信号输出,单片机产生中断进入解码程序。
ms,软件延时过后启动定时器;定时器的定
时时间的设定依据为:定时时间加上软件延时时间加上代码解码时间要大于46.4ms,这样如果有连发码就一定能接收到。
当启动定时器后,程序就不停的查询遥控器代码输入脚,目的是查询是否有连发码,在定时时间到之前如果有连发码,则返回继续执行连发码处理程序,如果定时器的定时时间到了还没有连发码,则判断解码是否正确,如果正确则设置解码正确标志并打开中断返回主程序(设置解码标志的目的是使解码程序不至于太长);如果解码不正
圈5遥控信号接收的单片机接口
3.2解码软件处理
考虑到中断服务程序不易过长,所以在中断服务程序中只解出遥控器的代码信息及对连发码进行处理,并保存解出的代码信息,然后对解码是
否成功做判断。如果解码成功,则设置一个解码成功标志并退出中断,如果解码不成功,则直接退出解码程序。主程序通过查询解码成功标志来判断是否有遥控器信号,如果有遥控器信号,则对解
合肥工业大学学报(自然科学版)
出的代码信息进行比较和处理,从而实现按键的相应功能。详细的解码软件流程,如图6所示。
圈6解码软件流程
MandaiK,MiyauchiK,SugimotoM。el:aLAnadvancedinfraredremotecontrolsensor[J].IEEETransactionsConsumerElectronics,1990,36(3):669―677.
本文详细分析了16位代码红外遥控器的编码原理,并根据其编码原理研究出一种解码及连发码的处理方法,运用此方法可以通过设置一个按键次数计数器来有效地解决按键双击问题。目前,这种解码方法已经用在了作者所做的多用计时器上,试验证明此解码方法简单可靠。
[参考文献]
[1]丁福庆,李利军.LC7462编码分析及单片机解码实现[J].
微型机与应用,Z000,(4):29―30.
[23聂诗良,李磊民.红外遥控信号的一种编码解码方法[J].仪
器技术与传感器,2004,(8):28―32.
[43安颖,张春英,王裕琛.红外遥控器在单片机控制系统中
的应用[J].电子技术,2003,(6):60一62.
[5]阎世栋.对遥控器进行解码分析的一种测试系统[J].国外
电子测量技术,2004,(3):33―34.
[63王亭.彩电遥控器的单片机解码模块设计[J].电子技术
应用,1997,(1):35―37.
[73张明峰.PIC单片机人门与实践[M].北京:北京航空航天
大学出版社,2004:47―57.
[83刘笃仁.PIC软硬件系统设计[M3.北京:电子工业出版社,
2005:163―165.
(责任编辑张秋娟)
一种16位码红外遥控器的解码方法
作者:作者单位:
张建军, 穆远祥, 韩江洪, ZHANG Jian-jun, MU Yuan-xiang, HAN Jiang-hong
张建军,穆远祥,ZHANG Jian-jun,MU Yuan-xiang(合肥工业大学,机械与汽车工程学院,安徽,合肥,230009), 韩江洪,HAN Jiang-hong(合肥工业大学,计算机与信息学院,安徽,合肥,230009)
合肥工业大学学报(自然科学版)
JOURNAL OF HEFEI UNIVERSITY OF TECHNOLOGY(NATURAL SCIENCE))2次
刊名:英文刊名:年,卷(期):被引用次数:
参考文献(8条)
1.丁福庆.李利军 LC7462编码分析及单片机解码实现[期刊论文]-微型机与应用 .聂诗良.李磊民 红外遥控信号的一种编码解码方法[期刊论文]-仪表技术与传感器 .Mandai K.Miyauchi K.Sugimoto M An advanced infrared remote control sensor .安颖.张春英.王裕琛 红外遥控器在单片机控制系统中的应用[期刊论文]-电子技术 .阎世栋 对遥控器进行解码分析的一种测试系统[期刊论文]-国外电子测量技术 .王亭 彩电遥控器的单片机解码模块设计 .张明峰 PIC单片机入门与实践 20048.刘笃仁 PIC软硬件系统设计 2005
相似文献(3条)
1.学位论文 刘浩 内嵌微处理器核的SSI型心脏起搏器的设计与仿真 2004
自1952年首次成功使用心脏起搏技术至今已经有五十多年的历史.在这五十多年里,心脏起搏技术得到了很大的发展.国际上,随着密封技术、能源技术、电子技术的发展,起搏器的设计已经出现过多次飞跃.而中国的起搏器研制工作虽然起步较早(上个世纪60年代),但是后来,由于缺少资金投入和相关的技术能力,使中国现有的起搏器设计生产能力落后于国外发达国家.但是从上个世纪九十年代以来,国家加大了对ASIC的科研及生产领域的扶持,中国的集成电路产业有了长足的发展,同时为起搏器中核心的电子电路开发创造了发展条件,使我们看到实现心脏起搏器的设计与生产与国际接轨的可能性.该文提出了一种利用复旦大学已经开发出来的、具有自主知识产权的微处理器内核作为起搏器的控制核心来设计SSI型心脏起搏器专用集成电路的设计方案.比起传统的应用数字逻辑电路设计的SSI型心脏起搏器来说,这种方案的优点就是可以利用微处理器的程序控制功能完成比较复杂的控制逻辑,从而增强起搏器的功能.为了争取时间及积累数据,我们先利用结构功能相似的PIC单片机PIC16F84进行SSI型心脏起搏器功能的设计和模拟.该文详细描述了利用PIC16F84单片机结合外围电路如何实现SSI型心脏起搏器的各种功能:感知自身心律的功能,按时发放起搏脉冲的功能,强干扰模式转换的功能,电池电压测量的功能,还有程控与遥测的功能.另外,作者在文章内对脉冲发放电路和电池电压测量电路提出了自己的设计方案,并用分立元件进行了仿真.为了实现程控与遥测的功能,文中还设计了应用于该起搏器的通讯协议,并定义了通讯编码方式和指令集,这些都是利用单片机的软件完成的.最后,该文对基于分立元件实现的SSI型心脏起搏器进行了各项功能的验证,并粗略估算了使用微处理器内核的SSI型心脏起搏器的功耗.结果表明,利用该文提出的内嵌微处理器核的SSI型心脏起搏器的设计方案应该是能够达到功能和功耗方面的要求的.所以,该文在心脏起搏器的国产化、同国际心脏起搏器的设计相接轨方面取得了阶段性的成果.
2.期刊论文 杜凤付 PIC单片机串行通信中的汉明编码自动检纠错 -单片机与嵌入式系统应用2004,&&(8)
基于汉明码(Hamming Code)编码方式实现串行通信中的自动检纠错功能.重点分析汉明码编码方式和纠错方式,并介绍实现算法.在算法中,将位操作转化为对字节操作,从而可以直接利用字节操作结果确定各校验位和校验因子,最后给出关键代码.
3.学位论文 孙亚辉 植入式装置与体外程控装置双向传输技术的研究 2004
自1952年首次成功使用心脏起搏技术,至今已有五十年的历史.在这五十年里,心脏起搏技术得到了很大的发展.1958年,埋藏式起搏器的问世,虽然使起搏的应用范围大为扩展,但起搏器一经埋藏,便不能再改变其起搏参数,带来临床应用的诸多不便,特别是在病情发生变化(如心衰或发生起搏综合症)时,往往需要手术更换起搏器.因此,利用体外程控技术,无创伤地调节埋藏起搏器工作状态,是人们的重点研究课题.而如何降低功耗,进一步延长起搏器的使用寿命,来减少病人因电池耗尽而不得不更换起搏器的次数,从而更好地为病人服务,这也是发展的一个方向.该文在立足起搏程控遥测系统的基础上,对影响植入式装置程控遥测系统的关键技术作了大量基础性的研究工作.目标是通过对双向传输技术的研究为将来的实用化的起搏器程控遥测系统提供理论保证并设计测试试验平台和测试评估系统的研究.文章对于双向传输技术的研究是从线圈物理性质的研究开始的.通过以基于LSK原理建立的近耦合线圈的电路模型的研究和分析,提出了线圈耦合系数的测量与研究方法,并针对隔离Ti壳的近耦合线圈得出了耦合电路能量传输的最低功率估计;随后,我们在参考了大量文献的基础上,研究了现代双向传输技术实现的基本原理,对功放电路、负载调制电路原理进行了深入地研究,并设计了用于起搏器程控遥测装置的可调制的具有反馈环的E类放大器以及起搏器植入部分的调制和解调电路;在对实际电路的调试过程中,遇到了大量的问题,诸如载波的选择、数据编码方式、能量传输方式等等,我们选择了在270kHz作为电路传输的载波频率,以ASK/LSK为调制方式,并通过PC串口和51单片机实现了非归零编码/曼彻斯特编码/脉冲宽度编码,在此基础上作了大量的编码抗干扰性试验,结合实测的数据比较了双向传输中各种编码的抗干扰性能;最后我们实现了与基于PIC单片机的SSI起搏器的联调.所有测试数据都已制表作为附录加在文末.
引证文献(1条)
1.陶玲樱.茅正冲.王博.姜进 通用型智能红外逻辑分析仪设计[期刊论文]-电脑知识与技术 2009(16)
三亿文库包含各类专业文献、幼儿教育、小学教育、文学作品欣赏、中学教育、各类资格考试、应用写作文书、高等教育、专业论文、一种16位码红外遥控器的解码方法_图文25等内容。 
 用单片机解码红外遥控器_电子/电路_工程科技_专业...在同一个遥控器中.所有按键发出的地址码都是相同 ...(或者1)为下降沿中断,定时器0(或者1)为16位计时...  红外线解码心得和解码程序_信息与通信_工程科技_专业...16 位的码,顾只需要用两个字节保存用 户码和数据...高位读取遥控器发送的数据,顾 要右移吧第一次读的...  红外遥控信号的解码_电脑基础知识_IT/计算机_专业...红外线遥控是目前使用最广泛的一种通信和遥控手段。...位二进制码组,其中前 16 位为用户识别码,能区别...  一下此遥控器的红外编解码原理与单片机 解码方法。 ...计时用了一个 16 位的变量,得到的一个数据序列如...引导码是一个代码的起始部分,由时间相对较长的一段...  红外遥控解码原理_信息与通信_工程科技_专业资料。托普老大→成哥红外线遥控器解码原理 红外线遥控是目前使用最广泛的一种通信和遥控手段。 由于红外线遥控装置具有 ...  proteus 仿真论坛: 一种红外遥控器编解码仿真如图 4-1 所示,发射数据与 38K 载波调制后为红外发射信号,该信号经过一种专门的红外接收 ...  红​外​解​码 暂无评价|0人阅读|0次下载|举报文档红外遥控解码器时间:...这样设置定时器0即是把 GATE 置 1,16位计数器,最大计数值为2的16次方个...  红外遥控解码器_信息与通信_工程科技_专业资料。编号...调制码,其中包含引导码、系统 码 1、系统码 2、...位二进制码组,其中前 16 位为 用户识别码,能区别...  红外线遥控是目前使用最广泛的一种通信和遥控手段。...应用编/解码专用集成电路 芯片来进行控制操作,如图1...该芯片的用户识 别码固定为十六进制01H;后16位为...查看: 578|回复: 5
为什么Arduino红外遥控按钮每次读取的编码有所不同?
新手,写的读取红外遥控器按键编码的程序,但是都出来的编码不一样,
请问大神是什么原因呢?
#include&IRremote.h&
int REC_PIN=11;
IRrecv irrecv(REC_PIN);
decode_
void setup()
{
&&Serial.begin(9600);
&&irrecv.enableIRIn();
}
void loop()
{
&&if(irrecv.decode(&results))
&&{
& & Serial.println(results.value,HEX);
& & delay(500);
& & irrecv.resume();
&&}
}复制代码
微信截图_05.png (5.22 KB, 下载次数: 0)
13:32 上传
这是按下同一个按钮读取的编码
这个感觉是遥控器上单片机程序的问题,好一些的遥控器我记得是不会这样子的。你可以试试其他遥控器。便宜的遥控器按键如果你一直按住,或者按键没有做消抖。就容易出现这种情况。
这是按下同一个按钮读取的编码
我用的1块钱的遥控器也有这个问题
红外头是有角度差的,你对应的角度不同,编码会不同,
和遥控器无关,是这个库的问题。
这个库在Arduino上的运行优先级不高,定时过程被抢占,导致计时数据不准,解出来的码就不一样。
这个库我也用过,发现误差很大。还是直接用AVR单片机编程(不用arduino系统)准确。
Powered by红外遥控器原理
红外遥控器原理
发布: | 作者:-- | 来源: -- | 查看:198次 | 用户关注:
遥控发射具有键盘矩阵,每按下一个键,即产生具有不同的编码数字脉冲,这种代码指令信号调制在38kHz的截波上,激励红外光二级管产生具有脉冲串的红外波,通过空间的传送到受控机内的遥控接收器。在接收过程中,红外波信号通过光学滤波器和光电二级管转换为38kHz的电信号,此信号经过放大、检波、整形、解调、送到解码与接口电路,从而完成相应的遥控功能。
附图为采用TC9148P专用集成块
38kHz38kHz
TC9148PIC501IC50123CF50138kHzIC5014510112X2IC501IC501IC5011538kHzQ501Q5028.5m10m
本页面信息由华强电子网用户提供,如果涉嫌侵权,请与我们客服联系,我们核实后将及时处理。
&&& 目前,处理器性能的主要衡量指标是时钟频率。绝大多数的集成电路 (IC) 设计都基于同博客访问: 1037358
博文数量: 333
博客积分: 3133
博客等级: 中校
技术积分: 3697
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: LINUX
&& 我们平常使用的遥控器随处可见,但是你知道他的原理吗?
&& 遥控器使用的红外通信方式,先对他的编码原理和编写程序的思路给一个简单介绍。
一、红外遥控系统
&&&& 通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,如图1所示。发射部分包括键盘矩阵、编码调制、LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路。
二、编码原理
&&这里介绍常用的超薄型红外线遥控器使用的就是6121编码。当发射器按键按下后,
即有遥控码发出,所按的键不同遥控编码也不同。这种遥控码具有以下特征:&&&&
采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔
1.685ms、周期为2.25ms的组合表示二进制的“1”,其波形如图2所示。
注意,此处为发射器发出的编码,并非接收器接收(输出)的信号,接收器输出的信号与发射器的信号正好反向。
上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。然后再通过红外发射二极管产生红外线向空间发射,如图3所示。
UPD6121G产生的遥控编码是连续的32位二进制码组,其中前16位为用户识别码,能区别
不同的电器设备,防止不同机种遥控码互相干扰,如我们可以同时使用电视机、机顶盒、功放等遥控器,但它们不会产生误触发。该芯片的用户识别码固定为十六进
制01H;后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)组成。
好了,讲到这里,你应该可以编写程序了。下边给出编程的思路来:
{16位地址码的最短宽度:1.12×16=18ms 16位地址码的最长宽度:2.24ms×16=36ms
可以得知8位数据代码及其8位反代码的宽度和不变:(1.12ms+2.24ms)×8=27ms
所有32位代码的宽度为(18ms+27ms)~(36ms+27ms)
对于红外线遥控对于很多电子爱好者来讲,都感觉到非常神奇,看不到,摸不着,但能实现无线遥控,其实控制的关键就是我们要用单片机芯片来识别红外线遥控器
发出红外光信号,即我们通常所说的解码,单片机得知发过来的是什么信号,然后再做出相应的判断与控制,如我们按电视机遥控器的频道按钮,则单片机会控制更
换电视频道,如按的是遥控器音量键,则单片机会控制增减音量。
而解码的关键是如何识别“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左右均可。根据码的格式,应该等待9ms的起始码和4.5ms的结果码完成后才能读码。
这个程序是我自己调试好的,可以拿来直接应用。仅供参考,望高手不要见笑:程序是从一个项目中提出来的,一些延时之类的小程序没有写出,对于您应该不是什么问题。
/*----------------------------------------------------------*//*-----------------------红外解码程序(核心)-----------------*//*----------------------------------------------------------*/
void IR_decode(){& uchar& i,j;& while(IR_RE==0);&&&&&&&&&&&&&&&&&&&&&&&&&& //如果在9MS的引导信号内,一直等待。。& delay2400();& if(IR_RE==1)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //延时2.4ms后如果是高电平则是新码& {&&&& delay2400();&&&&&&&&&&&&&&&&&&&&&&&&&&& //延时4.8ms避开4.5ms的高电平& for(i=0;i&4;i++)& {&&& for(j=0;j&8;j++)&&& {&&&&&&&&&& while(IR_RE==0);&&&&&&&&&&&&&&&&&&&&&& //等待地址码第1位高电平到来&&&&&&&&&& delay882();&&&&&&&&&&&&&&&&&&&&&&&&&&& //延时882纳秒判断此时引脚电平&&&& ///CY=IR_RE;&&&&&&&&&& if(IR_RE==0)&&&&&&&&&& {&&&&&& &&&& date[i]&&=1;&&&&&&&&&&&&&& //相当于 date[i]=date[i]&&1&&&& date[i]=date[i]&0x7f;&& //按位“与”&&& &&&&&&&&&& }&&&&&&&&&& else if(IR_RE==1)&&&& {&&&& delay1000();&&&& date[i]&&=1;&&&& date[i]=date[i]|0x80;&&&&& //按位“或”&&&&& }&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //1位数据接收结束&&&& }&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //32位二进制码接收结束&& } }
/*------------------------外部中断0程序-------------------------*//*------------------主要用于处理红外遥控键值--------------------*/
void int0() interrupt 0{ &&&& for(i=0;i&4;i++)&& { &&&& delay1000();& if(IR_RE==1){k=~k;}&&&&&&&&&&&&&&&&&& //刚开始为4.5ms的引导码,如果4ms内出现高电平则退出解码程序&& }
&& if(k==0)&& { && EX0=0;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //检测到有效信号关中断,防止干扰&& IR_decode();&&&&&&&&&&&&&&&&&&&&&&&&& //如果接收到的是有效信号,则调用解码程序&& disp();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //解码成功,调用显示程序,显示该键值&& }& EX0=1;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //开外部中断,允许新的遥控按键}
void main(void){& SP=0x60;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //堆栈指针& TMOD=0x11;&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //定时器模式设置所选为 模式1& TH0=0xd8;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //定时器初值理论为 10& TL0=0xf7;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //实际取d8f7& ET0=1;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //允许定时器0中断& EX0=1;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //允许外部中断0,用于检测红外遥控器按键& EA=1;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //总中断开& init();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //初始化LCD& wcom(0x80);&&&&&&&&&&&&&&&&&&&&&&&&&&&& //写入字符的地址为第1行第1列& strchar(p0);&&&&&&&&&&&&&&&&&&&&&&&&&&& //调用显示字符串函数& wcom(0xc0);& //strchar(p1);& while(1);}
首先要定义红外遥控的波形时间:
//PROCESSOR_CYCLE与你的时钟与分频数有关
#define IR_NUMX_LOW&& (U16)(560 * PROCESSOR_CYCLE)
#define IR_NUM0_HIGH& (U16)(565 * PROCESSOR_CYCLE)
#define IR_NUM1_HIGH& (U16)(1690* PROCESSOR_CYCLE)
#define IR_HEAD_HIGH& (U16)(4500* PROCESSOR_CYCLE)
#define IR_HEAD_LOW&& (U16)(9000* PROCESSOR_CYCLE)
#define WaveIrSetTimer() {TBOC2HR=WaveIr.time&&8;TBOC2LR=gWaveIr.time&0}
#define WaveIrDisTimer() {TBOC2LR=0;TBOC2HR=0;}
ST72F321有TimerA,TimerB,每个Timer又有两个比较时钟,这里我占用TimerB的CMP2,
中断任务的代码为:
&&& if (IntTimerBCmp2FlgChk())//检测中断标志
&&&&&&& WaveIrSend();&& // IR波形发送任务
IR波形发送任务处理:
void WaveIrSend(void)
&&& if (0==gWaveIr.state)
&&& {&& WaveIrDisTimer();
&&& Pin_IRWave = gWaveIr. //设置IO高低
&&& if (0==gWaveIr.trail)
&&& {&& WaveIrDisTimer(); //发送完毕后关闭时钟,以减少CPU占用率
&&&&&&& PinWaveIRIn();
&&&&&&& gWaveIr.state = 0; // 设置发送完成标志
&&& gWaveIr.io = ~gWaveIr. //IO状态变换
&&& WaveIrSetTimer(); //使能时钟
&&& if (gWaveIr.head)& // 发遥控器头
&&&&&&& gWaveIr.head = 0;
&&&&&&& gWaveIr.time += IR_NUMX_LOW;
&&&&&&& gWaveIr.high = 0;
&&&&&&& gWaveIr.next = 0;
&&&&&&& if (gWaveIr.len&5)
&&&&&&&&&&& if (gWaveIr.high)
&&&&&&&&&&& {&& gWaveIr.time += IR_NUMX_LOW; // 发送低脉冲
&&&&&&&&&&&&&&& if (4==gWaveIr.len)
&&&&&&&&&&&&&&& {&& gWaveIr.len++;
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& if (0x80==gWaveIr.byte)
&&&&&&&&&&&&&&& {&& gWaveIr.byte = 0x01;
&&&&&&&&&&&&&&&&&&& gDvdIr.len++;
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& else
&&&&&&&&&&&&&&& {&& gWaveIr.byte &&=1;&& //移位
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&&&&&& else
&&&&&&&&&&& {&& //判断下一个发要送的是0,还是1,以取得高脉冲的时间参数
&&&&&&&&&&&&&&& if (gWaveIr.next)
&&&&&&&&&&&&&&& {&& gWaveIr.time += IR_NUM1_HIGH;&
&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& else
&&&&&&&&&&&&&&& {&& gWaveIr.time += IR_NUM0_HIGH;
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&&&&&& gWaveIr.high = ~gWaveIr.
&&&&&&& else // 发送红外波形的结束
&&&&&&&&&&& gWaveIr.time += IR_NUMX_LOW;
&&&&&&&&&&& gWaveIr.trail = 0;
外部调用的接口函数: void WaveIrSet (U8 irCmd);
//其主要完成的任务是:设置要发送的四个字节的值,
&&&&&&&&&&&&&&&&&&& 为发送任务设置好相应的参数;
&&&&&&&&&&&&&&&&&&& 设置IO口为输出状态;
&&&&&&&&&&&&&&&&&&& 启动时钟;&
0//565 565 1//
文件:NEC码和PHILIPS码.pdf
阅读(5457) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。

我要回帖

更多关于 网线没有问题连不上网 的文章

 

随机推荐