?? 寶貝機器人.s
字號:
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 + -