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

📄 car1.lst

📁 基于m16的寻迹小车(包含小车题目
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0188)  	T0_10_set = 1;
     151 E081      LDI	R24,1
     152 9380 007C STS	T0_10_set,R24
     154 90B9      LD	R11,Y+
     155 90A9      LD	R10,Y+
     156 9029      LD	R2,Y+
     157 BE2F      OUT	0x3F,R2
     158 91B9      LD	R27,Y+
     159 91A9      LD	R26,Y+
     15A 9199      LD	R25,Y+
     15B 9189      LD	R24,Y+
     15C 9099      LD	R9,Y+
     15D 9089      LD	R8,Y+
     15E 9059      LD	R5,Y+
     15F 9049      LD	R4,Y+
     160 9039      LD	R3,Y+
     161 9029      LD	R2,Y+
     162 9518      RETI
(0189)  	//LCD_write_datalongint(1, 10, T0_200_n);
(0190) }
(0191) 
(0192) //计周长开始停止控制, 影响中断使能
(0193) void Time0OnOff (uchar onoff)
(0194) {
(0195) 	if (onoff == ON) {
_Time0OnOff:
  onoff                --> R16
     163 3001      CPI	R16,1
     164 F421      BNE	0x0169
(0196) 		TIMSK |= (1 << OCIE0);  //开时间中断
     165 B789      IN	R24,0x39
     166 6082      ORI	R24,2
     167 BF89      OUT	0x39,R24
(0197) 	}
     168 C005      RJMP	0x016E
(0198) 
(0199) 	else if (onoff == OFF) {
     169 2300      TST	R16
     16A F419      BNE	0x016E
(0200) 		TIMSK &=~ (1 << OCIE0);  //禁止时间中断
     16B B789      IN	R24,0x39
     16C 7F8D      ANDI	R24,0xFD
     16D BF89      OUT	0x39,R24
(0201) 	}		
     16E 9508      RET
_int1_isr:
     16F 920A      ST	R0,-Y
     170 921A      ST	R1,-Y
     171 922A      ST	R2,-Y
     172 923A      ST	R3,-Y
     173 924A      ST	R4,-Y
     174 925A      ST	R5,-Y
     175 926A      ST	R6,-Y
     176 927A      ST	R7,-Y
     177 928A      ST	R8,-Y
     178 929A      ST	R9,-Y
     179 930A      ST	R16,-Y
     17A 931A      ST	R17,-Y
     17B 932A      ST	R18,-Y
     17C 933A      ST	R19,-Y
     17D 938A      ST	R24,-Y
     17E 939A      ST	R25,-Y
     17F 93AA      ST	R26,-Y
     180 93BA      ST	R27,-Y
     181 93EA      ST	R30,-Y
     182 93FA      ST	R31,-Y
     183 B60F      IN	R0,0x3F
     184 920A      ST	R0,-Y
     185 940E 0786 CALL	push_xgsetF000
(0202) }
(0203) 
(0204) 
(0205) /*------------------------------------TIME END----------------------------------------*/
(0206) 
(0207) /*-------------------------------int0 & int1----------------------------------*/
(0208) 
(0209) //中断1, 用做计算圈数
(0210) #pragma interrupt_handler int1_isr:iv_INT1
(0211) void int1_isr(void)
(0212) {	
(0213) 	//GICR &=~ (1 << INT1);
(0214)  	//external interupt on INT1
(0215) 	//getlinestart = 1;
(0216) 	if (T2_1s_set_n >= nextint_time) {
     187 9040 006B LDS	R4,nextint_time+2
     189 9050 006C LDS	R5,nextint_time+3
     18B 9020 0069 LDS	R2,nextint_time
     18D 9030 006A LDS	R3,nextint_time+1
     18F 9080 0075 LDS	R8,T2_1s_set_n+2
     191 9090 0076 LDS	R9,T2_1s_set_n+3
     193 9060 0073 LDS	R6,T2_1s_set_n
     195 9070 0074 LDS	R7,T2_1s_set_n+1
     197 1462      CP	R6,R2
     198 0473      CPC	R7,R3
     199 0484      CPC	R8,R4
     19A 0495      CPC	R9,R5
     19B F158      BCS	0x01C7
(0217) 	   	getlinestart = 1;
     19C E081      LDI	R24,1
     19D 9380 0068 STS	getlinestart,R24
(0218) 		nextint_time += 13; //10s后如果果再进入中断,才能使圈数加1
     19F E04D      LDI	R20,0xD
     1A0 E050      LDI	R21,0
     1A1 E060      LDI	R22,0
     1A2 E070      LDI	R23,0
     1A3 0E24      ADD	R2,R20
     1A4 1E35      ADC	R3,R21
     1A5 1E46      ADC	R4,R22
     1A6 1E57      ADC	R5,R23
     1A7 9230 006A STS	nextint_time+1,R3
     1A9 9220 0069 STS	nextint_time,R2
     1AB 9250 006C STS	nextint_time+3,R5
     1AD 9240 006B STS	nextint_time+2,R4
(0219) 		circle_n_new++;
     1AF 9180 0066 LDS	R24,circle_n_new
     1B1 5F8F      SUBI	R24,0xFF
     1B2 9380 0066 STS	circle_n_new,R24
(0220) 		
(0221) 		if (circle_n_new == 4) {  //跑了三圈
     1B4 3084      CPI	R24,4
     1B5 F489      BNE	0x01C7
(0222) 			CarStop();           //小车停止
     1B6 DF06      RCALL	_CarStop
(0223) 			Time2OnOff(OFF);     //关闭时间计数器中断
     1B7 2700      CLR	R16
     1B8 DF5F      RCALL	_Time2OnOff
(0224) 			Time0OnOff(OFF);     //关闭路程计算器			
     1B9 2700      CLR	R16
     1BA DFA8      RCALL	_Time0OnOff
(0225) 			CLI();               //关所有中断
     1BB 94F8      BCLR	7
(0226) 		
(0227) 			LightOnOff(ON);      //灯闪
     1BC E001      LDI	R16,1
     1BD DF06      RCALL	_LightOnOff
(0228) 			delay_ns(1);
     1BE E001      LDI	R16,1
     1BF 940E 03DA CALL	_delay_ns
(0229)         	LightOnOff(OFF);
     1C1 2700      CLR	R16
     1C2 DF01      RCALL	_LightOnOff
(0230) 			delay_ns(1);
     1C3 E001      LDI	R16,1
     1C4 940E 03DA CALL	_delay_ns
(0231) 
(0232) 			while (1) {;}        //死车
     1C6 CFFF      RJMP	0x01C6
(0233) 		}
(0234) 	}
     1C7 940E 078B CALL	pop_xgsetF000
     1C9 9009      LD	R0,Y+
     1CA BE0F      OUT	0x3F,R0
     1CB 91F9      LD	R31,Y+
     1CC 91E9      LD	R30,Y+
     1CD 91B9      LD	R27,Y+
     1CE 91A9      LD	R26,Y+
     1CF 9199      LD	R25,Y+
     1D0 9189      LD	R24,Y+
     1D1 9139      LD	R19,Y+
     1D2 9129      LD	R18,Y+
     1D3 9119      LD	R17,Y+
     1D4 9109      LD	R16,Y+
     1D5 9099      LD	R9,Y+
     1D6 9089      LD	R8,Y+
     1D7 9079      LD	R7,Y+
     1D8 9069      LD	R6,Y+
     1D9 9059      LD	R5,Y+
     1DA 9049      LD	R4,Y+
     1DB 9039      LD	R3,Y+
     1DC 9029      LD	R2,Y+
     1DD 9019      LD	R1,Y+
     1DE 9009      LD	R0,Y+
     1DF 9518      RETI
_int0_isr:
     1E0 930A      ST	R16,-Y
     1E1 931A      ST	R17,-Y
     1E2 938A      ST	R24,-Y
     1E3 93AA      ST	R26,-Y
     1E4 93EA      ST	R30,-Y
     1E5 B70F      IN	R16,0x3F
     1E6 930A      ST	R16,-Y
(0235) 	
(0236) 	//LCD_write_datalongint(1, 10, lcd_i++);
(0237) 	//if(lcd_i == 5)
(0238) 	//	GICR &=~ (1 << INT1);
(0239) }
(0240) 
(0241) //扩展中断0, 用做寻线
(0242) #pragma interrupt_handler int0_isr:iv_INT0
(0243) void int0_isr(void)
(0244) {
(0245)  	//external interupt on INT1
(0246)  	switch( PIND & 0b01000111 ) {			
     1E7 B300      IN	R16,0x10
     1E8 2711      CLR	R17
     1E9 7407      ANDI	R16,0x47
     1EA 7010      ANDI	R17,0
     1EB 3001      CPI	R16,1
     1EC E0E0      LDI	R30,0
     1ED 071E      CPC	R17,R30
     1EE F0E9      BEQ	0x020C
     1EF 3003      CPI	R16,3
     1F0 E0E0      LDI	R30,0
     1F1 071E      CPC	R17,R30
     1F2 F0C9      BEQ	0x020C
     1F3 3001      CPI	R16,1
     1F4 E0E0      LDI	R30,0
     1F5 071E      CPC	R17,R30
     1F6 F0CC      BLT	0x0210
     1F7 3400      CPI	R16,0x40
     1F8 E0E0      LDI	R30,0
     1F9 071E      CPC	R17,R30
     1FA F049      BEQ	0x0204
     1FB 3401      CPI	R16,0x41
     1FC E0E0      LDI	R30,0
     1FD 071E      CPC	R17,R30
     1FE F049      BEQ	0x0208
     1FF 3402      CPI	R16,0x42
     200 E0E0      LDI	R30,0
     201 071E      CPC	R17,R30
     202 F009      BEQ	0x0204
     203 C00C      RJMP	0x0210
(0247) 		case 0b01000010: //左红外遇到黑线
(0248) 		case 0b01000000: //左中遇到
(0249) 			modle_now = 1;			
     204 E081      LDI	R24,1
     205 9380 0060 STS	modle_now,R24
(0250) 			break;
     207 C00B      RJMP	0x0213
(0251) 			
(0252) 		case 0b01000001: //中红外遇到黑线
(0253) 			modle_now = 2;
     208 E082      LDI	R24,2
     209 9380 0060 STS	modle_now,R24
(0254) 			break;
     20B C007      RJMP	0x0213
(0255) 
(0256) 		case 0b00000011: //右红外遇到黑线
(0257) 		case 0b00000001: //右中遇到
(0258) 			modle_now = 3;
     20C E083      LDI	R24,3
     20D 9380 0060 STS	modle_now,R24
(0259) 			break;
     20F C003      RJMP	0x0213
(0260) 
(0261) 		default :
(0262) 			modle_now = 4;
     210 E084      LDI	R24,4
     211 9380 0060 STS	modle_now,R24
(0263) 			break;
     213 9109      LD	R16,Y+
     214 BF0F      OUT	0x3F,R16
     215 91E9      LD	R30,Y+
     216 91A9      LD	R26,Y+
     217 9189      LD	R24,Y+
     218 9119      LD	R17,Y+
     219 9109      LD	R16,Y+
     21A 9518      RETI
_CarFindLine:
     21B 934A      ST	R20,-Y
     21C 935A      ST	R21,-Y
(0264) 	} 	
(0265) }
(0266) 
(0267) //小车寻线
(0268) void CarFindLine (void)
(0269) {
(0270) 	if (modle_last == 1) {
     21D 9180 0061 LDS	R24,modle_last
     21F 3081      CPI	R24,1
     220 F4A9      BNE	0x0236
(0271) 		CarTurnLeft();
     221 DE8D      RCALL	_CarTurnLeft
(0272) 		
(0273) 		switch (modle_now) {
     222 9140 0060 LDS	R20,modle_now
     224 2755      CLR	R21
     225 3042      CPI	R20,2
     226 E0E0      LDI	R30,0
     227 075E      CPC	R21,R30
     228 F029      BEQ	0x022E
     229 3043      CPI	R20,3
     22A E0E0      LDI	R30,0
     22B 075E      CPC	R21,R30
     22C F029      BEQ	0x0232
     22D C036      RJMP	0x0264
(0274) 			case 2:
(0275) 				modle_last = 4;
     22E E084      LDI	R24,4
     22F 9380 0061 STS	modle_last,R24
(0276) 				break;
     231 C032      RJMP	0x0264
(0277) 
(0278) 			case 3:
(0279) 				modle_last = 3;
     232 E083      LDI	R24,3
     233 9380 0061 STS	modle_last,R24
(0280) 				break;
(0281) 
(0282) 			default :
(0283) 				break;
(0284) 		}
(0285) 	}
     235 C02E      RJMP	0x0264
(0286) 
(0287) 	else if (modle_last == 3) {
     236 9180 0061 LDS	R24,modle_last
     238 3083      CPI	R24,3
     239 F4A9      BNE	0x024F
(0288) 		CarTurnRight();
     23A DE7B      RCALL	_CarTurnRight
(0289) 		
(0290) 		switch (modle_now) {
     23B 9140 0060 LDS	R20,modle_now
     23D 2755      CLR	R21
     23E 3041      CPI	R20,1
     23F E0E0      LDI	R30,0
     240 075E      CPC	R21,R30
     241 F029      BEQ	0x0247
     242 3042      CPI	R20,2
     243 E0E0      LDI	R30,0
     244 075E      CPC	R21,R30
     245 F029      BEQ	0x024B
     246 C01D      RJMP	0x0264
(0291) 			case 1:
(0292) 				modle_last = 1;
     247 E081      LDI	R24,1
     248 9380 0061 STS	modle_last,R24
(0293) 				break;
     24A C019      RJMP	0x0264
(0294) 
(0295) 			case 2:
(0296) 				modle_last = 4;
     24B E084      LDI	R24,4
     24C 9380 0061 STS	modle_last,R24
(0297) 				break;
(0298) 
(0299) 			default :
(0300) 				break;
(0301) 		}
(0302) 	}					
     24E C015      RJMP	0x0264
(0303) 	
(0304) 	else if (modle_last == 4) {
     24F 9180 0061 LDS	R24,modle_last
     251 3084      CPI	R24,4
     252 F489      BNE	0x0264
(0305) 		CarGoAheadMidSpeed(); 
     253 DE54      RCALL	_CarGoAheadMidSpeed
(0306) 
(0307) 		switch (modle_now) {
     254 9140 0060 LDS	R20,modle_now
     256 2755      CLR	R21
     257 3041      CPI	R20,1
     258 E0E0      LDI	R30,0
     259 075E      CPC	R21,R30
     25A F029      BEQ	0x0260
     25B 3043      CPI	R20,3
     25C E0E0      LDI	R30,0
     25D 075E      CPC	R21,R30
     25E F009      BEQ	0x0260
     25F C004      RJMP	0x0264
(0308) 			case 1:
(0309) 			case 3:
(0310) 				modle_last = modle_now;
     260 9020 0060 LDS	R2,modle_now
     262 9220 0061 STS	modle_last,R2
(0311) 				break;
(0312) 
(0313) 			default :
(0314) 				break;
(0315) 		}
(0316) 	}
     264 9159      LD	R21,Y+
     265 9149      LD	R20,Y+
     266 9508      RET
(0317) }
(0318) /*-------------------------------end---------------------------------------------*/
(0319) 
(0320) //call this routine to initialize all peripherals
(0321) void init_devices(void)
(0322) {
(0323)  	//stop errant interrupts until set up
(0324) 	closeJTAG();
_init_devices:
     267 DE24      RCALL	_closeJTAG
(0325)  	CLI(); //disable all interrupts
     268 94F8      BCLR	7
(0326) 
(0327) 	//时间使用
(0328) 	timer2_init();
     269 DE63      RCALL	_timer2_init
(0329) 	Time2OnOff(OFF);
     26A 2700      CLR	R16
     26B DEAC      RCALL	_Time2OnOff
(0330) 
(0331) 	//计圈数使用
(0332) 	timer0_init();
     26C DEB7      RCALL	_timer0_init
(0333) 	Time0OnOff(OFF);
     26D 2700      CLR	R16
     26E DEF4      RCALL	_Time0OnOff
(0334) 
(0335) 	//lcd
(0336)  	LCD_init();
     26F 940E 05F0 CALL	_LCD_init
(0337) 
(0338) 	//pwm
(0339) 	PwmInit();
     271 DE21      RCALL	_PwmInit
(0340) 	PwmASet(PWMA_MIN_VAL);
     272 2700      CLR	R16
     273 2711      CLR	R17
     274 DE26      RCALL	_PwmASet
(0341) 	PwmBSet(PWMB_MIN_VAL);
     275 2700      CLR	R16
     276 2711      CLR	R17
     277 DE26      RCALL	_PwmBSet
(0342)  
(0343)  	//INT1:0
(0344) 	DDRD &=~ (1 << PD0) | (1 << PD1) | (1 << PD2) | (1 << PD3) | (1 << PD6); //PD口的0,1,6做扩展中断, 2,3做中断

⌨️ 快捷键说明

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