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

📄 p87lpc762+nb9148红外线遥控.lst

📁 P87LPC762+NB9148红外线遥控.rar
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.09   P87LPC762_NB9148_焱_线襙控                                            11/13/2006 09:35:10 PAGE 1   


C51 COMPILER V7.09, COMPILATION OF MODULE P87LPC762_NB9148_焱_线襙控
OBJECT MODULE PLACED IN P87LPC762+NB9148红外线遥控.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE P87LPC762+NB9148红外线遥控.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          //P87LPC762+NB9148红外线遥控
   2          //2006年8月
   3          
   4          //Philips公司的51LPC系列
   5          //NB9148为遥控发射专用电路,16引脚可形成18只按键
   6          //NB9149为遥控接收专用电路,可完成10个功能控制
   7          //NB9150为遥控接收专用电路,可完成18个功能控制
   8          //本实验的遥控接收采用通用的红外线接收头
   9          //遥控接收接8脚P1_4的INT1输入口;晶振为11.0592MHz
  10          
  11          #include <REG768.H>                                                     //87LPC768寄存器定义头文件
  12          #include <stdio.h> 
  13          #include <intrins.h>
  14          
  15          #define REDINT 0x06                                                     //红外线间隔
  16          
  17          //存放消息标志的可位寻址字节Message,Message=NULL时无任消息
  18          unsigned char bdata Message;
  19          
  20          //在接收过程中置位,检测标置位Get可以有效防止其它进程干扰接收,防止数据丢失
  21          sbit RedMsg =Message^0;                                                 //红外遥控消息 
  22          sbit RedRead=Message^1;                                                 //位接收过程标志 
  23          sbit RedBit =Message^2;                                                 //接收到的位值 
  24          sbit RSend  =Message^3;                                                 //红外接收中重新发送标志 
  25          
  26          //存放遥控的字数据,低4位存放接收到的bit的位移,高12位从低到高存放接收到的bit 
  27          unsigned char bdata RedDataL,RedDataH;
  28          
  29          //RedDataH字节低6位代表指令,只有一个1,C1~C3是用户码,H表示连续,S1S2分别表示第一二组单发 
  30          sbit RedData0=RedDataL^4;                                               //C1 
  31          sbit RedData1=RedDataL^5;                                               //C2 
  32          sbit RedData2=RedDataL^6;                                               //C3 
  33          sbit RedData3=RedDataL^7;                                               //H 
  34          sbit RedData11=RedDataH^0;                                              //D6 
  35          sbit RedData10=RedDataH^1;                                              //D5 
  36          sbit RedData9=RedDataH^2;                                               //D4 
  37          sbit RedData8=RedDataH^3;                                               //D3 
  38          sbit RedData7=RedDataH^4;                                               //D2 
  39          sbit RedData6=RedDataH^5;                                               //D1 
  40          sbit RedData5=RedDataH^6;                                               //S2 
  41          sbit RedData4=RedDataH^7;                                               //S1 
  42          unsigned char bdata State;                                              //状态字节 
  43          sbit RedControl=State^6;                                                //遥控状态 
  44          
  45          //定时器T00的高位定时参数为Timer,定时256*Timer+(80--336)个周期,共139Timer+(43~
  46          //182)us<37ms。定时器T01的高位定时节参数为nTimer,定时256*nTimer+(24~280)个周期,
  47          //139nTimer+(13~152)us<9.1s。RedCon存放红外接收时的载波计数 
  48          unsigned char data RedCon,Timer;
  49          unsigned int nTimer;                                                    //定时整型参数 
  50          
  51          void Count0(void) interrupt 1 using 3                   //定时器T00中断,最大定时37ms 
  52                  {if(Timer!=0)                                                           //检测定时器T00的扩展高位 
  53   1                      {Timer--;
  54   2                      return;
  55   2                      }
C51 COMPILER V7.09   P87LPC762_NB9148_焱_线襙控                                            11/13/2006 09:35:10 PAGE 2   

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

 118   4                                                      if(RedBit!=RedData8) goto RClear;
 119   4                                                      break;
 120   4                                      case 9:                                                 //检验重复发送的第10位数据 
 121   4                                                      if(RedBit!=RedData9) goto RClear;
 122   4                                                      break;

⌨️ 快捷键说明

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