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

📄 遥控解码程序.lst

📁 基于51单片机的控制的红外线通信
💻 LST
字号:
C51 COMPILER V7.08   襙控絖码砡序                                                          08/22/2007 15:13:45 PAGE 1   


C51 COMPILER V7.08, COMPILATION OF MODULE 襙控絖码砡序
OBJECT MODULE PLACED IN 遥控解码程序.OBJ
COMPILER INVOKED BY: D:\单片机~1\C51\Bin\c51.exe 遥控解码程序.c DB OE SMALL ROM(LARGE)

line level    source

*** WARNING C500 IN LINE 1 OF 遥控解码程序.C: MISSING DEVICE (SECURITY KEY NOT FOUND)
   1          //红外线遥控器软件解码原理和程序(C语言)
   2          //红外线一开始发送一段13.5ms的引导码,引导码由9ms的高电平和4.5ms的低电平组成,跟着引导码
   3          //是系统码,系统反码,按键码,按键反码,如果按着键不放,则遥控器则发送一段重复码,重复码
   4          //由9ms的高电平,2.25ms的低电平,跟着是一个短脉冲。
   5          
   6          #include"reg52.h"
   7          #define      NULL        0x00//数据无效
   8          #define      RESET       0X01//程序复位
   9          #define      REQUEST     0X02//请求信号
  10          #define      ACK         0x03//应答信号,在接收数据后发送ACK信号表示数据接收正确,
  11                                       //也位请求信号的应答信号
  12          #define      NACK        0x04//应答信号,表示接收数据错误
  13          #define      BUSY        0x05//忙信号,表示正在忙
  14          #define      FREE        0x06//空闲信号,表示处于空闲状态
  15          #define      READ_IR     0x0b//读取红外
  16          #define      STORE_IR    0x0c//保存数据
  17          #define      READ_KEY    0x0d//读取键值
  18          #define      RECEIVE     0Xf400//接收缓冲开始地址
  19          #define      SEND        0xfa00//发送缓冲开始地址
  20          #define      IR          0x50//红外接收缓冲开始地址
  21          #define      HEAD        0xaa//数据帧头
  22          #define      TAIL        0x55//数据帧尾
  23          #define      SDA         P1^7
  24          #define      SCL         P1^6
  25          
  26          
  27          unsigned char xdata *buf1;   //接受数据缓冲
  28          unsigned int   buf1_length;   //接收到的数据实际长度
  29          unsigned char xdata *buf2;   //发送数据缓冲
  30          unsigned int   buf2_length;   //要发送的数据实际长度
  31          bit buf1_flag;     //接收标志,1表示接受到一个数据帧,0表示没有接受到数据帧或数据
  32          //帧为空
  33          
  34          bit buf2_flag;     //发送标志,1表示需要发送或没发送完毕,0表示没有要发送的数据或
  35          //发送完毕
  36          unsigned char state1,state2;          //用来标志接收字符的状态,state1用来表示接
  37          //收状态,state2用来表示发送状态
  38          unsigned char data *ir;
  39          union{
  40               unsigned char a[2];
  41               unsigned int b;
  42               unsigned char data *p1[2];
  43               unsigned int data *p2[2];
  44               unsigned char xdata *p3;     //红外缓冲的指针
  45               unsigned int xdata *p4;
  46          }p;
  47          //union{                        //
  48             //   unsigned char a[2];            //
  49             //   unsigned int b;
  50             //   unsigned char data *p1[2];
  51             //   unsigned int data *p2[2];
  52             //   unsigned char xdata *p3;
  53             //   unsigned int xdata *p4;        //地址指针
  54          //}q;                         //
C51 COMPILER V7.08   襙控絖码砡序                                                          08/22/2007 15:13:45 PAGE 2   

  55          
  56          union{
  57              unsigned char a[2];
  58              unsigned int b;
  59          }count;
  60          union{
  61              unsigned char a[2];
  62              unsigned int b;
  63          }temp;
  64          union{
  65              unsigned char a[4];
  66              unsigned int b[2];
  67              unsigned long c;
  68          }ir_code;
  69          
  70          union{
  71              unsigned char a[4];
  72              unsigned int b[2];
  73              unsigned long c;
  74              unsigned char data *p1[4];
  75              unsigned int data *p2[4];
  76              unsigned char xdata *p3[2];
  77              unsigned int xdata *p4[2];
  78          }I;
  79          unsigned char ir_key;
  80          bit ir_flag;         //红外接收标志,0为缓冲区空,1为接收成功,2为缓冲溢出
  81          void sub(void);
  82          void delay(void);
  83          void ie_0(void);
  84          void tf_0(void);
  85          void ie_1(void);
  86          void tf_1(void);
  87          void tf_2(void);
  88          void read_ir(void);
  89          void ir_jiema(void);
  90          void ir_init(void);
  91          void ir_exit(void);
  92          void store_ir(void);
  93          void read_key(void);
  94          void reset_iic(void);
  95          unsigned char read_byte_ack_iic(void);
  96          unsigned char read_byte_nack_iic(void);
  97          bit write_byte_iic(unsigned char a);
  98          void send_ack_iic(void);
  99          void send_nack_iic(void);
 100          bit receive_ack_iic(void);
 101          void start_iic(void);
 102          void stop_iic(void);
 103          void write_key_data(unsigned char a);
 104          unsigned int read_key_data(unsigned char a);
 105          void ie0(void)    interrupt 0{ie_0();}
 106          void tf0(void)    interrupt 1{tf_0();}
 107          void ie1(void)    interrupt 2{ie_1();}
 108          void tf1(void)    interrupt 3{tf_1();tf_2();}
 109          void tf2(void)    interrupt 5{             //采用中断方式跟查询方式相结合的办法解码
 110   1          EA=0;                                  //禁止中断
 111   1          if(TF2){                               //判断是否是溢出还是电平变化产生的中断
 112   2               TF2=0;                            //如果是溢出产生的中断则清除溢出位,重新开放中断退出
 113   2               EA=1;
 114   2               goto end;
 115   2           }
 116   1          EXF2=0;                                //清除电平变化产生的中断位
C51 COMPILER V7.08   襙控絖码砡序                                                          08/22/2007 15:13:45 PAGE 3   

 117   1          *ir=RCAP2H;                             //把捕捉的数保存起来
 118   1          ir++;
 119   1          *ir=RCAP2L;
 120   1          *ir++;
*** WARNING C275 IN LINE 120 OF 遥控解码程序.C: expression with possibly no effect
 121   1          F0=1;
 122   1          TR0=1;                                  //开启计数器0
 123   1      loop:
 124   1          TL0=0;   //将计数器0重新置为零
 125   1          TH0=0;
 126   1          while(!EXF2){                          //查询等待EXF2变为1
 127   2               if(TF0)goto exit;                 //检查有没超时,如果超时则退出
 128   2          };
 129   1          EXF2=0;                                //将EXF2清零
 130   1          if(!TH0)                             //判断是否是长低电平脉冲过来了
 131   1          {                                      //不是长低电平脉冲而是短低电平
 132   2             if(F0)count.b++;                       //短脉冲数加一
 133   2             temp.a[0]=RCAP2H;                   //将捕捉数临时存放起来
 134   2             temp.a[1]=RCAP2L;
 135   2             goto loop;                          //返回继续查询
 136   2          }
 137   1          else{                                  //是低电平脉冲,则进行处理
 138   2      
 139   2              F0=0;
 140   2              *ir=temp.a[0];        //把连续的短脉冲总时间记录下来
 141   2              ir++;
 142   2              *ir=temp.a[1];
 143   2              ir++;
 144   2              *ir=RCAP2H;           //把长电平脉冲时间记录下来
 145   2              ir++;
 146   2              *ir=RCAP2L;
 147   2              ir++;
 148   2              if(ir>=0xda) {
 149   3                        goto exit;     //判断是否溢出缓冲,如果溢出则失败退出
 150   3              }
 151   2              goto loop;          //返回继续查询
 152   2              }
 153   1      exit:
 154   1              ir_flag=1;        //置ir_flag为1表示接收成功
 155   1      end:
 156   1              ;
 157   1      }
 158          
 159          
 160          void rs232(void)    interrupt   4{
 161   1            static unsigned char sbuf1,sbuf2,rsbuf1,rsbuf2;       //sbuf1,sbuf2用来接收
 162   1      //发送临时用,rsbuf1,rsbuf2用来分别用来存放接收发送的半字节
 163   1            EA=0;                                          //禁止中断
 164   1            if(RI){
 165   2                RI=0;                                      //清除接收中断标志位
 166   2                sbuf1=SBUF;                                //将接收缓冲的字符复制到sbuf1
 167   2                if(sbuf1==HEAD){                                   //判断是否帧开头
 168   3                                state1=10;                  //是则把state赋值为10
 169   3                                buf1=RECEIVE;               //初始化接收地址                        
 170   3                }
 171   2                else{
 172   3                switch(state1){
 173   4                case 10:sbuf2=sbuf1>>4;                    //把高半字节右移到的半字节
 174   4                        sbuf2=~sbuf2;                      //把低半字节取反
 175   4                        if((sbuf2&0x0f)!=(sbuf1&0x0f))     //判断接收是否正确
 176   4                             {                             //接收错误,有可能接收的是数据帧尾,也有可能是接收错

⌨️ 快捷键说明

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