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

📄 irda.lst

📁 本程序利用C代码中插入汇编语言实现了51单片机红外解码程序
💻 LST
字号:
C51 COMPILER V7.20   IRDA                                                                  11/25/2005 22:56:48 PAGE 1   


C51 COMPILER V7.20, COMPILATION OF MODULE IRDA
OBJECT MODULE PLACED IN Irda.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Irda.c BROWSE DEBUG OBJECTEXTEND SRC(.\Irda.SRC)

line level    source

   1          /******************************************************************** 
   2          *                                                                   *
   3          *      程序名:红外线遥控解码程序(芯片 HT6221)                      *
   4          *                                                                   *
   5          *      设  计  人:牛余朋                                           *
   6          *                                                                   *
   7          *      日    期:2005年11月24日                                      *
   8          *                                                                   *
   9          *      版本:1.0                                                     *
  10          *********************************************************************/
  11          #include <REGX51.H>
  12          unsigned char keynumber=0xff;//定义按键值变量
  13          void Delay(void);
  14          void Irda(void);
  15          void beep(void);
  16          dispaly(unsigned char keynum);
  17          void delay1ms(unsigned int count);
  18          /*分别存放红外线译码后的数据*/
  19          unsigned char data e1 _at_ 0x1A; /*存放低8位地址码*/      
  20          unsigned char data w1 _at_ 0x1B; /*存放高8位地址码*/ 
  21          unsigned char data e2 _at_ 0x1C; /*存放8位数据码*/ 
  22          unsigned char data w2 _at_ 0x1D; /*存放8位数据反码*/ 
  23          //sbit IrInput=P3^2;       //红外线输入引脚,可自定义
  24          unsigned char LEDdata[]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60};//0-9段码
  25          /*代表遥控器上的1--28按键红外码值*/
  26          unsigned char Irda_data[]={0x5f,0x50,0x5d,0x44,0x41,0x0a,0x42,0x46,0x47,0x49,
  27                                     0x05,0x06,0x07,0x09,0x45,0x03,0x5c,0x1e,0x5e,0x02,
  28                                     0x58,0x1a,0x5b,0x01,0x1b,0x59,0x5a,0x18};//1--28
  29          /*********************主程序***************************/
  30          
  31          void main(void)
  32          {
  33   1      unsigned char i;
  34   1              IT0 = 1; //INT0下降沿有效
  35   1              EX0 = 1; //开INT0中断;
  36   1              P0=0xff;
  37   1              P1=0xff;
  38   1              P2=0xff;
  39   1              P3=0xff;
  40   1              EA = 1; //允许CPU中断
  41   1              while(1)
  42   1          {
  43   2               if(keynumber!=0xff)
  44   2                 {
  45   3                   for(i=0;i<10;i++)
  46   3                   dispaly(keynumber);
  47   3                   keynumber=0XFF;   
  48   3                 }
  49   2      
  50   2          }                      
  51   1      
  52   1      }
  53          
  54          /*******************红外线解码子程序*******************/
  55          void Irda(void)
C51 COMPILER V7.20   IRDA                                                                  11/25/2005 22:56:48 PAGE 2   

  56           { 
  57   1           #pragma asm 
  58   1      SB:
  59   1          MOV R4,#8   ;8毫秒为高电平错误
  60   1      SBA:
  61   1          MOV R5,#250
  62   1      SBB:
  63   1          JB P3.2,SXB1
  64   1          DJNZ R5,SBB
  65   1          DJNZ R4,SBA
  66   1          MOV R4,#2
  67   1          JMP SBC
  68   1      SXB1:
  69   1          MOV R5,#5
  70   1      SXB2:             ;去掉20US的尖峰干扰信号
  71   1          JNB P3.2,SBB
  72   1          DJNZ R5,SXB2
  73   1          RET
  74   1      SBC:
  75   1          MOV R5,#250
  76   1      SB1:
  77   1              JB P3.2,SB2     ;2MS内不为高电平错误(监测9MS的低电平引导码)
  78   1          DJNZ R5,SB1
  79   1          DJNZ R4,SBC
  80   1          RET
  81   1      SB2:                ;去掉20US的尖峰干扰信号
  82   1          MOV R5,#5
  83   1      SB2_A:
  84   1          JNB P3.2,SB1
  85   1          DJNZ R5,SB2_A
  86   1          MOV R4,#3
  87   1      SB2_1:
  88   1          MOV R5,#250
  89   1      SB3:                 ;监测4.5MS高电平,如3MS内出现低电平错误
  90   1          JNB P3.2,SXC
  91   1          DJNZ R5,SB3
  92   1          DJNZ R4,SB2_1
  93   1          MOV R4,#2
  94   1          JMP SB3_1
  95   1      SXC:                 ;去掉20US的尖峰干扰信号
  96   1          MOV R5,#5
  97   1      SXC1:
  98   1          JB P3.2,SB3
  99   1          DJNZ R5,SXC1
 100   1          RET
 101   1      SB3_1:                ;监测4.5MS高电平,如5MS内不为低电平错误
 102   1          MOV R5,#250
 103   1      SB3_2:
 104   1          JNB P3.2,SB4
 105   1          DJNZ R5,SB3_2
 106   1          DJNZ R4,SB3_1
 107   1          RET
 108   1      SB4:                   ;去掉20US的尖峰干扰信号
 109   1          MOV R5,#5
 110   1      SB4_1:
 111   1          JB P3.2,SB3_2
 112   1          DJNZ R5,SB4_1
 113   1              MOV R1,#1AH     ;设定1AH为起始RAM区
 114   1              MOV R2,#4
 115   1      PP: MOV R3,#8
 116   1      JJJJ:
 117   1          MOV R5,#250
C51 COMPILER V7.20   IRDA                                                                  11/25/2005 22:56:48 PAGE 3   

 118   1      JJJJ2:               ;1MS内不为低电平错误
 119   1          JB P3.2,JJJJ3
 120   1          DJNZ R5,JJJJ2
 121   1          RET
 122   1      JJJJ3:
 123   1              LCALL YS1       ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
 124   1              MOV C,P3.2      ;将P3.7引脚此时的电平状态0或1存入C中
 125   1              JNC UUU         ;如果为0就跳转到UUU
 126   1          MOV R5,#250
 127   1      JJJJ4:
 128   1          JNB P3.2,UUU
 129   1          NOP
 130   1          DJNZ R5,JJJJ4
 131   1          RET
 132   1      UUU:    MOV A,@R1       ;将R1中地址的给A
 133   1              RRC A            ;将C中的值0或1移入A中的最低位
 134   1              MOV @R1,A       ;将A中的数暂时存放在R1中
 135   1              DJNZ R3,JJJJ    ;接收地址码的高8位
 136   1              INC R1          ;对R1中的值加1,换成下一个RAM
 137   1              DJNZ R2,PP      ;接收完16位地址码和8位数据码和8位数据反码,存放在1AH/1BH/1CH/1DH的RAM中
 138   1      
 139   1      YS1:     MOV R4,#20      ;延时子程序1,精确延时882微秒
 140   1              D1: MOV R5,#20
 141   1              DJNZ R5,$
 142   1              DJNZ R4,D1
 143   1              RET
 144   1      YS2: MOV R4,#10         ;延时子程序2,精确延时4740微秒
 145   1              D2: MOV R5,#235
 146   1              DJNZ R5,$
 147   1              DJNZ R4,D2
 148   1              RET
 149   1      YS3:    MOV R4,#2       ;延时程序3,精确延时1000微秒
 150   1              D3:MOV R5,#248
 151   1              DJNZ R5,$
 152   1              DJNZ R4,D3
 153   1              RET
 154   1      #pragma endasm 
 155   1       }
 156          
 157          /*****************外部中断0服务程序*********************/
 158          void int0_int(void) interrupt 0
 159          {
 160   1       unsigned char i;
 161   1       EX0 = 0;
 162   1       Irda();
 163   1      
 164   1       if((e1==~w1)&&(e2==~w2))   //判断系统码与系统反码、用户码与用户反码是否相同
 165   1        {    
 166   2           P1=e2;
 167   2           for(i=0;i<28;i++)
 168   2               {
 169   3                if(e2==Irda_data[i])
 170   3                 {
 171   4                  keynumber=i;
 172   4                  beep( );
 173   4                 }
 174   3               }    
 175   2         }
 176   1         e1=e2=w1=w2=0;             //防止下一次误判断
 177   1       EX0 = 1;
 178   1      }
 179          
C51 COMPILER V7.20   IRDA                                                                  11/25/2005 22:56:48 PAGE 4   

 180          void beep(void)
 181          {
 182   1      P3_3=0;
 183   1      delay1ms(1);
 184   1      P3_3=1;
 185   1      }
 186          /*************************延时1毫秒子程序*****************************/
 187          void delay1ms(unsigned int count)//晶振12M,延时ms
 188          {
 189   1         unsigned int  i,j;
 190   1           for(i=0;i<count;i++)
 191   1              for(j=0;j<120;j++)
 192   1                       ;
 193   1      }
 194          
 195          dispaly(unsigned char keynum)
 196          {
 197   1       //unsigned char i;
 198   1      // for(i=0;i<5;i++)
 199   1      // {
 200   1           P0=LEDdata[(keynum+1)%10];
 201   1               P2=0xfb;
 202   1               delay1ms(5);
 203   1               P0=LEDdata[(keynum+1)/10];
 204   1               P2=0xfd;
 205   1               delay1ms(5);
 206   1               P2=0xff;
 207   1      // }
 208   1      
 209   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    546    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     39       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 + -