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


2 再谈PIC单片机发送

原理是接收的逆过程

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

 
  1. ;///////////////////////////////////////////////////////////////////////////////////////////////  
  2. READDIGT:   
  3. MOVF SENDLOOP,0   
  4. ADDWF PC,1   
  5. GOTO SENDC4   
  6. GOTO SENDC3   
  7. GOTO SENDC2   
  8. GOTO SENDC1   
  9. GOTO SENDC0   
  10. ;///////////////////////////////////  
  11. SENDC0:   
  12. MOVF C4COUNT,0;;读要发的数据(假设要发5个字)   
  13. RETURN   
  14. SENDC1:   
  15. MOVF C3COUNT,0   
  16. RETURN   
  17. SENDC2:   
  18. MOVF C2COUNT,0   
  19. RETURN   
  20. SENDC3:   
  21. MOVF C1COUNT,0   
  22. RETURN   
  23. SENDC4:   
  24. MOVF C0COUNT,0   
  25. RETURN   
  26. ;///////////////////////////////////  
  27. SENDBIT:   
  28. CLRF TIME   
  29. BCF PORTB,1   
  30. SENDBIT1:   
  31. CLRWDT   
  32. MOVLW .35   
  33. SUBWF TIME,0   
  34. BTFSS STATUS,2   
  35. GOTO SENDBIT1   
  36. CLRF TIME   
  37. BSF PORTB,1   
  38. SENDBIT2:   
  39. CLRWDT   
  40. MOVLW .18   
  41. SUBWF TIME,0   
  42. BTFSS STATUS,2   
  43. GOTO SENDBIT2   
  44. CLRF SENDLOOP ;码头数据发送  
  45.   
  46. //////////////////////////////////////////////   
  47. SENDBIT3:   
  48. CLRWDT   
  49. BCF INTCON,7   
  50. CALL READDIGT   
  51. MOVWF SENDCOUNT   
  52. BSF INTCON,7   
  53. CALL SENDDIGT   
  54. INCF SENDLOOP,1   
  55. MOVLW .5   
  56. SUBWF SENDLOOP,0   
  57. BTFSS STATUS,2   
  58. GOTO SENDBIT3   
  59. CLRF TIME   
  60. BCF PORTB,1   
  61. SENDDIGT5:   
  62. CLRWDT   
  63. MOVLW .2;;加发一个结束位   
  64. SUBWF TIME,0   
  65. BTFSS STATUS,2   
  66. GOTO SENDDIGT5   
  67. BSF PORTB,1   
  68. BSF STARTBIT   
  69. RETURN   
  70. ;/////////////////////////////////////////////////////////////////////////////////////////  
  71. SENDDIGT:;;实现0和1的发送   
  72. MOVLW .8   
  73. MOVWF LOOPSENDCOUNT   
  74. SENDDIGTGO:   
  75. BTFSS SENDCOUNT,7   
  76. GOTO ZERSEND   
  77. CLRF TIME   
  78. SENDDIGT1:   
  79. CLRWDT   
  80. BCF PORTB,1   
  81. MOVLW .2   
  82. SUBWF TIME,0   
  83. BTFSS STATUS,2   
  84. GOTO SENDDIGT1   
  85. CLRF TIME   
  86. SENDDIGT2:   
  87. CLRWDT   
  88. BSF PORTB,1   
  89. MOVLW .6   
  90. SUBWF TIME,0   
  91. BTFSS STATUS,2   
  92. GOTO SENDDIGT2   
  93. GOTO SENDOVER   
  94. ZERSEND:   
  95. CLRF TIME   
  96. SENDDIGT3:   
  97. CLRWDT   
  98. BCF PORTB,1   
  99. MOVLW .2   
  100. SUBWF TIME,0   
  101. BTFSS STATUS,2   
  102. GOTO SENDDIGT3   
  103. CLRF TIME   
  104. SENDDIGT4:   
  105. CLRWDT   
  106. BSF PORTB,1   
  107. MOVLW .2   
  108. SUBWF TIME,0   
  109. BTFSS STATUS,2   
  110. GOTO SENDDIGT4   
  111. SENDOVER:   
  112. RLF SENDCOUNT,1   
  113. DECFSZ LOOPSENDCOUNT   
  114. GOTO SENDDIGTGO   
  115. RETURN  

 

 

相应的C代码如下:(C5口是发送口)

 
  1. #include   
  2. #include   
  3. #include   
  4. unsigned char dispcount[5];//要发送的码值   
  5. unsigned char i,k,data,rfbit,zbit,rfgobit;   
  6. #pragma interrupt_level 1   
  7. interrupt adint(void)   
  8. {   
  9.     if(TMR1IF==1)   
  10.     {   
  11.         TMR1IF=0;   
  12.         TMR1H=0b11111100;   
  13.         TMR1L=0b00010111;   
  14.         rfbit=rfbit+1;//发送指针加一   
  15.         send( );   
  16.     }   
  17. }   
  18. //////////////////////////////////////////   
  19. send( )   
  20. {   
  21.     if(rfgobit==0)   
  22.     {   
  23.         switch(rfbit)   
  24.         {   
  25.         case 1 :   
  26.             RC5=0;   
  27.             break;   
  28.         case 6 :   
  29.             RC5=1;   
  30.             break;   
  31.         case 7 :   
  32.             RC5=0;   
  33.             rfgobit=1;//制发送完标制   
  34.             rfbit=0;   
  35.             break;   
  36.         default :   
  37.             break;   
  38.         }   
  39.     }   
  40.     if(rfgobit==1)   
  41.     {   
  42.         zbit=dispcount[i]&0b00000001;   
  43.         switch(rfbit)   
  44.         {   
  45.         case 1:   
  46.             RC5=1;   
  47.             break;   
  48.         case 2 :   
  49.             if(zbit==0)   
  50.             {   
  51.                 RC5=0;   
  52.                 rfbit=0;   
  53.                 rf( );   
  54.             }   
  55.             break;   
  56.         case 3 :   
  57.             if(zbit==1)   
  58.             {   
  59.                 RC5=0;   
  60.                 rfbit=0;   
  61.                 rf( );   
  62.             }   
  63.             break;   
  64.         default :   
  65.             break;   
  66.         }   
  67.     }   
  68. }   
  69. //////////////////////////////////////////////   
  70. rf( )   
  71. {   
  72.     k=k+1;   
  73.     if(k==8)   
  74.     {   
  75.         i=i+1;   
  76.         k=0;   
  77.         if(i==6)   
  78.         {   
  79.             i=1;   
  80.             rfgobit=0;   
  81.             TMR1H=0;   
  82.             TMR1L=0;   
  83.             RC5=1;   
  84.             dispcount[1]=0xaa;   
  85.             dispcount[2]=0xbb;   
  86.             dispcount[3]=0xcc;   
  87.             dispcount[4]=0xdd;   
  88.             dispcount[5]=0xee;   
  89.         }   
  90.         return;   
  91.     }   
  92.     dispcount[i]=dispcount[i]>>1;   
  93. }   
  94. //////////////////////////////////////   
  95. main( )   
  96. {   
  97.     di( );   
  98.     TRISC=0b11011111;   
  99.     TRISA=0b111111;   
  100.     TRISB=0b11111111;   
  101.     i=1;   
  102.     k=0;   
  103.     TMR1H=0b11111100;   
  104.     TMR1L=0b00010111;   
  105.     T1CON=1;   
  106.     TMR1IE=1;   
  107.     RC5=1;   
  108.     PEIE=1;   
  109.     ei( );   
  110.     dispcount[1]=0xaa;   
  111.     dispcount[2]=0xbb;   
  112.     dispcount[3]=0xcc;   
  113.     dispcount[4]=0xdd;   
  114.     dispcount[5]=0xee;   
  115.     while( 1 )   
  116.     {   
  117.         ;   
  118.     }   
  119. }  


这两个程序只是一个演示例程

在实际运用中可变通的把这种发送与接受用于两机之间的通讯(好处是移植性好,抗干扰好且一发一收只要两根线或一根线)另外如要产生载波(38KHZ)的话可用其输出口去调制38KHZ发生源(比如555电路,PWM)来得到,或干脆用软件来实现(不过难度较大;不如用带38KHZ的单片机来做)

 
相关文章:

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




 
  查看更多...  

 

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