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

📄 infrared_test.s

📁 AVR 红外接收源代码,对学习红外的人很有帮助
💻 S
字号:
	.module infrared_test.c
	.area vector(rom, abs)
	.org 4
	rjmp _int1_isr
	.org 18
	rjmp _t0_isr
	.area text(rom, con, rel)
	.dbfile D:\开发板\source\infrared\infrared_test\infrared_test.c
	.dbfunc e init_infr _init_infr fV
;              i -> R16
	.even
_init_infr::
	.dbline -1
	.dbline 30
; /******************************************/
; /*             北京MCU学习之家            */
; /*            红外输入演示程序            */
; /*             作者:白如冰                */
; /*             2005年10月1日              */
; /*  目标MCU:MEGA8   晶振:外部(EXT) 8MHZ   */
; /******************************************/
; //红外接收头的引脚定义 
; //   1----->data-----> (PD3(int1))
; //   2----->gnd
; //   3----->vss
; /******************************************/
; 
; #include <iom8v.h>
; #include <macros.h>
; #pragma interrupt_handler int1_isr:iv_INT1
; #pragma interrupt_handler t0_isr:iv_TIMER0_OVF
; 
; #define INFR_DIR      DDRD
; #define INFR_PORT     PORTD
; #define INFR_DATA     3
; #define buffer_max    75
; unsigned char infra_data[4],rece_flag;
; unsigned int counter_buffer[buffer_max];
; unsigned char flag_start,rece_data_count,t0_counter,flag_t0;
; 
; 
; /* 初始化外部中断1 */  
; void init_infr(void) 
;     {
	.dbline 32
; 	 unsigned char i;
; 	 INFR_DIR&=~(1<<INFR_DATA); //PD3为输入方向
	cbi 0x11,3
	.dbline 33
; 	 INFR_PORT|=1<<INFR_DATA;   //PD3初始为高电平
	sbi 0x12,3
	.dbline 34
; 	 MCUCR = 0x04; //int1 电平变化产生中断
	ldi R24,4
	out 0x35,R24
	.dbline 35
;      GICR  = 0x80; //int1 外部中断使能 
	ldi R24,128
	out 0x3b,R24
	.dbline 36
; 	 TCCR0=0; //T0 1024分频
	clr R2
	out 0x33,R2
	.dbline 37
; 	 TCNT0=0; //初始值为0 32ms中断一次,200ms许7次
	out 0x32,R2
	.dbline 38
; 	 TIMSK=1;//允许T0溢出中断
	ldi R24,1
	out 0x39,R24
	.dbline 39
; 	 TCCR1B=0;//关闭定时器T1
	out 0x2e,R2
	.dbline 40
; 	 TCNT1=0; //初始值为0
	clr R3
	out 0x2d,R3
	out 0x2c,R2
	.dbline 41
; 	 flag_start=0;
	sts _flag_start,R2
	.dbline 42
; 	 rece_data_count=0;
	sts _rece_data_count,R2
	.dbline 43
; 	 t0_counter=0;
	sts _t0_counter,R2
	.dbline 44
; 	 for(i=0;i<buffer_max;i++)
	clr R16
	rjmp L5
L2:
	.dbline 45
	ldi R24,2
	mul R24,R16
	movw R30,R0
	ldi R24,<_counter_buffer
	ldi R25,>_counter_buffer
	add R30,R24
	adc R31,R25
	clr R2
	clr R3
	std z+1,R3
	std z+0,R2
L3:
	.dbline 44
	inc R16
L5:
	.dbline 44
	cpi R16,75
	brlo L2
	.dbline 46
; 	 counter_buffer[i]=0;
; 	 infra_data[0]=0x31;
	ldi R24,49
	sts _infra_data,R24
	.dbline 47
; 	 infra_data[1]=0x32;
	ldi R24,50
	sts _infra_data+1,R24
	.dbline 48
; 	 infra_data[2]=0x33;
	ldi R24,51
	sts _infra_data+2,R24
	.dbline 49
; 	 infra_data[3]=0x34;
	ldi R24,52
	sts _infra_data+3,R24
	.dbline 50
; 	 rece_flag=0;
	clr R2
	sts _rece_flag,R2
	.dbline 51
; 	 flag_t0=0;
	sts _flag_t0,R2
	.dbline 52
; 	 SEI();  //全局中断使能
	sei
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 c
	.dbend
	.dbfunc e int1_isr _int1_isr fV
;              i -> R20
	.even
_int1_isr::
	st -y,R0
	st -y,R1
	st -y,R2
	st -y,R3
	st -y,R16
	st -y,R17
	st -y,R18
	st -y,R19
	st -y,R24
	st -y,R25
	st -y,R30
	st -y,R31
	in R0,0x3f
	st -y,R0
	rcall push_gset1
	.dbline -1
	.dbline 59
;      
;     }
; 
; /*外部中断1 中断函数 */	
; 
; void int1_isr(void)
; { 
	.dbline 62
;   unsigned char i;
;   
;   if(flag_start==0)   //开始计时T1
	lds R2,_flag_start
	tst R2
	brne L10
	.dbline 63
;   {
	.dbline 64
;     TCCR1B=2;//开始计时 8分频
	ldi R24,2
	out 0x2e,R24
	.dbline 65
; 	flag_start=1;
	ldi R24,1
	sts _flag_start,R24
	.dbline 66
;   }
	rjmp L11
L10:
	.dbline 69
;   
;   else
;   {  
	.dbline 71
;      
;      TCCR1B=0;
	clr R2
	out 0x2e,R2
	.dbline 72
; 	 counter_buffer[rece_data_count++]=TCNT1;
	lds R2,_rece_data_count
	clr R3
	mov R24,R2
	subi R24,255    ; addi 1
	sts _rece_data_count,R24
	ldi R16,2
	ldi R17,0
	movw R18,R2
	rcall empy16s
	movw R30,R16
	ldi R24,<_counter_buffer
	ldi R25,>_counter_buffer
	add R30,R24
	adc R31,R25
	in R2,0x2c
	in R3,0x2d
	std z+1,R3
	std z+0,R2
	.dbline 73
; 	 TCNT1=0;
	clr R2
	clr R3
	out 0x2d,R3
	out 0x2c,R2
	.dbline 74
;      TCCR1B=2; //T0 8分频 开始计时
	ldi R24,2
	out 0x2e,R24
	.dbline 75
; 	 if((counter_buffer[0]<4000)&&(counter_buffer[1]>5000)) //如果第一个数据不是有效数据退出
	lds R24,_counter_buffer
	lds R25,_counter_buffer+1
	cpi R24,160
	ldi R30,15
	cpc R25,R30
	brsh L12
	ldi R24,5000
	ldi R25,19
	lds R2,_counter_buffer+2
	lds R3,_counter_buffer+2+1
	cp R24,R2
	cpc R25,R3
	brsh L12
	.dbline 76
; 	 { 
	.dbline 77
; 	    for(i=0;i<buffer_max;i++) 
	clr R20
	rjmp L18
L15:
	.dbline 78
	ldi R24,2
	mul R24,R20
	movw R30,R0
	ldi R24,<_counter_buffer
	ldi R25,>_counter_buffer
	add R30,R24
	adc R31,R25
	clr R2
	clr R3
	std z+1,R3
	std z+0,R2
L16:
	.dbline 77
	inc R20
L18:
	.dbline 77
	cpi R20,75
	brlo L15
	.dbline 79
; 	   counter_buffer[i]=0;    //清空缓冲区
; 	   rece_data_count=0;      //接收数据计时清 0
	clr R2
	sts _rece_data_count,R2
	.dbline 80
; 	   flag_start=0;           //开始标志置0
	sts _flag_start,R2
	.dbline 81
; 	   TCCR1B=0;               //关闭定时器 T1
	out 0x2e,R2
	.dbline 82
;   	   TCNT1=0;                //定时器T1 清0
	clr R3
	out 0x2d,R3
	out 0x2c,R2
	.dbline 83
; 	   TCCR0=0;               //关闭定时器 T0
	out 0x33,R2
	.dbline 84
; 	   TCNT0=0;                  //定时器T0 清0
	out 0x32,R2
	.dbline 85
; 	   flag_t0=0;
	sts _flag_t0,R2
	.dbline 87
; 	   
; 	   return;
	rjmp L9
L12:
	.dbline 91
; 	  }
; 	  else
; 	  //如果是有效数据
; 	  {
	.dbline 94
; 	
; 	  
; 	  if(flag_t0==0)
	lds R2,_flag_t0
	tst R2
	brne L19
	.dbline 95
; 	  {
	.dbline 96
; 	  TCNT0=0;  //定时器T0 清0
	clr R2
	out 0x32,R2
	.dbline 97
; 	  TCCR0=5; //T0 1024分频 开始计时100MS
	ldi R24,5
	out 0x33,R24
	.dbline 98
; 	  flag_t0=1;
	ldi R24,1
	sts _flag_t0,R24
	.dbline 99
; 	  }
L19:
	.dbline 100
	.dbline 103
L11:
	.dbline -2
L9:
	rcall pop_gset1
	ld R0,y+
	out 0x3f,R0
	ld R31,y+
	ld R30,y+
	ld R25,y+
	ld R24,y+
	ld R19,y+
	ld R18,y+
	ld R17,y+
	ld R16,y+
	ld R3,y+
	ld R2,y+
	ld R1,y+
	ld R0,y+
	.dbline 0 ; func end
	reti
	.dbsym r i 20 c
	.dbend
	.dbfunc e t0_isr _t0_isr fV
;              i -> R16
	.even
_t0_isr::
	st -y,R0
	st -y,R1
	st -y,R2
	st -y,R3
	st -y,R16
	st -y,R17
	st -y,R24
	st -y,R25
	st -y,R30
	st -y,R31
	in R0,0x3f
	st -y,R0
	.dbline -1
	.dbline 111
; 	  }
; 	
; 	 
;   } 
; 
;  
; }
; 
; /*定时器T0 中断函数 */	
; 
; void t0_isr(void)
; {
	.dbline 114
;   unsigned char i;
; 
;  TCNT0=0;
	clr R2
	out 0x32,R2
	.dbline 115
;  t0_counter++;
	lds R24,_t0_counter
	subi R24,255    ; addi 1
	sts _t0_counter,R24
	.dbline 116
;  if(t0_counter>3)
	ldi R24,3
	lds R2,_t0_counter
	cp R24,R2
	brlo X0
	rjmp L22
X0:
	.dbline 117
;  {
	.dbline 119
;   
;   GICR  = 0x00;          //关掉外部中断1
	clr R2
	out 0x3b,R2
	.dbline 120
;   TCCR0=0;               //关掉T0
	out 0x33,R2
	.dbline 121
;   TCNT0=0;
	out 0x32,R2
	.dbline 122
;   TCCR1B=0;               //关闭定时器 T1
	out 0x2e,R2
	.dbline 123
;   TCNT1=0;                //定时器T1 清0
	clr R3
	out 0x2d,R3
	out 0x2c,R2
	.dbline 125
;   
;   t0_counter=0;
	sts _t0_counter,R2
	.dbline 127
;   
;  if((counter_buffer[1]>4000)&&(counter_buffer[1]<5000)&&
	ldi R24,4000
	ldi R25,15
	lds R2,_counter_buffer+2
	lds R3,_counter_buffer+2+1
	cp R24,R2
	cpc R25,R3
	brlo X1
	rjmp L24
X1:
	movw R24,R2
	cpi R24,136
	ldi R30,19
	cpc R25,R30
	brlo X2
	rjmp L24
X2:
	ldi R24,400
	ldi R25,1
	lds R2,_counter_buffer+132
	lds R3,_counter_buffer+132+1
	cp R24,R2
	cpc R25,R3
	brlo X3
	rjmp L24
X3:
	movw R24,R2
	cpi R24,188
	ldi R30,2
	cpc R25,R30
	brlo X4
	rjmp L24
X4:
	.dbline 129
;     (counter_buffer[66]>400)&&(counter_buffer[66]<700))
;     {
	.dbline 131
; 	//如果是有效数据
; 	   rece_flag=1;
	ldi R24,1
	sts _rece_flag,R24
	.dbline 132
; 	 for(i=3;i<66;i+=2)
	ldi R16,3
	rjmp L33
L30:
	.dbline 133
; 	{
	.dbline 134
; 	    if(counter_buffer[i]>800)
	ldi R24,2
	mul R24,R16
	movw R30,R0
	ldi R24,<_counter_buffer
	ldi R25,>_counter_buffer
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	ldd R3,z+1
	ldi R24,800
	ldi R25,3
	cp R24,R2
	cpc R25,R3
	brsh L34
	.dbline 135
; 	     {
	.dbline 136
; 	       if(i<18)
	cpi R16,18
	brsh L36
	.dbline 137
; 		   {
	.dbline 138
; 		     infra_data[0]>>=1;
	lds R2,_infra_data
	lsr R2
	sts _infra_data,R2
	.dbline 139
; 		     infra_data[0]|=0x80;
	mov R24,R2
	ori R24,128
	sts _infra_data,R24
	.dbline 140
; 	       }
	rjmp L35
L36:
	.dbline 141
; 		   else if(i<34)
	cpi R16,34
	brsh L38
	.dbline 142
; 		   {
	.dbline 143
; 		     infra_data[1]>>=1;
	lds R2,_infra_data+1
	lsr R2
	sts _infra_data+1,R2
	.dbline 144
; 		     infra_data[1]|=0x80;
	mov R24,R2
	ori R24,128
	sts _infra_data+1,R24
	.dbline 145
; 	       }
	rjmp L35
L38:
	.dbline 146
; 		   else if(i<50)
	cpi R16,50
	brsh L42
	.dbline 147
; 		   {
	.dbline 148
; 		     infra_data[2]>>=1;
	lds R2,_infra_data+2
	lsr R2
	sts _infra_data+2,R2
	.dbline 149
; 		     infra_data[2]|=0x80;
	mov R24,R2
	ori R24,128
	sts _infra_data+2,R24
	.dbline 150
; 	       }
	rjmp L35
L42:
	.dbline 151
; 		   else if(i<66)
	cpi R16,66
	brsh L35
	.dbline 152
; 		   {
	.dbline 153
; 		     infra_data[3]>>=1;
	lds R2,_infra_data+3
	lsr R2
	sts _infra_data+3,R2
	.dbline 154
; 		     infra_data[3]|=0x80;
	mov R24,R2
	ori R24,128
	sts _infra_data+3,R24
	.dbline 155
; 	       }
	.dbline 156
; 	     }	
	rjmp L35
L34:
	.dbline 158
; 		else
; 		 {
	.dbline 159
; 	     	if(i<18)
	cpi R16,18
	brsh L50
	.dbline 160
; 			{
	.dbline 161
; 			 infra_data[0]>>=1;
	lds R2,_infra_data
	lsr R2
	sts _infra_data,R2
	.dbline 162
; 			}
	rjmp L51
L50:
	.dbline 163
; 			else if(i<34)
	cpi R16,34
	brsh L52
	.dbline 164
; 			{
	.dbline 165
; 			 infra_data[1]>>=1;
	lds R2,_infra_data+1
	lsr R2
	sts _infra_data+1,R2
	.dbline 166
; 			}
	rjmp L53
L52:
	.dbline 167
; 		    else if(i<50)
	cpi R16,50
	brsh L55
	.dbline 168
; 			{
	.dbline 169
; 		     infra_data[2]>>=1;
	lds R2,_infra_data+2
	lsr R2
	sts _infra_data+2,R2
	.dbline 170
; 			}
	rjmp L56
L55:
	.dbline 171
; 		    else if(i<66)
	cpi R16,66
	brsh L58
	.dbline 172
; 		    {
	.dbline 173
; 		     infra_data[3]>>=1;
	lds R2,_infra_data+3
	lsr R2
	sts _infra_data+3,R2
	.dbline 174
; 		    }
L58:
L56:
L53:
L51:
	.dbline 175
; 	      }	
L35:
	.dbline 176
L31:
	.dbline 132
	subi R16,254    ; addi 2
L33:
	.dbline 132
	cpi R16,66
	brsh X5
	rjmp L30
X5:
	.dbline 177
; 	  }
; 	  for(i=0;i<buffer_max;i++)
	clr R16
	rjmp L64
L61:
	.dbline 178
	ldi R24,2
	mul R24,R16
	movw R30,R0
	ldi R24,<_counter_buffer
	ldi R25,>_counter_buffer
	add R30,R24
	adc R31,R25
	clr R2
	clr R3
	std z+1,R3
	std z+0,R2
L62:
	.dbline 177
	inc R16
L64:
	.dbline 177
	cpi R16,75
	brlo L61
	.dbline 179
; 	  counter_buffer[i]=0;
; 	  rece_data_count=0;
	clr R2
	sts _rece_data_count,R2
	.dbline 180
; 	  flag_start=0;
	sts _flag_start,R2
	.dbline 181
; 	  TCCR1B=0;
	out 0x2e,R2
	.dbline 182
;   	  TCNT1=0;
	clr R3
	out 0x2d,R3
	out 0x2c,R2
	.dbline 183
; 	  flag_t0=0;
	sts _flag_t0,R2
	.dbline 184
; 	  return;
	rjmp L21
L24:
	.dbline 190
; 	 
;     }
; 	
; 	//如果不是有效数据
; 	 
; 	  for(i=0;i<buffer_max;i++)
	clr R16
	rjmp L68
L65:
	.dbline 191
	ldi R24,2
	mul R24,R16
	movw R30,R0
	ldi R24,<_counter_buffer
	ldi R25,>_counter_buffer
	add R30,R24
	adc R31,R25
	clr R2
	clr R3
	std z+1,R3
	std z+0,R2
L66:
	.dbline 190
	inc R16
L68:
	.dbline 190
	cpi R16,75
	brlo L65
	.dbline 192
	clr R2
	sts _rece_data_count,R2
	.dbline 193
	sts _flag_start,R2
	.dbline 194
	out 0x2e,R2
	.dbline 195
	clr R3
	out 0x2d,R3
	out 0x2c,R2
	.dbline 196
	sts _flag_t0,R2
	.dbline 197
	ldi R24,128
	out 0x3b,R24
	.dbline 199
L22:
	.dbline -2
L21:
	ld R0,y+
	out 0x3f,R0
	ld R31,y+
	ld R30,y+
	ld R25,y+
	ld R24,y+
	ld R17,y+
	ld R16,y+
	ld R3,y+
	ld R2,y+
	ld R1,y+
	ld R0,y+
	.dbline 0 ; func end
	reti
	.dbsym r i 16 c
	.dbend
	.area bss(ram, con, rel)
	.dbfile D:\开发板\source\infrared\infrared_test\infrared_test.c
_flag_t0::
	.blkb 1
	.dbsym e flag_t0 _flag_t0 c
_t0_counter::
	.blkb 1
	.dbsym e t0_counter _t0_counter c
_rece_data_count::
	.blkb 1
	.dbsym e rece_data_count _rece_data_count c
_flag_start::
	.blkb 1
	.dbsym e flag_start _flag_start c
_counter_buffer::
	.blkb 150
	.dbsym e counter_buffer _counter_buffer A[150:75]i
_rece_flag::
	.blkb 1
	.dbsym e rece_flag _rece_flag c
_infra_data::
	.blkb 4
	.dbsym e infra_data _infra_data A[4:4]c

⌨️ 快捷键说明

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