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

📄 irrecv.lst

📁 此代码实现功能为:在philips P89LPC935单片机上实现红外遥(对应红外发送芯片为:HT6222)控解码接收
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.09   IRRECV                                                                12/05/2005 10:23:18 PAGE 1   


C51 COMPILER V7.09, COMPILATION OF MODULE IRRECV
OBJECT MODULE PLACED IN IRRecv.OBJ
COMPILER INVOKED BY: c:\Keil\C51\BIN\C51.EXE IRRecv.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          
   2          /*********************************************************************/
   3          /* 模 块 名:单片机(C51)             文件名:IRRecv.c                        */
   4          /* 提交日期:2005年11月01日          作  者:金雨和                  */
   5          /* 版    本:V1.0 --Copyright(c) 2005-2006中太视讯技术有限公司       */
   6          /* 描    述:单片机(C51)红外接收程序                                                             */
   7          /* 修改记录:                                                                                                         */
   8          /*        日  期        版本      修改人     修改内容                            */
   9          /*         1.                                                                                                                    */     
  10          /*********************************************************************/
  11          
  12          #include <Reg935.h>
  13          #include <stdio.h>
  14          #include "uart.h"
  15          
  16          /* IO脚定义 */
  17          #define IR_SIGNAL               KB0             //红外输入
  18          #define IR_LED                  TxD             //红外指示灯信号
  19          #define RDIR                    OCB             //reserved
  20          #define IIC_INT                 KB1             //IIC中断脚
  21          
  22          #define QUIETLED        KB3             //静音指示灯
  23          #define MUTELED         KB6             //哑音指示灯
  24          
  25          /* 脉冲检测范围定义,此脉冲通过定时器0检测,故脉冲宽度与定时器定时器值设置有关 */
  26          /* 当定时器0为方式2时,定时值为TH0=00x10,TL0=0x10时,采用如下组值 */
  27          #if 0
              #define MIN_BIT0_PLS    9               //bit 0 脉冲宽度最小值
              #define MAX_BIT0_PLS    16              //bit 0 脉冲宽度最大值
              #define MIN_BIT1_PLS    37              //bit 1 脉冲宽度最小值
              #define MAX_BIT1_PLS    45              //bit 1 脉冲宽度最大值
              #define MIN_CODE_PLS    100             //前导码脉冲宽度最小值
              #define MAX_CODE_PLS    125             //前导码脉冲宽度最大值
              #define MIN_CONT_PLS    52              //连续按键脉冲宽度最小值
              #define MAX_CONT_PLS    60              //连续按键脉冲宽度最大值
              #define INVALID_PLS             200             //大于此值认为是无效脉冲值
              #endif
  38          
  39          /* 当定时器0为方式1时,定时值为TH0=00x10,TL0=0x10时,采用如下组值 */
  40          #define MIN_BIT0_PLS    3               //bit 0 脉冲宽度最小值
  41          #define MAX_BIT0_PLS    7               //bit 0 脉冲宽度最大值
  42          #define MIN_BIT1_PLS    14              //bit 1 脉冲宽度最小值
  43          #define MAX_BIT1_PLS    19              //bit 1 脉冲宽度最大值
  44          #define MIN_CODE_PLS    40              //前导码脉冲宽度最小值
  45          #define MAX_CODE_PLS    50              //前导码脉冲宽度最大值
  46          #define MIN_CONT_PLS    21              //连续按键脉冲宽度最小值
  47          #define MAX_CONT_PLS    24              //连续按键脉冲宽度最大值
  48          #define INVALID_PLS             90              //大于此值认为是无效脉冲值
  49          
  50          /* 标志位定义 */
  51          bit g_rsFlag;           //收到一键码
  52          bit g_RSDA1;                    //引导码第一个下降沿指示,表示可能一按键到来
  53          bit g_RSDA2;            //可能一有效高脉冲
  54          bit g_RSDA3;            //误码,非有效按键
  55          bit g_IR_SF;                    //连续按键指示
C51 COMPILER V7.09   IRRECV                                                                12/05/2005 10:23:18 PAGE 2   

  56          
  57          /* 键值及用户码保存字 */
  58          unsigned char data g_rsData;            //键码,返回给主程序
  59          unsigned char data g_insr0;                     //定时器一计数器,一次中断为0.1ms,主要记录脉冲宽度
  60          unsigned char data g_insr1;             //Insr1=(valid)insr0 transfer to int1
  61          unsigned char data g_pulseNum;          //脉冲数,一个键码总共有33个脉冲信号
  62          unsigned char data g_keyUser;           //user code
  63          unsigned char data g_keyValue;          //key value
  64          unsigned char data g_keyValueF;         //用户码反码
  65          unsigned char data g_keyUserF;          //键值反码
  66          
  67          unsigned char data g_keyPressed;        //连续按键不放,spying the continue pressing a key
  68          
  69          extern unsigned char xdata g_ucI2CSendBuf[MAX_I2CDATALEN];     //IIC数据缓存
  70          extern unsigned char xdata g_ucI2CSendBuf_Len;     //IIC数据缓存内容长度
  71          extern unsigned char xdata g_ucI2CSendBuf_offset;  //IIC缓存数据读取当前位移
  72          
  73          /*******************************************************************
  74          ** 函 数 名: IRRecvInit()
  75          ** 输    入: 无
  76          ** 输    出: 无
  77          ** 描    述: 红外接收初始化。
  78          ** 全局变量: 
  79          **                       g_pulseNum                     -- 脉冲数
  80          **                       g_keyPressed           -- 连续按键标志
  81          **                       g_rsFlag                       -- 标志,表示已正确接收到红外键码
  82          ** 调用模块: 无
  83          ** 被调模块: 无
  84          ** 作    者: 
  85          ** 创建日期: 2005年11月01日
  86          ** 修    改:
  87          **        日  期        版本      修改人     修改内容                            
  88          **         1.
  89          ********************************************************************/
  90          void IRRecvInit()
  91          {
  92   1              /* ------------------ 初始化 ------------------------- */
  93   1              g_rsFlag = 0;                   //No active
  94   1          g_IR_SF = 0;                        //连续按键指示
  95   1      
  96   1          g_RSDA1 = 0;                        //引导码第一个下降沿指示,表示可能一按键到来
  97   1          g_RSDA2 = 0;                        //可能一有效高脉冲
  98   1          g_RSDA3 = 0;                        //误码,非有效按键
  99   1          g_pulseNum = 0x00;  //比特流bit计数器
 100   1          g_insr0 = 0x00;             //记录一次脉冲脉宽,单位为0.1ms
 101   1          g_insr1 = 0x00;             //记录一次脉冲脉宽,单位为0.1ms
 102   1              g_keyPressed = 0x00;//spying the continue pressing a key
 103   1              
 104   1              //红外接收  仅为输入
 105   1              P0M1 = P0M1 | 0x01;     //Input status,set P1.1 input mode
 106   1              P0M2 = P0M2 & 0xFE;
 107   1      
 108   1          IR_SIGNAL = 1;              
 109   1          //IR_LED = 0;         //Init completed,turn off the ir indicator led
 110   1      
 111   1      }
 112          
 113          
 114          /*******************************************************************
 115          ** 函 数 名: timer0_Init()
 116          ** 输    入: 无
 117          ** 输    出: 无
C51 COMPILER V7.09   IRRECV                                                                12/05/2005 10:23:18 PAGE 3   

 118          ** 描    述: 初始化定时器0。
 119          ** 全局变量: 无
 120          ** 调用模块: 无
 121          ** 被调模块: 无
 122          ** 作    者: 
 123          ** 创建日期: 2005年11月02日
 124          ** 修    改:
 125          **        日  期        版本      修改人     修改内容                            
 126          **         1. 
 127          ********************************************************************/
 128          void timer0_Init()
 129          {
 130   1              /*  使能定时器0中断   1  */
 131   1          TMOD = TMOD | 0x01;
 132   1              TR0 = 1;
 133   1              ET0 = 1;
 134   1      //    TL0  = 0xB0;        //100H-CEH=32H=50X2uS=100uS
 135   1      //    TH0  = 0xFE;        //定时器0 happen per 0.1MS
 136   1      
 137   1          TL1  = 0xD8;        //100uS
 138   1          TH1  = 0xFD;        //定时器0 happen per 0.1MS
 139   1      }
 140          
 141          
 142          /*******************************************************************
 143          ** 函 数 名: timer0_Isr()
 144          ** 输    入: 无
 145          ** 输    出: 无
 146          ** 描    述: 定时器0中断函数,每0.1ms检测是否有脉冲。
 147          ** 全局变量: 
 148          **                       g_pulseNum                     -- 脉冲数
 149          **                       g_keyPressed           -- 连续按键标志
 150          ** 调用模块: 
 151          **                       checkPulse                     -- 检测脉冲
 152          ** 被调模块: 
 153          ** 作    者: 金雨和
 154          ** 创建日期: 2005年11月02日
 155          ** 修    改:
 156          **        日  期        版本      修改人     修改内容                            
 157          **         1. 
 158          ********************************************************************/
 159          void timer0_Isr() interrupt 1
 160          {
 161   1              /* =====timer0: high pulse detect ========= */
 162   1              if(g_RSDA1)                     //RSDA1 为1,IR_SIGNAL有下降沿来过,可能是一按键已开始,转到处理bit流
 163   1              {
 164   2                      if(IR_SIGNAL)   //IR_SIGNAL是否高,则INSR0+=1,若为低则判断脉冲宽度是否为有效
 165   2                      {
 166   3                              g_insr0++;      //step one,inc about 0.1 ms
 167   3                      }
 168   2                      else                    //IR_SIGNAL =0,为低,在此检测遥控信号的第一个下降沿
 169   2                      {
 170   3                              if(g_RSDA3)     //查询此次是否为有效按键
 171   3                              {
 172   4                                      g_insr0 = 0;
 173   4                                      g_pulseNum = 0;
 174   4                              }
 175   3                              else
 176   3                              {
 177   4                                      //有效脉宽值,MIN_BIT0_PLS为bit 0的脉宽值是最小的,所以至少要比bit 0脉宽最小值大才能算有效脉宽
 178   4                                      if(g_insr0 > MIN_BIT0_PLS)      //if INSR0<3,pulse width<0.3ms, exit,not a valid pulse
 179   4                                      {
C51 COMPILER V7.09   IRRECV                                                                12/05/2005 10:23:18 PAGE 4   

 180   5                                              if((g_insr0 > MIN_CODE_PLS)&&(g_insr0 < MAX_CODE_PLS))  //检测到前导码
 181   5                                              {
 182   6                                                      g_pulseNum = 0;
 183   6                                                      g_keyPressed = 0x00;
 184   6                                              }
 185   5              
 186   5                                              //MAX_BIT1_PLS为bit 1的脉宽值是最大的,以下比较可以得到bit 0或者bit 1的脉宽
 187   5                                              if(g_insr0 <= MAX_BIT1_PLS)                     //bit 0或者bit 1脉冲,<2ms continue
 188   5                                              {
 189   6                                                      g_IR_SF = 0;

⌨️ 快捷键说明

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