⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ir.lst

📁 这是我在学习红外遥控接收时写的代码
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.00  IR                                                                     08/21/2006 21:45:38 PAGE 1   


C51 COMPILER V7.00, COMPILATION OF MODULE IR
OBJECT MODULE PLACED IN ir.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ir.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #ifndef _IR_C
   2          #define _IR_C
   3          
   4          
   5          /*****************************说明*****************************************
   6                  该红外线接收代码是针对红外线遥控器设计的,在使用中请根据具体的红外线感应
   7                   器的说明修改。
   8          
   9          */
  10          
  11          
  12          #include <stdio.h>
  13          #include <REG768.H> /*Philips 87LPC768 寄存器定义头文件*/
  14          #include "ir.h"
  15          
  16          
  17          #define REDINT 0x06 /*红外线间隔*/
  18          
  19          /*存放消息标志的可位寻址字节Message,Message=NULL 时无任消息*/
  20          unsigned char bdata Message;
  21          
  22          /*在接收过程中置位,检测标置位Get 可以有效防止其它进程干扰接收,防止数据丢失.*/
  23          sbit RedMsg=Message^0; /*红外遥控消息*/
  24          sbit RedRead=Message^1; /*位接收过程标志*/
  25          sbit RedBit =Message^2; /*接收到的位值*/
  26          sbit RSend =Message^3; /*红外接收中重新发送标志*/
  27          
  28          /*存放遥控的字数据,低4 位存放接收到的bit 的位移,高12 位从低到高存放接收到的bit*/
  29          unsigned char bdata RedDataL,RedDataH;
  30          
  31          /*RedDataH 字节低6 位代表指令只有一个1 C1-C3 是用户码H 表示连续S1 S2 分别表示第一二组单发*/
  32          sbit RedData0=RedDataL^4; /*C1*/
  33          sbit RedData1=RedDataL^5; /*C2*/
  34          sbit RedData2=RedDataL^6; /*C3*/
  35          sbit RedData3=RedDataL^7; /*H*/
  36          sbit RedData11=RedDataH^0; /*D6*/
  37          sbit RedData10=RedDataH^1; /*D5*/
  38          sbit RedData9=RedDataH^2; /*D4*/
  39          sbit RedData8=RedDataH^3; /*D3*/
  40          sbit RedData7=RedDataH^4; /*D2*/
  41          sbit RedData6=RedDataH^5; /*D1*/
  42          sbit RedData5=RedDataH^6; /*S2*/
  43          sbit RedData4=RedDataH^7; /*S1*/
  44          unsigned char bdata State; /*状态字节*/
  45          sbit RedControl=State^6; /*遥控状态*/
  46          
  47          
  48          
  49          /*定时器T00 的高位定时参数为Timer 
  50          定时256*Timer+(80--336)个周期共139Timer+(43--182)us<37ms 
  51          定时器T01的高位定时节参数为nTimer 定时256*nTimer+(24--280)个周期139nTimer+(13--152)us<9.1s,
  52          RedCon 存放红外接收时的载波计数*/
  53          
  54          unsigned char data RedCon;
  55          unsigned int nTimer; /*定时整型参数*/
C51 COMPILER V7.00  IR                                                                     08/21/2006 21:45:38 PAGE 2   

  56          /*INT1 用于红外解码状态遥控解码数据处理,nTimer=1 定时152--291us*/
  57          void Inte1() interrupt 2 using 2
  58          {
  59   1              for(nTimer=8;nTimer>1;nTimer--);/*使处理周期达到51 机器周期=27.7us 使得RedCon<32*/
  60   1      
  61   1              if(RedRead) 
  62   1              {
  63   2                      RedCon++; /*0 信号宽度a=420us,1 信号宽度a=1260us,周期4a=1680us*/
  64   2              }
  65   1              else
  66   1              { /*开始计数或者重新发送时开始计数*/
  67   2                      RedBit=0; /*复位接收位*/
  68   2                      RedCon=0; /*复位载波计数*/
  69   2                      RedRead=1; /*置位位接收标志*/
  70   2                      if(!ET1)
  71   2                      { /*首次接收时没有启动定时器T01 接收第一个位*/
  72   3                              TF1=0; /*复位定时器T01 益出标志*/
  73   3                              ET1=1; /*启动T01 定时*/
  74   3                              RedDataL=0; /*复位红外数据*/
  75   3                              RedDataH=0; /*复位红外数据*/
  76   3                              RSend=0;
  77   3                      } /*复位重新发送标志*/
  78   2              }
  79   1      }
  80          
  81          void Count1(void) interrupt 3 using 3
  82          { 
  83   1              /*定时器T01 中断,最大定时9.1s*/
  84   1              if(nTimer!=0)
  85   1              { /*检测定时器T01 的扩展高位*/
  86   2                      nTimer--;
  87   2                      return;
  88   2              }
  89   1      
  90   1              ET1=0; /*关闭T01 定时*/
  91   1      
  92   1              if(RedRead)
  93   1              { /*红外接收状态*/
  94   2                      if((RedDataL&0xF)==12)
  95   2                      { /*第一阶段接收已经结束*/
  96   3                              RSend=1; /*置位重新发送标志以便校验*/
  97   3                              RedDataL&=0xF0;
  98   3                      } /*复位位指针以便校验*/
  99   2                      
 100   2                      if(RedCon>27-REDINT&&RedCon<27+REDINT) RedBit=1;
 101   2                      else RedBit=0; /*低电平计数9 表示0 27 表示1*/
 102   2                      
 103   2                      if(RSend)
 104   2                      { /*检验重复发送的数据是否与第一次符合*/
 105   3                              switch(RedDataL&0xF)
 106   3                              {
 107   4                                      case 0: /*检验重复发送的第1 位数据*/
 108   4                                              if(RedBit!=RedData0) goto RClear;
 109   4                                              break;
 110   4                                      case 1: /*检验重复发送的第2 位数据*/
 111   4                                              if(RedBit!=RedData1) goto RClear;
 112   4                                              break;
 113   4                                      case 2: /*检验重复发送的第3 位数据*/
 114   4                                              if(RedBit!=RedData2) goto RClear;
 115   4                                              break;
 116   4                                      case 3: /*检验重复发送的第4 位数据*/
 117   4                                              if(RedBit!=RedData3) goto RClear;
C51 COMPILER V7.00  IR                                                                     08/21/2006 21:45:38 PAGE 3   

 118   4                                              break;
 119   4                                      case 4: /*检验重复发送的第5 位数据*/
 120   4                                              if(RedBit!=RedData4) goto RClear;
 121   4                                              break;
 122   4                                      case 5: /*检验重复发送的第6 位数据*/
 123   4                                              if(RedBit!=RedData5) goto RClear;
 124   4                                              break;
 125   4                                      case 6: /*检验重复发送的第7 位数据*/
 126   4                                              if(RedBit!=RedData6) goto RClear;
 127   4                                              break;
 128   4                                      case 7: /*检验重复发送的第8 位数据*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -