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

📄 laserbeam.s

📁 AVR单片机实现的窗户红外光报警器程序
💻 S
字号:
	.module LaserBeam.c
	.area text(rom, con, rel)
	.dbfile C:\DOCUME~2\hb\MYDOCU~1\电子窗户防盗网\单片机程序1.1\LaserBeam.c
	.dbfunc e DelayUs _DelayUs fV
;              a -> R20,R21
;              t -> R16,R17
	.even
_DelayUs::
	rcall push_gset1
	.dbline -1
	.dbline 12
; /*
; 	电子窗户防盗网
; 	main.c
; 	硬件:CA-M8
; 	时钟:1MHz
; */
; 
; #include <io8515v.h>
; #include <macros.h>
; 
; void DelayUs(unsigned int t)
; {
	.dbline 14
	ldi R20,1
	ldi R21,0
	rjmp L5
L2:
	.dbline 14
	.dbline 14
	.dbline 14
L3:
	.dbline 14
	subi R20,255  ; offset = 1
	sbci R21,255
L5:
	.dbline 14
; 	int a;
; 	for (a = 1; a<t; a++){;}  
	cp R20,R16
	cpc R21,R17
	brlo L2
	.dbline -2
	.dbline 15
; }
L1:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r a 20 I
	.dbsym r t 16 i
	.dbend
	.dbfunc e DelayMs _DelayMs fV
;              a -> R20,R21
;              b -> R22,R23
;              t -> R16,R17
	.even
_DelayMs::
	rcall push_gset2
	.dbline -1
	.dbline 18
; 
; void DelayMs(unsigned int t)
; {
	.dbline 20
	ldi R20,1
	ldi R21,0
	rjmp L10
L7:
	.dbline 20
; 	int a, b;
; 	for (a = 1; a<t; a++){
	.dbline 21
	ldi R22,1
	ldi R23,0
L11:
	.dbline 21
	.dbline 21
	.dbline 21
L12:
	.dbline 21
	subi R22,255  ; offset = 1
	sbci R23,255
	.dbline 21
	cpi R22,150
	ldi R30,0
	cpc R23,R30
	brlt L11
	.dbline 22
L8:
	.dbline 20
	subi R20,255  ; offset = 1
	sbci R21,255
L10:
	.dbline 20
	cp R20,R16
	cpc R21,R17
	brlo L7
	.dbline -2
	.dbline 23
; 	  for (b = 1; b<150; b++){;}
; 	}  
; }
L6:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r a 20 I
	.dbsym r b 22 I
	.dbsym r t 16 i
	.dbend
	.dbfunc e main _main fV
;    Alarm2_Time -> y+6
;    Alarm1_Time -> y+4
; Alarm2_triggered -> y+2
;     Time_Alarm -> R14,R15
; Alarm1_triggered -> y+0
;              d -> R20
;              b -> R22
;              i -> R10
;              a -> R12
	.even
_main::
	sbiw R28,8
	.dbline -1
	.dbline 26
; 
; void main()
; {
	.dbline 31
; 	unsigned char i,a,b,d;
; 	int Alarm1_triggered,Alarm2_triggered;
; 	int Time_Alarm,Alarm1_Time,Alarm2_Time;
; 
; 	Alarm1_triggered =0;            //警报1触发标记,没有触发为0,触发为1
	clr R0
	clr R1
	std y+1,R1
	std y+0,R0
	.dbline 32
; 	Alarm2_triggered =0;            //警报2触发标记,没有触发为0,触发为1
	std y+3,R1
	std y+2,R0
	.dbline 33
;     Alarm1_Time = 30;               //第一级(低音)报警时间(毫秒)
	ldi R24,30
	ldi R25,0
	std y+5,R25
	std y+4,R24
	.dbline 34
; 	Alarm2_Time = 40;               //第二级(高音)报警时间(毫秒)
	ldi R24,40
	std y+7,R25
	std y+6,R24
	.dbline 35
; 	DDRC = 0xFF;	                //整个C口设置为输出
	ldi R24,255
	out 0x14,R24
	.dbline 36
;     PORTC =0;                       //C口输出为0
	clr R2
	out 0x15,R2
	rjmp L17
L16:
	.dbline 37
; 	while (1){
	.dbline 38
;        if((Alarm1_triggered==0) && (Alarm2_triggered==0)){
	ldd R0,y+0
	ldd R1,y+1
	tst R0
	breq X4
	rjmp L19
X4:
	tst R1
	breq X5
	rjmp L19
X5:
X0:
	ldd R0,y+2
	ldd R1,y+3
	tst R0
	breq X6
	rjmp L19
X6:
	tst R1
	breq X7
	rjmp L19
X7:
X1:
	.dbline 38
	.dbline 39
; 	      DDRD = 0;	                // 整个D口设置为输入
	clr R2
	out 0x11,R2
	.dbline 40
; 	      PORTD =0xFF;              // D口上拉电阻全部有效
	ldi R24,255
	out 0x12,R24
	.dbline 41
; 	      PORTC = PORTC & (~1);     // C口第3脚C1输出低电平
	cbi 0x15,0
	.dbline 42
; 	      PORTC = PORTC | 2;        // C口第2脚C2输出高电平
	sbi 0x15,1
	.dbline 43
; 	      a =1;
	clr R12
	inc R12
	.dbline 44
	clr R10
	rjmp L24
L21:
	.dbline 44
; 		  for(i = 0; i < 8; i++){
	.dbline 45
; 		      DDRB  = a;	        // B口第i脚设置为输出 
	out 0x17,R12
	.dbline 46
; 	          PORTB = 0xFF;         // B口第i脚输出高电平,其他脚为输入脚,上拉电阻有效
	ldi R24,255
	out 0x18,R24
	.dbline 47
; 	          DelayUs(50);          // 延时50微秒(20微秒不工作,25微秒以上就可以很好工作)
	ldi R16,50
	ldi R17,0
	rcall _DelayUs
	.dbline 48
; 		      b = PINB;
	in R22,0x16
	.dbline 49
; 			  d = ~PIND;
	in R20,0x10
	com R20
	.dbline 50
	cp R20,R12
	brne L27
	cpi R22,255
	breq L25
L27:
	.dbline 50
; 		      if((d!=a) || (b!=0xFF)){      //如果没有报警发生,并且产生了警情,就输出报警信号
	.dbline 51
; 			     Alarm1_triggered =1;       //标记产生了警情
	ldi R24,1
	ldi R25,0
	std y+1,R25
	std y+0,R24
	.dbline 52
; 			     Time_Alarm =0;             //报警计时器清0
	clr R14
	clr R15
	.dbline 53
; 		         PORTC = PORTC | BIT(3);    //触发第一级报警
	sbi 0x15,3
	.dbline 54
; 		         goto AlarmStatus;
	rjmp L28
L25:
	.dbline 56
	lsl R12
	.dbline 57
L22:
	.dbline 44
	inc R10
L24:
	.dbline 44
	mov R24,R10
	cpi R24,8
	brlo L21
	.dbline 59
; 			  }
; 			  a = a<<1;
; 	      }	
; 
;           DDRB = 0;	               // 整个B口设置为输入
	clr R2
	out 0x17,R2
	.dbline 60
; 	      PORTB =0xFF;             // B口上拉电阻全部有效
	ldi R24,255
	out 0x18,R24
	.dbline 61
; 	      PORTC = PORTC & (~2);    // C口第2脚C1输出低电平
	cbi 0x15,1
	.dbline 62
; 	      PORTC = PORTC | 1;       // C口第3脚C2输出高电平
	sbi 0x15,0
	.dbline 63
; 	      a = 1;
	clr R12
	inc R12
	.dbline 64
	clr R10
	rjmp L32
L29:
	.dbline 64
; 		  for(i = 0; i < 8; i++){
	.dbline 65
; 		      DDRD  = a;	       // D口第i脚设置为输出 
	out 0x11,R12
	.dbline 66
; 	          PORTD = 0xFF;        // D口第i脚输出高电平,其他脚为输入脚,上拉电阻有效
	ldi R24,255
	out 0x12,R24
	.dbline 67
; 		      DelayUs(50);         // 延时50微秒(20微秒不工作,25微秒以上就可以很好工作)
	ldi R16,50
	ldi R17,0
	rcall _DelayUs
	.dbline 68
; 		      b = ~PINB;
	in R22,0x16
	com R22
	.dbline 69
; 			  d = PIND;
	in R20,0x10
	.dbline 70
	cp R22,R12
	brne L35
	cpi R20,255
	breq L33
L35:
	.dbline 70
; 		      if((b!=a) || (d!=0xFF)){       //如果没有报警发生,并且产生了警情,就输出报警信号
	.dbline 71
; 			     Alarm1_triggered =1;        //标记产生了警情
	ldi R24,1
	ldi R25,0
	std y+1,R25
	std y+0,R24
	.dbline 72
; 			     Time_Alarm =0;              //报警计时器清0
	clr R14
	clr R15
	.dbline 73
; 		         PORTC = PORTC | BIT(3);     //触发第一级报警
	sbi 0x15,3
	.dbline 74
; 		         goto AlarmStatus;
	rjmp L28
L33:
	.dbline 76
	lsl R12
	.dbline 77
L30:
	.dbline 64
	inc R10
L32:
	.dbline 64
	mov R24,R10
	cpi R24,8
	brlo L29
	.dbline 78
; 			  }
; 			  a = a<<1;
; 	      }	
;        }
L19:
L28:
	.dbline 80
	ldd R24,y+0
	ldd R25,y+1
	cpi R24,1
	ldi R30,0
	cpc R25,R30
	breq L38
	ldd R24,y+2
	ldd R25,y+3
	cpi R24,1
	ldi R30,0
	cpc R25,R30
	brne L36
L38:
	.dbline 80
; AlarmStatus:
; 	   if((Alarm1_triggered ==1) || (Alarm2_triggered ==1)){
	.dbline 81
; 	      Time_Alarm = Time_Alarm+1;         //报警时间计时
	movw R24,R14
	adiw R24,1
	movw R14,R24
	.dbline 82
; 	      DelayMs(100);                      //延时100毫秒
	ldi R16,100
	ldi R17,0
	rcall _DelayMs
	.dbline 83
; 	      if((Time_Alarm>Alarm1_Time) && (Alarm2_triggered ==0)){   //触发第二级报警
	ldd R0,y+4
	ldd R1,y+5
	cp R0,R14
	cpc R1,R15
	brge L39
	ldd R0,y+2
	ldd R1,y+3
	tst R0
	brne L39
	tst R1
	brne L39
X2:
	.dbline 83
	.dbline 84
;              Alarm1_triggered =0;
	clr R0
	clr R1
	std y+1,R1
	std y+0,R0
	.dbline 85
; 			 Alarm2_triggered =1;
	ldi R24,1
	ldi R25,0
	std y+3,R25
	std y+2,R24
	.dbline 86
; 			 PORTC = PORTC & (~BIT(3));      //第一级报警时间到了,报警关闭(电话铃声)
	cbi 0x15,3
	.dbline 87
; 		     PORTC = PORTC | BIT(4);         //接通第二级报警
	sbi 0x15,4
	.dbline 88
;           }
L39:
	.dbline 89
; 		  if(Time_Alarm>(Alarm1_Time+Alarm2_Time)){
	ldd R2,y+4
	ldd R3,y+5
	ldd R0,y+6
	ldd R1,y+7
	add R2,R0
	adc R3,R1
	cp R2,R14
	cpc R3,R15
	brge L41
	.dbline 89
	.dbline 90
; 	         Alarm2_triggered =0;            //清除报警标记,停止报警
	clr R0
	clr R1
	std y+3,R1
	std y+2,R0
	.dbline 91
; 		     PORTC = PORTC & (~BIT(4));      //第二级报警(高音量)时间到了,报警关闭(高声喇叭报警)
	cbi 0x15,4
	.dbline 93
; 	         //if(Time_Alarm>600)PORTC = PORTC | BIT(5);    //接通第五脚进行报警(拨电话号码报警)
; 	      }
L41:
	.dbline 94
; 	   }
L36:
	.dbline 95
L17:
	.dbline 37
	rjmp L16
X3:
	.dbline -2
	.dbline 96
; 	}
; }
L15:
	adiw R28,8
	.dbline 0 ; func end
	ret
	.dbsym l Alarm2_Time 6 I
	.dbsym l Alarm1_Time 4 I
	.dbsym l Alarm2_triggered 2 I
	.dbsym r Time_Alarm 14 I
	.dbsym l Alarm1_triggered 0 I
	.dbsym r d 20 c
	.dbsym r b 22 c
	.dbsym r i 10 c
	.dbsym r a 12 c
	.dbend

⌨️ 快捷键说明

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