📄 双足机器人.lst
字号:
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 + -