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

📄 infrared_test.lis

📁 AVR 红外接收源代码,对学习红外的人很有帮助
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module infrared_test.c
                        .area vector(rom, abs)
                        .org 4
 0004 38C0              rjmp _int1_isr
                        .org 18
 0012 B7C0              rjmp _t0_isr
                        .area text(rom, con, rel)
 0000                   .dbfile D:\开发板\source\infrared\infrared_test\infrared_test.c
 0000                   .dbfunc e init_infr _init_infr fV
 0000           ;              i -> R16
                        .even
 0000           _init_infr::
 0000                   .dbline -1
 0000                   .dbline 30
 0000           ; /******************************************/
 0000           ; /*             北京MCU学习之家            */
 0000           ; /*            红外输入演示程序            */
 0000           ; /*             作者:白如冰                */
 0000           ; /*             2005年10月1日              */
 0000           ; /*  目标MCU:MEGA8   晶振:外部(EXT) 8MHZ   */
 0000           ; /******************************************/
 0000           ; //红外接收头的引脚定义 
 0000           ; //   1----->data-----> (PD3(int1))
 0000           ; //   2----->gnd
 0000           ; //   3----->vss
 0000           ; /******************************************/
 0000           ; 
 0000           ; #include <iom8v.h>
 0000           ; #include <macros.h>
 0000           ; #pragma interrupt_handler int1_isr:iv_INT1
 0000           ; #pragma interrupt_handler t0_isr:iv_TIMER0_OVF
 0000           ; 
 0000           ; #define INFR_DIR      DDRD
 0000           ; #define INFR_PORT     PORTD
 0000           ; #define INFR_DATA     3
 0000           ; #define buffer_max    75
 0000           ; unsigned char infra_data[4],rece_flag;
 0000           ; unsigned int counter_buffer[buffer_max];
 0000           ; unsigned char flag_start,rece_data_count,t0_counter,flag_t0;
 0000           ; 
 0000           ; 
 0000           ; /* 初始化外部中断1 */  
 0000           ; void init_infr(void) 
 0000           ;     {
 0000                   .dbline 32
 0000           ;        unsigned char i;
 0000           ;        INFR_DIR&=~(1<<INFR_DATA); //PD3为输入方向
 0000 8B98              cbi 0x11,3
 0002                   .dbline 33
 0002           ;        INFR_PORT|=1<<INFR_DATA;   //PD3初始为高电平
 0002 939A              sbi 0x12,3
 0004                   .dbline 34
 0004           ;        MCUCR = 0x04; //int1 电平变化产生中断
 0004 84E0              ldi R24,4
 0006 85BF              out 0x35,R24
 0008                   .dbline 35
 0008           ;      GICR  = 0x80; //int1 外部中断使能 
 0008 80E8              ldi R24,128
 000A 8BBF              out 0x3b,R24
 000C                   .dbline 36
 000C           ;        TCCR0=0; //T0 1024分频
 000C 2224              clr R2
 000E 23BE              out 0x33,R2
 0010                   .dbline 37
 0010           ;        TCNT0=0; //初始值为0 32ms中断一次,200ms许7次
 0010 22BE              out 0x32,R2
 0012                   .dbline 38
 0012           ;        TIMSK=1;//允许T0溢出中断
 0012 81E0              ldi R24,1
 0014 89BF              out 0x39,R24
 0016                   .dbline 39
 0016           ;        TCCR1B=0;//关闭定时器T1
 0016 2EBC              out 0x2e,R2
 0018                   .dbline 40
 0018           ;        TCNT1=0; //初始值为0
 0018 3324              clr R3
 001A 3DBC              out 0x2d,R3
 001C 2CBC              out 0x2c,R2
 001E                   .dbline 41
 001E           ;        flag_start=0;
 001E 20920300          sts _flag_start,R2
 0022                   .dbline 42
 0022           ;        rece_data_count=0;
 0022 20920200          sts _rece_data_count,R2
 0026                   .dbline 43
 0026           ;        t0_counter=0;
 0026 20920100          sts _t0_counter,R2
 002A                   .dbline 44
 002A           ;        for(i=0;i<buffer_max;i++)
 002A 0027              clr R16
 002C 0CC0              rjmp L5
 002E           L2:
 002E                   .dbline 45
 002E 82E0              ldi R24,2
 0030 809F              mul R24,R16
 0032 F001              movw R30,R0
 0034 80E0              ldi R24,<_counter_buffer
 0036 90E0              ldi R25,>_counter_buffer
 0038 E80F              add R30,R24
 003A F91F              adc R31,R25
 003C 2224              clr R2
 003E 3324              clr R3
 0040 3182              std z+1,R3
 0042 2082              std z+0,R2
 0044           L3:
 0044                   .dbline 44
 0044 0395              inc R16
 0046           L5:
 0046                   .dbline 44
 0046 0B34              cpi R16,75
 0048 90F3              brlo L2
 004A                   .dbline 46
 004A           ;        counter_buffer[i]=0;
 004A           ;        infra_data[0]=0x31;
 004A 81E3              ldi R24,49
 004C 80939B00          sts _infra_data,R24
 0050                   .dbline 47
 0050           ;        infra_data[1]=0x32;
 0050 82E3              ldi R24,50
 0052 80939C00          sts _infra_data+1,R24
 0056                   .dbline 48
 0056           ;        infra_data[2]=0x33;
 0056 83E3              ldi R24,51
 0058 80939D00          sts _infra_data+2,R24
 005C                   .dbline 49
 005C           ;        infra_data[3]=0x34;
 005C 84E3              ldi R24,52
 005E 80939E00          sts _infra_data+3,R24
 0062                   .dbline 50
 0062           ;        rece_flag=0;
 0062 2224              clr R2
 0064 20929A00          sts _rece_flag,R2
 0068                   .dbline 51
 0068           ;        flag_t0=0;
 0068 20920000          sts _flag_t0,R2
 006C                   .dbline 52
 006C           ;        SEI();  //全局中断使能
 006C 7894              sei
 006E                   .dbline -2
 006E           L1:
 006E                   .dbline 0 ; func end
 006E 0895              ret
 0070                   .dbsym r i 16 c
 0070                   .dbend
 0070                   .dbfunc e int1_isr _int1_isr fV
 0070           ;              i -> R20
                        .even
 0070           _int1_isr::
 0070 0A92              st -y,R0
 0072 1A92              st -y,R1
 0074 2A92              st -y,R2
 0076 3A92              st -y,R3
 0078 0A93              st -y,R16
 007A 1A93              st -y,R17
 007C 2A93              st -y,R18
 007E 3A93              st -y,R19
 0080 8A93              st -y,R24
 0082 9A93              st -y,R25
 0084 EA93              st -y,R30
 0086 FA93              st -y,R31
 0088 0FB6              in R0,0x3f
 008A 0A92              st -y,R0
 008C 00D0              rcall push_gset1
 008E                   .dbline -1
 008E                   .dbline 59
 008E           ;      
 008E           ;     }
 008E           ; 
 008E           ; /*外部中断1 中断函数 */       
 008E           ; 
 008E           ; void int1_isr(void)
 008E           ; { 
 008E                   .dbline 62
 008E           ;   unsigned char i;
 008E           ;   
 008E           ;   if(flag_start==0)   //开始计时T1
 008E 20900300          lds R2,_flag_start
 0092 2220              tst R2
 0094 31F4              brne L10
 0096                   .dbline 63
 0096           ;   {
 0096                   .dbline 64
 0096           ;     TCCR1B=2;//开始计时 8分频
 0096 82E0              ldi R24,2
 0098 8EBD              out 0x2e,R24
 009A                   .dbline 65
 009A           ;       flag_start=1;
 009A 81E0              ldi R24,1
 009C 80930300          sts _flag_start,R24
 00A0                   .dbline 66
 00A0           ;   }
 00A0 56C0              rjmp L11
 00A2           L10:
 00A2                   .dbline 69
 00A2           ;   
 00A2           ;   else
 00A2           ;   {  
 00A2                   .dbline 71
 00A2           ;      
 00A2           ;      TCCR1B=0;
 00A2 2224              clr R2
 00A4 2EBC              out 0x2e,R2
 00A6                   .dbline 72
 00A6           ;        counter_buffer[rece_data_count++]=TCNT1;
 00A6 20900200          lds R2,_rece_data_count
 00AA 3324              clr R3
 00AC 822D              mov R24,R2
 00AE 8F5F              subi R24,255    ; addi 1
 00B0 80930200          sts _rece_data_count,R24
 00B4 02E0              ldi R16,2
 00B6 10E0              ldi R17,0
 00B8 9101              movw R18,R2
 00BA 00D0              rcall empy16s
 00BC F801              movw R30,R16
 00BE 80E0              ldi R24,<_counter_buffer
 00C0 90E0              ldi R25,>_counter_buffer
 00C2 E80F              add R30,R24
 00C4 F91F              adc R31,R25
 00C6 2CB4              in R2,0x2c
 00C8 3DB4              in R3,0x2d
 00CA 3182              std z+1,R3
 00CC 2082              std z+0,R2
 00CE                   .dbline 73
 00CE           ;        TCNT1=0;
 00CE 2224              clr R2
 00D0 3324              clr R3
 00D2 3DBC              out 0x2d,R3
 00D4 2CBC              out 0x2c,R2
 00D6                   .dbline 74
 00D6           ;      TCCR1B=2; //T0 8分频 开始计时
 00D6 82E0              ldi R24,2
 00D8 8EBD              out 0x2e,R24
 00DA                   .dbline 75
 00DA           ;        if((counter_buffer[0]<4000)&&(counter_buffer[1]>5000)) //如果第一个数据不是有效数据退出
 00DA 80910400          lds R24,_counter_buffer
 00DE 90910500          lds R25,_counter_buffer+1
 00E2 803A              cpi R24,160
 00E4 EFE0              ldi R30,15
 00E6 9E07              cpc R25,R30
 00E8 38F5              brsh L12
 00EA 88E8              ldi R24,5000
 00EC 93E1              ldi R25,19
 00EE 20900600          lds R2,_counter_buffer+2
 00F2 30900700          lds R3,_counter_buffer+2+1
 00F6 8215              cp R24,R2
 00F8 9305              cpc R25,R3
 00FA F0F4              brsh L12
 00FC                   .dbline 76
 00FC           ;        { 
 00FC                   .dbline 77
 00FC           ;           for(i=0;i<buffer_max;i++) 
 00FC 4427              clr R20
 00FE 0CC0              rjmp L18
 0100           L15:
 0100                   .dbline 78
 0100 82E0              ldi R24,2
 0102 849F              mul R24,R20
 0104 F001              movw R30,R0
 0106 80E0              ldi R24,<_counter_buffer
 0108 90E0              ldi R25,>_counter_buffer
 010A E80F              add R30,R24
 010C F91F              adc R31,R25
 010E 2224              clr R2
 0110 3324              clr R3
 0112 3182              std z+1,R3
 0114 2082              std z+0,R2
 0116           L16:
 0116                   .dbline 77
 0116 4395              inc R20
 0118           L18:
 0118                   .dbline 77
 0118 4B34              cpi R20,75
 011A 90F3              brlo L15
 011C                   .dbline 79
 011C           ;          counter_buffer[i]=0;    //清空缓冲区
 011C           ;          rece_data_count=0;      //接收数据计时清 0
 011C 2224              clr R2
 011E 20920200          sts _rece_data_count,R2
 0122                   .dbline 80
 0122           ;          flag_start=0;           //开始标志置0
 0122 20920300          sts _flag_start,R2
 0126                   .dbline 81
 0126           ;          TCCR1B=0;               //关闭定时器 T1
 0126 2EBC              out 0x2e,R2
 0128                   .dbline 82
 0128           ;          TCNT1=0;                //定时器T1 清0
 0128 3324              clr R3
 012A 3DBC              out 0x2d,R3
 012C 2CBC              out 0x2c,R2
 012E                   .dbline 83
 012E           ;          TCCR0=0;               //关闭定时器 T0
 012E 23BE              out 0x33,R2
 0130                   .dbline 84
 0130           ;          TCNT0=0;                  //定时器T0 清0
 0130 22BE              out 0x32,R2
 0132                   .dbline 85
 0132           ;          flag_t0=0;
 0132 20920000          sts _flag_t0,R2
 0136                   .dbline 87
 0136           ;          
 0136           ;          return;
 0136 0BC0              rjmp L9
 0138           L12:
 0138                   .dbline 91
 0138           ;         }
 0138           ;         else
 0138           ;         //如果是有效数据
 0138           ;         {
 0138                   .dbline 94
 0138           ;       
 0138           ;         
 0138           ;         if(flag_t0==0)
 0138 20900000          lds R2,_flag_t0
 013C 2220              tst R2
 013E 39F4              brne L19
 0140                   .dbline 95
 0140           ;         {
 0140                   .dbline 96
 0140           ;         TCNT0=0;  //定时器T0 清0
 0140 2224              clr R2
 0142 22BE              out 0x32,R2
 0144                   .dbline 97
 0144           ;         TCCR0=5; //T0 1024分频 开始计时100MS
 0144 85E0              ldi R24,5
 0146 83BF              out 0x33,R24
 0148                   .dbline 98
 0148           ;         flag_t0=1;
 0148 81E0              ldi R24,1
 014A 80930000          sts _flag_t0,R24
 014E                   .dbline 99
 014E           ;         }
 014E           L19:
 014E                   .dbline 100
 014E                   .dbline 103
 014E           L11:
 014E                   .dbline -2
 014E           L9:
 014E 00D0              rcall pop_gset1
 0150 0990              ld R0,y+
 0152 0FBE              out 0x3f,R0
 0154 F991              ld R31,y+
 0156 E991              ld R30,y+
 0158 9991              ld R25,y+
 015A 8991              ld R24,y+
 015C 3991              ld R19,y+
 015E 2991              ld R18,y+
 0160 1991              ld R17,y+
 0162 0991              ld R16,y+
 0164 3990              ld R3,y+
 0166 2990              ld R2,y+
 0168 1990              ld R1,y+
 016A 0990              ld R0,y+
 016C                   .dbline 0 ; func end
 016C 1895              reti
 016E                   .dbsym r i 20 c
 016E                   .dbend
 016E                   .dbfunc e t0_isr _t0_isr fV
 016E           ;              i -> R16
                        .even
 016E           _t0_isr::
 016E 0A92              st -y,R0
 0170 1A92              st -y,R1
 0172 2A92              st -y,R2
 0174 3A92              st -y,R3
 0176 0A93              st -y,R16
 0178 1A93              st -y,R17
 017A 8A93              st -y,R24
 017C 9A93              st -y,R25
 017E EA93              st -y,R30
 0180 FA93              st -y,R31
 0182 0FB6              in R0,0x3f
 0184 0A92              st -y,R0
 0186                   .dbline -1
 0186                   .dbline 111
 0186           ;         }
 0186           ;       
 0186           ;        
 0186           ;   } 
 0186           ; 
 0186           ;  
 0186           ; }
 0186           ; 
 0186           ; /*定时器T0 中断函数 */        
 0186           ; 
 0186           ; void t0_isr(void)
 0186           ; {
 0186                   .dbline 114
 0186           ;   unsigned char i;
 0186           ; 
 0186           ;  TCNT0=0;
 0186 2224              clr R2
 0188 22BE              out 0x32,R2
 018A                   .dbline 115
 018A           ;  t0_counter++;
 018A 80910100          lds R24,_t0_counter
 018E 8F5F              subi R24,255    ; addi 1
 0190 80930100          sts _t0_counter,R24
 0194                   .dbline 116

⌨️ 快捷键说明

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