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

📄 infraredremotecontrol.lst

📁 通过DT1922D控制AT89S52单片机
💻 LST
字号:
C51 COMPILER V7.50   INFRAREDREMOTECONTROL                                                 04/28/2009 15:19:39 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE INFRAREDREMOTECONTROL
OBJECT MODULE PLACED IN InfraredRemoteControl.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE InfraredRemoteControl.C BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <reg51.h>
   2          #include <intrins.h>
   3          
   4          #define uchar unsigned char
   5          #define uint  unsigned int
   6          #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
   7          
   8          void delay(uchar x);  //x*0.14MS
   9          void delay1(int ms);
  10          void beep();
  11          
  12          sbit IRIN = P3^2;         //红外接收器数据线
  13          sbit BEEP = P3^7;         //蜂鸣器驱动线
  14          sbit RELAY= P1^3;         //继电器驱动线
  15          
  16          uchar IRCOM[7];
  17          
  18          sbit LCD_RS = P2^0;             
  19          sbit LCD_RW = P2^1;
  20          sbit LCD_EN = P2^2;
  21          
  22          uchar code  cdis1[ ] = {" REMOTE CONTROL "};
  23          uchar code  cdis2[ ] = {"  IR-CODE: --H  "};
  24          
  25          /*******************************************************************/
  26          /*                                                                 */
  27          /*检查LCD忙状态                                                    */
  28          /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。      */
  29          /*                                                                 */
  30          /*******************************************************************/ 
  31          
  32          bit lcd_busy()
  33           {                          
  34   1          bit result;
  35   1          LCD_RS = 0;
  36   1          LCD_RW = 1;
  37   1          LCD_EN = 1;
  38   1          delayNOP();
  39   1          result = (bit)(P0&0x80);
  40   1          LCD_EN = 0;
  41   1          return(result); 
  42   1       }
  43          
  44          /*******************************************************************/
  45          /*                                                                 */
  46          /*写指令数据到LCD                                                  */
  47          /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。                             */
  48          /*                                                                 */
  49          /*******************************************************************/
  50          
  51          void lcd_wcmd(uchar cmd)
  52          
  53          {                          
  54   1         while(lcd_busy());
  55   1          LCD_RS = 0;
C51 COMPILER V7.50   INFRAREDREMOTECONTROL                                                 04/28/2009 15:19:39 PAGE 2   

  56   1          LCD_RW = 0;
  57   1          LCD_EN = 0;
  58   1          _nop_();
  59   1          _nop_(); 
  60   1          P0 = cmd;
  61   1          delayNOP();
  62   1          LCD_EN = 1;
  63   1          delayNOP();
  64   1          LCD_EN = 0;  
  65   1      }
  66          
  67          /*******************************************************************/
  68          /*                                                                 */
  69          /*写显示数据到LCD                                                  */
  70          /*RS=H,RW=L,E=高脉冲,D0-D7=数据。                               */
  71          /*                                                                 */
  72          /*******************************************************************/
  73          
  74          void lcd_wdat(uchar dat)
  75          {                          
  76   1         while(lcd_busy());
  77   1          LCD_RS = 1;
  78   1          LCD_RW = 0;
  79   1          LCD_EN = 0;
  80   1          P0 = dat;
  81   1          delayNOP();
  82   1          LCD_EN = 1;
  83   1          delayNOP();
  84   1          LCD_EN = 0; 
  85   1      }
  86          
  87          /*******************************************************************/
  88          /*                                                                 */
  89          /*  LCD初始化设定                                                  */
  90          /*                                                                 */
  91          /*******************************************************************/
  92          
  93          void lcd_init()
  94          { 
  95   1          delay1(15);                   
  96   1          lcd_wcmd(0x38);      //16*2显示,5*7点阵,8位数据
  97   1          delay1(5);
  98   1          lcd_wcmd(0x38);         
  99   1          delay1(5);
 100   1          lcd_wcmd(0x38);         
 101   1          delay1(5);
 102   1      
 103   1          lcd_wcmd(0x0c);      //显示开,关光标
 104   1          delay1(5);
 105   1          lcd_wcmd(0x06);      //移动光标
 106   1          delay1(5);
 107   1          lcd_wcmd(0x01);      //清除LCD的显示内容
 108   1          delay1(5);
 109   1      }
 110          
 111          /*******************************************************************/
 112          /*                                                                 */
 113          /*  设定显示位置                                                   */
 114          /*                                                                 */
 115          /*******************************************************************/
 116          
 117          void lcd_pos(uchar pos)
C51 COMPILER V7.50   INFRAREDREMOTECONTROL                                                 04/28/2009 15:19:39 PAGE 3   

 118          {                          
 119   1        lcd_wcmd(pos | 0x80);  //数据指针=80+地址变量
 120   1      }
 121          
 122          /*******************************************************************/
 123          main()
 124          {
 125   1         uchar m;
 126   1        
 127   1          IE = 0x81;                 //允许总中断中断,使能 INT0 外部中断
 128   1          TCON = 0x01;               //触发方式为脉冲负边沿触发
 129   1          
 130   1          IRIN=1;                    //I/O口初始化
 131   1          BEEP=1;
 132   1          RELAY=1; 
 133   1              
 134   1          delay1(10);                 //延时
 135   1          lcd_init();                //初始化LCD             
 136   1              
 137   1          lcd_pos(0);                //设置显示位置为第一行的第1个字符
 138   1           m = 0;
 139   1          while(cdis1[m] != '\0')
 140   1           {                         //显示字符
 141   2             lcd_wdat(cdis1[m]);
 142   2             m++;
 143   2           }
 144   1      
 145   1          lcd_pos(0x40);             //设置显示位置为第二行第1个字符
 146   1           m = 0;
 147   1          while(cdis2[m] != '\0')
 148   1           {
 149   2             lcd_wdat(cdis2[m]);      //显示字符
 150   2             m++;
 151   2           }
 152   1      
 153   1         while(1)     ;
 154   1      
 155   1      } //end main
 156          /**********************************************************/
 157          void IR_IN() interrupt 0 using 0
 158          {
 159   1        unsigned char j,k,N=0;
 160   1           EX0 = 0;   
 161   1               delay(15);
 162   1               if (IRIN==1) 
 163   1           { EX0 =1;
 164   2                 return;
 165   2                } 
 166   1                                 //确认IR信号出现
 167   1        while (!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。
 168   1          {delay(1);}
 169   1      
 170   1       for (j=0;j<4;j++)         //收集四组数据
 171   1       { 
 172   2        for (k=0;k<8;k++)        //每组数据有8位
 173   2        {
 174   3         while (IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
 175   3           {delay(1);}
 176   3          while (!IRIN)          //等 IR 变为高电平
 177   3           {delay(1);}
 178   3           while (IRIN)           //计算IR高电平时长
 179   3            {
C51 COMPILER V7.50   INFRAREDREMOTECONTROL                                                 04/28/2009 15:19:39 PAGE 4   

 180   4          delay(1);
 181   4          N++;           
 182   4          if (N>=30)
 183   4               { EX0=1;
 184   5               return;}                  //0.14ms计数过长自动离开。
 185   4            }                        //高电平计数完毕                
 186   3           IRCOM[j]=IRCOM[j] >> 1;                  //数据最高位补“0”
 187   3           if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //数据最高位补“1”1000 0000
 188   3           N=0;
 189   3        }//end for k
 190   2       }//end for j
 191   1         
 192   1         if (IRCOM[2]!=~IRCOM[3])
 193   1         { EX0=1;
 194   2           return; }
 195   1      
 196   1         IRCOM[5]=IRCOM[2] & 0x0F;     //取键码的低四位
 197   1         IRCOM[6]=IRCOM[2] >> 4;       //右移4次,高四位变为低四位
 198   1      
 199   1         if(IRCOM[5]>9)
 200   1          { IRCOM[5]=IRCOM[5]+0x37;}
 201   1         else
 202   1                IRCOM[5]=IRCOM[5]+0x30;
 203   1      
 204   1         if(IRCOM[6]>9)
 205   1          { IRCOM[6]=IRCOM[6]+0x37;}
 206   1         else
 207   1                IRCOM[6]=IRCOM[6]+0x30;
 208   1      
 209   1           lcd_pos(0x4b);             
 210   1           lcd_wdat(IRCOM[6]);        //第一位数显示 
 211   1           lcd_pos(0x4c);             
 212   1           lcd_wdat(IRCOM[5]);        //第二位数显示
 213   1      
 214   1           beep();
 215   1           EX0 = 1; 
 216   1      } 
 217          
 218          /**********************************************************/
 219          void beep()
 220          {
 221   1        unsigned char i;
 222   1        for (i=0;i<100;i++)
 223   1         {
 224   2         delay(4);
 225   2         BEEP=!BEEP;                 //BEEP取反
 226   2         } 
 227   1        BEEP=1;                      //关闭蜂鸣器
 228   1      }
 229          /**********************************************************/
 230          void delay(unsigned char x)    //x*0.14MS
 231          {
 232   1       unsigned char i;
 233   1        while(x--)
 234   1       {
 235   2        for (i = 0; i<13; i++) {}
 236   2       }
 237   1      }
 238          
 239          /**********************************************************/
 240          void delay1(int ms)
 241          {
C51 COMPILER V7.50   INFRAREDREMOTECONTROL                                                 04/28/2009 15:19:39 PAGE 5   

 242   1       unsigned char y;
 243   1        while(ms--)
 244   1       {
 245   2        for(y = 0; y<250; y++)
 246   2        {
 247   3         _nop_();
 248   3         _nop_();
 249   3         _nop_();
 250   3         _nop_();
 251   3        }
 252   2       }
 253   1      }
 254          
 255          /*
 256          ;================================
 257          ;DT9122D 遥控器
 258          
 259          ;******  红外遥控器键值表  ******
 260          
 261          ;  10     03      01      06
 262          ;  09     1D      1F      0D
 263          ;  19     1B      11      15
 264          ;  17     12      16      4C
 265          ;  40     48      04      00
 266          ;  02     05      54      4D
 267          ;  0A     1E      0E      1A
 268          ;  1C     14      0F      0C
 269          ;================================
 270          */


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    513    ----
   CONSTANT SIZE    =     34    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      7       4
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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