网站导航: 首页 > 设计参考 > 正文 文章搜索
C51红外遥控解码程序
 
文章编号:
090106101633
文章分类: 单片机 51系列
点 击:
...
关 键 词: 红外遥控
文章来源:
网络,作者:大炮
摘 要:
本keil c51程序适用uPC1621/uPC1622及兼容的红外遥控器芯片,占用外部中断0和定时器1,以中断方式解码,节省系统资源,以查询方式检测遥控信号是否有效

    本keil c51程序适用uPC1621/uPC1622及兼容的红外遥控器芯片,占用外部中断0和定时器1,以中断方式解码,节省系统资源,以查询方式检测遥控信号是否有效.

解码思路:
    红外线经一体化接受头解码放到后送到单片机的外部中断0,单片机设置外部中断下降沿触发,T0和T1为16位定时器,T0在系统启动后定时5ms.T1在外部中断0启动后开始定时,初值为0,每次在INT0中断后先读T1计数值,并重设初值为0,而且判断T1的计数值,

 
 
  1. //Fosc=11.0592MHz       
  2. // states for and variables IR data processing ;       
  3. typedef enum  
  4. {        
  5.     IR_idle,        
  6.     IR_waitstart,                 
  7.     IR_getaddr,                 
  8.     IR_getaddrinv,                 
  9.     IR_getdata,                 
  10.     IR_getdatainv                 
  11. }_IRstate;                      
  12.   
  13. _IRstate IRstate = IR_idle;       
  14.   
  15. unsigned char IRaddr=0xff;       
  16. unsigned char _IRaddr=0xff;       
  17. unsigned char IRdata=0xff;       
  18. unsigned char _IRdata=0xff;       
  19. unsigned char IR_repeat=0;       
  20. unsigned char IR_ready=0;       
  21. unsigned char  IR_poweron=0;       
  22. //bit ir_done=0;       
  23. // time constants       
  24. unsigned int IRtimer=0; // IR timeout        
  25.   
  26. //cpu初始化       
  27. void cpu_init(void)       
  28. {       
  29.     TMOD=0X11; // T0 and T1 十六位定时                       
  30.     TH0=0xee;  //fosc=11.0592M,timer=5ms       
  31.     TL0=0x00;        
  32.     TR0=1; // run timer 0;       
  33.     TF0=0;       
  34.        
  35.     ET0=1;  // enable tmr 0 overflow interrupt       
  36.     IT0=1; // int0 edge sensitive       
  37.     EX0=1; //  enable "int0"       
  38.     EA=1;   // global interupt enable        
  39. }       
  40.   
  41. //T0中断       
  42. void tmrint() interrupt 1       
  43. {       
  44.     TH0=0xee;       
  45.     TL0=0x00;        
  46.     if (IRtimer)     //IR接收超时       
  47.         --IRtimer; //        
  48.     else      
  49.     {       
  50.         IRstate=IR_idle;       
  51.         //        IR_poweron=0;       
  52.     }       
  53. }       
  54.   
  55. //Fosc=11.0592MHz       
  56. #define msec_12p5  0x2d00       
  57. #define msec_15  0x3600       
  58. #define msec_9  0x2066       
  59. //#define msec_9  0x1066       
  60. #define msec_2p5  0x900       
  61. #define msec_0p9  0x33d       
  62. #define msec_1p68  0x610       
  63.   
  64.   
  65. //void IRint() interrupt 0(void)       
  66.   
  67. //When the IR receive pin goes low and interrupt is generated        
  68. // IR is collected by starting timer 2 in the first falling edge of the pin       
  69. // then on every other falling edge, the timer value is saved and the timer restarted .         
  70. // the captured time is then used to get the IR data        
  71. // a "start of data" is 13.5Msec,a "1" is 2.25Msec,a "0" is 1.12 msec and a "repeat" is 11.25msec.       
  72. // the counter increments at 1.085 Usec       
  73. // I allow a fairly large tolerance to time jitter but there are no false triggers seen.       
  74.   
  75. void IRint() interrupt 0       
  76. {       
  77.     static unsigned char bits;       
  78.     unsigned short time;       
  79.     switch(IRstate)       
  80.     {       
  81.     case IR_idle:       
  82.         TL1=0;       
  83.         TH1=0;       
  84.         TR1=1;       
  85.         IRstate=IR_waitstart;       
  86.         IRtimer=26;       
  87.         break;       
  88.     case IR_waitstart: //P2_4=!P2_4;       
  89.         TR1=0;       
  90.         time=TH1;       
  91.         time =(time <<8)+TL1;;       
  92.         TL1=0;       
  93.         TH1=0;       
  94.         TR1=1;       
  95.         if ((time > msec_12p5)&&(time < msec_15)) // greater than 12.5Msec & less than 15 msec = start code        
  96.         {           
  97.             IRaddr=0;       
  98.             _IRaddr=0;       
  99.             IRdata=0;       
  100.             _IRdata=0;       
  101.             bits=1;       
  102.             IRstate=IR_getaddr;       
  103.         }       
  104.         else if ((time > msec_9)&&(time <  msec_12p5))// less than 12.5Msec  and greater than 9 msec =Repeat code        
  105.         {            
  106.             IR_repeat=2;       
  107.             IRstate=IR_idle;       
  108.         }       
  109.         else        
  110.         {           // to short, bad data just go to idle        
  111.             IRstate=IR_idle;                       
  112.         }                       
  113.         break;       
  114.     case IR_getaddr:    // P2_4=!P2_4;       
  115.         TR1=0;       
  116.         time=TH1;       
  117.         time =(time <<8)+TL1;;       
  118.         TL1=0;       
  119.         TH1=0;       
  120.         TR1=1;       
  121.         if ((time>msec_2p5)||(time<msec_0p9))// if  > 2.5msec or shorter than .9Msec bad data , go to idle        
  122.         {          
  123.             IRstate=IR_idle;       
  124.             break;        
  125.         }       
  126.         if (time>msec_1p68)// greater than 1.68Msec is a 1       
  127.         {             
  128.             IRaddr|= bits;       
  129.         }       
  130.         bits=bits<<1;       
  131.         if (!bits)       
  132.         {       
  133.             IRstate=IR_getaddrinv;                       
  134.             bits=1;       
  135.         }       
  136.         break;                     
  137.     case IR_getaddrinv:  //P2_4=!P2_4;       
  138.         TR1=0;       
  139.         time=TH1;       
  140.         time =(time <<8)+TL1;;       
  141.         TL1=0;       
  142.         TH1=0;       
  143.         TR1=1;       
  144.         if ((time>msec_2p5)||(time<msec_0p9))// if  > 2.5msec or shorter than .9Msec bad data , go to idle        
  145.         {          
  146.             IRstate=IR_idle;       
  147.             break;        
  148.         }       
  149.         if (time>msec_1p68)// greater than 1.68Msec is a 1        
  150.         {            
  151.             _IRaddr|= bits;       
  152.         }       
  153.         bits=bits<<1;       
  154.         if (!bits)       
  155.         {       
  156.             IRstate=IR_getdata;;                       
  157.             bits=1;       
  158.         }       
  159.         break;                     
  160.     case IR_getdata:       
  161.         TR1=0;       
  162.         time=TH1;       
  163.         time =(time <<8)+TL1;;       
  164.         TL1=0;       
  165.         TH1=0;       
  166.         TR1=1;       
  167.         if ((time>msec_2p5)||(time<msec_0p9))// if  > 2.5msec or shorter than .9Msec bad data , go to idle       
  168.         {           
  169.             IRstate=IR_idle;       
  170.             break;        
  171.         }       
  172.         if (time>msec_1p68)// greater than 1.68Msec is a 1       
  173.         {             
  174.             IRdata|= bits;       
  175.         }       
  176.         bits=bits<<1;       
  177.         if (!bits)       
  178.         {       
  179.             IRstate=IR_getdatainv;                       
  180.             bits=1;       
  181.         }       
  182.         break;                     
  183.     case IR_getdatainv:       
  184.         TR1=0;       
  185.         time=TH1;       
  186.         time =(time <<8)+TL1;;       
  187.         TL1=0;       
  188.         TH1=0;       
  189.         TR1=1;       
  190.         if ((time>msec_2p5)||(time<msec_0p9)) // if  > 2.5msec or shorter than .9Msec bad data , go to idle        
  191.         {          
  192.             IRstate=IR_idle;       
  193.             break;        
  194.         }       
  195.         if (time>msec_1p68)// greater than 1.68Msec is a 1        
  196.         {            
  197.             _IRdata|= bits;       
  198.         }       
  199.         bits=bits<<1;       
  200.         if (!bits)         // we have it all , now we make sure it is a NEC code from the CHS IR transmitter       
  201.         {                   // make sure address,~address are correct , data ,~data are correct and address is 0.       
  202.             IR_ready=((IRaddr^_IRaddr)==0xff)&&((IRdata^_IRdata)==0xff)&&(IRaddr==0);       
  203.             if(IR_ready)       
  204.             {       
  205.                 IRstate=IR_idle;       
  206.             }           
  207.         }       
  208.         break;                     
  209.     default:       
  210.         IRstate=IR_idle;       
  211.         break;       
  212.     }       
  213. }       
  214.   
  215. void main(void)       
  216. {       
  217.     cpu_init();       
  218.     while(1)       
  219.     {       
  220.         if(IR_ready)       
  221.         {       
  222.             IR_ready=0;       
  223.             switch(IRdata)       
  224.             {       
  225.             case 0x45:        //1       
  226.                 //your code       
  227.                 break;       
  228.             case 0x44:        //3       
  229.                 //your code       
  230.                 break;       
  231.             case 0x43:       //4       
  232.                 //your code       
  233.                 break;       
  234.             case 0x08:        //prev       
  235.                 //your code       
  236.                 break;       
  237.             case 0x5a:        //next       
  238.                 //your code       
  239.                 break;       
  240.             default:       
  241.                 break;       
  242.             }       
  243.         }       
  244.     }       
  245. }       
 
相关文章:

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




 
  查看更多...  

 

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