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

📄 laser.lst

📁 AVR单片机实现的窗户红外光报警器程序
💻 LST
字号:
__start:
__text_start:
    0013 E5CF      LDI	R28,0x5F
    0014 E0D4      LDI	R29,4
    0015 BFCD      OUT	0x3D,R28
    0016 BFDE      OUT	0x3E,R29
    0017 51C0      SUBI	R28,0x10
    0018 40D0      SBCI	R29,0
    0019 EA0A      LDI	R16,0xAA
    001A 8308      STD	Y+0,R16
    001B 2400      CLR	R0
    001C E6E0      LDI	R30,0x60
    001D E0F0      LDI	R31,0
    001E E010      LDI	R17,0
    001F 36E0      CPI	R30,0x60
    0020 07F1      CPC	R31,R17
    0021 F011      BEQ	0x0024
    0022 9201      ST	R0,Z+
    0023 CFFB      RJMP	0x001F
    0024 8300      STD	Z+0,R16
    0025 E2E6      LDI	R30,0x26
    0026 E0F0      LDI	R31,0
    0027 E6A0      LDI	R26,0x60
    0028 E0B0      LDI	R27,0
    0029 E010      LDI	R17,0
    002A 32E6      CPI	R30,0x26
    002B 07F1      CPC	R31,R17
    002C F021      BEQ	0x0031
    002D 95C8      LPM
    002E 9631      ADIW	R30,1
    002F 920D      ST	R0,X+
    0030 CFF9      RJMP	0x002A
    0031 D01F      RCALL	_main
_exit:
    0032 CFFF      RJMP	_exit
_DelayUs:
  a                    --> R20
  t                    --> R16
    0033 D0C2      RCALL	push_gset1
FILE: C:\DOCUME~2\hb\MYDOCU~1\电子窗户防盗网\单片机程序1.1\LaserBeam.c
(0001) /*
(0002) 	电子窗户防盗网
(0003) 	main.c
(0004) 	硬件:CA-M8
(0005) 	时钟:1MHz
(0006) */
(0007) 
(0008) #include <io8515v.h>
(0009) #include <macros.h>
(0010) 
(0011) void DelayUs(unsigned int t)
(0012) {
(0013) 	int a;
(0014) 	for (a = 1; a<t; a++){;}  
    0034 E041      LDI	R20,1
    0035 E050      LDI	R21,0
    0036 C002      RJMP	0x0039
    0037 5F4F      SUBI	R20,0xFF
    0038 4F5F      SBCI	R21,0xFF
    0039 1740      CP	R20,R16
    003A 0751      CPC	R21,R17
    003B F3D8      BCS	0x0037
(0015) }
    003C D0BC      RCALL	pop_gset1
    003D 9508      RET
_DelayMs:
  a                    --> R20
  b                    --> R22
  t                    --> R16
    003E D0CE      RCALL	push_gset2
(0016) 
(0017) void DelayMs(unsigned int t)
(0018) {
(0019) 	int a, b;
(0020) 	for (a = 1; a<t; a++){
    003F E041      LDI	R20,1
    0040 E050      LDI	R21,0
    0041 C00A      RJMP	0x004C
(0021) 	  for (b = 1; b<150; b++){;}
    0042 E061      LDI	R22,1
    0043 E070      LDI	R23,0
    0044 5F6F      SUBI	R22,0xFF
    0045 4F7F      SBCI	R23,0xFF
    0046 3966      CPI	R22,0x96
    0047 E0E0      LDI	R30,0
    0048 077E      CPC	R23,R30
    0049 F3D4      BLT	0x0044
    004A 5F4F      SUBI	R20,0xFF
    004B 4F5F      SBCI	R21,0xFF
    004C 1740      CP	R20,R16
    004D 0751      CPC	R21,R17
    004E F398      BCS	0x0042
(0022) 	}  
(0023) }
    004F D0A4      RCALL	pop_gset2
    0050 9508      RET
_main:
  Alarm2_Time          --> Y+6
  Alarm1_Time          --> Y+4
  Alarm2_triggered     --> Y+2
  Time_Alarm           --> R14
  Alarm1_triggered     --> Y+0
  d                    --> R20
  b                    --> R22
  i                    --> R10
  a                    --> R12
    0051 9728      SBIW	R28,0x8
(0024) 
(0025) void main()
(0026) {
(0027) 	unsigned char i,a,b,d;
(0028) 	int Alarm1_triggered,Alarm2_triggered;
(0029) 	int Time_Alarm,Alarm1_Time,Alarm2_Time;
(0030) 
(0031) 	Alarm1_triggered =0;            //警报1触发标记,没有触发为0,触发为1
    0052 2400      CLR	R0
    0053 2411      CLR	R1
    0054 8219      STD	Y+1,R1
    0055 8208      STD	Y+0,R0
(0032) 	Alarm2_triggered =0;            //警报2触发标记,没有触发为0,触发为1
    0056 821B      STD	Y+3,R1
    0057 820A      STD	Y+2,R0
(0033)     Alarm1_Time = 30;               //第一级(低音)报警时间(毫秒)
    0058 E18E      LDI	R24,0x1E
    0059 E090      LDI	R25,0
    005A 839D      STD	Y+5,R25
    005B 838C      STD	Y+4,R24
(0034) 	Alarm2_Time = 40;               //第二级(高音)报警时间(毫秒)
    005C E288      LDI	R24,0x28
    005D 839F      STD	Y+7,R25
    005E 838E      STD	Y+6,R24
(0035) 	DDRC = 0xFF;	                //整个C口设置为输出
    005F EF8F      LDI	R24,0xFF
    0060 BB84      OUT	0x14,R24
(0036)     PORTC =0;                       //C口输出为0
    0061 2422      CLR	R2
    0062 BA25      OUT	0x15,R2
    0063 C08D      RJMP	0x00F1
(0037) 	while (1){
(0038)        if((Alarm1_triggered==0) && (Alarm2_triggered==0)){
    0064 8008      LDD	R0,Y+0
    0065 8019      LDD	R1,Y+1
    0066 2000      TST	R0
    0067 F009      BEQ	0x0069
    0068 C053      RJMP	0x00BC
    0069 2011      TST	R1
    006A F009      BEQ	0x006C
    006B C050      RJMP	0x00BC
    006C 800A      LDD	R0,Y+2
    006D 801B      LDD	R1,Y+3
    006E 2000      TST	R0
    006F F009      BEQ	0x0071
    0070 C04B      RJMP	0x00BC
    0071 2011      TST	R1
    0072 F009      BEQ	0x0074
    0073 C048      RJMP	0x00BC
(0039) 	      DDRD = 0;	                // 整个D口设置为输入
    0074 2422      CLR	R2
    0075 BA21      OUT	0x11,R2
(0040) 	      PORTD =0xFF;              // D口上拉电阻全部有效
    0076 EF8F      LDI	R24,0xFF
    0077 BB82      OUT	0x12,R24
(0041) 	      PORTC = PORTC & (~1);     // C口第3脚C1输出低电平
    0078 98A8      CBI	0x15,0
(0042) 	      PORTC = PORTC | 2;        // C口第2脚C2输出高电平
    0079 9AA9      SBI	0x15,1
(0043) 	      a =1;
    007A 24CC      CLR	R12
    007B 94C3      INC	R12
(0044) 		  for(i = 0; i < 8; i++){
    007C 24AA      CLR	R10
    007D C017      RJMP	0x0095
(0045) 		      DDRB  = a;	        // B口第i脚设置为输出 
    007E BAC7      OUT	0x17,R12
(0046) 	          PORTB = 0xFF;         // B口第i脚输出高电平,其他脚为输入脚,上拉电阻有效
    007F EF8F      LDI	R24,0xFF
    0080 BB88      OUT	0x18,R24
(0047) 	          DelayUs(50);          // 延时50微秒(20微秒不工作,25微秒以上就可以很好工作)
    0081 E302      LDI	R16,0x32
    0082 E010      LDI	R17,0
    0083 DFAF      RCALL	_DelayUs
(0048) 		      b = PINB;
    0084 B366      IN	R22,0x16
(0049) 			  d = ~PIND;
    0085 B340      IN	R20,0x10
    0086 9540      COM	R20
(0050) 		      if((d!=a) || (b!=0xFF)){      //如果没有报警发生,并且产生了警情,就输出报警信号
    0087 154C      CP	R20,R12
    0088 F411      BNE	0x008B
    0089 3F6F      CPI	R22,0xFF
    008A F041      BEQ	0x0093
(0051) 			     Alarm1_triggered =1;       //标记产生了警情
    008B E081      LDI	R24,1
    008C E090      LDI	R25,0
    008D 8399      STD	Y+1,R25
    008E 8388      STD	Y+0,R24
(0052) 			     Time_Alarm =0;             //报警计时器清0
    008F 24EE      CLR	R14
    0090 24FF      CLR	R15
(0053) 		         PORTC = PORTC | BIT(3);    //触发第一级报警
    0091 9AAB      SBI	0x15,3
(0054) 		         goto AlarmStatus;
    0092 C029      RJMP	0x00BC
(0055) 			  }
(0056) 			  a = a<<1;
    0093 0CCC      LSL	R12
    0094 94A3      INC	R10
    0095 2D8A      MOV	R24,R10
    0096 3088      CPI	R24,0x8
    0097 F330      BCS	0x007E
(0057) 	      }	
(0058) 
(0059)           DDRB = 0;	               // 整个B口设置为输入
    0098 2422      CLR	R2
    0099 BA27      OUT	0x17,R2
(0060) 	      PORTB =0xFF;             // B口上拉电阻全部有效
    009A EF8F      LDI	R24,0xFF
    009B BB88      OUT	0x18,R24
(0061) 	      PORTC = PORTC & (~2);    // C口第2脚C1输出低电平
    009C 98A9      CBI	0x15,1
(0062) 	      PORTC = PORTC | 1;       // C口第3脚C2输出高电平
    009D 9AA8      SBI	0x15,0
(0063) 	      a = 1;
    009E 24CC      CLR	R12
    009F 94C3      INC	R12
(0064) 		  for(i = 0; i < 8; i++){
    00A0 24AA      CLR	R10
    00A1 C017      RJMP	0x00B9
(0065) 		      DDRD  = a;	       // D口第i脚设置为输出 
    00A2 BAC1      OUT	0x11,R12
(0066) 	          PORTD = 0xFF;        // D口第i脚输出高电平,其他脚为输入脚,上拉电阻有效
    00A3 EF8F      LDI	R24,0xFF
    00A4 BB82      OUT	0x12,R24
(0067) 		      DelayUs(50);         // 延时50微秒(20微秒不工作,25微秒以上就可以很好工作)
    00A5 E302      LDI	R16,0x32
    00A6 E010      LDI	R17,0
    00A7 DF8B      RCALL	_DelayUs
(0068) 		      b = ~PINB;
    00A8 B366      IN	R22,0x16
    00A9 9560      COM	R22
(0069) 			  d = PIND;
    00AA B340      IN	R20,0x10
(0070) 		      if((b!=a) || (d!=0xFF)){       //如果没有报警发生,并且产生了警情,就输出报警信号
    00AB 156C      CP	R22,R12
    00AC F411      BNE	0x00AF
    00AD 3F4F      CPI	R20,0xFF
    00AE F041      BEQ	0x00B7
(0071) 			     Alarm1_triggered =1;        //标记产生了警情
    00AF E081      LDI	R24,1
    00B0 E090      LDI	R25,0
    00B1 8399      STD	Y+1,R25
    00B2 8388      STD	Y+0,R24
(0072) 			     Time_Alarm =0;              //报警计时器清0
    00B3 24EE      CLR	R14
    00B4 24FF      CLR	R15
(0073) 		         PORTC = PORTC | BIT(3);     //触发第一级报警
    00B5 9AAB      SBI	0x15,3
(0074) 		         goto AlarmStatus;
    00B6 C005      RJMP	0x00BC
(0075) 			  }
(0076) 			  a = a<<1;
    00B7 0CCC      LSL	R12
    00B8 94A3      INC	R10
    00B9 2D8A      MOV	R24,R10
    00BA 3088      CPI	R24,0x8
    00BB F330      BCS	0x00A2
(0077) 	      }	
(0078)        }
(0079) AlarmStatus:
(0080) 	   if((Alarm1_triggered ==1) || (Alarm2_triggered ==1)){
    00BC 8188      LDD	R24,Y+0
    00BD 8199      LDD	R25,Y+1
    00BE 3081      CPI	R24,1
    00BF E0E0      LDI	R30,0
    00C0 079E      CPC	R25,R30
    00C1 F031      BEQ	0x00C8
    00C2 818A      LDD	R24,Y+2
    00C3 819B      LDD	R25,Y+3
    00C4 3081      CPI	R24,1
    00C5 E0E0      LDI	R30,0
    00C6 079E      CPC	R25,R30
    00C7 F549      BNE	0x00F1
(0081) 	      Time_Alarm = Time_Alarm+1;         //报警时间计时
    00C8 01C7      MOVW	R24,R14
    00C9 9601      ADIW	R24,1
    00CA 017C      MOVW	R14,R24
(0082) 	      DelayMs(100);                      //延时100毫秒
    00CB E604      LDI	R16,0x64
    00CC E010      LDI	R17,0
    00CD DF70      RCALL	_DelayMs
(0083) 	      if((Time_Alarm>Alarm1_Time) && (Alarm2_triggered ==0)){   //触发第二级报警
    00CE 800C      LDD	R0,Y+4
    00CF 801D      LDD	R1,Y+5
    00D0 140E      CP	R0,R14
    00D1 041F      CPC	R1,R15
    00D2 F484      BGE	0x00E3
    00D3 800A      LDD	R0,Y+2
    00D4 801B      LDD	R1,Y+3
    00D5 2000      TST	R0
    00D6 F461      BNE	0x00E3
    00D7 2011      TST	R1
    00D8 F451      BNE	0x00E3
(0084)              Alarm1_triggered =0;
    00D9 2400      CLR	R0
    00DA 2411      CLR	R1
    00DB 8219      STD	Y+1,R1
    00DC 8208      STD	Y+0,R0
(0085) 			 Alarm2_triggered =1;
    00DD E081      LDI	R24,1
    00DE E090      LDI	R25,0
    00DF 839B      STD	Y+3,R25
    00E0 838A      STD	Y+2,R24
(0086) 			 PORTC = PORTC & (~BIT(3));      //第一级报警时间到了,报警关闭(电话铃声)
    00E1 98AB      CBI	0x15,3
(0087) 		     PORTC = PORTC | BIT(4);         //接通第二级报警
    00E2 9AAC      SBI	0x15,4
(0088)           }
(0089) 		  if(Time_Alarm>(Alarm1_Time+Alarm2_Time)){
    00E3 802C      LDD	R2,Y+4
    00E4 803D      LDD	R3,Y+5
    00E5 800E      LDD	R0,Y+6
    00E6 801F      LDD	R1,Y+7
    00E7 0C20      ADD	R2,R0
    00E8 1C31      ADC	R3,R1
    00E9 142E      CP	R2,R14
    00EA 043F      CPC	R3,R15
    00EB F42C      BGE	0x00F1
(0090) 	         Alarm2_triggered =0;            //清除报警标记,停止报警
    00EC 2400      CLR	R0
    00ED 2411      CLR	R1
    00EE 821B      STD	Y+3,R1
    00EF 820A      STD	Y+2,R0
(0091) 		     PORTC = PORTC & (~BIT(4));      //第二级报警(高音量)时间到了,报警关闭(高声喇叭报警)
    00F0 98AC      CBI	0x15,4
    00F1 CF72      RJMP	0x0064
(0092) 	         //if(Time_Alarm>600)PORTC = PORTC | BIT(5);    //接通第五脚进行报警(拨电话号码报警)
(0093) 	      }
(0094) 	   }
(0095) 	}
(0096) }
FILE: <library>
    00F2 9628      ADIW	R28,0x8
    00F3 9508      RET
pop_gset2:
    00F4 E0E2      LDI	R30,2
    00F5 C004      RJMP	pop
push_gset1:
    00F6 935A      ST	R21,-Y
    00F7 934A      ST	R20,-Y
    00F8 9508      RET
pop_gset1:
    00F9 E0E1      LDI	R30,1
pop:
    00FA 9149      LD	R20,Y+
    00FB 9159      LD	R21,Y+
    00FC FDE0      SBRC	R30,0
    00FD 9508      RET
    00FE 9169      LD	R22,Y+
    00FF 9179      LD	R23,Y+
    0100 FDE1      SBRC	R30,1
    0101 9508      RET
    0102 90A9      LD	R10,Y+
    0103 90B9      LD	R11,Y+
    0104 FDE2      SBRC	R30,2
    0105 9508      RET
    0106 90C9      LD	R12,Y+
    0107 90D9      LD	R13,Y+
    0108 FDE3      SBRC	R30,3
    0109 9508      RET
    010A 90E9      LD	R14,Y+
    010B 90F9      LD	R15,Y+
    010C 9508      RET
push_gset2:
    010D 937A      ST	R23,-Y
    010E 936A      ST	R22,-Y
    010F CFE6      RJMP	push_gset1

⌨️ 快捷键说明

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