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

📄 test.lst

📁 使用2051单片机对2272进行解码的完全代码,可直接拿来修改成很强的遥控器.
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.20   TEST                                                                  11/01/2004 17:44:53 PAGE 1   


C51 COMPILER V7.20, COMPILATION OF MODULE TEST
OBJECT MODULE PLACED IN test.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE test.c ROM(COMPACT) BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <reg51.h>
   2          
   3          
   4          sbit FS1 = P3^7;
   5          sbit FS2 = P1^0;
   6          sbit BEEP = P1^1;
   7          
   8          sbit LED1 = P1^2;
   9          sbit LED2 = P1^4;
  10          sbit IR_IN = P3^2;
  11          
  12          unsigned char ir_timer=0;
  13          unsigned int jiffies=0;
  14          void clock_timer(void) interrupt 1 using 1{
  15   1              ir_timer++;
  16   1              jiffies++;
  17   1      }
  18          
  19          void clock_init(void){
  20   1              jiffies = 0;
  21   1              TMOD=0x02;
  22   1      //      TH0=TL0=0x9b;//12M
  23   1      //      TH0=TL0=0x7a;//16M
  24   1      //      TH0=TL0=0x75;//16.59M
  25   1      //      TH0=TL0=0x72;//17M
  26   1      //      TH0=TL0=0x37;//24M
  27   1              TH0=TL0=0xa0;//22M
  28   1              EA=1;
  29   1              ET0=1;
  30   1      
  31   1              TR0=1;
  32   1      }
  33          void init_serialcomm(void)
  34          {
  35   1          SCON  = 0x50;       //SCON: serail mode 1, 8-bit UART, enable ucvr 
  36   1          TMOD |= 0x20;       //TMOD: timer 1, mode 2, 8-bit reload 
  37   1          PCON |= 0x80;       //SMOD=1; 
  38   1          TH1   = 0xFF;       //Baud:4800  fosc=11.0592MHz  :f4
  39   1          //IE   |= 0x90;       //Enable Serial Interrupt 
  40   1          TR1   = 1;          // timer 1 run
  41   1              RI=0;
  42   1              TI=1; 
  43   1      }
  44          
  45          void serial_out(unsigned char d){
  46   1              while(!TI);
  47   1              TI=0;
  48   1              SBUF=(d);
  49   1      }
  50          
  51          //等待指定长度的串行数据到达,超时值为每两个字节之间的间隔时间而非等待整个串的时间.
  52          //超时单位为time_out * 100uS,为0时为永久等待
  53          bit wait_serial(unsigned char *p, unsigned char len, unsigned char time_out){
  54   1              unsigned int time=jiffies;
  55   1              unsigned char n=0;
C51 COMPILER V7.20   TEST                                                                  11/01/2004 17:44:53 PAGE 2   

  56   1              while(time_out == 0 || jiffies-time < time_out){
  57   2                      if (RI){
  58   3                              p[n++]=SBUF;
  59   3                              RI=0;
  60   3                              if(n==len)
  61   3                                      return 0;
  62   3                              time=jiffies;
  63   3                      }
  64   2              }
  65   1              return 1;
  66   1      }
  67          
  68          unsigned char ir_step=0;
  69          unsigned int ir_addr;
  70          unsigned char ir_data;
  71          unsigned char ir_buf[3];
  72          bit ir_status,ir_last_status;
  73          void ir_test(void){
  74   1              unsigned char __ir_timer;
  75   1      
  76   1              if (ir_step == 50)//数据未取走,停止红外接收.
  77   1                      return;
  78   1      
  79   1              ir_status=IR_IN;
  80   1      
  81   1              if (ir_last_status==ir_status){//超时处理
  82   2                      if (ir_step>0 && ir_timer>0x4a){
  83   3                              ir_timer=0;
  84   3                              ir_step=0;
  85   3                      }
  86   2                      return;
  87   2              }
  88   1      
  89   1              __ir_timer=ir_timer;
  90   1              ir_timer=0;
  91   1              ir_step++;
  92   1              ir_last_status=ir_status;
  93   1      
  94   1              if(ir_step < 50 && __ir_timer > 0x7){//误码处理,提前出现数据码以外的非正常宽度编码,正常数据码宽度应小于0x
             -5
  95   2                      ir_step = 0;
  96   2                      return;
  97   2              }
  98   1      
  99   1      //0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 94
 100   1      //0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 0 1 0 1 1 0 1 0 1 0 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 0 1 0 94
 101   1      //数据转换规则:前32位每4位取中间两位,合成16字节地址,之后16位每两位取第1位,得到8位键值
 102   1      //地址:ED FF
 103   1      //键值:FC F3 CF 3F  分别对应按键A,B,C,D
 104   1      
 105   1              if(ir_step <= 32){
 106   2                      if((ir_step & 3)==2 || (ir_step & 3)==3){
 107   3                              ir_addr >>= 1;
 108   3                              if(__ir_timer < 4)//1 --- 3
 109   3                                      ir_addr &= 0x7fff;
 110   3                              if(__ir_timer > 4) //5 -- 7
 111   3                                      ir_addr |= 0x8000;
 112   3                              else
 113   3                                      ir_step = 0;
 114   3                      }
 115   2              }else
 116   1              if(ir_step>32 && ir_step<=48){
C51 COMPILER V7.20   TEST                                                                  11/01/2004 17:44:53 PAGE 3   

 117   2                      if((ir_step & 1)==0){
 118   3                              ir_data >>= 1;
 119   3                              if(__ir_timer < 4)//1 --- 3
 120   3                                      ir_data &= 0x7f;
 121   3                              else
 122   3                              if(__ir_timer > 4) //5 -- 7
 123   3                                      ir_data |= 0x80;
 124   3                              else
 125   3                                      ir_step = 0;
 126   3                      }
 127   2              }else
 128   1              if(ir_step>48 && ir_step<=50){
 129   2                      if(ir_step==50){
 130   3                              if (__ir_timer < 0x36 || __ir_timer > 0x4a)//接收码收0x1d结束,未收到该码则为出错
 131   3                                      ir_step=0;
 132   3                              else{
 133   4                                      ir_buf[0]=ir_addr>>8;
 134   4                                      ir_buf[1]=ir_addr;
 135   4                                      ir_buf[2]=ir_data;
 136   4                              }
 137   3                      }
 138   2              }
 139   1      }
 140          
 141          
 142          #if 0
              
              void ee_write(unsigned char ee_addrh,unsigned char ee_addrl,unsigned char ee_num,unsigned char *sp);
              void ee_read(unsigned char ee_addrh,unsigned char ee_addrl,unsigned char ee_num,unsigned char *sp);
              
              void setup12887(unsigned char *p);//*p指向7字节数组,从0到6分别是秒 分 时 星期 日 月 年
              void read12887(unsigned char *p);//*p指向7字节数组,从0到6分别是秒 分 时 星期 日 月 年
              void start12887(void);
              
              unsigned char date[7];
              
              void sleep(unsigned int t){
                      unsigned int time=jiffies;
                      while(jiffies-time<t);
              }
              
              typedef struct log_s{
                      unsigned char index;
                      unsigned char year;
                      unsigned char month;
                      unsigned char day;
                      unsigned char hou;
                      unsigned char min;
                      unsigned char sec;
                      unsigned char rsv1;
              } log_t;
              
              #include <string.h>
              unsigned char log_pos=0;
              unsigned char log_index=0;
              #define MAX_LOGS 60
              
              void find_log_pos(){
                      log_t log;
                      log_index=0;
                      log_pos=0;
              
C51 COMPILER V7.20   TEST                                                                  11/01/2004 17:44:53 PAGE 4   

                      memset((void *)&log, 0xff, sizeof(log_t));
                      ee_read(log_pos>>5, log_pos<<3, sizeof(log_t), (unsigned char*)&log);
                      if(log.year==0xff)
                              return;
                      log_index=log.index;
              
                      for(log_pos=1; log_pos<MAX_LOGS; log_pos++){
                              memset((void *)&log, 0xff, sizeof(log_t));
                              ee_read(log_pos>>5, log_pos<<3, sizeof(log_t), (unsigned char*)&log);
                              log_index++;
                              if(log.year==0xff)
                                      return;
                              if(log.index == log_index)
                                      continue;
                              return;
                      }
                      if (log_pos==MAX_LOGS)
                              log_index++;
              }
              
              void write_log(){
                      log_t log;
              
                      memset((void *)&log, 0xff, sizeof(log_t));

⌨️ 快捷键说明

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