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

📄 宝贝机器人.s

📁 基于atmel公司的mega16单片机做的机器人控制程序
💻 S
📖 第 1 页 / 共 2 页
字号:
	ldi R17,0
	xcall _delay_us
	.dbline 202
	mov R24,R22
	andi R24,1
	lsl R24
	lsl R24
	lsl R24
	in R2,0x15
	or R2,R24
	out 0x15,R2
	.dbline 202
	ldi R16,5
	ldi R17,0
	xcall _delay_us
	.dbline 203
	in R24,0x15
	andi R24,239
	out 0x15,R24
	.dbline 203
	ldi R16,5
	ldi R17,0
	xcall _delay_us
	.dbline 204
	lsr R22
	.dbline 205
L58:
	.dbline 198
	inc R20
L60:
	.dbline 198
	cpi R20,8
	brlo L57
	.dbline -2
L38:
	xcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbsym r j 20 c
	.dbsym r display 22 c
	.dbsym r point 12 c
	.dbsym r second 10 c
	.dbsym r minute 14 c
	.dbsym r n1 20 c
	.dbend
	.dbfunc e trace_road _trace_road fV
;           pinc -> <dead>
	.even
_trace_road::
	.dbline -1
	.dbline 213
;   {
;    PORTC|=0x10;delay_us(5);
;    PORTC&=0xf7;delay_us(5);
;    PORTC|=((display&0x01)<<3);delay_us(5);
;    PORTC&=0xef;delay_us(5);
;    display>>=1;
;   }
; } 
; /////////////液晶屏显示函数/////////////////////////////////////
; 
; 
; 
; /////////////////寻找黑线////////////////////////////////////////
; void trace_road(void) //黑线寻迹函数
; {
	.dbline 215
;    unsigned char pinc;
;     PINC=PINC&0x07;  //PC0~PC2信号送给变量pinc
	in R24,0x13
	andi R24,7
	out 0x13,R24
	.dbline 216
;   if((PINC==0x02)||(PINC==0x07))//只有中间传感器有信号,
	in R24,0x13
	cpi R24,2
	breq L64
	in R24,0x13
	cpi R24,7
	brne L62
L64:
	.dbline 217
;       { run();turn_state0=0;  turn_state1=0;}//或三个均有信号,则直走
	.dbline 217
	xcall _run
	.dbline 217
	clr R2
	sts _turn_state0,R2
	.dbline 217
	sts _turn_state1,R2
	.dbline 217
	xjmp L63
L62:
	.dbline 218
; 	else if(PINC==0x06)//若右边无信号
	in R24,0x13
	cpi R24,6
	brne L65
	.dbline 219
; 	  {turn_left();turn_state0=1;}     //左转
	.dbline 219
	xcall _turn_left
	.dbline 219
	ldi R24,1
	sts _turn_state0,R24
	.dbline 219
	xjmp L66
L65:
	.dbline 220
; 	  else if(PINC==0x03)//若左边无信号
	in R24,0x13
	cpi R24,3
	brne L67
	.dbline 221
; 	    {turn_right(); turn_state1=1;}   //右转
	.dbline 221
	xcall _turn_right
	.dbline 221
	ldi R24,1
	sts _turn_state1,R24
	.dbline 221
	xjmp L68
L67:
	.dbline 222
; 		else if(PINC==0x04)//若右边和中间均无信号
	in R24,0x13
	cpi R24,4
	brne L69
	.dbline 223
; 		 { turn_left();turn_state0=1;}   //左转
	.dbline 223
	xcall _turn_left
	.dbline 223
	ldi R24,1
	sts _turn_state0,R24
	.dbline 223
	xjmp L70
L69:
	.dbline 224
; 		  else if(PINC==0x01)//若左边和中间均无信号
	in R24,0x13
	cpi R24,1
	brne L71
	.dbline 225
; 		    {turn_right();turn_state1=1;}   //右转
	.dbline 225
	xcall _turn_right
	.dbline 225
	ldi R24,1
	sts _turn_state1,R24
	.dbline 225
	xjmp L72
L71:
	.dbline 226
; 			else if((turn_state0==1)&&(PINC==0))//若三个均无信号
	lds R24,_turn_state0
	cpi R24,1
	brne L73
	in R2,0x13
	tst R2
	brne L73
	.dbline 227
; 			   turn_left();  //左转半圈
	xcall _turn_left
	xjmp L74
L73:
	.dbline 228
;               else if((turn_state1==1)&&(PINC==0))
	lds R24,_turn_state1
	cpi R24,1
	brne L75
	in R2,0x13
	tst R2
	brne L75
	.dbline 229
; 			    turn_right();
	xcall _turn_right
	xjmp L76
L75:
	.dbline 231
; 				else
; 				  run();
	xcall _run
L76:
L74:
L72:
L70:
L68:
L66:
L63:
	.dbline -2
L61:
	.dbline 0 ; func end
	ret
	.dbsym l pinc 1 c
	.dbend
	.dbfunc e trace_light_init _trace_light_init fV
	.even
_trace_light_init::
	.dbline -1
	.dbline 239
;   }
; ///////////////////寻找黑线////////////////////////////////////////
; 
; 
; 
; ////////////////////探测光源函数///////////////////////////////////
; void trace_light_init(void)
;  {
	.dbline 240
;    DDRA&=0xf8;       // PC0 1分别为探测光源的左 右端口,
	in R24,0x1a
	andi R24,248
	out 0x1a,R24
	.dbline 241
;    PORTA&=0xf8;
	in R24,0x1b
	andi R24,248
	out 0x1b,R24
	.dbline 242
;   ADMUX=0x60;         //初始化ADC0 
	ldi R24,96
	out 0x7,R24
	.dbline 243
;   ADCSRA=0x82;         //初始化ADC0,64分频
	ldi R24,130
	out 0x6,R24
	.dbline -2
L77:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e trace_light _trace_light fV
;            adc -> R20
	.even
_trace_light::
	xcall push_gset2
	.dbline -1
	.dbline 246
;  }
; void trace_light(void)
; {
	.dbline 248
;    unsigned char adc;
;     for(adc=0;adc<3;adc++)
	clr R20
	xjmp L82
L79:
	.dbline 249
; 	{
	.dbline 250
; 	   if(adc==0)
	tst R20
	brne L83
	.dbline 251
;           ADMUX=0x60;
	ldi R24,96
	out 0x7,R24
	xjmp L84
L83:
	.dbline 252
; 	        else if(adc==1)
	cpi R20,1
	brne L85
	.dbline 253
;                ADMUX=0x61;
	ldi R24,97
	out 0x7,R24
	xjmp L86
L85:
	.dbline 255
; 			     else 
;                     ADMUX=0x62;
	ldi R24,98
	out 0x7,R24
L86:
L84:
	.dbline 256
;    delay_us(10);
	ldi R16,10
	ldi R17,0
	xcall _delay_us
	.dbline 257
;     ADCSRA|=0x40;
	sbi 0x6,6
	.dbline 258
;    delay_ms(100);
	ldi R16,100
	ldi R17,0
	xcall _delay_ms
	.dbline 259
;    switch(adc)
	mov R22,R20
	clr R23
	cpi R22,0
	cpc R22,R23
	breq L90
X1:
	cpi R22,1
	ldi R30,0
	cpc R23,R30
	breq L91
	cpi R22,2
	ldi R30,0
	cpc R23,R30
	breq L92
	xjmp L88
X2:
	.dbline 260
;        {
L90:
	.dbline 261
;         case 0: left=(ADC>>6);break;
	ldi R18,6
	ldi R19,0
	in R16,0x4
	in R17,0x5
	xcall lsr16
	sts _left+1,R17
	sts _left,R16
	.dbline 261
	xjmp L88
L91:
	.dbline 262
; 	    case 1: right=(ADC>>6);break;
	ldi R18,6
	ldi R19,0
	in R16,0x4
	in R17,0x5
	xcall lsr16
	sts _right+1,R17
	sts _right,R16
	.dbline 262
	xjmp L88
L92:
	.dbline 263
; 		case 2: interval=(ADC>>6);break;
	ldi R18,6
	ldi R19,0
	in R16,0x4
	in R17,0x5
	xcall lsr16
	sts _interval+1,R17
	sts _interval,R16
	.dbline 263
	.dbline 264
; 	        default:  break;
L88:
	.dbline 266
L80:
	.dbline 248
	inc R20
L82:
	.dbline 248
	cpi R20,3
	brsh X4
	xjmp L79
X4:
	.dbline 267
;         }
;     }
;   zhong=right-left;
	lds R2,_left
	lds R3,_left+1
	lds R4,_right
	lds R5,_right+1
	sub R4,R2
	sbc R5,R3
	sts _zhong+1,R5
	sts _zhong,R4
	.dbline 268
;   right=1024-right;
	lds R2,_right
	lds R3,_right+1
	ldi R24,1024
	ldi R25,4
	sub R24,R2
	sbc R25,R3
	sts _right+1,R25
	sts _right,R24
	.dbline 269
;   if(interval<420)
	lds R24,_interval
	lds R25,_interval+1
	cpi R24,164
	ldi R30,1
	cpc R25,R30
	brsh L93
	.dbline 270
;    {
	.dbline 271
;       TIMSK&=0xbf;//停止计时
	in R24,0x39
	andi R24,191
	out 0x39,R24
	.dbline 272
; 	       for(;;)
L95:
	.dbline 273
; 	            stop();
	xcall _stop
	.dbline 272
	.dbline 272
	xjmp L95
L93:
	.dbline 275
; 		}		
;    else if((interval>419)&&(zhong<left)&&(zhong<right)&&((left<(right+10))|(right<(left+10))))
	ldi R24,419
	ldi R25,1
	lds R2,_interval
	lds R3,_interval+1
	cp R24,R2
	cpc R25,R3
	brlo X5
	xjmp L99
X5:
	lds R2,_left
	lds R3,_left+1
	lds R4,_zhong
	lds R5,_zhong+1
	cp R4,R2
	cpc R5,R3
	brsh L99
	lds R2,_right
	lds R3,_right+1
	cp R4,R2
	cpc R5,R3
	brsh L99
	movw R24,R2
	adiw R24,10
	lds R2,_left
	lds R3,_left+1
	cp R2,R24
	cpc R3,R25
	brsh L101
	ldi R22,1
	ldi R23,0
	xjmp L102
L101:
	clr R22
	clr R23
L102:
	lds R24,_left
	lds R25,_left+1
	adiw R24,10
	lds R2,_right
	lds R3,_right+1
	cp R2,R24
	cpc R3,R25
	brsh L103
	ldi R20,1
	ldi R21,0
	xjmp L104
L103:
	clr R20
	clr R21
L104:
	movw R2,R22
	or R2,R20
	or R3,R21
	tst R2
	brne X3
	tst R3
	breq L99
X3:
	.dbline 276
;               {run();}
	.dbline 276
	xcall _run
	.dbline 276
	xjmp L100
L99:
	.dbline 277
; 	      else if((interval>419)&&(zhong<left)&&(zhong<right)&&(left>(right+10)))
	ldi R24,419
	ldi R25,1
	lds R2,_interval
	lds R3,_interval+1
	cp R24,R2
	cpc R25,R3
	brsh L105
	lds R2,_left
	lds R3,_left+1
	lds R4,_zhong
	lds R5,_zhong+1
	cp R4,R2
	cpc R5,R3
	brsh L105
	lds R2,_right
	lds R3,_right+1
	cp R4,R2
	cpc R5,R3
	brsh L105
	movw R24,R2
	adiw R24,10
	lds R2,_left
	lds R3,_left+1
	cp R24,R2
	cpc R25,R3
	brsh L105
	.dbline 278
; 		       {turn_left();}
	.dbline 278
	xcall _turn_left
	.dbline 278
	xjmp L106
L105:
	.dbline 279
; 		   else if((interval>419)&&(zhong<left)&&(zhong<right)&&(right>(left+10)))
	ldi R24,419
	ldi R25,1
	lds R2,_interval
	lds R3,_interval+1
	cp R24,R2
	cpc R25,R3
	brsh L107
	lds R2,_left
	lds R3,_left+1
	lds R4,_zhong
	lds R5,_zhong+1
	cp R4,R2
	cpc R5,R3
	brsh L107
	lds R2,_right
	lds R3,_right+1
	cp R4,R2
	cpc R5,R3
	brsh L107
	lds R24,_left
	lds R25,_left+1
	adiw R24,10
	cp R24,R2
	cpc R25,R3
	brsh L107
	.dbline 280
; 		 	   {turn_right();}
	.dbline 280
	xcall _turn_right
	.dbline 280
	xjmp L108
L107:
	.dbline 281
;                   else  if((interval>419)&&(left<zhong)&&(left<right))
	ldi R24,419
	ldi R25,1
	lds R2,_interval
	lds R3,_interval+1
	cp R24,R2
	cpc R25,R3
	brsh L109
	lds R2,_zhong
	lds R3,_zhong+1
	lds R4,_left
	lds R5,_left+1
	cp R4,R2
	cpc R5,R3
	brsh L109
	lds R2,_right
	lds R3,_right+1
	cp R4,R2
	cpc R5,R3
	brsh L109
	.dbline 282
;                       {turn_right();}
	.dbline 282
	xcall _turn_right
	.dbline 282
	xjmp L110
L109:
	.dbline 283
; 		            else if((interval>419)&&(right<left)&&(right<left))
	ldi R24,419
	ldi R25,1
	lds R2,_interval
	lds R3,_interval+1
	cp R24,R2
	cpc R25,R3
	brsh L111
	lds R2,_left
	lds R3,_left+1
	lds R4,_right
	lds R5,_right+1
	cp R4,R2
	cpc R5,R3
	brsh L111
	cp R4,R2
	cpc R5,R3
	brsh L111
	.dbline 284
; 		                  {turn_left();} 
	.dbline 284
	xcall _turn_left
	.dbline 284
L111:
L110:
L108:
L106:
L100:
	.dbline 285
; delay_ms(100);
	ldi R16,100
	ldi R17,0
	xcall _delay_ms
	.dbline -2
L78:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r adc 20 c
	.dbend
	.dbfunc e time_inite _time_inite fV
	.even
_time_inite::
	.dbline -1
	.dbline 292
; }
; ////////////////////探测光源函数///////////////////////////////////
; 
; 
; ///////////////计时中断函数/////////////////////////////////////////
; void time_inite(void)
; {
	.dbline 293
; TCCR2|= 0x07;//分频比1024
	in R24,0x25
	ori R24,7
	out 0x25,R24
	.dbline 294
;  mini=0;
	clr R2
	sts _mini,R2
	.dbline 295
;  second=0;
	sts _second,R2
	.dbline 296
;  minisecond=0;
	sts _minisecond,R2
	.dbline -2
L113:
	.dbline 0 ; func end
	ret
	.dbend
	.area vector(rom, abs)
	.org 16
	jmp _time2_isr
	.area text(rom, con, rel)
	.dbfile C:\DOCUME~1\eda\桌面\宝贝机器人.c
	.dbfunc e time2_isr _time2_isr fV
	.even
_time2_isr::
	xcall push_lset
	sbiw R28,3
	.dbline -1
	.dbline 301
; }
; 
; #pragma interrupt_handler  time2_isr:5
; void   time2_isr(void)
;  {
	.dbline 302
;  TCNT2=0xb2;
	ldi R24,178
	out 0x24,R24
	.dbline 303
;  minisecond++;
	lds R24,_minisecond
	subi R24,255    ; addi 1
	sts _minisecond,R24
	.dbline 304
;  if (minisecond<100)//计算总时间
	cpi R24,100
	brsh L115
	.dbline 305
; 	  	;
	xjmp L116
L115:
	.dbline 307
; 	  else
; 	    {
	.dbline 308
; 		 minisecond=0;
	clr R2
	sts _minisecond,R2
	.dbline 309
; 		 if (second<60)
	lds R24,_second
	cpi R24,60
	brsh L117
	.dbline 310
; 		    second++;
	subi R24,255    ; addi 1
	sts _second,R24
	xjmp L118
L117:
	.dbline 312
; 		 else  
; 		    {
	.dbline 313
; 			second=0;
	clr R2
	sts _second,R2
	.dbline 314
; 			minute++;
	lds R24,_minute
	subi R24,255    ; addi 1
	sts _minute,R24
	.dbline 315
; 			if(minute==100)
	cpi R24,100
	brne L119
	.dbline 316
; 			  minute=0;
	sts _minute,R2
L119:
	.dbline 317
; 	      }
L118:
	.dbline 318
; 		 }
L116:
	.dbline 319
;         display_time(10,minute,second,0);
	clr R2
	std y+2,R2
	lds R2,_second
	std y+0,R2
	lds R18,_minute
	ldi R16,10
	xcall _display_time
	.dbline -2
L114:
	adiw R28,3
	xcall pop_lset
	.dbline 0 ; func end
	reti
	.dbend
	.dbfunc e main _main fV
;              i -> R20,R21
	.even
_main::
	.dbline -1
	.dbline 327
;   
; } 
; ///////////////计时中断函数/////////////////////////////////////////
; 
; 
; //////////////主函数///////////////////////////////////////////////
; void main(void)
; {
	.dbline 329
;  unsigned  int i;  
;  MCUCSR|=0x80;//禁止PC5第二功能,使之为普通I/O口
	in R24,0x34
	ori R24,128
	out 0x34,R24
	.dbline 330
;  MCUCSR|=0x80;
	in R24,0x34
	ori R24,128
	out 0x34,R24
	.dbline 331
;  DDRD|=0xc0;//PD 6 7控制左右电机
	in R24,0x11
	ori R24,192
	out 0x11,R24
	.dbline 332
;  DDRC&=0xf8;//PC0 1 2为右中左红外传感器输入
	in R24,0x14
	andi R24,248
	out 0x14,R24
	.dbline 333
;  DDRC|=0x18;//PC3,4控制显示,PC3传送数据,PC4为时钟信号线
	in R24,0x14
	ori R24,24
	out 0x14,R24
	.dbline 334
;  PORTC&=0xe7;
	in R24,0x15
	andi R24,231
	out 0x15,R24
	.dbline 335
;  PORTC&=0xf8;
	in R24,0x15
	andi R24,248
	out 0x15,R24
	.dbline 336
;  PORTD&=0x3f;
	in R24,0x12
	andi R24,63
	out 0x12,R24
	.dbline 337
;  time_inite();
	xcall _time_inite
	.dbline 339
;  
;  SEI();
	sei
	.dbline 340
;   TIMSK|=0x40;//开始计时
	in R24,0x39
	ori R24,64
	out 0x39,R24
	xjmp L123
L122:
	.dbline 343
;  //while(1)stop();
;    while(1)
;  {
	.dbline 344
;     i++;
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 345
;     if(i<200)run();
	cpi R20,200
	ldi R30,0
	cpc R21,R30
	brsh L125
	.dbline 345
	xcall _run
	xjmp L126
L125:
	.dbline 346
; 	else if(i>200  && i<300)turn_left();	
	ldi R24,200
	ldi R25,0
	cp R24,R20
	cpc R25,R21
	brsh L127
	cpi R20,44
	ldi R30,1
	cpc R21,R30
	brsh L127
	.dbline 346
	xcall _turn_left
	xjmp L128
L127:
	.dbline 347
; 	else if(i>300  && i<500)run_back();
	ldi R24,300
	ldi R25,1
	cp R24,R20
	cpc R25,R21
	brsh L129
	cpi R20,244
	ldi R30,1
	cpc R21,R30
	brsh L129
	.dbline 347
	xcall _run_back
	xjmp L130
L129:
	.dbline 348
; 	else if((i>500  && i<600)) turn_right();
	ldi R24,500
	ldi R25,1
	cp R24,R20
	cpc R25,R21
	brsh L131
	cpi R20,88
	ldi R30,2
	cpc R21,R30
	brsh L131
	.dbline 348
	xcall _turn_right
L131:
L130:
L128:
L126:
	.dbline 349
; 	if(i>700)i=0;
	ldi R24,700
	ldi R25,2
	cp R24,R20
	cpc R25,R21
	brsh L133
	.dbline 349
	clr R20
	clr R21
L133:
	.dbline 350
L123:
	.dbline 342
	xjmp L122
X6:
	.dbline -2
L121:
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbend
	.area bss(ram, con, rel)
	.dbfile C:\DOCUME~1\eda\桌面\宝贝机器人.c
_interval::
	.blkb 2
	.dbsym e interval _interval i
_zhong::
	.blkb 2
	.dbsym e zhong _zhong i
_right::
	.blkb 2
	.dbsym e right _right i
_left::
	.blkb 2
	.dbsym e left _left i
_minisecond::
	.blkb 1
	.dbsym e minisecond _minisecond c
_mini::
	.blkb 1
	.dbsym e mini _mini c
_second::
	.blkb 1
	.dbsym e second _second c
_sec::
	.blkb 1
	.dbsym e sec _sec c

⌨️ 快捷键说明

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