网站导航: 首页 > 设计参考 > 正文 文章搜索
PIC单片机红外遥控编码与解码的问题
 
文章编号:
081208215506
文章分类: 单片机 PIC
点 击:
...
关 键 词: 红外遥控
文章来源:
网络
摘 要:
一般常用的红外遥控器编码规则都差不多,基本上都同6221原理一样(可在网上找到)

一般常用的红外遥控器编码规则都差不多,基本上都同6221原理一样(可在网上找到)

PIC单片机接收时:
如果用54,57这类片子做的话有一定的难度(假如要做成实时控制的;比如说你还要驱动显示,驱动步进电机,在加上几个按键)原因就是这类片子没有中断

例程如下(用来解6221;分频比为256)

 
  1. RF:   
  2. BTFSC PORTB,2;;B2口用做接收口   
  3. GOTO RF1   
  4. BTFSS DOWNBIT;;检测下降沿标制   
  5. CLRF RTCCOUNT   
  6. BSF DOWNBIT;制下降沿标制   
  7. BTFSS UPBIT;;检测上升沿标制   
  8. RETLW 0   
  9. BTFSC IDBIT;;检测码头标制   
  10. GOTO RF3   
  11. MOVLW 2AH  
  12. SUBWF RTCCOUNT,0   
  13. BTFSS STATUS,0   
  14. GOTO RF2   
  15. MOVLW 36H  
  16. SUBWF RTCCOUNT,0   
  17. BTFSC STATUS,0   
  18. GOTO RF2   
  19. BTFSC IDBIT   
  20. GOTO RF3   
  21. MOVLW .8   
  22. MOVWF LOOP   
  23. MOVLW .3   
  24. MOVWF LOOPCOUNT   
  25. CLRF DATACOUNT   
  26. BSF IDBIT   
  27. BSF DOWNBIT   
  28. BCF UPBIT   
  29. CLRF RTCCOUNT   
  30. RETLW 0   
  31. RF1:   
  32. BTFSS DOWNBIT   
  33. RETLW 0   
  34. BSF UPBIT   
  35. RETLW 0   
  36.   
  37. RF2:   
  38. BCF DOWNBIT   
  39. BCF UPBIT   
  40. BCF IDBIT   
  41. CLRF RTCCOUNT   
  42. RETLW 0 ;遥控接收  
  43. RF3:   
  44. MOVLW 02H  
  45. SUBWF RTCCOUNT,0   
  46. BTFSS STATUS,0   
  47. GOTO RF4   
  48. MOVLW 0CH  
  49. SUBWF RTCCOUNT,0   
  50. BTFSS STATUS,0   
  51. GOTO RF4   
  52. GOTO RF2   
  53. RF4:   
  54. MOVLW 08H  
  55. SUBWF RTCCOUNT,0   
  56. BTFSC STATUS,0   
  57. BSF 3H,0   
  58. MOVLW 07H  
  59. SUBWF RTCCOUNT,0   
  60. BTFSS STATUS,0   
  61. BCF 3H,0   
  62. RLF DATACOUNT,1   
  63. BSF DOWNBIT   
  64. BCF UPBIT   
  65. CLRF RTCCOUNT   
  66. DECFSZ LOOP,1   
  67. RETLW 0   
  68. MOVLW .8   
  69. MOVWF LOOP   
  70. DECFSZ LOOPCOUNT   
  71. RETLW 0   
  72. BSF RFBIT;;制接收完标制   
  73. BCF DOWNBIT   
  74. BCF UPBIT   
  75. BCF IDBIT   
  76. CLRF RTCCOUNT   
  77. RETLW 0   
  78.   
  79. //////////////////////////////////////////////////////////   
  80.   
  81. TIME:   
  82. BTFSC TIMEPD1   
  83. GOTO TIME1   
  84. MOVF RTCC,0;;(   
  85. MOVWF TIMEONE   
  86. BSF TIMEPD1   
  87. RETLW 0 ;定时查寻  
  88. TIME1:   
  89. MOVF RTCC,0   
  90. SUBWF TIMEONE,0   
  91. BTFSC STATUS,2   
  92. RETLW 0   
  93.   
  94. BCF TIMEPD1   
  95.   
  96.   
  97. INCF RTCCOUNT,1   
  98.   
  99. RETLW 0   
  100.   
  101. ////////////////////////////////////////////////   
  102.   

在这里我是用查询的方式来定时的(RTCCOUNT)只是在解码时不需要去追求时间精度;我是去查RTCC有没有发生跳变如有则表示时间过了 256US---RTCCOUNT加一;这样做有一个好处---你不必去管RTCC具体的值是多少,(RTCC去做精确的时钟定时;在这个查询的子程序中你可以去判断键扫,显示刷新,驱动步进电机等等)

相应的C代码如下:

 
  1. unsigned char rfcount,   
  2. loop,   
  3. rftime,//查询定时器   
  4. k;   
  5. bit rfbit, //接收完标制   
  6. lowbit1,   
  7. lowbit2,   
  8. downbit,   
  9. rfgobit;   
  10. unsigned char dispcount[5];//结果   
  11. #define rfin RC6   
  12. ////////////////////////////////////////////////////////////////////////////////   
  13. rf( )//遥控接收   
  14. {   
  15.     if(rfbit==0)   
  16.     {   
  17.         if((lowbit1==0)&&(rfin==0))   
  18.         {   
  19.             downbit=1;   
  20.             rftime=0;   
  21.             lowbit1=1;   
  22.             return;   
  23.         }   
  24.         if((lowbit1==1)&&(rfin==1))   
  25.         {   
  26.             lowbit2=1;   
  27.             return;   
  28.         }   
  29.         if((lowbit1==1)&&(lowbit2==1)&&(RC6==0))   
  30.         {   
  31.             lowbit1=0;   
  32.             lowbit2=0;   
  33.             if((rftime>=40)&&(downbit==1))//遥控接收;   
  34.             {   
  35.                 rfgobit=1;   
  36.                 loop=0;   
  37.                 rfcount=0;   
  38.                 k=1;   
  39.                 rftime=0;   
  40.                 return;   
  41.             }   
  42.             rfcount=rfcount+1;   
  43.             loop=loop+1;   
  44.             if(rfcount>=31)   
  45.             {   
  46.                 rfgobit=0;   
  47.                 downbit=0;   
  48.                 rfcount=0;   
  49.                 rfbit=1;   
  50.                 loop=0;   
  51.                 return;   
  52.             }   
  53.             if((rftime>=7)&&(rfgobit==1))   
  54.             {   
  55.                 dispcount[k]=dispcount[k]|0x80;   
  56.                 rftime=0;   
  57.                 if(loop==8)   
  58.                 {   
  59.                     k=k+1;   
  60.                     loop=0;   
  61.                     return;   
  62.                 }   
  63.                 dispcount[k]=dispcount[k]>>1;   
  64.                 return;   
  65.             }   
  66.             if((rftime<5)&&(rfgobit==1))   
  67.             {   
  68.                 dispcount[k]=dispcount[k]&0x7f;   
  69.                 rftime=0;   
  70.                 if(loop==8)   
  71.                 {   
  72.                     k=k+1;   
  73.                     loop=0;   
  74.                     return;   
  75.                 }   
  76.                 dispcount[k]=dispcount[k]>>1;   
  77.                 return;   
  78.             }   
  79.         }   
  80.     }   
  81. }  

 

(查询子程序同汇编)
假如用中断的话也可用时间查询的方法,只是接收口改用带中断的口线;RB4--RB7,CCP1,CCP2,都可以。建议不要用RB0(他当按键输入最好用);

还有就是解码时的容陷和误码处理(有一种写法是在解码移位时利用进位标制C同时移位;我个人认为不太好,因为只要差一位没接收到,整个接收到的都是误码且浪费时间)

 
相关文章:

12 下一页
 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4