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

📄 红外0.lst

📁 很好理解的红外解码C51程序
💻 LST
字号:
C51 COMPILER V8.02   红外0                                                                 09/14/2008 11:33:32 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE 红外0
OBJECT MODULE PLACED IN 红外0.OBJ
COMPILER INVOKED BY: D:\专业\keil\C51\BIN\C51.EXE 红外0.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <AT89X51.H>
   2          
   3          #define c(x) (x*110592/120000)
   4          
   5          sbit Ir_Pin=P3^5;
   6          
   7          unsigned char code Led_Tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,
   8          
   9          0xf8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //共阳极数码显示码0-F.
  10          
  11          unsigned char code Led_Sel[]={0xfe,0xfd,0xfb,0xf7};     //显示位控
  12          
  13          unsigned char Led_Buf[4]; //显示缓冲区
  14          
  15          char Led_Index; //位选
  16          
  17          unsigned char Ir_Buf[4]; //用于保存解码结果
  18          
  19          //==============================================================
  20          
  21          //数码管扫描
  22          
  23          timer0() interrupt 1 using 1
  24          
  25          {
  26   1      
  27   1      TL0=(65536-1000)%256;
  28   1      
  29   1      TH0=(65536-1000)/256; //定时器0设定约1000us中断一次,用于数码管扫描
  30   1      
  31   1      P0=0xff;
  32   1      
  33   1      P2=Led_Sel[Led_Index]; //位选
  34   1      
  35   1      P0=Led_Tab[Led_Buf[Led_Index]]; //段选
  36   1      
  37   1      if(++Led_Index>3) Led_Index=0; //四个扫描完了,到第一个数码管
  38   1      
  39   1      }
  40          
  41          //==============================================================
  42          
  43          unsigned int Ir_Get_Low()
  44          
  45          {
  46   1      
  47   1      TL1=0;
  48   1      
  49   1      TH1=0;
  50   1      
  51   1      TR1=1;
  52   1      
  53   1      while(!Ir_Pin && (TH1&0x80)==0); //当P3.5为低 且 TH1<0x80时 等待
  54   1      
  55   1      TR1=0;
C51 COMPILER V8.02   红外0                                                                 09/14/2008 11:33:32 PAGE 2   

  56   1      
  57   1      return TH1*256+TL1;
  58   1      
  59   1      }
  60          
  61          //=============================================================
  62          
  63          unsigned int Ir_Get_High()
  64          
  65          {
  66   1      
  67   1      TL1=0;
  68   1      
  69   1      TH1=0;
  70   1      
  71   1      TR1=1;
  72   1      
  73   1      while(Ir_Pin && (TH1&0x80)==0);
  74   1      
  75   1      TR1=0;
  76   1      
  77   1      return TH1*256+TL1;
  78   1      
  79   1      }
  80          
  81          //==============================================================
  82          
  83          main()
  84          
  85          {
  86   1      
  87   1      unsigned int temp;
  88   1      
  89   1      char i,j;
  90   1      
  91   1      Led_Index=1;
  92   1      
  93   1      TMOD=0x11;
  94   1      
  95   1      TL0=(65536-1000)%256;
  96   1      
  97   1      TH0=(65536-1000)/256; //定时器0设定约1000us中断一次,用于数码管扫描
  98   1      
  99   1      EA=1;
 100   1      
 101   1      ET0=1;
 102   1      
 103   1      TR0=1;
 104   1      
 105   1      Led_Buf[0]=0;
 106   1      
 107   1      Led_Buf[1]=0;
 108   1      
 109   1      Led_Buf[2]=0;
 110   1      
 111   1      Led_Buf[3]=0; //显示区设成0
 112   1      
 113   1      do{
 114   2      
 115   2      restart:
 116   2      
 117   2      while(Ir_Pin);
C51 COMPILER V8.02   红外0                                                                 09/14/2008 11:33:32 PAGE 3   

 118   2      
 119   2      temp=Ir_Get_Low();
 120   2      
 121   2      if(temp<c(4000) || temp>c(5000)) continue;//引导脉冲低电平9000
 122   2      
 123   2      temp=Ir_Get_High();
 124   2      
 125   2      if(temp<c(4000) || temp>c(5000)) continue;//引导脉冲高电平4500
 126   2      
 127   2      for(i=0;i<4;i++) //4个字节
 128   2      
 129   2              for(j=0;j<8;j++) //每个字节8位
 130   2              
 131   2                      {
 132   3                      
 133   3                              temp=Ir_Get_Low();
 134   3                              
 135   3                              if(temp<c(200) || temp>c(800)) goto restart;
 136   3                              
 137   3                              temp=Ir_Get_High();
 138   3                              
 139   3                              if(temp<c(200) || temp>c(2000)) goto restart;
 140   3      
 141   3                              Ir_Buf[i]>>=1;
 142   3                              
 143   3                              if(temp>c(1120)) Ir_Buf[i]|=0x80;
 144   3                      
 145   3                      }
 146   2      
 147   2      Led_Buf[0]=Ir_Buf[2]&0xf;          //低四位数据码
 148   2                                                                 
 149   2      Led_Buf[1]=(Ir_Buf[2]/16)&0xf; //高四位数据码
 150   2      
 151   2      Led_Buf[2]=Ir_Buf[0]&0xf;          //低四位用户码
 152   2      
 153   2      Led_Buf[3]=(Ir_Buf[0]/16)&0xf; //高四位用户码
 154   2      
 155   2      }while(1);
 156   1      
 157   1      } 


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    448    ----
   CONSTANT SIZE    =     20    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      9       2
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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