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

📄 car_main.s

📁 基于m16的寻迹小车(包含小车题目
💻 S
📖 第 1 页 / 共 3 页
字号:
_T0_10_n::
	.blkb 4
	.area idata
	.word 0,0
	.area data(ram, con, rel)
	.dbfile d:\我的文档\桌面\小车\car1\car_main.c
	.dbsym e T0_10_n _T0_10_n l
_T0_10_set::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile d:\我的文档\桌面\小车\car1\car_main.c
	.dbsym e T0_10_set _T0_10_set c
	.area text(rom, con, rel)
	.dbfile d:\我的文档\桌面\小车\car1\car_main.c
	.dbfunc e timer0_init _timer0_init fV
	.even
_timer0_init::
	.dbline -1
	.dbline 177
; }
; 
; //-----------------------T0------------------------------------
; unsigned long int T0_10_n = 0;  //处部计数满10后溢出次数, 周长 = [((10 * T0_10_n) + TCNT0) / 5 ]* LENGHT_PER_CIRCLE
; uchar T0_10_set = 0;
; //TIMER0 initialize - prescale:Falling edge
; // WGM: CTC
; // desired value: 1Hz
; // actual value: Out of range
; void timer0_init(void)
; {
	.dbline 178
;  TCCR0 = 0x00; //stop
	clr R2
	out 0x33,R2
	.dbline 179
;  OCR0  = 9 /*INVALID SETTING*/;  //set compare
	ldi R24,9
	out 0x3c,R24
	.dbline 180
;  TCCR0 = 0x0E; //start timer
	ldi R24,14
	out 0x33,R24
	.dbline -2
L24:
	.dbline 0 ; func end
	ret
	.dbend
	.area vector(rom, abs)
	.org 76
	jmp _timer0_comp_isr
	.area text(rom, con, rel)
	.dbfile d:\我的文档\桌面\小车\car1\car_main.c
	.dbfunc e timer0_comp_isr _timer0_comp_isr fV
	.even
_timer0_comp_isr::
	st -y,R2
	st -y,R3
	st -y,R4
	st -y,R5
	st -y,R8
	st -y,R9
	st -y,R24
	st -y,R25
	st -y,R26
	st -y,R27
	in R2,0x3f
	st -y,R2
	st -y,R10
	st -y,R11
	.dbline -1
	.dbline 185
; }
; 
; #pragma interrupt_handler timer0_comp_isr:iv_TIM0_COMP
; void timer0_comp_isr(void)
; {
	.dbline 187
;  //compare occured TCNT0=OCR0
;  	T0_10_n++;
	ldi R24,1
	ldi R25,0
	ldi R26,0
	ldi R27,0
	lds R4,_T0_10_n+2
	lds R5,_T0_10_n+2+1
	lds R2,_T0_10_n
	lds R3,_T0_10_n+1
	add R2,R24
	adc R3,R25
	adc R4,R26
	adc R5,R27
	sts _T0_10_n+1,R3
	sts _T0_10_n,R2
	sts _T0_10_n+2+1,R5
	sts _T0_10_n+2,R4
	.dbline 188
;  	T0_10_set = 1;
	ldi R24,1
	sts _T0_10_set,R24
	.dbline -2
L25:
	.dbline 0 ; func end
	ld R11,y+
	ld R10,y+
	ld R2,y+
	out 0x3f,R2
	ld R27,y+
	ld R26,y+
	ld R25,y+
	ld R24,y+
	ld R9,y+
	ld R8,y+
	ld R5,y+
	ld R4,y+
	ld R3,y+
	ld R2,y+
	reti
	.dbend
	.dbfunc e Time0OnOff _Time0OnOff fV
;          onoff -> R16
	.even
_Time0OnOff::
	.dbline -1
	.dbline 194
;  	//LCD_write_datalongint(1, 10, T0_200_n);
; }
; 
; //计周长开始停止控制, 影响中断使能
; void Time0OnOff (uchar onoff)
; {
	.dbline 195
; 	if (onoff == ON) {
	cpi R16,1
	brne L27
X5:
	.dbline 195
	.dbline 196
; 		TIMSK |= (1 << OCIE0);  //开时间中断
	in R24,0x39
	ori R24,2
	out 0x39,R24
	.dbline 197
; 	}
	xjmp L28
L27:
	.dbline 199
; 
; 	else if (onoff == OFF) {
	tst R16
	brne L29
X6:
	.dbline 199
	.dbline 200
; 		TIMSK &=~ (1 << OCIE0);  //禁止时间中断
	in R24,0x39
	andi R24,253
	out 0x39,R24
	.dbline 201
; 	}		
L29:
L28:
	.dbline -2
L26:
	.dbline 0 ; func end
	ret
	.dbsym r onoff 16 c
	.dbend
	.area vector(rom, abs)
	.org 8
	jmp _int1_isr
	.area text(rom, con, rel)
	.dbfile d:\我的文档\桌面\小车\car1\car_main.c
	.dbfunc e int1_isr _int1_isr fV
	.even
_int1_isr::
	st -y,R0
	st -y,R1
	st -y,R2
	st -y,R3
	st -y,R4
	st -y,R5
	st -y,R6
	st -y,R7
	st -y,R8
	st -y,R9
	st -y,R16
	st -y,R17
	st -y,R18
	st -y,R19
	st -y,R24
	st -y,R25
	st -y,R26
	st -y,R27
	st -y,R30
	st -y,R31
	in R0,0x3f
	st -y,R0
	xcall push_xgsetF000
	.dbline -1
	.dbline 212
; }
; 
; 
; /*------------------------------------TIME END----------------------------------------*/
; 
; /*-------------------------------int0 & int1----------------------------------*/
; 
; //中断1, 用做计算圈数
; #pragma interrupt_handler int1_isr:iv_INT1
; void int1_isr(void)
; {	
	.dbline 216
; 	//GICR &=~ (1 << INT1);
;  	//external interupt on INT1
; 	//getlinestart = 1;
; 	if (T2_1s_set_n >= nextint_time) {
	lds R4,_nextint_time+2
	lds R5,_nextint_time+2+1
	lds R2,_nextint_time
	lds R3,_nextint_time+1
	lds R8,_T2_1s_set_n+2
	lds R9,_T2_1s_set_n+2+1
	lds R6,_T2_1s_set_n
	lds R7,_T2_1s_set_n+1
	cp R6,R2
	cpc R7,R3
	cpc R8,R4
	cpc R9,R5
	brlo L32
X7:
	.dbline 216
	.dbline 217
; 	   	getlinestart = 1;
	ldi R24,1
	sts _getlinestart,R24
	.dbline 218
; 		nextint_time += 13; //10s后如果果再进入中断,才能使圈数加1
	ldi R20,13
	ldi R21,0
	ldi R22,0
	ldi R23,0
	add R2,R20
	adc R3,R21
	adc R4,R22
	adc R5,R23
	sts _nextint_time+1,R3
	sts _nextint_time,R2
	sts _nextint_time+2+1,R5
	sts _nextint_time+2,R4
	.dbline 219
; 		circle_n_new++;
	lds R24,_circle_n_new
	subi R24,255    ; addi 1
	sts _circle_n_new,R24
	.dbline 221
; 		
; 		if (circle_n_new == 4) {  //跑了三圈
	cpi R24,4
	brne L34
X8:
	.dbline 221
	.dbline 222
; 			CarStop();           //小车停止
	xcall _CarStop
	.dbline 223
; 			Time2OnOff(OFF);     //关闭时间计数器中断
	clr R16
	xcall _Time2OnOff
	.dbline 224
; 			Time0OnOff(OFF);     //关闭路程计算器			
	clr R16
	xcall _Time0OnOff
	.dbline 225
; 			CLI();               //关所有中断
	cli
	.dbline 227
; 		
; 			LightOnOff(ON);      //灯闪
	ldi R16,1
	xcall _LightOnOff
	.dbline 228
; 			delay_ns(1);
	ldi R16,1
	xcall _delay_ns
	.dbline 229
;         	LightOnOff(OFF);
	clr R16
	xcall _LightOnOff
	.dbline 230
; 			delay_ns(1);
	ldi R16,1
	xcall _delay_ns
L36:
	.dbline 232
; 
; 			while (1) {;}        //死车
	.dbline 232
	.dbline 232
L37:
	.dbline 232
	xjmp L36
L34:
	.dbline 234
; 		}
; 	}
L32:
	.dbline -2
L31:
	.dbline 0 ; func end
	xcall pop_xgsetF000
	ld R0,y+
	out 0x3f,R0
	ld R31,y+
	ld R30,y+
	ld R27,y+
	ld R26,y+
	ld R25,y+
	ld R24,y+
	ld R19,y+
	ld R18,y+
	ld R17,y+
	ld R16,y+
	ld R9,y+
	ld R8,y+
	ld R7,y+
	ld R6,y+
	ld R5,y+
	ld R4,y+
	ld R3,y+
	ld R2,y+
	ld R1,y+
	ld R0,y+
	reti
	.dbend
	.area vector(rom, abs)
	.org 4
	jmp _int0_isr
	.area text(rom, con, rel)
	.dbfile d:\我的文档\桌面\小车\car1\car_main.c
	.dbfunc e int0_isr _int0_isr fV
	.even
_int0_isr::
	st -y,R16
	st -y,R17
	st -y,R24
	st -y,R26
	st -y,R30
	in R16,0x3f
	st -y,R16
	.dbline -1
	.dbline 244
; 	
; 	//LCD_write_datalongint(1, 10, lcd_i++);
; 	//if(lcd_i == 5)
; 	//	GICR &=~ (1 << INT1);
; }
; 
; //扩展中断0, 用做寻线
; #pragma interrupt_handler int0_isr:iv_INT0
; void int0_isr(void)
; {
	.dbline 246
;  	//external interupt on INT1
;  	switch( PIND & 0b01000111 ) {			
	in R16,0x10
	clr R17
	andi R16,71
	andi R17,0
	cpi R16,1
	ldi R30,0
	cpc R17,R30
	breq L45
X9:
	cpi R16,3
	ldi R30,0
	cpc R17,R30
	breq L45
X10:
	cpi R16,1
	ldi R30,0
	cpc R17,R30
	brlt L40
X11:
L46:
	cpi R16,64
	ldi R30,0
	cpc R17,R30
	breq L43
X12:
	cpi R16,65
	ldi R30,0
	cpc R17,R30
	breq L44
X13:
	cpi R16,66
	ldi R30,0
	cpc R17,R30
	breq L43
X14:
	xjmp L40
L43:
	.dbline 249
; 		case 0b01000010: //左红外遇到黑线
; 		case 0b01000000: //左中遇到
; 			modle_now = 1;			
	ldi R24,1
	sts _modle_now,R24
	.dbline 250
; 			break;
	xjmp L41
L44:
	.dbline 253
; 			
; 		case 0b01000001: //中红外遇到黑线
; 			modle_now = 2;
	ldi R24,2
	sts _modle_now,R24
	.dbline 254
; 			break;
	xjmp L41
L45:
	.dbline 258
; 
; 		case 0b00000011: //右红外遇到黑线
; 		case 0b00000001: //右中遇到
; 			modle_now = 3;
	ldi R24,3
	sts _modle_now,R24
	.dbline 259
; 			break;
	xjmp L41
L40:
	.dbline 262
; 
; 		default :
; 			modle_now = 4;
	ldi R24,4
	sts _modle_now,R24
	.dbline 263
; 			break;
L41:
	.dbline -2
L39:
	.dbline 0 ; func end
	ld R16,y+
	out 0x3f,R16
	ld R30,y+
	ld R26,y+
	ld R24,y+
	ld R17,y+
	ld R16,y+
	reti
	.dbend
	.dbfunc e CarFindLine _CarFindLine fV
	.even
_CarFindLine::
	st -y,R20
	st -y,R21
	.dbline -1
	.dbline 269
; 	} 	
; }
; 
; //小车寻线
; void CarFindLine (void)
; {
	.dbline 270
; 	if (modle_last == 1) {
	lds R24,_modle_last
	cpi R24,1
	brne L48
X15:
	.dbline 270
	.dbline 271
; 		CarTurnLeft();
	xcall _CarTurnLeft
	.dbline 273
; 		
; 		switch (modle_now) {
	lds R20,_modle_now
	clr R21
	cpi R20,2
	ldi R30,0
	cpc R21,R30
	breq L53
X16:
	cpi R20,3
	ldi R30,0
	cpc R21,R30
	breq L54
X17:
	xjmp L49
L53:
	.dbline 275
; 			case 2:
; 				modle_last = 4;
	ldi R24,4
	sts _modle_last,R24
	.dbline 276
; 				break;
	xjmp L49
L54:
	.dbline 279
; 
; 			case 3:
; 				modle_last = 3;
	ldi R24,3
	sts _modle_last,R24
	.dbline 280
; 				break;
	.dbline 283
; 
; 			default :
; 				break;
	.dbline 285
; 		}
; 	}
	xjmp L49
L48:
	.dbline 287
; 
; 	else if (modle_last == 3) {
	lds R24,_modle_last
	cpi R24,3
	brne L55
X18:
	.dbline 287
	.dbline 288
; 		CarTurnRight();
	xcall _CarTurnRight
	.dbline 290
; 		
; 		switch (modle_now) {
	lds R20,_modle_now
	clr R21
	cpi R20,1
	ldi R30,0
	cpc R21,R30
	breq L60
X19:
	cpi R20,2
	ldi R30,0
	cpc R21,R30
	breq L61
X20:
	xjmp L56
L60:
	.dbline 292
; 			case 1:
; 				modle_last = 1;
	ldi R24,1
	sts _modle_last,R24
	.dbline 293
; 				break;
	xjmp L56
L61:
	.dbline 296
; 
; 			case 2:
; 				modle_last = 4;
	ldi R24,4
	sts _modle_last,R24
	.dbline 297
; 				break;
	.dbline 300
; 
; 			default :
; 				break;
	.dbline 302
; 		}
; 	}					
	xjmp L56
L55:
	.dbline 304
; 	
; 	else if (modle_last == 4) {
	lds R24,_modle_last
	cpi R24,4
	brne L62
X21:
	.dbline 304
	.dbline 305
; 		CarGoAheadMidSpeed(); 
	xcall _CarGoAheadMidSpeed
	.dbline 307
; 
; 		switch (modle_now) {
	lds R20,_modle_now

⌨️ 快捷键说明

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