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

📄 双足机器人.lst

📁 这段源代码是基于atmel公司mega16单片机做的双足机器人控制程序
💻 LST
📖 第 1 页 / 共 4 页
字号:
    0213 7081      ANDI	R24,1
    0214 0F88      LSL	R24
    0215 0F88      LSL	R24
    0216 0F88      LSL	R24
    0217 B225      IN	R2,0x15
    0218 2A28      OR	R2,R24
    0219 BA25      OUT	0x15,R2
    021A E005      LDI	R16,5
    021B E010      LDI	R17,0
    021C DE36      RCALL	_delay_us
(0280)    PORTC&=0xef;delay_us(5);
    021D B385      IN	R24,0x15
    021E 7E8F      ANDI	R24,0xEF
    021F BB85      OUT	0x15,R24
    0220 E005      LDI	R16,5
    0221 E010      LDI	R17,0
    0222 DE30      RCALL	_delay_us
(0281)    display>>=1;
    0223 9566      LSR	R22
    0224 9543      INC	R20
    0225 3048      CPI	R20,0x8
    0226 F308      BCS	0x0208
    0227 940E0468  CALL	pop_gset5
    0229 9508      RET
(0282)   }
(0283) } 
(0284) /////////////液晶屏显示函数/////////////////////////////////////
(0285) 
(0286) 
(0287) 
(0288) /////////////////寻找黑线////////////////////////////////////////
(0289) void trace_road(void) //黑线寻迹函数
(0290) {
(0291)    unsigned char pinc;
(0292)     PINC=PINC&0x07;  //PC0~PC2信号送给变量pinc
_trace_road:
  pinc                 --> Y+1
    022A B383      IN	R24,0x13
    022B 7087      ANDI	R24,7
    022C BB83      OUT	0x13,R24
(0293)   if((PINC==0x02)||(PINC==0x07))//只有中间传感器有信号,
    022D B383      IN	R24,0x13
    022E 3082      CPI	R24,2
    022F F019      BEQ	0x0233
    0230 B383      IN	R24,0x13
    0231 3087      CPI	R24,7
    0232 F439      BNE	0x023A
(0294)       { run();turn_state0=0;  turn_state1=0;}//或三个均有信号,则直走
    0233 DE8D      RCALL	_run
    0234 2422      CLR	R2
    0235 92200060  STS	turn_state0,R2
    0237 92200061  STS	turn_state1,R2
    0239 C033      RJMP	0x026D
(0295) 	else if(PINC==0x06)//若右边无信号
    023A B383      IN	R24,0x13
    023B 3086      CPI	R24,6
    023C F429      BNE	0x0242
(0296) 	  {turn_left();turn_state0=1;}     //左转
    023D DEA3      RCALL	_turn_left
    023E E081      LDI	R24,1
    023F 93800060  STS	turn_state0,R24
    0241 C02B      RJMP	0x026D
(0297) 	  else if(PINC==0x03)//若左边无信号
    0242 B383      IN	R24,0x13
    0243 3083      CPI	R24,3
    0244 F429      BNE	0x024A
(0298) 	    {turn_right(); turn_state1=1;}   //右转
    0245 DEA5      RCALL	_turn_right
    0246 E081      LDI	R24,1
    0247 93800061  STS	turn_state1,R24
    0249 C023      RJMP	0x026D
(0299) 		else if(PINC==0x04)//若右边和中间均无信号
    024A B383      IN	R24,0x13
    024B 3084      CPI	R24,4
    024C F429      BNE	0x0252
(0300) 		 { turn_left();turn_state0=1;}   //左转
    024D DE93      RCALL	_turn_left
    024E E081      LDI	R24,1
    024F 93800060  STS	turn_state0,R24
    0251 C01B      RJMP	0x026D
(0301) 		  else if(PINC==0x01)//若左边和中间均无信号
    0252 B383      IN	R24,0x13
    0253 3081      CPI	R24,1
    0254 F429      BNE	0x025A
(0302) 		    {turn_right();turn_state1=1;}   //右转
    0255 DE95      RCALL	_turn_right
    0256 E081      LDI	R24,1
    0257 93800061  STS	turn_state1,R24
    0259 C013      RJMP	0x026D
(0303) 			else if((turn_state0==1)&&(PINC==0))//若三个均无信号
    025A 91800060  LDS	R24,turn_state0
    025C 3081      CPI	R24,1
    025D F429      BNE	0x0263
    025E B223      IN	R2,0x13
    025F 2022      TST	R2
    0260 F411      BNE	0x0263
(0304) 			   turn_left();  //左转半圈
    0261 DE7F      RCALL	_turn_left
    0262 C00A      RJMP	0x026D
(0305)               else if((turn_state1==1)&&(PINC==0))
    0263 91800061  LDS	R24,turn_state1
    0265 3081      CPI	R24,1
    0266 F429      BNE	0x026C
    0267 B223      IN	R2,0x13
    0268 2022      TST	R2
    0269 F411      BNE	0x026C
(0306) 			    turn_right();
    026A DE80      RCALL	_turn_right
    026B C001      RJMP	0x026D
(0307) 				else
(0308) 				  run();
    026C DE54      RCALL	_run
    026D 9508      RET
(0309)   }
(0310) ///////////////////寻找黑线////////////////////////////////////////
(0311) 
(0312) 
(0313) 
(0314) ////////////////////探测光源函数///////////////////////////////////
(0315) void trace_light_init(void)
(0316)  {
(0317)    DDRA&=0xf8;       // PC0 1分别为探测光源的左 右端口,
_trace_light_init:
    026E B38A      IN	R24,0x1A
    026F 7F88      ANDI	R24,0xF8
    0270 BB8A      OUT	0x1A,R24
(0318)    PORTA&=0xf8;
    0271 B38B      IN	R24,0x1B
    0272 7F88      ANDI	R24,0xF8
    0273 BB8B      OUT	0x1B,R24
(0319)   ADMUX=0x60;         //初始化ADC0 
    0274 E680      LDI	R24,0x60
    0275 B987      OUT	0x07,R24
(0320)   ADCSRA=0x82;         //初始化ADC0,64分频
    0276 E882      LDI	R24,0x82
    0277 B986      OUT	0x06,R24
    0278 9508      RET
_trace_light:
  adc                  --> R20
    0279 940E0471  CALL	push_gset2
(0321)  }
(0322) void trace_light(void)
(0323) {
(0324)    unsigned char adc;
(0325)     for(adc=0;adc<3;adc++)
    027B 2744      CLR	R20
    027C C042      RJMP	0x02BF
(0326) 	{
(0327) 	   if(adc==0)
    027D 2344      TST	R20
    027E F419      BNE	0x0282
(0328)           ADMUX=0x60;
    027F E680      LDI	R24,0x60
    0280 B987      OUT	0x07,R24
    0281 C007      RJMP	0x0289
(0329) 	        else if(adc==1)
    0282 3041      CPI	R20,1
    0283 F419      BNE	0x0287
(0330)                ADMUX=0x61;
    0284 E681      LDI	R24,0x61
    0285 B987      OUT	0x07,R24
    0286 C002      RJMP	0x0289
(0331) 			     else 
(0332)                     ADMUX=0x62;
    0287 E682      LDI	R24,0x62
    0288 B987      OUT	0x07,R24
(0333)    delay_us(10);
    0289 E00A      LDI	R16,0xA
    028A E010      LDI	R17,0
    028B DDC7      RCALL	_delay_us
(0334)     ADCSRA|=0x40;
    028C 9A36      SBI	0x06,6
(0335)    delay_ms(100);
    028D E604      LDI	R16,0x64
    028E E010      LDI	R17,0
    028F DDCB      RCALL	_delay_ms
(0336)    switch(adc)
    0290 2F64      MOV	R22,R20
    0291 2777      CLR	R23
    0292 3060      CPI	R22,0
    0293 0767      CPC	R22,R23
    0294 F049      BEQ	0x029E
    0295 3061      CPI	R22,1
    0296 E0E0      LDI	R30,0
    0297 077E      CPC	R23,R30
    0298 F081      BEQ	0x02A9
    0299 3062      CPI	R22,2
    029A E0E0      LDI	R30,0
    029B 077E      CPC	R23,R30
    029C F0B9      BEQ	0x02B4
    029D C020      RJMP	0x02BE
(0337)        {
(0338)         case 0: left=(ADC>>6);break;
    029E E026      LDI	R18,6
    029F E030      LDI	R19,0
    02A0 B104      IN	R16,0x04
    02A1 B115      IN	R17,0x05
    02A2 940E04B8  CALL	lsr16
    02A4 93100076  STS	left+1,R17
    02A6 93000075  STS	left,R16
    02A8 C015      RJMP	0x02BE
(0339) 	    case 1: right=(ADC>>6);break;
    02A9 E026      LDI	R18,6
    02AA E030      LDI	R19,0
    02AB B104      IN	R16,0x04
    02AC B115      IN	R17,0x05
    02AD 940E04B8  CALL	lsr16
    02AF 93100074  STS	right+1,R17
    02B1 93000073  STS	right,R16
    02B3 C00A      RJMP	0x02BE
(0340) 		case 2: interval=(ADC>>6);break;
    02B4 E026      LDI	R18,6
    02B5 E030      LDI	R19,0
    02B6 B104      IN	R16,0x04
    02B7 B115      IN	R17,0x05
    02B8 940E04B8  CALL	lsr16
    02BA 93100070  STS	interval+1,R17
    02BC 9300006F  STS	interval,R16
    02BE 9543      INC	R20
    02BF 3043      CPI	R20,3
    02C0 F408      BCC	0x02C2
    02C1 CFBB      RJMP	0x027D
(0341) 	        default:  break;
(0342)         }
(0343)     }
(0344)   zhong=right-left;
    02C2 90200075  LDS	R2,left
    02C4 90300076  LDS	R3,left+1
    02C6 90400073  LDS	R4,right
    02C8 90500074  LDS	R5,right+1
    02CA 1842      SUB	R4,R2
    02CB 0853      SBC	R5,R3
    02CC 92500072  STS	zhong+1,R5
    02CE 92400071  STS	zhong,R4
(0345)   right=1024-right;
    02D0 90200073  LDS	R2,right
    02D2 90300074  LDS	R3,right+1
    02D4 E080      LDI	R24,0
    02D5 E094      LDI	R25,4
    02D6 1982      SUB	R24,R2
    02D7 0993      SBC	R25,R3
    02D8 93900074  STS	right+1,R25
    02DA 93800073  STS	right,R24
(0346)   if(interval<420)
    02DC 9180006F  LDS	R24,interval
    02DE 91900070  LDS	R25,interval+1
    02E0 3A84      CPI	R24,0xA4
    02E1 E0E1      LDI	R30,1
    02E2 079E      CPC	R25,R30
    02E3 F428      BCC	0x02E9
(0347)    {
(0348)       TIMSK&=0xbf;//停止计时
    02E4 B789      IN	R24,0x39
    02E5 7B8F      ANDI	R24,0xBF
    02E6 BF89      OUT	0x39,R24
(0349) 	       for(;;)
(0350) 	            stop();
    02E7 DDD0      RCALL	_stop
    02E8 CFFE      RJMP	0x02E7
(0351) 		}		
(0352)    else if((interval>419)&&(zhong<left)&&(zhong<right)&&((left<(right+10))|(right<(left+10))))
    02E9 EA83      LDI	R24,0xA3
    02EA E091      LDI	R25,1
    02EB 9020006F  LDS	R2,interval
    02ED 90300070  LDS	R3,interval+1
    02EF 1582      CP	R24,R2
    02F0 0593      CPC	R25,R3
    02F1 F008      BCS	0x02F3
    02F2 C03A      RJMP	0x032D
    02F3 90200075  LDS	R2,left
    02F5 90300076  LDS	R3,left+1
    02F7 90400071  LDS	R4,zhong
    02F9 90500072  LDS	R5,zhong+1
    02FB 1442      CP	R4,R2
    02FC 0453      CPC	R5,R3
    02FD F578      BCC	0x032D
    02FE 90200073  LDS	R2,right
    0300 90300074  LDS	R3,right+1
    0302 1442      CP	R4,R2
    0303 0453      CPC	R5,R3
    0304 F540      BCC	0x032D
    0305 01C1      MOVW	R24,R2
    0306 960A      ADIW	R24,0xA
    0307 90200075  LDS	R2,left
    0309 90300076  LDS	R3,left+1
    030B 1628      CP	R2,R24
    030C 0639      CPC	R3,R25
    030D F418      BCC	0x0311
    030E E061      LDI	R22,1
    030F E070      LDI	R23,0
    0310 C002      RJMP	0x0313
    0311 2766      CLR	R22
    0312 2777      CLR	R23
    0313 91800075  LDS	R24,left
    0315 91900076  LDS	R25,left+1
    0317 960A      ADIW	R24,0xA
    0318 90200073  LDS	R2,right
    031A 90300074  LDS	R3,right+1
    031C 1628      CP	R2,R24
    031D 0639      CPC	R3,R25
    031E F418      BCC	0x0322
    031F E041      LDI	R20,1
    0320 E050      LDI	R21,0
    0321 C002      RJMP	0x0324
    0322 2744      CLR	R20
    0323 2755      CLR	R21
    0324 011B      MOVW	R2,R22
    0325 2A24      OR	R2,R20
    0326 2A35      OR	R3,R21
    0327 2022      TST	R2
    0328 F411      BNE	0x032B
    0329 2033      TST	R3
    032A F011      BEQ	0x032D
(0353)               {run();}
    032B DD95      RCALL	_run
    032C C080      RJMP	0x03AD
(0354) 	      else if((interval>419)&&(zhong<left)&&(zhong<right)&&(left>(right+10)))
    032D EA83      LDI	R24,0xA3
    032E E091      LDI	R25,1
    032F 9020006F  LDS	R2,interval
    0331 90300070  LDS	R3,interval+1
    0333 1582      CP	R24,R2
    0334 0593      CPC	R25,R3
    0335 F4E8      BCC	0x0353
    0336 90200075  LDS	R2,left
    0338 90300076  LDS	R3,left+1
    033A 90400071  LDS	R4,zhong
    033C 90500072  LDS	R5,zhong+1
    033E 1442      CP	R4,R2
    033F 0453      CPC	R5,R3
    0340 F490      BCC	0x0353
    0341 90200073  LDS	R2,right
    0343 90300074  LDS	R3,right+1
    0345 1442      CP	R4,R2
    0346 0453      CPC	R5,R3
    0347 F458      BCC	0x0353
    0348 01C1      MOVW	R24,R2
    0349 960A      ADIW	R24,0xA
    034A 90200075  LDS	R2,left
    034C 90300076  LDS	R3,left+1
    034E 1582      CP	R24,R2
    034F 0593      CPC	R25,R3
    0350 F410      BCC	0x0353
(0355) 		       {turn_left();}
    0351 DD8F      RCALL	_turn_left
    0352 C05A      RJMP	0x03AD
(0356) 		   else if((interval>419)&&(zhong<left)&&(zhong<right)&&(right>(left+10)))
    0353 EA83      LDI	R24,0xA3
    0354 E091      LDI	R25,1
    0355 9020006F  LDS	R2,interval
    0357 90300070  LDS	R3,interval+1
    0359 1582      CP	R24,R2
    035A 0593      CPC	R25,R3
    035B F4E0      BCC	0x0378
    035C 90200075  LDS	R2,left
    035E 90300076  LDS	R3,left+1
    0360 90400071  LDS	R4,zhong
    0362 90500072  LDS	R5,zhong+1
    0364 1442      CP	R4,R2
    0365 0453      CPC	R5,R3
    0366 F488      BCC	0x0378
    0367 90200073  LDS	R2,right
    0369 90300074  LDS	R3,right+1
    036B 1442      CP	R4,R2
    036C 0453      CPC	R5,R3
    036D F450      BCC	0x0378
    036E 91800075  LDS	R24,left
    0370 91900076  LDS	R25,left+1
    0372 960A      ADIW	R24,0xA
    0373 1582      CP	R24,R2
    0374 0593      CPC	R25,R3
    0375 F410      BCC	0x0378
(0357) 		 	   {turn_right();}
    0376 DD74      RCALL	_turn_right
    0377 C035      RJMP	0x03AD
(0358)                   else  if((interval>419)&&(left<zhong)&&(left<right))
    0378 EA83      LDI	R24,0xA3
    0379 E091      LDI	R25,1
    037A 9020006F  LDS	R2,interval
    037C 90300070  LDS	R3,interval+1
    037E 1582      CP	R24,R2
    037F 0593      CPC	R25,R3
    0380 F4A0      BCC	0x0395
    0381 90200071  LDS	R2,zhong
    0383 90300072  LDS	R3,zhong+1
    0385 90400075  LDS	R4,left

⌨️ 快捷键说明

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