C51 COMPILER V8.08   MAIN                                                                  08/18/2015 10:40:55 PAGE 1   


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

line level    source

   1          /*********************************************************************************
   2          * 【编写时间】： 2014年3月5日
   3          * 【作    者】： 清翔电子:03
   4          * 【版    本】： 1.0
   5          * 【网    站】： http://www.qxmcu.com/ 
   6          * 【淘宝店铺】： http://qxmcu.taobao.com/ 
   7          * 【实验平台】： QX-MCS51 单片机开发板
   8          * 【外部晶振】： 11.0592mhz     
   9          * 【主控芯片】： STC89C52
  10          * 【编译环境】： Keil μVisio3  
  11          * 【程序功能】：                                                                                    
  12          * 【使用说明】： 
  13          *  说明：免费开源，不提供源代码分析.
  14          **********************************************************************************/
  15          /*-----------------------------------------------
  16            名称：遥控器红外解码数码管显示
  17            内容：按配套遥控器上1-9会在数码管上对应显示
  18          ------------------------------------------------*/
  19          #include<reg52.h>       //包含头文件，一般情况不需要改动，头文件包含特殊功能寄存器的定义
  20          
  21          sbit IR=P3^2;                   //红外接口标志
  22          
  23          #define DataPort P0     //定义数据端口 程序中遇到DataPort 则用P0 替换
  24          sbit LATCH1=P2^6;               //定义锁存使能端口 段锁存
  25          sbit LATCH2=P2^7;               //                 位锁存
  26          
  27          unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9
  28          unsigned char  irtime;  //红外用全局变量
  29          
  30          bit irpro_ok,irok;
  31          unsigned char IRcord[4];
  32          unsigned char irdata[33];
  33          
  34          void Ir_work(void);
  35          void Ircordpro(void);
  36          
  37          void tim0_isr (void) interrupt 1 using 1
  38          {
  39   1        irtime++;  //用于计数2个下降沿之间的时间
  40   1      }
  41          
  42          void EX0_ISR (void) interrupt 0 //外部中断0服务函数
  43          {
  44   1              static unsigned char  i;             //接收红外信号处理
  45   1              static bit startflag;                //是否开始处理标志位
  46   1      
  47   1              if(startflag)                         
  48   1              {
  49   2                      if(irtime<63&&irtime>=33)//引导码 TC9012的头码，9ms+4.5ms
  50   2                  i=0;
  51   2                      irdata[i]=irtime;//存储每个电平的持续时间，用于以后判断是0还是1
  52   2                      irtime=0;
  53   2                      i++;
  54   2                              if(i==33)
  55   2                      {
C51 COMPILER V8.08   MAIN                                                                  08/18/2015 10:40:55 PAGE 2   

  56   3                                      irok=1;
  57   3                                      i=0;
  58   3                              }
  59   2              }
  60   1              else
  61   1              {
  62   2                      irtime=0;
  63   2                      startflag=1;
  64   2              }
  65   1      }
  66          
  67          void TIM0init(void)//定时器0初始化
  68          {
  69   1              TMOD=0x02;//定时器0工作方式2，TH0是重装值，TL0是初值
  70   1              TH0=0x00; //重载值
  71   1              TL0=0x00; //初始化值
  72   1              ET0=1;    //开中断
  73   1              TR0=1;    
  74   1      }
  75          void EX0init(void)
  76          {
  77   1       IT0 = 1;   //指定外部中断0下降沿触发，INT0 (P3.2)
  78   1       EX0 = 1;   //使能外部中断
  79   1       EA = 1;    //开总中断
  80   1      }
  81          void Ir_work(void)//红外键值散转程序
  82          {
  83   1             switch(IRcord[2])//判断第三个数码值
  84   1                       {
  85   2                               case 0x0c:DataPort=dofly_DuanMa[1];break;//1 显示相应的按键值
  86   2                               case 0x18:DataPort=dofly_DuanMa[2];break;//2
  87   2                               case 0x5e:DataPort=dofly_DuanMa[3];break;//3
  88   2                               case 0x08:DataPort=dofly_DuanMa[4];break;//4
  89   2                               case 0x1c:DataPort=dofly_DuanMa[5];break;//5
  90   2                               case 0x5a:DataPort=dofly_DuanMa[6];break;//6
  91   2                               case 0x42:DataPort=dofly_DuanMa[7];break;//7
  92   2                               case 0x52:DataPort=dofly_DuanMa[8];break;//8
  93   2                               case 0x4a:DataPort=dofly_DuanMa[9];break;//9
  94   2                   default:break;
  95   2                               }
  96   1      
  97   1                        irpro_ok=0;//处理完成标志
  98   1      
  99   1      }
 100          void Ircordpro(void)//红外码值处理函数
 101          { 
 102   1              unsigned char i, j, k,cord,value;
 103   1              k=1;
 104   1              for(i=0;i<4;i++)      //处理4个字节
 105   1              {
 106   2                      for(j=1;j<=8;j++) //处理1个字节8位
 107   2                      {
 108   3                              cord=irdata[k];
 109   3                              if(cord>7)//大于某值为1，这个和晶振有绝对关系，这里使用12M计算，此值可以有一定误差
 110   3                              value=value|0x80;
 111   3                              if(j<8)
 112   3                              {
 113   4                                      value>>=1;
 114   4                              }
 115   3                              k++;
 116   3                      }
 117   2                      IRcord[i]=value;
C51 COMPILER V8.08   MAIN                                                                  08/18/2015 10:40:55 PAGE 3   

 118   2                      value=0;     
 119   2              } 
 120   1              irpro_ok=1;//处理完毕标志位置1
 121   1      }
 122          
 123          void main(void)
 124          {
 125   1              EX0init(); //初始化外部中断
 126   1              TIM0init();//初始化定时器
 127   1              LATCH1=0;      //位锁存
 128   1              DataPort=0xfe; //取位码 第一位数码管选通，即二进制1111 1110
 129   1              LATCH2=1;      //位锁存
 130   1              LATCH2=0;
 131   1              DataPort=0x3f; //取位码 第一位数码管选通，即二进制1111 1110
 132   1              LATCH1=1;      //位锁存
 133   1      
 134   1              while(1)//主循环
 135   1              {
 136   2                      if(irok)                        //如果接收好了进行红外处理
 137   2                      {   
 138   3                              Ircordpro();
 139   3                              irok=0;
 140   3                      }
 141   2                      if(irpro_ok)                   //如果处理好后进行工作处理，如按对应的按键后显示对应的数字等
 142   2                      {
 143   3                              Ir_work();
 144   3                      }
 145   2              }
 146   1      }
 147            
 148            


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    259    ----
   CONSTANT SIZE    =     10    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     39    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      3    ----
END OF MODULE INFORMATION.


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