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

📄 双足机器人.s

📁 这段源代码是基于atmel公司mega16单片机做的双足机器人控制程序
💻 S
📖 第 1 页 / 共 3 页
字号:
	.dbfunc e RightUp _RightUp fV
;           time -> R20
	.even
_RightUp::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 190
;  {
;   time--;
;  
;   PORTD&=0x3f;
;   delay_20ms();
; 
;  
;   PORTD|=0x40;
;   delay_run();
;   PORTD&=0x3f; 
;  }
; 
; 
; 
; 
; }	
; 	
; void RightUp(unsigned char  time)//抬右脚
; {
	xjmp L48
L47:
	.dbline 192
	.dbline 193
	dec R20
	.dbline 195
	in R24,0x12
	andi R24,63
	out 0x12,R24
	.dbline 196
	xcall _delay_20ms
	.dbline 199
	sbi 0x12,7
	.dbline 200
	xcall _delay_back
	.dbline 201
	in R24,0x12
	andi R24,63
	out 0x12,R24
	.dbline 203
L48:
	.dbline 191
;  while(time>1)
	ldi R24,1
	cp R24,R20
	brlo L47
	.dbline -2
L46:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r time 20 c
	.dbend
	.dbfunc e RightFwd _RightFwd fV
;           time -> R20
	.even
_RightFwd::
	xcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 207
;  {
;   time--;
;  
;   PORTD&=0x3f;
;   delay_20ms();
; 
;  
;   PORTD|=0x80;
;   delay_back();
;   PORTD&=0x3f;
;  
;  }
; }
; 
; void RightFwd(unsigned char time)//迈右脚
; {
	xjmp L52
L51:
	.dbline 209
	.dbline 210
	dec R20
	.dbline 212
	in R24,0x12
	andi R24,63
	out 0x12,R24
	.dbline 213
	xcall _delay_20ms
	.dbline 216
	sbi 0x12,6
	.dbline 217
	xcall _delay_back
	.dbline 218
	in R24,0x12
	andi R24,63
	out 0x12,R24
	.dbline 219
L52:
	.dbline 208
;  while(time>1)
	ldi R24,1
	cp R24,R20
	brlo L51
	.dbline -2
L50:
	xcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r time 20 c
	.dbend
	.dbfunc e display_time _display_time fV
;              j -> R20
;        display -> R22
;          point -> R12
;         second -> R10
;         minute -> R14
;             n1 -> R20
	.even
_display_time::
	xcall push_gset5
	mov R14,R18
	mov R20,R16
	ldd R10,y+10
	ldd R12,y+12
	.dbline -1
	.dbline 234
;  {
;   time--;
;  
;   PORTD&=0x3f;
;   delay_20ms();
; 
;  
;   PORTD|=0x40;
;   delay_back();
;   PORTD&=0x3f; 
;  }
; 
; }
; 
; 
; /////////////////小车运动////////////////////////////////////////
; 
; 
; /////////////液晶屏显示函数/////////////////////////////////////
;  
;  
;  void display_time(unsigned char n1,unsigned char minute,unsigned char second,unsigned char  point)
; //参数n1为控制是否显示冒号,11为不显示,10为显示.
; //minute\second为两个最大为99的整数
; //point为控制是否显示小数点,0为不显示,1为显示.
; {
	.dbline 236
; 	unsigned char j,display;
; 	 display=number[n1];
	ldi R24,<_number
	ldi R25,>_number
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R22,z+0
	.dbline 237
;     for(j=0;j<8;j++)
	clr R20
	xjmp L58
L55:
	.dbline 238
	.dbline 239
	sbi 0x15,4
	.dbline 240
	in R24,0x15
	andi R24,247
	out 0x15,R24
	.dbline 240
	ldi R16,5
	ldi R17,0
	xcall _delay_us
	.dbline 241
	mov R24,R22
	andi R24,1
	lsl R24
	lsl R24
	lsl R24
	in R2,0x15
	or R2,R24
	out 0x15,R2
	.dbline 241
	ldi R16,5
	ldi R17,0
	xcall _delay_us
	.dbline 242
	in R24,0x15
	andi R24,239
	out 0x15,R24
	.dbline 242
	ldi R16,5
	ldi R17,0
	xcall _delay_us
	.dbline 243
	lsr R22
	.dbline 244
L56:
	.dbline 237
	inc R20
L58:
	.dbline 237
	cpi R20,8
	brlo L55
	.dbline 245
;      {
;        PORTC|=0x10;
;        PORTC&=0xf7;delay_us(5);
;        PORTC|=((display&0x01)<<3);delay_us(5);
;        PORTC&=0xef;delay_us(5);
;         display>>=1;
;      }
;   display=number[minute/10];
	ldi R18,10
	ldi R19,0
	mov R16,R14
	clr R17
	xcall div16s
	movw R30,R16
	ldi R24,<_number
	ldi R25,>_number
	add R30,R24
	adc R31,R25
	ldd R22,z+0
	.dbline 246
;   for(j=0;j<8;j++)
	clr R20
	xjmp L62
L59:
	.dbline 247
	.dbline 248
	sbi 0x15,4
	.dbline 248
	ldi R16,5
	ldi R17,0
	xcall _delay_us
	.dbline 249
	in R24,0x15
	andi R24,247
	out 0x15,R24
	.dbline 249
	ldi R16,5
	ldi R17,0
	xcall _delay_us
	.dbline 250
	mov R24,R22
	andi R24,1
	lsl R24
	lsl R24
	lsl R24
	in R2,0x15
	or R2,R24
	out 0x15,R2
	.dbline 250
	ldi R16,5
	ldi R17,0
	xcall _delay_us
	.dbline 251
	in R24,0x15
	andi R24,239
	out 0x15,R24
	.dbline 251
	ldi R16,5
	ldi R17,0
	xcall _delay_us
	.dbline 252
	lsr R22
	.dbline 253
L60:
	.dbline 246
	inc R20
L62:
	.dbline 246
	cpi R20,8
	brlo L59
	.dbline 254
;     {
;      PORTC|=0x10;delay_us(5);
;      PORTC&=0xf7;delay_us(5);
;      PORTC|=((display&0x01)<<3);delay_us(5);
;      PORTC&=0xef;delay_us(5);
;       display>>=1;
;    }
;   display=number[minute%10];
	ldi R18,10
	ldi R19,0
	mov R16,R14
	clr R17
	xcall mod16s
	movw R30,R16
	ldi R24,<_number
	ldi R25,>_number
	add R30,R24
	adc R31,R25
	ldd R22,z+0
	.dbline 255
;   if(point)  //显示路程时米与厘米之加小数点
	tst R12
	breq L63
	.dbline 256
;   display&=0x7f;
	andi R22,127
L63:
	.dbline 257
;    for(j=0;j<8;j++)
	clr R20
	xjmp L68
L65:
	.dbline 258
	.dbline 259
	sbi 0x15,4
	.dbline 259
	ldi R16,5
	ldi R17,0
	xcall _delay_us
	.dbline 260
	in R24,0x15
	andi R24,247
	out 0x15,R24
	.dbline 260
	ldi R16,5
	ldi R17,0
	xcall _delay_us
	.dbline 261
	mov R24,R22
	andi R24,1
	lsl R24
	lsl R24
	lsl R24
	in R2,0x15
	or R2,R24
	out 0x15,R2
	.dbline 261
	ldi R16,5
	ldi R17,0
	xcall _delay_us
	.dbline 262
	in R24,0x15
	andi R24,239
	out 0x15,R24
	.dbline 262
	ldi R16,5
	ldi R17,0
	xcall _delay_us
	.dbline 263
	lsr R22
	.dbline 264
L66:
	.dbline 257
	inc R20
L68:
	.dbline 257
	cpi R20,8
	brlo L65
	.dbline 265
;    {
;      PORTC|=0x10;delay_us(5);
;      PORTC&=0xf7;delay_us(5);
;      PORTC|=((display&0x01)<<3);delay_us(5);
;      PORTC&=0xef;delay_us(5);
;     display>>=1;
;   }
;   display=number[second/10];
	ldi R18,10
	ldi R19,0
	mov R16,R10
	clr R17
	xcall div16s
	movw R30,R16
	ldi R24,<_number
	ldi R25,>_number
	add R30,R24
	adc R31,R25
	ldd R22,z+0
	.dbline 266
;   for(j=0;j<8;j++)
	clr R20
	xjmp L72
L69:
	.dbline 267
	.dbline 268
	sbi 0x15,4
	.dbline 268
	ldi R16,5
	ldi R17,0
	xcall _delay_us
	.dbline 269
	in R24,0x15
	andi R24,247
	out 0x15,R24
	.dbline 269
	ldi R16,5
	ldi R17,0
	xcall _delay_us
	.dbline 270
	mov R24,R22
	andi R24,1
	lsl R24
	lsl R24
	lsl R24
	in R2,0x15
	or R2,R24
	out 0x15,R2
	.dbline 270
	ldi R16,5
	ldi R17,0
	xcall _delay_us
	.dbline 271
	in R24,0x15
	andi R24,239
	out 0x15,R24
	.dbline 271
	ldi R16,5
	ldi R17,0
	xcall _delay_us
	.dbline 272
	lsr R22
	.dbline 273
L70:
	.dbline 266
	inc R20
L72:
	.dbline 266
	cpi R20,8
	brlo L69
	.dbline 274
;   {
;    PORTC|=0x10;delay_us(5);
;    PORTC&=0xf7;delay_us(5);
;    PORTC|=((display&0x01)<<3);delay_us(5);
;    PORTC&=0xef;delay_us(5);
;    display>>=1;
;   }
;   display=number[second%10];
	ldi R18,10
	ldi R19,0
	mov R16,R10
	clr R17
	xcall mod16s
	movw R30,R16
	ldi R24,<_number
	ldi R25,>_number
	add R30,R24
	adc R31,R25
	ldd R22,z+0
	.dbline 275
;   for(j=0;j<8;j++)
	clr R20
	xjmp L76
L73:
	.dbline 276
	.dbline 277
	sbi 0x15,4
	.dbline 277
	ldi R16,5
	ldi R17,0
	xcall _delay_us
	.dbline 278
	in R24,0x15
	andi R24,247
	out 0x15,R24
	.dbline 278
	ldi R16,5
	ldi R17,0
	xcall _delay_us
	.dbline 279
	mov R24,R22
	andi R24,1
	lsl R24
	lsl R24
	lsl R24
	in R2,0x15
	or R2,R24
	out 0x15,R2
	.dbline 279
	ldi R16,5
	ldi R17,0
	xcall _delay_us
	.dbline 280
	in R24,0x15
	andi R24,239
	out 0x15,R24
	.dbline 280
	ldi R16,5
	ldi R17,0
	xcall _delay_us
	.dbline 281
	lsr R22
	.dbline 282
L74:
	.dbline 275
	inc R20
L76:
	.dbline 275
	cpi R20,8
	brlo L73
	.dbline -2
L54:
	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 290
;   {
;    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 292
;    unsigned char pinc;
;     PINC=PINC&0x07;  //PC0~PC2信号送给变量pinc
	in R24,0x13
	andi R24,7
	out 0x13,R24
	.dbline 293
;   if((PINC==0x02)||(PINC==0x07))//只有中间传感器有信号,
	in R24,0x13
	cpi R24,2
	breq L80
	in R24,0x13
	cpi R24,7
	brne L78
L80:
	.dbline 294
;       { run();turn_state0=0;  turn_state1=0;}//或三个均有信号,则直走
	.dbline 294
	xcall _run
	.dbline 294
	clr R2
	sts _turn_state0,R2
	.dbline 294
	sts _turn_state1,R2
	.dbline 294
	xjmp L79
L78:
	.dbline 295
; 	else if(PINC==0x06)//若右边无信号
	in R24,0x13
	cpi R24,6
	brne L81
	.dbline 296
; 	  {turn_left();turn_state0=1;}     //左转
	.dbline 296
	xcall _turn_left
	.dbline 296
	ldi R24,1
	sts _turn_state0,R24
	.dbline 296
	xjmp L82
L81:
	.dbline 297
; 	  else if(PINC==0x03)//若左边无信号
	in R24,0x13
	cpi R24,3
	brne L83
	.dbline 298
; 	    {turn_right(); turn_state1=1;}   //右转
	.dbline 298
	xcall _turn_right
	.dbline 298
	ldi R24,1
	sts _turn_state1,R24
	.dbline 298
	xjmp L84
L83:
	.dbline 299
; 		else if(PINC==0x04)//若右边和中间均无信号
	in R24,0x13
	cpi R24,4
	brne L85
	.dbline 300
; 		 { turn_left();turn_state0=1;}   //左转
	.dbline 300
	xcall _turn_left
	.dbline 300
	ldi R24,1
	sts _turn_state0,R24
	.dbline 300
	xjmp L86
L85:
	.dbline 301
; 		  else if(PINC==0x01)//若左边和中间均无信号
	in R24,0x13
	cpi R24,1
	brne L87
	.dbline 302
; 		    {turn_right();turn_state1=1;}   //右转
	.dbline 302
	xcall _turn_right
	.dbline 302
	ldi R24,1
	sts _turn_state1,R24
	.dbline 302
	xjmp L88
L87:
	.dbline 303
; 			else if((turn_state0==1)&&(PINC==0))//若三个均无信号
	lds R24,_turn_state0
	cpi R24,1
	brne L89
	in R2,0x13
	tst R2
	brne L89
	.dbline 304
; 			   turn_left();  //左转半圈
	xcall _turn_left
	xjmp L90
L89:
	.dbline 305
;               else if((turn_state1==1)&&(PINC==0))
	lds R24,_turn_state1
	cpi R24,1
	brne L91
	in R2,0x13
	tst R2
	brne L91
	.dbline 306
; 			    turn_right();
	xcall _turn_right
	xjmp L92
L91:
	.dbline 308
; 				else
; 				  run();
	xcall _run
L92:
L90:
L88:
L86:
L84:
L82:
L79:
	.dbline -2
L77:
	.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 316
;   }
; ///////////////////寻找黑线////////////////////////////////////////
; 
; 
; 
; ////////////////////探测光源函数///////////////////////////////////
; void trace_light_init(void)

⌨️ 快捷键说明

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