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

📄 ir.lst

📁 自己编写的专门针对6122红外编码芯片的红外解码程序,使用定时器+中断,占用CPU时间少,能稳定可靠的解码
💻 LST
字号:
C51 COMPILER V8.02   IR                                                                    04/29/2007 12:10:57 PAGE 1   


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

line level    source

   1          /*--------------------------------------------------------------------------------
   2            遥控器处理程序
   3            算法:测两个下降沿的的时间,作判断 0?  1?,遇到引导码,计数清0
   4          
   5          ---------------------------------------------------------------------------------*/
   6          
   7          #include<reg51.h>
   8          #define uchar unsigned char
   9          #define uint unsigned int
  10          #define ulong unsigned long     
  11          
  12          extern show(uchar showdata); 
  13          
  14          volatile ulong IRcode=0x00000000;  //32位的键代码
  15          
  16          volatile uint customcode=0x0000;      //16位用户码
  17          volatile uint time_us=0x0000;      //两个下降沿之间的时间       
  18          
  19          volatile uchar timeH,timeL;      //保存TH1 TL的值
  20          
  21          uchar Lcustomcode=0x00;      //低8用户码
  22          uchar Hcustomcode=0x00;     //高8
  23          uchar datacode=0x00;       //8位键数据码
  24          uchar Rdatacode=0x00;      //8位键数据反码
  25          uchar T1overflow=0x00;   //T1溢出次数   ??????
  26          
  27          sbit IR=P3^2;   //??  
  28          sbit power=P1^7;  //电源开关
  29          bit NewIRcode=0;  //指示当处理完了32位码后,就有了新的遥控码
  30          bit DataRight=0;   //为1时读取数据正确 
  31          
  32          
  33          //-----------------------------delay()-------------------------
  34          void delay()
  35          {
  36   1       uchar i,j,k;
  37   1       for(i=200;i>0;i--)
  38   1          for(j=200;j>0;j--)
  39   1                 for(k=22;k>0;k--) ;  
  40   1      }
  41          
  42          void delay2()
  43          {
  44   1       uchar i,j,k;
  45   1       for(i=200;i>0;i--)
  46   1          for(j=200;j>0;j--)
  47   1                 for(k=13;k>0;k--);
  48   1      }
  49          //------------------------------------------------------------------------------
  50          void init()             
  51          {
  52   1      
  53   1        
  54   1        TMOD=0x11; //定时器0,工作方式1 ;  定时器1,工作方式1
  55   1        TCON=0x01; //外中断0下降沿触发,(包括TR1=0,TR0=0)
C51 COMPILER V8.02   IR                                                                    04/29/2007 12:10:57 PAGE 2   

  56   1        TH0=0x3c;      //初始化定时器0,定时50ms
  57   1        TL0=0xb0;
  58   1        TH1=0x00;      //初始化定时器1 
  59   1        TL1=0x00;        
  60   1      
  61   1        EA=1;           //开全中断
  62   1        ET0=1;          //开放T0中断
  63   1        ET1=1;      //开放T1中断
  64   1        EX0=1;          //开放INT0
  65   1        IP=0x01;   //?????  
  66   1      }
  67          
  68          //-------------------------------------interrupt0-------------------------------------
  69          void IR_ISR() interrupt 0 using 1       //遥控器中断处理函数
  70          {   
  71   1        static uchar cn=0;   
  72   1       
  73   1        TR1=0;         
  74   1        timeH=TH1;
  75   1        timeL=TL1;
  76   1        TH1=0;
  77   1        TL1=0;
  78   1        TR1=1;
  79   1        
  80   1        time_us=(unsigned int)timeH;
  81   1        time_us=time_us<<8;
  82   1        time_us=time_us|timeL;
  83   1      
  84   1        if(time_us>13300&&time_us<13700) {cn=1;IRcode=0;}  //遇到引导码,就把cn清0,IRcode清0  
  85   1         
  86   1        if(cn<34)
  87   1        {
  88   2        if(time_us>1000&&time_us<1300) //0  
  89   2                {IRcode=IRcode|0x00000000; if(cn<33) IRcode=IRcode>>1;}
  90   2      
  91   2        else if(time_us>2000&&time_us<2450) //1        
  92   2                {IRcode=IRcode|0x80000000;if(cn<33) IRcode=IRcode>>1;}
  93   2        }
  94   1                        
  95   1        else if(time_us>11000&&time_us<11500) {IRcode=IRcode;}; //遇到重复码
  96   1                                                                                                                                                                                              
  97   1         cn++; 
  98   1      
  99   1        if(cn==34) {NewIRcode=1;TR1=0;}  //读完32位码,则有新码产生 
 100   1      
 101   1      }
 102          
 103          //--------------------------------------timer_ISR------------------------------
 104          void Timer0_ISR() interrupt 1 using 2           //定时器0中断函数
 105          {
 106   1              //TR1=0;        
 107   1              //TR1=1; 
 108   1      }
 109          void Timer1_ISR() interrupt 3 using 3           //定时器1中断函数
 110          {
 111   1         T1overflow++;         //还要记得清0????
 112   1         //???++;放比如音量,切换时间等的递增量?????????????????????
 113   1         //TH1=0xff;   //这三句可以不要,定时器可以不断的启动计数
 114   1         //TL1=0xff;
 115   1         //TR1=0;     //???
 116   1      }
 117                                             
C51 COMPILER V8.02   IR                                                                    04/29/2007 12:10:57 PAGE 3   

 118          //------------------------------------main()----------------------------------------------
 119          void main()
 120          {       
 121   1          
 122   1          init();        
 123   1          power=1;
 124   1              
 125   1              
 126   1       while(1)          
 127   1        { 
 128   2              
 129   2        if(NewIRcode==1)    //如果有新的遥控码就读
 130   2            {         
 131   3                 
 132   3                 customcode=IRcode;    //取红外码中的用户码    
 133   3                 //Lcustomcode=IRcode;   //取低8位用户码
 134   3                 //Hcustomcode=IRcode>>8;  //取高8位用户码
 135   3                 datacode=IRcode>>16;    //取数据码
 136   3                 Rdatacode=IRcode>>24;        //取数据码的反码          
 137   3               
 138   3            if((customcode!=0xFF80)&&(~Rdatacode!=datacode)) {DataRight=0;IRcode=0;} //校验用户码,反码 
 139   3                  
 140   3                      else DataRight=1;           
 141   3              
 142   3                  NewIRcode=0; //读完之后清零,表示新码已读 
 143   3                 }
 144   2                      
 145   2                if(DataRight==1)  {show(datacode);}                                           
 146   2              
 147   2        }     
 148   1      
 149   1      }
 150          
 151          
 152          
 153          
 154          
 155          
 156          
 157          
 158            


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    394    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     16    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      2    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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