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

📄 ok.lst

📁 红外遥控风扇的接收程序
💻 LST
字号:
C51 COMPILER V7.20   OK                                                                    05/13/2008 09:14:00 PAGE 1   


C51 COMPILER V7.20, COMPILATION OF MODULE OK
OBJECT MODULE PLACED IN ok.OBJ
COMPILER INVOKED BY: D:\HUIBIAN\C51\BIN\C51.EXE ok.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*************************   说 明 *********************************/
   2            /*    以一个9ms的低电平和4.5ms的高电平为引导码,后跟32位二进制代码 */
   3            /*    前16位为8位用户码及其反码,后16位为8位的操作码及其反码      */
   4            /*    以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示"0";    */
   5            /*    以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示"1"。    */
   6            /*    注意:接收码的脉宽与间隔是对发射码取反的,即间隔是0.565ms     */
   7            /******************************************************************/
   8             #include <REGX52.h>
   9             #define uchar unsigned char
  10             uchar   time=0;   
  11             uchar   period=40;         //定义定时周期   
  12             int   timer_count=0;
  13             uchar   high;              //定义高电平时间变量
  14             uchar data    IRcode[4];     //定义一个4字节的数组用来存储代码
  15             uchar     CodeTemp;       //编码字节缓存变量
  16             uchar     i,j,k,m,g,h;
  17             uchar     a=0,b=0;         //延时用的循环变量
  18             sbit     IRsignal=P3^2;     //MS0038接收头OUT端直接连P3.2(INT0)
  19             sbit    feilin=P1^0; 
  20             sbit    mogu=P2^0;
  21             sbit    love=P1^7;
  22             sbit    father=P1^6;
  23             sbit    mother=P1^5;
  24            /**************************延时0.9ms子程序**********************/
  25               void Delay0_9ms(void)
  26               {uchar j,k;
  27   1                for(j=18;j>0;j--)
  28   1                  for(k=20;k>0;k--) ;
  29   1           }
  30            /***************************延时1ms子程序**********************/
  31               void Delay1ms(void)
  32               {uchar i,j;
  33   1              for(i=2;i>0;i--)
  34   1                 for(j=230;j>0;j--) ;
  35   1           }
  36            /***************************延时4.5ms子程序**********************/
  37               void Delay4_5ms(void)
  38               {uchar i,j;
  39   1                for(i=10;i>0;i--)
  40   1                 for(j=225;j>0;j--) ;
  41   1           }          
  42             
  43             /**************************** 延时子程序 ************************/
  44               void Delay(void)
  45               {uchar i,j,k;
  46   1           for(i=200;i>0;i--)  
  47   1              for(j=200;j>0;j--)
  48   1                 for(k=3;k>0;k--) ;
  49   1           }
  50             
  51             /************************定时1中断服务子程序**********************/  
  52             void  time1()   interrupt 3 using 3
  53             { EX0=1;
  54   1           TH1=0x3C;
  55   1               TL1=0xB0;
C51 COMPILER V7.20   OK                                                                    05/13/2008 09:14:00 PAGE 2   

  56   1               timer_count++;
  57   1               if(h==1&&timer_count==100)                          //定时5S
  58   1                 {   ET1=0;           
  59   2                 timer_count=0;h=0;
  60   2                         high=1;g=0;love=1;P0=0x81;ET0=1;Delay4_5ms(); 
  61   2             }
  62   1               if(h==2&&timer_count==200)                          //定时10S
  63   1                  {  ET1=0;
  64   2                 timer_count=0;h=0;
  65   2                         high=1;g=0;father=1;P0=0x81;ET0=1;Delay4_5ms(); 
  66   2                      }
  67   1               if(h==3&&timer_count==300)                          //定时30S
  68   1                  {  ET1=0;
  69   2                 timer_count=0;h=0;
  70   2                         high=1;g=0;mother=1;P0=0x81;ET0=1;Delay4_5ms(); 
  71   2                      }
  72   1                 
  73   1               } 
  74          
  75             /************************定时0中断服务子程序**********************/   
  76             /*采用12MHz晶振,在P1.0脚上输出周期为100ms的脉冲信号*/   
  77             /*定时2.5ms,周期100ms需40次中断,高电平10ms需4次中断*/   
  78            
  79             void  time0()   interrupt 2  using 1
  80             {     
  81   1             EX0=1; 
  82   1             TH0=0xF6;                 /*定时器初值重装载*/   
  83   1             TL0=0x3C;   
  84   1             time++;   
  85   1             if(time==high)              /*高电平持续时间结束,变低*/   
  86   1                  {   mogu=0;}   
  87   1             else   if(time==period)      /*周期时间到,变高*/   
  88   1                  {   time=0;   
  89   2                      mogu=1;
  90   2                                      if(g==1)           /*睡眠风控制*/
  91   2                                        {a++;
  92   3                                         if(a==100)
  93   3                                                {a=0;
  94   4                                                 b++;
  95   4                                                 if(b%6==1)   /*停止运行10S*/
  96   4                                                 high=50;
  97   4                                                 if(b%6==2)   /*二档运行10S*/
  98   4                                                 high=13;
  99   4                                                 if(b%6==3)   /*停止运行10S*/
 100   4                                                 high=50;
 101   4                                                 if(b%6==4)   /*三档运行10S*/
 102   4                                                 high=22;
 103   4                                                 if(b%6==5)   /*停止运行10S*/
 104   4                                                 high=50;
 105   4                                                 if(b%6==0)   /*一档运行10S*/
 106   4                                                 high=1;
 107   4                                                 }
 108   3                                              }
 109   2                      if(g==2)            /*自然风控制*/
 110   2                        {a++;
 111   3                                              if(a==100)
 112   3                                                {a=0;
 113   4                                                 b++;
 114   4                                                  if(b%4==1)  /*二档运行10S*/
 115   4                                                  high=13;              
 116   4                                                  if(b%4==2)  /*三档运行10S*/
 117   4                                                  high=22;                                               
C51 COMPILER V7.20   OK                                                                    05/13/2008 09:14:00 PAGE 3   

 118   4                                                  if(b%4==3)  /*停止运行10S*/
 119   4                                                  high=50;
 120   4                                                  if(b%4==0)  /*一档运行10S*/
 121   4                                                  high=1;
 122   4                                     }                                                 
 123   3                          }
 124   2                      if(g==3)            /*正常风控制*/
 125   2                        {a++;
 126   3                                              if(a==100)
 127   3                                                {a=0;
 128   4                                                 b++;
 129   4                                                  if(b%3==1)  /*二档运行10S*/
 130   4                                                  high=13;              
 131   4                                                  if(b%3==2)  /*三档运行10S*/
 132   4                                                  high=22;                                               
 133   4                                                  if(b%3==0)  /*一档运行10S*/
 134   4                                                  high=1;
 135   4                                                 }
 136   3                                 }                                             
 137   2                }
 138   1                      }   
 139           
 140               
 141             /************************中断0解码服务子程序**********************/
 142             void int0(void) interrupt 0 using 2      
 143             {
 144   1          EA=0;
 145   1          for(k=0;k<10;k++)
 146   1             {Delay0_9ms();
 147   2              if (IRsignal==1)                 //如果0.9ms后IRsignal=1,说明不是引导码
 148   2                 {k=10;break;}
 149   2              else if(k==9)                    //如果持续了10×0.9ms=9ms的低电平,说明是引导
 150   2                 {while(IRsignal==0);
 151   3                  Delay4_5ms();              //跳过持续4.5ms的高电平
 152   3                  for(i=0;i<4;i++)             //分别读取4个字节
 153   3                     {for(j=1;j<=8;j++)        //每个字节8个bit的判断
 154   4                         { while(IRsignal==0); //等待上升沿
 155   5                           Delay0_9ms();     //从上升沿那一时刻开始延时0.9ms,再判断IRsignal
 156   5                           if(IRsignal==1)     //如果IRsignal是"1",则向右移入一位"1"
 157   5                             {Delay1ms();
 158   6                              CodeTemp=CodeTemp|0x80;
 159   6                              if(j<8) CodeTemp=CodeTemp>>1;
 160   6                              }
 161   5                           else
 162   5                           if(j<8)CodeTemp=CodeTemp>>1;//如果IRsignal是"0",则向右移一位,自动补"0"
 163   5                        }
 164   4                      IRcode[i]=CodeTemp;              //接收的码型存到IRcode
 165   4                      CodeTemp=0;
 166   4                     }
 167   3       
 168   3                  }
 169   2               }
 170   1               EA=1;
 171   1               EX0=0;
 172   1         if(IRcode[3]==0xA1)             //检测到一档按键按下
 173   1           {IRcode[3]=0;
 174   2            P0=0x81;                     //数码管显示1  
 175   2                feilin=0;Delay();feilin=1;   //发光二极管闪一闪
 176   2                high=1;g=0;ET0=1;}
 177   1         if(IRcode[3]==0xE2)             //检测到二档按键按下
 178   1           {IRcode[3]=0;P0=0x3B;
 179   2                feilin=0;Delay();feilin=1;
C51 COMPILER V7.20   OK                                                                    05/13/2008 09:14:00 PAGE 4   

 180   2                high=13;g=0; ET0=1; }
 181   1         if(IRcode[3]==0xE1)              //检测到三档按键按下/
 182   1           {IRcode[3]=0;P0=0xAB;
 183   2                feilin=0;Delay();feilin=1;    
 184   2                high=22;g=0; ET0=1;}
 185   1        
 186   1         if(IRcode[3]==0xE0)              //检测到关机按键按下/
 187   1           {IRcode[3]=0;P0=0x00;
 188   2                feilin=0;Delay();feilin=1;
 189   2                high=50;g=0; ET0=1;}  
 190   1        
 191   1         if(IRcode[3]==0xA8)              //检测到睡眠风按键按下/
 192   1           {IRcode[3]=0;P0=0x9F;
 193   2                feilin=0;Delay();feilin=1;
 194   2                g=1;high=1; ET0=1;}     
 195   1         if(IRcode[3]==0xEB)              //检测到自然风按键按下/
 196   1           {IRcode[3]=0;P0=0xBC;
 197   2                feilin=0;Delay();feilin=1;
 198   2                g=2;high=1; ET0=1;}
 199   1         if(IRcode[3]==0xE8)              //检测到正常风按键按下/
 200   1           {IRcode[3]=0;P0=0x36;
 201   2                feilin=0;Delay();feilin=1;
 202   2                g=3;high=1; ET0=1;}
 203   1       
 204   1      
 205   1         if(IRcode[3]==0xA9)                     //检测定时5s/
 206   1           {IRcode[3]=0;
 207   2            P0=0xB9;love=0;mogu=1;h=1;ET1=1;}
 208   1         if(IRcode[3]==0xEA)                     //检测定时10s/
 209   1           {IRcode[3]=0;
 210   2            P0=0xB9;father=0;mogu=1;h=2; ET1=1;}
 211   1         if(IRcode[3]==0xE9)                     //检测定时15s/
 212   1           {IRcode[3]=0;
 213   2            P0=0xB9;mother=0;mogu=1;h=3;ET1=1;}
 214   1          
 215   1         Delay();
 216   1       }
 217              
 218               /**************************主程序*************************/
 219              void main()
 220              {P0=0; 
 221   1               ET1=0;
 222   1           ET0=0;       //关定时中断
 223   1           TMOD=0x11;   /*定时器0和1方式1*/   
 224   1           TH0=0xF6;    /*定时器装载初值*/   
 225   1           TL0=0x3C;
 226   1               TH1=0x3C;
 227   1               TL1=0xB0;
 228   1               PT1=0;
 229   1               TR1=1;       //启动定时器1/
 230   1               TR0=1;       /*启动定时器0*/ 
 231   1           IT0=1;       //INT0为负边沿触发, (1:负边沿触发,0:低电平触发)
 232   1           EX0=1;       //外部中断INT0开
 233   1           EA=1;        //开所有中断
 234   1           CodeTemp=0;  //初始化红外编码字节缓存变量
 235   1           Delay();
 236   1           while(1)      //等外部中断0
 237   1              {}
 238   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
C51 COMPILER V7.20   OK                                                                    05/13/2008 09:14:00 PAGE 5   

   CODE SIZE        =    784    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     18    ----
   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 + -