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

📄 telecontrol.lst

📁 红外遥控解码
💻 LST
字号:
C51 COMPILER V8.02   TELECONTROL                                                           05/19/2008 12:28:18 PAGE 1   


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

line level    source

   1          /*11.0592MHz晶振*/
   2          #include<at89x52.h>
   3          #define uchar unsigned char
   4          #define uint unsigned int
   5          #include"led.h"
   6          
   7          sbit beep=P3^5;
   8          sbit inf=P3^3;
   9          sbit led1=P1^3;
  10          
  11          uchar key_code=0;/*key_code:遥控键值*/
  12          uint  buf_key_code=0;/*键值暂存对应功能看主函数*/
  13          uchar key_bit_count=0;/*键编码脉冲计数*/
  14          uint  count_T=0,buf_CT=0;/*count_T:定时器中断次数计数,buf_CT用来截获某一时间的count_T值以供判断*/
  15          uchar common_code_count=0;/*前导码脉冲计数*/
  16          uchar inf_status=0;/*inf_status:脉冲接收器所处的状态,0:无信号,1:前导码接收区,2:数据编码接收区*/
  17          
  18          void main()
  19          {
  20   1              EA=1;     //开全局中断
  21   1              ET0=1;    //开定时器0中断
  22   1              TMOD=0x02;//T0设置为8位自动装载模式
  23   1              TH0=0xCA; //自动装载值为202,中断间隔为50us
  24   1              TL0=0xCA; //初值为202
  25   1              IT1=1;    //INT1为下降沿触发
  26   1              EX1=1;    //开外部中断
  27   1              TR0=1;    //启动定时器计数
  28   1              while(1)
  29   1              {        
  30   2                      /*收到数字键则显示数字*/
  31   2                      if(key_code<10)
  32   2                      {
  33   3                              beep=0;//响蜂鸣器
  34   3                      //CLEARSCREEN;
  35   3                              led_display(key_code);//其它数字和编码值相同,直接显示键值
  36   3                              key_code=255;//清键值
  37   3                              delay_ms(20);
  38   3                              beep=1;
  39   3                      }
  40   2                      /*收到功能键则显示相应的功能*/ 
  41   2                      else if(key_code<50)
  42   2                      {
  43   3                              beep=0;
  44   3                      //      CLEARSCREEN;//清屏
  45   3                              led_display(key_code);
  46   3                              key_code=255;//清键值
  47   3                              delay_ms(30);
  48   3                              beep=1; 
  49   3                      }
  50   2                      delay_ms(50);                                                                   
  51   2              }
  52   1      }
  53          
  54          void Time0(void) interrupt 1
  55          { 
C51 COMPILER V8.02   TELECONTROL                                                           05/19/2008 12:28:18 PAGE 2   

  56   1          count_T++;//周期累加
  57   1              /*如果外部中断处于无信号区,则滤除前导宽脉冲中间的跳变毛刺*/
  58   1              if(inf_status==0&&count_T<160)
  59   1              {
  60   2                      EX1=0;
  61   2              }
  62   1              /*如果外部中断处于信号区,则滤除宽脉冲中间的跳变毛刺*/
  63   1              else if((inf_status==1||inf_status==2)&&count_T<12)
  64   1              {
  65   2                      EX1=0;
  66   2              }
  67   1              /*渡过上升沿后重新开放外部中断*/
  68   1              else
  69   1              {
  70   2                      EX1=1;
  71   2              }
  72   1              /*超过25ms,则锁定count_T值,等待下一次信号脉冲下降沿来解开*/
  73   1              if(count_T>500)
  74   1              {
  75   2                      inf_status=0;
  76   2                      count_T=600;
  77   2              }
  78   1      }
  79          
  80          /***************************************************************
  81                          外部中断1,用于捕获红外脉冲信号
  82          ****************************************************************/
  83          void int_1(void) interrupt 2
  84          {
  85   1              led1=0;
  86   1              TR0=1;
  87   1              if(count_T>15&&count_T<250)//如果信号合法,则捕进buf_CT,count_T清0,对下一个脉冲信号计时
  88   1              {
  89   2                      buf_CT=count_T;
  90   2                      count_T=0;
  91   2              }
  92   1              delay_ms(1);//延时100us以消除下降沿跳变抖动
  93   1              if(inf==0)//INT1引脚稳定为低电平,则表示确实是信号,count_T重新计时,因上面延时了100us,故要补偿2次T0中断
  94   1              {
  95   2                      count_T=10;
  96   2              }
  97   1              if(buf_CT>15&&buf_CT<250)//若收到的信号合法,则再进行以下的信号分析
  98   1              {
  99   2                      if(inf_status==0)//若当前信号接收系统处于空闲状态,则标志进入前导码接收区
 100   2                      {
 101   3                              if(buf_CT>210&&buf_CT<250)//捕捉前导码
 102   3                              {
 103   4                                      inf_status=1;//标志进入前导码接收区
 104   4                                      buf_key_code=0;
 105   4                                      key_bit_count=0;                                        
 106   4                                      buf_CT=0;
 107   4                              }
 108   3                      }
 109   2                      else if(inf_status==1)//前导码接收区(收到的脉冲全部忽略)
 110   2                      {
 111   3                              if((buf_CT>15&&buf_CT<25)||(buf_CT>32&&buf_CT<45))//脉冲接收
 112   3                              {                                                               
 113   4                                      common_code_count++;//脉冲数计算
 114   4                                      if(common_code_count>=26)//若收够了26个脉冲
 115   4                                      {
 116   5                                              inf_status=2;//则标志进入数据接收区
 117   5                                              common_code_count=0;//脉冲计数清0
C51 COMPILER V8.02   TELECONTROL                                                           05/19/2008 12:28:18 PAGE 3   

 118   5                                              key_bit_count=0;
 119   5                                              buf_key_code=0;
 120   5                                      }       
 121   4                              }
 122   3                      }
 123   2                      else if(inf_status==2)//数据接收区
 124   2                      {
 125   3                              if(buf_CT>15&&buf_CT<25)//窄脉冲接收
 126   3                              {
 127   4                                      buf_key_code>>=1;//接收0
 128   4                                      key_bit_count++;
 129   4                                                                       
 130   4                              }
 131   3                              else if(buf_CT>32&&buf_CT<45)//宽脉冲接收
 132   3                              {
 133   4                                      buf_key_code>>=1;
 134   4                                      buf_key_code|=0x80;//接收1
 135   4                                      key_bit_count++;//数据脉冲数累加,一共有8个
 136   4                              } 
 137   3                              if(key_bit_count>=8)//若收完8位个数据脉冲,则进行以下的处理
 138   3                              {
 139   4                                      inf_status=0;//标志接收系统返回空闲状态
 140   4                                      key_bit_count=0;
 141   4                                      key_code=buf_key_code;
 142   4                                      buf_key_code=0;
 143   4                                      TR0=0;
 144   4                                      count_T=600;                                    
 145   4                              }                       
 146   3                      }
 147   2                      buf_CT=0;
 148   2              } 
 149   1              led1=1;
 150   1              EX1=1;  
 151   1      }
 152          
 153          
 154          
 155          
 156          
 157          
 158          
 159          


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