网站导航: 首页 > 设计参考 > 正文 文章搜索
SAA3010红外遥控接收Keil C程序
 
文章编号:
090106160829
文章分类: 单片机 51系列
点 击:
...
关 键 词: SAA3010,红外遥控
文章来源:
网络
摘 要:

 
  1. //  用单片机进行红外遥控接收已经是很平常的应用了,基本上稍懂单片机就可以自己编//   
  2. //  但往往很多人编的程序要么繁琐,要么占用大量存储器、CPU资源,               //   
  3. //  而且用于现场时还可能因为受到干扰而不能正常工作                            //   
  4. //  真正试过的都会发现,要想编个真正好用的接收程序不是那么简单的              //   
  5.   
  6. //  其实,所有遥控芯片的编码都是比较简单的(有限的状态),只要仔细分析它的编码//   
  7. //  我们完全可以用状态机的方式来处理各种可能的情况,甚至从被干扰的杂乱波形中找//   
  8. //  出正确的编码                                                            //   
  9. //  下面是基于状态机的SAA3010红外遥控接收程序示例:                         //   
  10. //--------------------------------------------------------------------------//   
  11. //                                                                          //   
  12. //                    (c) Copyright 2001-2003 xuwenjun                     //   
  13. //                            All Rights Reserved                           //   
  14. //                                    V1.00                                 //   
  15. //--------------------------------------------------------------------------//   
  16. //标 题: SAA3010遥控芯片接收程序                                           //   
  17. //文件名: ir_3010.c                                                         //   
  18. //版 本: V1.00                                                             //   
  19. //修改人: xuwenjun                         E-mail:xuwenjun@21cn.com         //   
  20. //日 期: 03-06-14                                                          //   
  21. //描 述: SAA3010遥控芯片接收程序                                           //   
  22. //--------------------------------------------------------------------------//   
  23. //老版本: 无                             老版本文件名:                      //   
  24. //创建人: xuwenjun                         E-mail:xuwenjun@21cn.com         //   
  25. //日 期: 03-06-14                                                          //   
  26. //描 述: SAA3010遥控芯片接收程序                                           //   
  27. //        当ykok=1时,ykcode中的数据就是接收到的遥控码(14位的最后8位)        //   
  28. //--------------------------------------------------------------------------//   
  29. //占用以下资源:                                                             //   
  30. //        1. 遥控使用外部中断0,接P3.2口                                     //   
  31. //        2. 遥控使用定时计数器1                                            //   
  32. //        3. 5.1字节data RAM                                                //   
  33. //        4. 293字节 code ROM                                               //   
  34. //--------------------------------------------------------------------------//   
  35. //声 明:                                                                   //   
  36. //        以下代码仅免费提供给学习用途,但引用或修改后必须在文件中声明出处. //   
  37. //        如用于商业用途请与作者联系.    E-mail:xuwenjun@21cn.com           //   
  38. //        有问题请mailto xuwenjun@21cn.com   欢迎与我交流!                  //   
  39. //--------------------------------------------------------------------------//   
  40.   
  41. #include <reg52.h>   
  42. #define uchar unsigned char   
  43.   
  44. //  SAA3010存储定义   
  45. uchar ykcode;                                    //遥控码(14位的最后8位)   
  46. bit ykok;                                        //遥控数据有效标志   
  47.   
  48. uchar ykbnum;                                    //遥控已接收位数   
  49. uchar ykbtc;                                     //遥控中断时 ykbtc=TH1   
  50. uchar ykdelay;                                   //遥控延时接收   
  51. bdata uchar ykcodetemp;                          //遥控临时码   
  52. sbit ykcodetemp0=ykcodetemp^0;   
  53.   
  54.   
  55. //  SAA3010端口定义   
  56. //sbit YKIO=P3^3;                                //遥控使用外部中断0,接P3.2口   
  57.   
  58. //  SAA3010函数原型: 公用函数   
  59. void YkInit(void);                               //遥控接收初始化   
  60. unsigned char YkGetcode(void);                   //返回遥控码   
  61. bit YkTest(void);                                //检查有无遥控信号   
  62.   
  63. /*  
  64.                                                 //  SAA3010函数原型: 公用函数  
  65. extern void YkInit(void);                       //遥控接收初始化  
  66. extern unsigned char YkGetcode(void);           //返回遥控码  
  67. extern bit YkTest(void);                        //检查有无遥控信号  
  68. */  
  69.   
  70. /*  
  71. //  外部引用四位LED显示模块  //  
  72. extern unsigned char code tab_duam[];           //位映射  
  73. extern void led_send(unsigned char d);          //发送子程序  
  74. extern void led_cls(void);                      //清除显示  
  75. extern void led_show(unsigned int n);           //显示数字子程序  
  76. extern void led_showhh(unsigned int n);         //16进制显示数字子程序  
  77. extern void led_test(void);                     //4LED测试函数  
  78. extern void led_delay(unsigned char  ms);       //延迟函数   
  79. */  
  80.   
  81. //  SAA3010函数内容   
  82. void YkInit(void)                              //遥控接收初始化   
  83. {   
  84.     TMOD=0x11;                                 //TMOD T0,T1均选用方式1(16位定时)   
  85.     SCON=0x00;   
  86.     TH1=0;   
  87.     TL1=0;   
  88.     IE|=0x89;                                 //SETB        EX0 0x1  外部中断 0 允许   
  89.     //SETB        ET0 0x8  定时器 1 中断允许   
  90.     //SETB        EA  0x80 开中断   
  91.     IP|=0x01;                                 //SETB  INT0 中断优先   
  92.     TCON |= 0x41;                             //TCON  EX0下降沿触发,启动T1 //   
  93.     ykbnum=0;   
  94.     ykcodetemp=0;   
  95.     ykdelay=0;   
  96.        
  97. }   
  98.   
  99. unsigned char YkGetcode(void)                //返回遥控码   
  100. {   
  101.     return(ykcode);   
  102. }   
  103.   
  104. bit YkTest(void)                             //检查有无遥控信号   
  105. {   
  106.     return(ykok);   
  107. }   
  108.   
  109. void intx0() interrupt 0 using 2            //遥控使用外部中断0,接P3.2口   
  110. {   
  111.     ykbtc=TH1;TH1=0;TL1=0;TR1=1;ET1=1;   
  112.     switch(ykbnum)   
  113.     {   
  114.     case(0):   
  115.         ykbnum=1;   
  116.         break;   
  117.     case(1):   
  118.         if(ykbtc==6)   
  119.             ykbnum=2;   
  120.         else    
  121.             ykbnum=0;   
  122.         break;   
  123.     case(2):   
  124.         if(ykbtc==6||ykbtc==9)ykbnum=3;   
  125.         else ykbnum=0;    
  126.         break;   
  127.     case(3):   
  128.         if(ykbtc==9||ykbtc==6)   
  129.         {   
  130.             ykbnum=4;   
  131.         }   
  132.         else ykbnum=0;   
  133.         break;   
  134.     default:   
  135.         if(ykbnum<7)   
  136.         {   
  137.             if(ykbtc==6)   
  138.                 ykbnum++;          
  139.             else           
  140.                 ykbnum=0;   
  141.         }   
  142.         else    
  143.         {   
  144.             if(ykbtc==6)   
  145.             {   
  146.                 if(ykcodetemp0)   
  147.                     ykcodetemp=ykcodetemp*2+1;   
  148.                 else    
  149.                     ykcodetemp=ykcodetemp*2;   
  150.                 ykbnum++;   
  151.             }   
  152.             else if(ykbtc==9)   
  153.             {           
  154.                 if(ykcodetemp0)   
  155.                 {   
  156.                     ykbnum++;ykcodetemp=ykcodetemp*2;   
  157.                 }     
  158.                 else    
  159.                 {   
  160.                     ykbnum+=2;   
  161.                     ykcodetemp=ykcodetemp*2;   
  162.                     ykcodetemp=ykcodetemp*2+1;   
  163.                 }   
  164.             }   
  165.             else if(ykbtc>11&&ykbtc<15)   
  166.             {   
  167.                 ykbnum+=2;   
  168.                 ykcodetemp=ykcodetemp*2;   
  169.                 ykcodetemp=ykcodetemp*2+1;   
  170.             }   
  171.             else if(ykbtc>30)   
  172.             {   
  173.                 EX0=1;   
  174.             }   
  175.             else    
  176.             {   
  177.                 ykbnum=0;    
  178.             }   
  179.         }   
  180.     }   
  181. }     
  182.   
  183. void intt1() interrupt 3 using 3        //遥控使用定时计数器1   
  184. {   
  185.     if(ykdelay)   
  186.     {   
  187.         ykdelay--;   
  188.         EX0=0;   
  189.     }        //ykdelay不为0暂停接收   
  190.     else  
  191.     {   
  192.         if(ykbnum==13)                 //遥控码最后一位为0,补0   
  193.         {   
  194.             ykcode=ykcodetemp*=2;   
  195.             ykdelay=3;   
  196.             EX0=0;                     //暂停接收   
  197.             ykok=1;                    //遥控数据有效   
  198.         }   
  199.         else if(ykbnum==14)            //遥控码最后一位为1,不用补   
  200.         {   
  201.             ykcode=ykcodetemp;   
  202.             ykdelay=3;   
  203.             EX0=0;                     //暂停接收   
  204.             ykok=1;                    //遥控数据有效   
  205.         }   
  206.         else  
  207.         {   
  208.             EX0=1;                     //ykbnum不为13,14接收无效,继续接收   
  209.         }   
  210.         ykbnum=0;   
  211.         ykcodetemp=0;   
  212.     }   
  213. }   
  214.   
  215. /*  
  216. //  SAA3010测试主函数内容  
  217. main()  
  218. {  
  219.     YkInit();  
  220.     led_test();                        //4LED测试函数  
  221.     for(;1;)                           //主程序  
  222.     {  
  223.         if (YkTest())  
  224.         led_showhh(YkGetcode());  
  225.         led_delay(10);  
  226.     }  
  227. }  
  228. */  
  229.   
  230. //太晚了,详细解释另文畅叙,大家可以先研究下哦    
  231.   

 

 
相关文章:

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




 
  查看更多...  

 

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