单片机发送红外遥控码

来源:互联网 发布:曹方 知乎 编辑:程序博客网 时间:2024/04/29 22:21

    前不久,要用单片机做一个发送红外遥控码的程序,以前只搞硬件,第一次作软件,不知所以然,想到网上参考一下,结果找来找去总是那么一个,还是用汇编写的,看了很久不知讲些什么,只好自己写了。在此给像我一样的新手一个参考,分享一下。

    这个程序主要是用单片机来控制数码相框(或广告机),利用人体红外探头检测是否有人移动,然后根据用记所选择的模式来控制数码相框(或广告机)的工作状态。

    代码如下:

    以下是头文件:

  1. //
  2. //
  3. // this header file is programmed by hdl ,
  4. // maybe there are something that is not correct ,
  5. // please connect me when come accross problem ,
  6. // e_mail:de_12@163.com
  7. //
  8. //
  9. // the following is header file
  10. //
  11. // if you use any other [single chip computer] or [PIC] ,
  12. // please change this header file only , you don not hava to 
  13. // change the [C] file
  14. //
  15. // programmed on 2008 - 08 - 29
  16. //
  17. // single chip computer [holtek ht48f06e] , web site : http://www.holtek.com.tw ; http://www.holtek.com.cn
  18. //
  19. //
  20. #ifndef haodl_h_file                    
  21. #define haodl_h_file                    
  22. #ifndef hdl_inlcude_ht48f06e
  23.     #include "ht48f06e.h"                                           
  24.     #define hdl_inlcude_ht48f06e
  25.     #define single_chip_is_ht48f06e 1
  26.     #define __mod_can_change_by_key__                                   
  27. #endif
  28. #ifdef __mod_can_change_by_key__
  29.     #define keychange 0
  30.     #define plugchange 1
  31. #endif
  32. typedef enum
  33. {
  34.     false,
  35.     true
  36. }
  37. BOOL;
  38. typedef enum
  39. {
  40.     irMute,
  41.     irTurnOffBK,
  42.     irMutePause
  43. }
  44. CONMODE;
  45. typedef unsigned short BYTE;
  46. #define pac _pac
  47. #define pbc _pbc
  48. #define pcc _pcc
  49. #define pa _pa
  50. #define pb _pb
  51. #define pc _pc
  52. #define pa0 _pa0
  53. #define pa1 _pa1
  54. #define pa2 _pa2
  55. #define pa3 _pa3
  56. #define pa4 _pa4
  57. #define pa5 _pa5
  58. #define pa6 _pa6
  59. #define pa7 _pa7
  60. #define pb2 _pb2
  61. #define pb1 _pb1
  62. #define pb0 _pb0
  63. #define tmrc _tmrc
  64. #define intc _intc
  65. #define sysDelay _delay
  66. #define powerOffBk() {pause();/
  67.                         pa1=1;}
  68.                     
  69. #define powerOnBk() {pa1=0;/
  70.                         pause();}
  71.                     
  72. void powerOnIni();
  73. void IR(BYTE);
  74. #define mute() IR(0x04)
  75. #define muteOff mute
  76. #define muteOn mute
  77. #define pause() IR(0x1F)
  78.                         
  79. #define delay(t) {for (a=1;a<=t;a++)/
  80.                     sysDelay(10000);}
  81.                     
  82. #define muteAndPause pause
  83. void delay1s();
  84. #define __hdl main
  85. #endif

       以下是C文件:

  1. #include "hdl_d.h"
  2. /********** function **********
  3. ------- function name : powerOnIni 
  4. ------- function : initiate the status of ht48f06e 
  5. ------- author : hdl 
  6. ------- programmed date : 2008 - 08 - 29 
  7. *******************************/
  8. /*
  9. ********* please modify any variable of this function *********
  10. ********* when you need ***************************************
  11. */
  12. void powerOnIni()
  13. {
  14.     tmrc = 0;
  15.     intc = 0;
  16.     pac = 9;
  17.     pbc = 6;
  18.     pcc = 0;
  19.     pa1 = 0;
  20.     pa2 = 1;
  21. }
  22. /*
  23. // this file is programmed by hdl ,
  24. // please connect me when come accross problem ,
  25. // e_mail:de_12@163.com
  26. */
  27. /***************************** NOTICE : ************************
  28. *********** please change time your ir has to delay ************
  29. ***********   and the ir leader code , custom code  ************
  30. ****************************************************************/
  31. /********** function **********
  32. ------- function name : IR
  33. ------- function : generate ir serial code 
  34. ------- author : hdl 
  35. ------- programmed date : 2008 - 08 - 29 
  36. *******************************/
  37. void IR(BYTE irCode)
  38. {
  39.     BYTE dataCode;
  40.     BYTE i;
  41.     
  42.     if (irCode == 0)
  43.         return;     
  44.     
  45.     /***** this variable is not required ****/
  46.     dataCode = irCode;
  47.     
  48.     /**** the start of leader code ****/
  49.     
  50.     pa2 = 0;
  51.     sysDelay(9000);
  52.     pa2 = 1;
  53.     sysDelay(4500);
  54.     
  55.     /**** the end of leader code ****/
  56.     
  57.     /**** start of custom code ****/
  58.     
  59.     for (i=0;i<8;i++)
  60.     {
  61.         pa2 = 1;
  62.         sysDelay(560);
  63.         pa2 = 0;
  64.         sysDelay(565);      
  65.     }
  66.     
  67.     for (i=0;i<8;i++)
  68.     {
  69.         pa2 = 1;
  70.         sysDelay(560);
  71.         pa2 = 0;
  72.         sysDelay(1690);     
  73.     }
  74.     
  75.     /**** end of custom code ****/
  76.     
  77.     /**** start of data code ****/
  78.     
  79.     for (i=0;i<8;i++)
  80.     {
  81.         if ((dataCode>>i)&0x01) 
  82.         {
  83.             pa2 = 1;
  84.             sysDelay(560);  
  85.             pa2 = 0;
  86.             sysDelay(1690);
  87.         }           
  88.         else
  89.         {
  90.             pa2 = 1;
  91.             sysDelay(560);
  92.             pa2 = 0;
  93.             sysDelay(565);
  94.         }           
  95.     }
  96.     
  97.     for (i=0;i<8;i++)
  98.     {
  99.         if ((dataCode>>i)&0x01)
  100.         {
  101.             pa2 = 1;
  102.             sysDelay(560);
  103.             pa2 = 0;
  104.             sysDelay(565);
  105.         }   
  106.         else
  107.         {
  108.             pa2 = 1;
  109.             sysDelay(560);
  110.             pa2 = 0;
  111.             sysDelay(1690);
  112.         }           
  113.     }
  114.     
  115.     /**** end of data code ****/
  116.     
  117.     /**** other code starts ****/
  118.     /**** different ir may have different code ****/
  119.     /**** this code is not required ****/
  120.     
  121.     pa2 = 1;
  122.     
  123.     for (i=0;i<2;i++)
  124.         sysDelay(30000);
  125.     sysDelay(7500);
  126.     
  127.     pa2 = 0;
  128.     sysDelay(9000);
  129.     pa2 = 1;
  130.     sysDelay(2250);
  131.     pa2 = 0;
  132.     sysDelay(560);
  133.     pa2 = 1;
  134.     
  135.     /**** other code ends ****/
  136.     
  137.     irCode = 0;
  138. }
  139. /********** function **********
  140. ------- function name : delay1s
  141. ------- function : delay one minute
  142. ------- author : hdl 
  143. ------- programmed date : 2008 - 08 - 29 
  144. *******************************/
  145. void delay1s()
  146. {
  147.     BYTE a;
  148.     delay(100);
  149. }

    程序注释应是很清楚了,从中可以看到IR码的发送函数IR(BYTE);正是通过此函数发送的IR码。主函数是用来切换工作模式的,您可以试着编写一下,这里不再给出了。

    如果有什么问题,与我联系。

    E-mail : de_12@163.com。

原创粉丝点击