红外接收程序讲解_第1页
红外接收程序讲解_第2页
红外接收程序讲解_第3页
红外接收程序讲解_第4页
红外接收程序讲解_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、红外接收程序讲解1、红外遥控系统通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,如图1所示。发射部分包括键盘矩阵、编码调制、LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路。下面,我们将使用下面两种设备:另外,使用51单片机进行解码。2、原理图从原理图看出,IR的data脚与51的PD2(P3.2)目连。?2、红外发射原理要对红外遥控器所发的信号进行解码,必须先理解这些信号。a)波形首先来看看,当我们按下遥控器时,红外发射器是发送了一个什么样的信号波形,如下图:由上图所示,当一个键按下超过22ms,振荡器使芯片激活,将发射一组108ms的编码

2、脉冲(由位置1所示)。如果键按下超过108ms仍未松开,接下来发射的代码(连发代码由位置3所示)将仅由起始码(9ms)和结束码(2.5ms)组成。下面把位置1的波形放大:nn nnzz nn nn nn nizz.'广ZZ鼠4J.任8位用户编旧引寻巧IJ位置放大由位置1的波形得知,这108ms发射代码由一个起始码(9ms),一个结果码(4.5ms),低8位地址码(用户编码)(9ms18ms),高8位地址码(用户编码)(9ms18ms),8位数据码(键值数据码)(9ms18ms)和这8位数据的反码(键值数据码反码)(9ms18ms)组成。b)编码格式遥控器发射的信号由一审0和1的二进制代

3、码组成.不同的芯片对0和1的编码有所不同。通常有曼彻斯特编码和脉冲宽度编码。XS-091遥控板的0和1采用PWM方法编码,即脉冲宽度调制。下图为一个发射波形对应的编码方法:_-nnnn_nn_n引导码I o I i I i I|放大0和1的波形如下图:潟控码的30 H和时1 E这种编码具有以下特征:以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1:3、红外接收原理a)波形红外接收头将38K载波信号过虑,接收到的波形刚好与发射波形相反:放大,位定义0和位定义1波形如下:4、解

4、码原理及算法注:代码宽度算法:16位地址码的最短宽度:1.12x16=18ms附地址码的最长宽度:2.24msx16=36ms可以得知8位数据代码及其8位反代码的宽度和不变:(1.12ms+2.24m§x8=27ms所有32位代码的宽度为(18ms+27ms)(36ms+27ms)对于红外线遥控对于很多电子爱好者来讲,都感觉到非常神奇,看不到,摸不着,但能实现无线遥控,其实控制的关键就是我们要用单片机芯片来识别红外线遥控器发出红外光信号,即我们通常所说的解码。单片机得知发过来的是什么信号,然后再做出相应的判断与控制,如我们按电视机遥控器的频道按钮,则单片机会控制更换电视频道,如按的是

5、遥控器音量键,则单片机会控制增减音量。解码的关键是如何识别“解口“1”!从位的定义我们可以发现“0”1均以0.56ms的低电平开始,不同的是高电平的宽度不同!,“肪0.56ms,”1'1.68ms所以必须根据高电平的宽度区别”仔如果从0.56ms低电平过后,开始延时,0.56ms以后,若读到的电平为低,说明该位为“0:反之则为“1;为了可靠起见,延时必须比0.56ms长些,但又不能超过1.12ms,否则如果该位为“0:读到的已是下一位的高电平,因此取(1.12ms+0.56ms)/2=0.84ms最为可靠,一股取0.84ms左右均可。根据码的格式,应该等待9ms的起始码和4.5ms的结

6、果码完成后才能读码。5、实例代码:注意一下几点:1 .从上面红外接收头与单片机连接原理图”来看,红外接收头的型号脚是与51的int0相连,所以需要使用INT0(外部中断0).2 .由于解码过程中涉及到延时,为精确起见,我们选择使用定期时1来计时。实例代码:C+1. #include2. #include3. /函数原型4. voidSystemInit(void);5. voidDelay_840usvoid);6. voidDelay_2400usVoid);7. voidLedDisp();8. unsignedcharGetCodevoid);/获得码9. voiddelay(unsig

7、nedcharloop);10. /位变量11. sbitIRIN=P3A2;12. sbitBEEP=Pi6;13. sbitswch=P1A7;14. /变量15. unsignedcharKeyValue;/机器码16. unsignedcharMaValue;/键值码;17. unsignedchardisbuf4;/数码管显示缓冲18. unsignedcharscan4=0x04,0x08,0x10,0x20;/p2位选择19. unsignedcharcodetable16=/共除礁20. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,

8、0x6f,0x77,0x7C,0x39,0x5E,0x79,0x71;21. /*22. *延时23. */24. voiddelay(unsignedcharloop)25. 26. unsignedchari;27. for(i=0;i>8);28. TR1=1;29. while(!TF1);30. TF1=0;31. TR1=0;32. 33. /*34. *延时9ms35. */36. voidDelay_9000us(void)37. 38. TL1=153.6;39. TH1=223.6;40. TR1=1;41. while(!TF1);42. TF1=0;43. TR1

9、=0;44. 45. /*46. *延时4.5ms47. */48. voidDelay_4500us(void)49. 50. TH1=239.8;51. TL1=204.8;52. TR1=1;53. while(!TF1);54. TF1=0;55. TR1=0;56. 57. /*58. *系统初始化59. */60. voidSystemInit(void)61. 62. IRIN=1;63. IT0=1;/INT颜跳变触发64. TMOD=0x10;/定时器/1工作在方式165. EA=1;66. EX0=1;67. 68. /*69. *读码70. */71. unsignedc

10、harGetCode()72. 73. unsignedcharn;74. statictemp=0;75. for(n=0;n<8;n+)76. 77. while(!IRIN);/等待高电平,开始解码78. Delay_840us();/延时0.84ms79. if(IRIN)/若仍然为高电平,则为1,否则为080. 81. temp=(0x80|(temp>>1);/182. while(IRIN);/等待跳变成低电平83. 84. else85. temp=(0x00|(temp>>1);/086. 87. 88. returntemp;89. 90. /

11、*91. *数码管显示92. */93. voidLedDisp()94. 95. unsignedchari;96. for(i=0;i<4;i+)97. 98. P0=tabledisbufi;99. P2=scani;100. delay(50);101. P0=0x00;102. 103. 104. voidmain(void)105. 106. SystemInit();107. while(1)108. 109. /以下是查表显示110. disbuf0=(KeyValue&0xf0)>>4)&0x0f);111. disbuf1=KeyValue

12、&0x0f;112. disbuf2=(MaValue&0xf0)>>4)&0x0f);113. disbuf3=MaValue&0x0f;114. LedDisp();115. 116. 117. voidinterr_ir(void)interrupt0118. 119. /*120. *用户码和机器码121. */122. unsignedcharaddrl,addrh,num1,num2;123. EA=0;/先关闭外部中断0124. Delay_9000us();/检测9ms开始码125. if(IRIN)/检测是否为干扰信号126. EA

13、=1;/重新开启外部中断0127. return;/退出解码128. 129. while(!IRIN);/等待跳为高电平130. Delay_4500us();/检测4.5ms结果码131. if(IRIN)/检测是否为干扰信号132. EA=1;/重新开启外部中断0133. return;/退出解码134. 135. /读码136. addrl=GetCode();/用户编码高位137. addrh=GetCode();/用户编码低位138. num1=GetCode();/机器码139. num2=GetCode();/机器码反码140. /校验是否为错码141. if(num1!=nu

14、m2)142. 143. KeyValue=14;144. EA=1;145. return;146. 147. KeyValue=num2;148. MaValue=addrh;149. EA=1;150. 代码分析(只分析关键部位):1. 系统初始化SystemInit()系统初始化时,我们设置IRIN为高电平,同时把IT0设置成1,即下降沿(负跳变)触发中断。这是用于接收波形的引导码是从低电平开始的(如上面接收波形所示)。这样,当按下按键时,红外接收到信号,IRIN则发生从预先设置的高电平跳为低电平,从而产生中断。2. 解码-中断程序interr_ir(void)首先,第一步把EX0关不

15、断,这步至关重要,因为一个接收波形许多的下降沿,这样会产生干扰中断。接下来,使用定期时0延时9ms,跳过开始码。注意,延时后,需要检测一下干扰信号。下一步,while(!IRIN);等待4.5ms高电平的到来,再延时4.5ms,跳过结果。引导码过后,开始读码,执行GetCode():32位数据码,分4次读取,所以执行4次GetCode(),读取一个字节数据过程如下:C+1. unsignedcharGetCode()2. 3. unsignedcharn;4. statictemp=0;5. for(n=0;n<8;n+)6. 7. while(!IRIN);/等待高电平,开始解码8. Delay_840us();/延时0.84ms9. if(IRIN)/若仍然为高电平,则为1,否则为010. 11. temp=(0x80|(temp>>1);/112. while(IRIN);/等待跳变成低电平13. 14. else15. temp=(0x00|(temp>>1);/016. 17.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论