微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 发一个遥控器解码程序(C51)

发一个遥控器解码程序(C51)

时间:10-02 整理:3721RD 点击:
相关常数定义:

  1. typedef bit                            BOOL;

  2. typedef unsigned char         BYTE;



  3. #define EX0INT_BANK         1

  4. #define TIMER1_BANK        2



  5. #define EX0INT                    0

  6. #define T1INT                      3



  7. 遥控器系统码(有人也叫它用户码)

  8. #define IR_ADDR_LOW        0x08

  9. #define IR_ADDR_HIGH       0xF7



  10. #define IR_STEP_NEW_CODE   0

  11. #define IR_STEP_LEAD_CODE  1

  12. #define IR_STEP_ADDR_LO      2

  13. #define IR_STEP_ADDR_HI        3

  14. #define IR_STEP_CODE_NOR   4

  15. #define IR_STEP_CODE_INV     5

  16. #define IR_STEP_MAX               6



  17. #define IR11MS0            110         //Repeat

  18. #define IR11MS5            115         //

  19. #define IR13MS0            130         //Start

  20. #define IR14MS0            140         //

  21. #define IR0MS90            9           //bit 0

  22. #define IR1MS40            14          //

  23. #define IR2MS00            20          //bit 1

  24. #define IR2MS50            25          //



  25. 变量定义:

  26. BOOL fgIrKeyExist;        //为真表示接收到了一个键码



  27. BYTE bIrCounter;          //遥控中断间隔计时

  28. BYTE bIrStatus;            //遥控接收状态

  29. BYTE bIrBitCounter;     //接收bit计数

  30. BYTE bIrData;              //接收到的键扫描码

  31. BYTE bIrBuffer;           //接收到的键扫描码保存值

  32. BYTE bRemoteKey;   //按键码



  33. 就两个函数:

  34. 一为timer1计时,周期为100us

  35. void Timer1( ) interrupt T1INT using TIMER1_BANK

  36. {

  37.    bIrCounter++;

  38. }



  39. 二为Int0中断函数,下降沿有效,解码过程就在这里完成

  40. void Exint0() interrupt EX0INT using EX0INT_BANK

  41. {

  42.   BOOL fgGetBit = FALSE;

  43.   BYTE bTimer;



  44.   bTimer = bIrCounter;

  45.   bIrCounter = 0;



  46.   switch(bIrStatus)

  47.   {

  48.    case IR_STEP_NEW_CODE:

  49.      bIrStatus = IR_STEP_LEAD_CODE;

  50.      break;

  51.    case IR_STEP_LEAD_CODE:

  52.      if((bTimer > IR13MS0)&&(bTimer < IR14MS0))

  53.      {

  54.        bIrBitCounter = 0;

  55.        bIrData = 0;

  56.        bIrBuffer = 0;

  57.        bIrStatus = IR_STEP_ADDR_LO;

  58.      }

  59.      else if((bTimer > IR11MS0)&&(bTimer < IR11MS5))  //连发状态

  60.      {

  61.        bIrBitCounter--;

  62.        if(bIrBitCounter == 0)

  63.        {

  64.          fgIrKeyExist = TRUE;

  65.          bIrBitCounter = IR_REPEAT_CYCLE;

  66.        }

  67.        bIrStatus = IR_STEP_NEW_CODE;

  68.      }

  69.      else

  70.      {

  71.        bIrStatus = IR_STEP_NEW_CODE;

  72.      }

  73.      break;

  74.    case IR_STEP_ADDR_LO:

  75.    case IR_STEP_ADDR_HI:

  76.    case IR_STEP_CODE_NOR:

  77.    case IR_STEP_CODE_INV:

  78.      bIrData >>= 1;

  79.      if((bTimer > IR2MS00)&&(bTimer < IR2MS50))

  80.      {

  81.        fgGetBit = TRUE;

  82.        bIrData |= 0x80;

  83.      }

  84.      else if((bTimer > IR0MS90)&&(bTimer < IR1MS40))

  85.      {

  86.        fgGetBit = TRUE;

  87.      }

  88.      else

  89.      {

  90.        bIrStatus = IR_STEP_NEW_CODE;

  91.      }

  92.      if(fgGetBit == TRUE)    //fgGetBit 为真,表示接收到了一个bit

  93.      {

  94.        bIrBitCounter++;

  95.        if(bIrBitCounter == 8)  //接收满8个bit了

  96.        {

  97.          bIrBitCounter = 0;

  98.          if(bIrStatus == IR_STEP_ADDR_LO)  //检查系统码

  99.          {

  100.            if(bIrData == IR_ADDR_LOW)

  101.              bIrStatus = IR_STEP_ADDR_HI;

  102.            else

  103.              bIrStatus = IR_STEP_NEW_CODE;

  104.          }

  105.          else if(bIrStatus == IR_STEP_ADDR_HI)  //检查系统码

  106.          {

  107.            if(bIrData == IR_ADDR_HIGH)

  108.              bIrStatus = IR_STEP_CODE_NOR;

  109.            else

  110.              bIrStatus = IR_STEP_NEW_CODE;

  111.          }

  112.          else if(bIrStatus == IR_STEP_CODE_NOR)

  113.          {

  114.            bIrBuffer = bIrData;                                       //保存起来,为下一步的比较做准备

  115.            bIrStatus = IR_STEP_CODE_INV;

  116.          }

  117.          else if(bIrStatus == IR_STEP_CODE_INV)

  118.          {

  119.            bIrData ^= 0xff;

  120.            if(bIrData == bIrBuffer)                                    //检查正码与反码是否对应

  121.            {

  122.                fgIrKeyExist = TRUE;                                  //正确接收到了按键扫描码

  123.                bRemoteKey = pbRemoteTable[bIrData];  //根据扫描码查表得到按键码,pbRemoteTable为你的键码表格

  124.                bIrBitCounter = IR_REPEAT_ACTIVE;

  125.            }

  126.            bIrStatus = IR_STEP_NEW_CODE; //为接收连发码做准备

  127.          }

  128.        }

  129.      }

  130.      break;

  131.    default:

  132.      bIrStatus = IR_STEP_NEW_CODE;

  133.      break;

  134.   }

  135. }

复制代码


恩,正需要这个,不过我是把相关图纸一同发出对新手是更有帮助的!

好的

东西呢

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top