网站导航: 首页 > 设计参考 > 正文 文章搜索
HT6222红外遥控芯片接收C程序
 
文章编号:
090106161749
文章分类: 单片机 51系列
点 击:
...
关 键 词: HT6222,红外遥控
文章来源:
网络,作者:徐文军
摘 要:
通过检测两次下降沿之间的时间差判断接受到的数据位.已经通过了测试,能够正确区分出32bit数据的遥控器按键键值.具有数据重发功能...

 
  1. /*************************************************************  
  2. 红外线遥控器按键检测程序.  
  3. 通过检测两次下降沿之间的时间差判断接受到的数据位.  
  4. 已经通过了测试,能够正确区分出32bit数据的遥控器按键键值.  
  5. 具有数据重发功能,但是数据的重发有点频繁.  
  6. 使用晶震频率为11.0592MHz,所有定时值都是基于这个频率计算.  
  7. 占用很少量的CPU时间,使用了外部中断0接受数据,定时器0进行计数,  
  8. 定时器1作为串口的波特率发生器(Band = 9600).  
  9. 主函数会使MCU进入低功耗模式,如需加入自己的代码需要屏蔽此功能.  
  10. 状态机:  
  11. 1.如果时间差=0,由空闲态进入接受态  
  12. 2.如果时间差>1ms and <1.3ms,收到数据0  
  13. 3.如果时间差>2ms and <2.5ms,收到数据1  
  14. 4.如果时间差>13.2ms and <13.8ms,收到开始位  
  15. 5.如果时间差>12.2ms and <12.8ms,收到停止位(没有检测)  
  16. 6.如果时间定时器溢出(时间差>20ms),进入空闲状态  
  17. *************************************************************/  
  18. //        本程序 可以说是状态机的典范                                       //   
  19. //        参照了网友高伟能gwnpeter@21cn.com的代码和思路,仅供学习参考       //   
  20. //        如有问题请mailto xuwenjun@21cn.com    欢迎与我交流!               //   
  21. //--------------------------------------------------------------------------//   
  22. //                                                                          //   
  23. //                    (c) Copyright 2001-2003 xuwenjun                     //   
  24. //                            All Rights Reserved                           //   
  25. //                                    V1.00                                 //   
  26. //--------------------------------------------------------------------------//   
  27. //标 题: Ir_6222遥控芯片接收程序                                           //   
  28. //文件名: ir_6222.c                                                         //   
  29. //版 本: V1.00                                                             //   
  30. //修改人: 徐文军                         E-mail:xuwenjun@21cn.com           //   
  31. //日 期: 03-06-14                                                          //   
  32. //描 述: Ir_6222遥控芯片接收程序                                           //   
  33. //--------------------------------------------------------------------------//   
  34. //老版本: 无                             老版本文件名:                      //   
  35. //创建人: 徐文军                         E-mail:xuwenjun@21cn.com           //   
  36. //日 期: 03-06-14                                                          //   
  37. //描 述: Ir_6222遥控芯片接收程序                                           //   
  38. //        当ykok=1时,ykcode中的数据就是接收到的遥控码(14位的最后8位)          //   
  39. //--------------------------------------------------------------------------//   
  40. //占用以下资源:                                                             //   
  41. //        1. 遥控使用外部中断0,接P3.2口                                     //   
  42. //        2. 遥控使用定时计数器1                                            //   
  43. //        3. 5.1字节data RAM                                                //   
  44. //        4. 293字节 code ROM                                               //   
  45. //--------------------------------------------------------------------------//   
  46. //声 明:     
  47. //   
  48. //        以下代码仅免费提供给学习用途,但引用或修改后必须在文件中声明出处. //   
  49. //        如用于商业用途请与作者联系.    E-mail:xuwenjun@21cn.com           //   
  50. //              本程序参照了网友高伟能gwnpeter@21cn.com的代码,仅供学习参考       //   
  51. //        如有问题请mailto xuwenjun@21cn.com    欢迎与我交流!               //   
  52. //--------------------------------------------------------------------------//   
  53.   
  54. #include <REG52.H>   
  55. #include "Ir_6222.h"                //  ht6222函数原型: 公用函数   
  56. //#i nclude "xwj_4led.h"                //  四位LED显示模块  //   
  57. //#i nclude    "xwj_pcf8566.h"                         //  I2C总线LCD8566函数声明    //   
  58. //#i nclude <stdio.h>   
  59. //--------------------------------------------------------------------------//   
  60.   
  61.   
  62. #define TIME_0_00MS        0x0000   
  63. #define TIME_1_00MS        0x039a   
  64. #define TIME_1_13MS        0x0480   
  65. #define TIME_2_00MS        0x0733   
  66. #define TIME_2_50MS        0x0900   
  67. #define TIME_13_2MS        0x2ecd   
  68. #define TIME_20_0MS        0x47ff   
  69. #define TIME1_LOAD         (0xffff - TIME_20_0MS)   
  70.   
  71. bit running;   
  72. long Irbuf;   
  73. unsigned char Irdat;   
  74. bit Irok;   
  75.   
  76. void IrInit(void)                                                //遥控接收初始化   
  77. {   
  78.     //-----init TIME1----   
  79.     TMOD |= 0x10;                                          //TMOD T0,T1均选用方式1(16位定时)   
  80.     TH1    = TIME1_LOAD >> 8;   
  81.     TL1    = TIME1_LOAD & 0xff;   
  82.     //        SCON=0x00;   
  83.     IP|=0x01;                                           //SETB  INT0 中断优先   
  84.     TCON |= 0x41;                                    //TCON  EX0下降沿触发,启动T1 //   
  85.     TR1    = 1;   
  86.     IE|=0x89;                                           //SETB        EX0 0x1  外部中断 0 允许   
  87.     //SETB        ET0 0x8  定时器 1 中断允许   
  88.     //SETB        EA  0x80 开中断   
  89. }   
  90.   
  91. unsigned char IrGetcode(void)                        //返回遥控码   
  92. {   
  93.     Irok=0;   
  94.     return(Irdat);   
  95. }   
  96.   
  97. bit IrTest(void)                                        //检查有无遥控信号   
  98. {   
  99.     return(Irok);   
  100. }   
  101.   
  102. void int0_isr(void) interrupt 0        //遥控使用外部中断0,接P3.2口   
  103. {   
  104.     unsigned int timer;    
  105.        
  106.     TR1 = 0;   
  107.     timer = ((TH1 << 8) | TL1) - TIME1_LOAD;   
  108.     TH1 = TIME1_LOAD >> 8;   
  109.     TL1 = TIME1_LOAD & 0xff;   
  110.     TR1 = 1;   
  111.        
  112.     if (timer > TIME_1_00MS && timer < TIME_1_13MS)    //data 0   
  113.         Irbuf = (Irbuf << 1) & 0xfffffffe;   
  114.     else if (timer > TIME_2_00MS && timer < TIME_2_50MS)    //data 1   
  115.         Irbuf = (Irbuf << 1) | 0x00000001;   
  116.     else if (timer == TIME_0_00MS || timer > TIME_13_2MS)   
  117.         Irbuf = 0x0000;   
  118.     running = 1;   
  119. }   
  120.   
  121. void time1_isr(void) interrupt 3        //遥控使用定时计数器1   
  122. {   
  123.     //    EA = 0;   
  124.     //    TR1 = 0;   
  125.     TH1 = TIME1_LOAD >> 8;   
  126.     TL1 = TIME1_LOAD & 0xff;   
  127.     //    if    ((((Irbuf >> 24) & 0xff) == (~((Irbuf >> 16)) & 0xff)) &&(((Irbuf >> 8) & 0xff) == (~((Irbuf >> 0)) & 0xff)))   
  128.     if (((Irbuf >> 8) & 0xff) == ((~(Irbuf >> 0)) & 0xff))   
  129.     {   
  130.         Irdat = (Irbuf>>8) & 0xff;   
  131.         Irok = 1;   
  132.         //        pcf8566_showhh(Irdat);   
  133.     }   
  134.     else if (Irbuf == 0x00 && Irok == 1)   
  135.         ;   
  136.     //        pcf8566_showhh(Irdat);   
  137.     else  
  138.         Irok = 0;   
  139.     //    IE0 = 0;   
  140.     //    EA = 1;   
  141.     running = 0;   
  142. }   
  143.   
  144. /*  
  145. //  HT6222测试主函数内容  
  146. main()  
  147. {  
  148.     IrInit();  
  149.     led_test();                                        //4LED测试函数  
  150.     for(;1;)                                                //主程序  
  151.     {  
  152.         if (IrTest())  
  153.         led_showhh(IrGetcode());  
  154.         led_delay(10);  
  155.     }  
  156. }  
  157.  
  158. */  
  159.   

 

 
相关文章:

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




 
  查看更多...  

 

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