📄 双足机器人.s
字号:
; {
.dbline 317
; DDRA&=0xf8; // PC0 1分别为探测光源的左 右端口,
in R24,0x1a
andi R24,248
out 0x1a,R24
.dbline 318
; PORTA&=0xf8;
in R24,0x1b
andi R24,248
out 0x1b,R24
.dbline 319
; ADMUX=0x60; //初始化ADC0
ldi R24,96
out 0x7,R24
.dbline 320
; ADCSRA=0x82; //初始化ADC0,64分频
ldi R24,130
out 0x6,R24
.dbline -2
L93:
.dbline 0 ; func end
ret
.dbend
.dbfunc e trace_light _trace_light fV
; adc -> R20
.even
_trace_light::
xcall push_gset2
.dbline -1
.dbline 323
; }
; void trace_light(void)
; {
.dbline 325
; unsigned char adc;
; for(adc=0;adc<3;adc++)
clr R20
xjmp L98
L95:
.dbline 326
; {
.dbline 327
; if(adc==0)
tst R20
brne L99
.dbline 328
; ADMUX=0x60;
ldi R24,96
out 0x7,R24
xjmp L100
L99:
.dbline 329
; else if(adc==1)
cpi R20,1
brne L101
.dbline 330
; ADMUX=0x61;
ldi R24,97
out 0x7,R24
xjmp L102
L101:
.dbline 332
; else
; ADMUX=0x62;
ldi R24,98
out 0x7,R24
L102:
L100:
.dbline 333
; delay_us(10);
ldi R16,10
ldi R17,0
xcall _delay_us
.dbline 334
; ADCSRA|=0x40;
sbi 0x6,6
.dbline 335
; delay_ms(100);
ldi R16,100
ldi R17,0
xcall _delay_ms
.dbline 336
; switch(adc)
mov R22,R20
clr R23
cpi R22,0
cpc R22,R23
breq L106
X1:
cpi R22,1
ldi R30,0
cpc R23,R30
breq L107
cpi R22,2
ldi R30,0
cpc R23,R30
breq L108
xjmp L104
X2:
.dbline 337
; {
L106:
.dbline 338
; 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 338
xjmp L104
L107:
.dbline 339
; 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 339
xjmp L104
L108:
.dbline 340
; 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 340
.dbline 341
; default: break;
L104:
.dbline 343
L96:
.dbline 325
inc R20
L98:
.dbline 325
cpi R20,3
brsh X4
xjmp L95
X4:
.dbline 344
; }
; }
; 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 345
; 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 346
; if(interval<420)
lds R24,_interval
lds R25,_interval+1
cpi R24,164
ldi R30,1
cpc R25,R30
brsh L109
.dbline 347
; {
.dbline 348
; TIMSK&=0xbf;//停止计时
in R24,0x39
andi R24,191
out 0x39,R24
.dbline 349
; for(;;)
L111:
.dbline 350
; stop();
xcall _stop
.dbline 349
.dbline 349
xjmp L111
L109:
.dbline 352
; }
; 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 L115
X5:
lds R2,_left
lds R3,_left+1
lds R4,_zhong
lds R5,_zhong+1
cp R4,R2
cpc R5,R3
brsh L115
lds R2,_right
lds R3,_right+1
cp R4,R2
cpc R5,R3
brsh L115
movw R24,R2
adiw R24,10
lds R2,_left
lds R3,_left+1
cp R2,R24
cpc R3,R25
brsh L117
ldi R22,1
ldi R23,0
xjmp L118
L117:
clr R22
clr R23
L118:
lds R24,_left
lds R25,_left+1
adiw R24,10
lds R2,_right
lds R3,_right+1
cp R2,R24
cpc R3,R25
brsh L119
ldi R20,1
ldi R21,0
xjmp L120
L119:
clr R20
clr R21
L120:
movw R2,R22
or R2,R20
or R3,R21
tst R2
brne X3
tst R3
breq L115
X3:
.dbline 353
; {run();}
.dbline 353
xcall _run
.dbline 353
xjmp L116
L115:
.dbline 354
; 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 L121
lds R2,_left
lds R3,_left+1
lds R4,_zhong
lds R5,_zhong+1
cp R4,R2
cpc R5,R3
brsh L121
lds R2,_right
lds R3,_right+1
cp R4,R2
cpc R5,R3
brsh L121
movw R24,R2
adiw R24,10
lds R2,_left
lds R3,_left+1
cp R24,R2
cpc R25,R3
brsh L121
.dbline 355
; {turn_left();}
.dbline 355
xcall _turn_left
.dbline 355
xjmp L122
L121:
.dbline 356
; 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 L123
lds R2,_left
lds R3,_left+1
lds R4,_zhong
lds R5,_zhong+1
cp R4,R2
cpc R5,R3
brsh L123
lds R2,_right
lds R3,_right+1
cp R4,R2
cpc R5,R3
brsh L123
lds R24,_left
lds R25,_left+1
adiw R24,10
cp R24,R2
cpc R25,R3
brsh L123
.dbline 357
; {turn_right();}
.dbline 357
xcall _turn_right
.dbline 357
xjmp L124
L123:
.dbline 358
; 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 L125
lds R2,_zhong
lds R3,_zhong+1
lds R4,_left
lds R5,_left+1
cp R4,R2
cpc R5,R3
brsh L125
lds R2,_right
lds R3,_right+1
cp R4,R2
cpc R5,R3
brsh L125
.dbline 359
; {turn_right();}
.dbline 359
xcall _turn_right
.dbline 359
xjmp L126
L125:
.dbline 360
; 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 L127
lds R2,_left
lds R3,_left+1
lds R4,_right
lds R5,_right+1
cp R4,R2
cpc R5,R3
brsh L127
cp R4,R2
cpc R5,R3
brsh L127
.dbline 361
; {turn_left();}
.dbline 361
xcall _turn_left
.dbline 361
L127:
L126:
L124:
L122:
L116:
.dbline 362
; delay_ms(100);
ldi R16,100
ldi R17,0
xcall _delay_ms
.dbline -2
L94:
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 369
; }
; ////////////////////探测光源函数///////////////////////////////////
;
;
; ///////////////计时中断函数/////////////////////////////////////////
; void time_inite(void)
; {
.dbline 370
; TCCR2|= 0x07;//分频比1024
in R24,0x25
ori R24,7
out 0x25,R24
.dbline 371
; mini=0;
clr R2
sts _mini,R2
.dbline 372
; second=0;
sts _second,R2
.dbline 373
; minisecond=0;
sts _minisecond,R2
.dbline -2
L129:
.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 378
; }
;
; #pragma interrupt_handler time2_isr:5
; void time2_isr(void)
; {
.dbline 379
; TCNT2=0xb2;
ldi R24,178
out 0x24,R24
.dbline 380
; minisecond++;
lds R24,_minisecond
subi R24,255 ; addi 1
sts _minisecond,R24
.dbline 381
; if (minisecond<100)//计算总时间
cpi R24,100
brsh L131
.dbline 382
; ;
xjmp L132
L131:
.dbline 384
; else
; {
.dbline 385
; minisecond=0;
clr R2
sts _minisecond,R2
.dbline 386
; if (second<60)
lds R24,_second
cpi R24,60
brsh L133
.dbline 387
; second++;
subi R24,255 ; addi 1
sts _second,R24
xjmp L134
L133:
.dbline 389
; else
; {
.dbline 390
; second=0;
clr R2
sts _second,R2
.dbline 391
; minute++;
lds R24,_minute
subi R24,255 ; addi 1
sts _minute,R24
.dbline 392
; if(minute==100)
cpi R24,100
brne L135
.dbline 393
; minute=0;
sts _minute,R2
L135:
.dbline 394
; }
L134:
.dbline 395
; }
L132:
.dbline 396
; 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
L130:
adiw R28,3
xcall pop_lset
.dbline 0 ; func end
reti
.dbend
.dbfunc e main _main fV
; i -> <dead>
.even
_main::
.dbline -1
.dbline 404
;
; }
; ///////////////计时中断函数/////////////////////////////////////////
;
;
; //////////////主函数///////////////////////////////////////////////
; void main(void)
; {
.dbline 406
; unsigned int i;
; MCUCSR|=0x80;//禁止PC5第二功能,使之为普通I/O口
in R24,0x34
ori R24,128
out 0x34,R24
.dbline 407
; MCUCSR|=0x80;
in R24,0x34
ori R24,128
out 0x34,R24
.dbline 408
; DDRD|=0xc0;//PD 6 7控制左右电机
in R24,0x11
ori R24,192
out 0x11,R24
.dbline 409
; DDRC&=0xf8;//PC0 1 2为右中左红外传感器输入
in R24,0x14
andi R24,248
out 0x14,R24
.dbline 410
; DDRC|=0x18;//PC3,4控制显示,PC3传送数据,PC4为时钟信号线
in R24,0x14
ori R24,24
out 0x14,R24
.dbline 411
; PORTC&=0xe7;
in R24,0x15
andi R24,231
out 0x15,R24
.dbline 412
; PORTC&=0xf8;
in R24,0x15
andi R24,248
out 0x15,R24
.dbline 413
; PORTD&=0x3f;
in R24,0x12
andi R24,63
out 0x12,R24
.dbline 414
; time_inite();
xcall _time_inite
.dbline 416
;
; SEI();
sei
.dbline 417
; TIMSK|=0x40;//开始计时
in R24,0x39
ori R24,64
out 0x39,R24
.dbline 422
; //while(1)stop();
;
; //while(1) LeftUp(2);//抬左脚
;
; delay_ms(100);
ldi R16,100
ldi R17,0
xcall _delay_ms
.dbline 423
; LeftFwd(10);//迈左脚步
ldi R16,10
xcall _LeftFwd
.dbline 424
; delay_ms(100);
ldi R16,100
ldi R17,0
xcall _delay_ms
xjmp L139
L138:
.dbline 427
.dbline 429
ldi R16,5
xcall _RightUp
.dbline 430
ldi R16,100
ldi R17,0
xcall _delay_ms
.dbline 431
ldi R16,20
xcall _RightFwd
.dbline 432
ldi R16,100
ldi R17,0
xcall _delay_ms
.dbline 434
ldi R16,7
xcall _LeftUp
.dbline 435
ldi R16,100
ldi R17,0
xcall _delay_ms
.dbline 436
ldi R16,20
xcall _LeftFwd
.dbline 437
ldi R16,100
ldi R17,0
xcall _delay_ms
.dbline 440
L139:
.dbline 426
xjmp L138
X6:
.dbline -2
L137:
.dbline 0 ; func end
ret
.dbsym l i 1 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 + -