📄 sl3010_3.s
字号:
.module sl3010_3.c
.area text(rom, con, rel)
.dbfile E:/icc/include/sl3010.c
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 83
; /*******************************************/
; /* 广州天河双龙电子公司 */
; /* http://www.sl.com.cn */
; /* 020-85510191,87578852,87578872 */
; /* nikko@sl.com.cn */
; /*******************************************/
;
; //遥控器没有按键或者 pd3,pd2,pd1,pd0 短路块全部不接上,全为高电平
; //机器人运行霓虹灯程序。
;
; //将 pd0 接低电平,pd3,pd2,pd1 保持高电平,只连接pd0的短路块
; // 或按下遥控器<A>(保持 0.5s) 进入遥控机器人运行环境
;
; //将 pd1 接低电平,pd3,pd2,pd0 保持高电平,只连接pd1的短路块
; // 或按下遥控器<B>(保持 0.5s) 寻迹机器人,探测白底黑线,沿黑线行进
;
; //将 pd2 接低电平,pd3,pd1,pd0 保持高电平,只连接pd2的短路块
; // 或按下遥控器<C>(保持 0.5s) 机器人避障碍、避悬崖行进
;
; //将 pd3 接低电平,pd2,pd1,pd0 保持高电平,只连接pd3的短路块
; // 或按下遥控器<D>(保持 0.5s) 机器人按程序设定路线行走,走四方形,同时演奏音乐
;
; //程序等待声控起动运行。
;
; //将 sl3010.c 文件拷贝到 icc avr 安装目录的<include>文件夹
; //sl3010.c 是sl3010机器人板的子函数库
; //程序中调用此文件后 #include <sl3010.c>
; //可直接调用里面的函数和变量
;
; #include <io8515v.h>
; #include <macros.h>
; #include <sl3010.c>
; #include <eeprom.h>
;
; #define xuanya_delayms 300
; #define cny_delayms 50
; #define light_delay 100
;
; /* 音乐数据 */
; /* 四分之一拍为0x10, 二分之一拍为0x20, 一拍为0x40*/
; /* 低1-1 2-2 3-3 4-4 5-5 6-6 7-7 */
; /* 中1-8 2-9 3-A 4-B 5-C 6-D 7-E */
; /* 高1-F*/
; #pragma data:eeprom
; unsigned char sound[]={
; //走进新时代
; 0x68,0x26,0x25,0x23,0x22,0x13,0x12,0x41,0x41,0x41,0x23,0x25,
; 0x28,0x48,0x28,0x29,0x2a,0x29,0x26,0x45,0x45,0x45,0x45,0x68,
; 0x29,0x29,0x28,0x26,0x25,0x46,0x46,0x46,0x25,0x26,0x29,0x43,
; 0x25,0x22,0x23,0x22,0x21,0x42,0x42,0x42,0x42,0x63,0x25,0x26,
; 0x25,0x26,0x25,0x23,0x22,0x13,0x12,0x41,0x23,0x25,0x28,0x28,
; 0x28,0x28,0x29,0x2a,0x2a,0x29,0x46,0x46,0x46,0x46,0x46,0x29,
; 0x2a,0x28,0x28,0x26,0x25,0x26,0x26,0x25,0x43,0x43,0x22,0x42,
; 0x26,0x25,0x23,0x22,0x13,0x12,0x41,0x41,0x41,0x41,
;
; 0x00,0x00
; };
; #pragma data:data
; /* 音阶表 */
; const unsigned int TONETABLE[15]={DO,RE,MI,FA,SO,LA,TI,DO_H,
; RE_H,MI_H,FA_H,SO_H,LA_H,TI_H,DO_HH};
; /* 音阶重装常数 */
; unsigned int toneconst;
; unsigned int sound_add=0;
; unsigned int delay_time1,delay_time2,led_delayms=600;
; unsigned char temp,temp1;
; unsigned char pa,pb,pc,pd,remote_in,timers,cny_in,cny_times,rst_time,cds,pd_select,remote_select;
; unsigned char gzsl,t0_times;
; const unsigned char led_data[]=
; {//设置LED广告灯数据表
; 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,
; 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,
; 0x00,0x18,0x3c,0x7e,0xff,0x7e,0x3c,0x18,
; 0x00,0x18,0x3c,0x7e,0xff,0x7e,0x3c,0x18,
; 0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x8f,0xc7,0xe3,0xf1,
; 0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x8f,0xc7,0xe3,0xf1,
; 0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,
; 0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,
; 0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,
; 0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,
; 0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,
;
; 0x0a,0x0a
.dbline 84
; };
ldi R24,255
out 0x1a,R24
.dbline 84
out 0x1b,R24
.dbline 85
;
ldi R24,128
out 0x17,R24
.dbline 85
ldi R24,255
out 0x18,R24
.dbline 86
; //TIMER0 initialisation - prescale:1024
ldi R24,1
out 0x14,R24
.dbline 86
ldi R24,255
out 0x15,R24
.dbline 87
; // desired value: 25mSec
ldi R24,240
out 0x11,R24
.dbline 87
ldi R24,255
out 0x12,R24
.dbline -2
.dbline 88
; // actual value: 24.960mSec (0.2%)
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e delay_us _delay_us fV
; time -> R16,R17
.even
_delay_us::
.dbline -1
.dbline 91
; void timer0_init(void)
; {
; TCCR0 = 0x00; //stop timer
L3:
.dbline 93
; TCNT0 = 0x3D; //set count value
; TCCR0 = 0x05; //start timer
.dbline 94
; }
subi R16,1
sbci R17,0
.dbline 95
;
L4:
.dbline 96
; #pragma interrupt_handler timer0_ovf_isr:8
ldi R24,1
ldi R25,0
cp R24,R16
cpc R25,R17
brlt L3
.dbline -2
.dbline 97
; void timer0_ovf_isr(void)
L2:
.dbline 0 ; func end
ret
.dbsym r time 16 I
.dbend
.dbfunc e delay_ms _delay_ms fV
; time -> R20,R21
.even
_delay_ms::
rcall push_gset1
mov R20,R16
mov R21,R17
.dbline -1
.dbline 100
; {
; TCNT0 = 0x3D; //reload counter value
; t0_times++;
rjmp L8
L7:
.dbline 102
.dbline 103
ldi R16,1000
ldi R17,3
rcall _delay_us
.dbline 104
subi R20,1
sbci R21,0
.dbline 105
L8:
.dbline 101
; if(gzsl == 0x88)
cpi R20,0
cpc R20,R21
brne L7
X0:
.dbline -2
.dbline 106
; {
; if(t0_times == 10)
; {
; timers++;
; t0_times = 0;
L6:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r time 20 i
.dbend
.dbfunc e turn_right _turn_right fV
.even
_turn_right::
.dbline -1
.dbline 109
; }
; }
; if(gzsl == 0x11)
.dbline 110
; {
ldi R24,96
out 0x12,R24
.dbline 111
; if(t0_times == delay_time1) //delay_time1*25ms
ldi R24,204
out 0x1b,R24
.dbline -2
.dbline 112
; {
L10:
.dbline 0 ; func end
ret
.dbend
.dbfunc e turn_left _turn_left fV
.even
_turn_left::
.dbline -1
.dbline 115
; t0_times = 0;
; gzsl = 0x22;
; forward();
.dbline 116
; }
ldi R24,144
out 0x12,R24
.dbline 117
; }
ldi R24,51
out 0x1b,R24
.dbline -2
.dbline 118
; if(gzsl == 0x22)
L11:
.dbline 0 ; func end
ret
.dbend
.dbfunc e turn_right_s _turn_right_s fV
.even
_turn_right_s::
.dbline -1
.dbline 120
; {
; if(t0_times == delay_time2) //delay_time2*25ms
.dbline 121
; {
ldi R24,32
out 0x12,R24
.dbline 122
; t0_times = 0;
ldi R24,207
out 0x1b,R24
.dbline -2
.dbline 123
; gzsl = 0x11;
L12:
.dbline 0 ; func end
ret
.dbend
.dbfunc e turn_left_s _turn_left_s fV
.even
_turn_left_s::
.dbline -1
.dbline 126
; turn_right();
; }
; }
.dbline 127
; }
ldi R24,128
out 0x12,R24
.dbline 128
;
ldi R24,243
out 0x1b,R24
.dbline -2
.dbline 129
; void stop_timer0()
L13:
.dbline 0 ; func end
ret
.dbend
.dbfunc e backward _backward fV
.even
_backward::
.dbline -1
.dbline 132
; {
; CLI();
; TCCR0 = 0x00;//停止timer0
.dbline 133
; MCUCR = 0x00;
ldi R24,80
out 0x12,R24
.dbline 134
; GIMSK = 0x00;
ldi R24,60
out 0x1b,R24
.dbline -2
.dbline 135
; TIMSK = 0x00;
L14:
.dbline 0 ; func end
ret
.dbend
.dbfunc e forward _forward fV
.even
_forward::
.dbline -1
.dbline 138
; SEI();
; }
;
.dbline 139
; /*******************************************/
ldi R24,160
out 0x12,R24
.dbline 140
; /* 电子音乐演示程序 */
ldi R24,195
out 0x1b,R24
.dbline -2
.dbline 141
; /*******************************************/
L15:
.dbline 0 ; func end
ret
.dbend
.dbfunc e stop _stop fV
.even
_stop::
.dbline -1
.dbline 144
; //使用说明:音乐输出端口:PORTC.0,音乐数据存放
; //于AT90S8515 的EEPROM存贮器中。
; // 可以用并口下载软件写入新的音乐文件
.dbline 145
; //PA口为音乐灯,当不同的音乐节奏,点亮不同的灯。
ldi R24,255
out 0x12,R24
.dbline 146
;
out 0x1b,R24
.dbline -2
.dbline 147
; #pragma interrupt_handler timer1_ovf_isr:iv_TIMER1_OVF
L16:
.dbline 0 ; func end
ret
.dbend
.dbfunc e sw_touch _sw_touch fV
.even
_sw_touch::
.dbline -1
.dbline 163
; void timer1_ovf_isr(void)
; {
; TCNT1=toneconst;
; PORTC^=1;
; }
;
; void music_car(void)
; {
; TCCR1A = 0x00;
; TCCR1B =(1<<CS11);//8分频
; temp1=EEPROMread((int)&sound[sound_add]);
; while(temp1!=0)
; {
; temp=temp1;
; temp&=0x0f;
; /*
.dbline 164
; //PA口为音乐灯
in R24,0x13
andi R24,16
sts _sw_in,R24
.dbline 165
; if(temp==1 || temp==2 || temp==3 || temp==4){PORTA = 0xfe;}
tst R24
brne L18
.dbline 166
; if(temp==5 || temp==6){PORTA = 0xfc;}
.dbline 167
; if(temp==7 || temp==8 ){PORTA = 0xf8;}
rcall _backward
.dbline 168
; if(temp==9){PORTA = 0xf0;}
ldi R16,250
ldi R17,0
rcall _delay_ms
.dbline 170
; if(temp==10){PORTA = 0xe0;}
; if(temp==11){PORTA = 0xc0;}
lds R24,_work_status
cpi R24,112
brne L20
.dbline 171
; if(temp==12){PORTA = 0x80;}
.dbline 172
; if(temp==13 || temp==14 || temp==15){PORTA = 0x00;}
rcall _stop
rjmp L23
L22:
.dbline 174
.dbline 175
ldi R24,85
out 0x1b,R24
.dbline 176
ldi R16,250
ldi R17,0
rcall _delay_ms
.dbline 177
ldi R24,170
out 0x1b,R24
.dbline 178
ldi R16,250
ldi R17,0
rcall _delay_ms
.dbline 179
L23:
.dbline 173
; */
rjmp L22
X1:
.dbline 180
; if(temp!=0)
; {
; TIMSK|=(1<<TOIE1);//根据SOUNDTABLE中数据的低四位选择音调频率
; temp--;
; toneconst=TONETABLE[temp];
; TCNT1=toneconst;
; }
L20:
.dbline 182
; temp=temp1;
; temp>>=4;
rcall _turn_left
.dbline 183
; temp&=0x0f;
ldi R16,250
ldi R17,0
rcall _delay_ms
.dbline 184
; delay_ms(temp*129);//根据SOUNDTABLE中数据的高四位*5后,为音调持续时间
L18:
.dbline 186
; TIMSK&=~(1<<TOIE1);
; sound_add++;
in R24,0x16
andi R24,112
sts _sw_in,R24
.dbline 187
; temp1=EEPROMread((int)&sound[sound_add]);
cpi R24,80
brne L25
.dbline 188
; }
.dbline 189
; delay_ms(1000);
rcall _forward
.dbline 190
; }
ldi R16,250
ldi R17,0
rcall _delay_ms
.dbline 192
;
; // 电机驱动信号 led灯指示电机状态
rcall _turn_left
.dbline 193
; //PORTD = 0xA0;//前行//1010 0000 //PORTA = 0xC3;//1100,0011
ldi R16,250
ldi R17,0
rcall _delay_ms
.dbline 194
; //PORTD = 0x90;//左转//1001 0000快速左转//PORTA = 0x33;//0011,0011
L25:
.dbline 195
; //PORTD = 0x80;//左转//1000 0000慢速左转//PORTA = 0xF3;//1111,0011
lds R24,_sw_in
cpi R24,48
brne L27
.dbline 196
; //PORTD = 0x60;//右转//0110 0000快速右转//PORTA = 0xCC;//1100,1100
.dbline 197
; //PORTD = 0x20;//右转//0010 0000慢速右转//PORTA = 0xCF;//1100,1111
rcall _backward
.dbline 198
; //PORTD = 0x50;//后退//0101 0000 //PORTA = 0x3C;//0011,1100
ldi R16,250
ldi R17,0
rcall _delay_ms
.dbline 200
;
; //PC3声控启动
rcall _turn_left
.dbline 201
; // 用PD7~PD4来作为电机驱动端
ldi R16,250
ldi R17,0
rcall _delay_ms
.dbline 202
;
L27:
.dbline 203
; void xuanya_car(void)
lds R24,_sw_in
cpi R24,96
brne L29
.dbline 204
; {
.dbline 205
; PORTA = 0xa5;//1010,0101
rcall _backward
.dbline 206
;
ldi R16,250
ldi R17,0
rcall _delay_ms
.dbline 208
; work_status = 0x20;//置对应的工作状态标志
;
rcall _turn_left
.dbline 209
; mic_startup(); //等待声控启动
ldi R16,250
ldi R17,0
rcall _delay_ms
.dbline 210
;
L29:
.dbline 211
; while(1)
lds R24,_sw_in
cpi R24,32
brne L31
.dbline 212
; {//左(pc7) 中(pc6) 右(pc5)
.dbline 213
;
rcall _stop
.dbline 214
; sw_touch(); //检测轻触开关
ldi R16,1000
ldi R17,3
rcall _delay_ms
rjmp L34
L33:
.dbline 216
;
; pc = PINC & 0x10;
.dbline 217
; if(pc == 0x00)
in R24,0x13
andi R24,16
sts _sw_in,R24
.dbline 218
; {//后退//左转
tst R24
brne L36
.dbline 219
; backward();//后退
.dbline 219
rjmp L35
L36:
.dbline 220
; delay_ms(xuanya_delayms);
ldi R24,85
out 0x1b,R24
.dbline 221
; turn_right();//左转
ldi R16,250
ldi R17,0
rcall _delay_ms
.dbline 222
; delay_ms(xuanya_delayms/2);
ldi R24,170
out 0x1b,R24
.dbline 223
; }
ldi R16,250
ldi R17,0
rcall _delay_ms
.dbline 224
; pc = PINC & 0xE0;
in R24,0x16
andi R24,15
sts _remote_in,R24
.dbline 225
; if(pc == 0x40)
tst R24
breq L38
.dbline 226
; {//后退//左转
.dbline 226
rjmp L35
L38:
.dbline 227
L34:
.dbline 215
rjmp L33
L35:
.dbline 228
L31:
.dbline -2
.dbline 229
; backward();//后退
; delay_ms(xuanya_delayms);
; turn_right();//左转
L17:
.dbline 0 ; func end
ret
.dbend
.dbfunc e mic_startup _mic_startup fV
.even
_mic_startup::
.dbline -1
.dbline 232
; delay_ms(xuanya_delayms/2);
; }
; if(pc == 0x80)
rjmp L42
L41:
.dbline 235
; {//后退//左转
; backward();//后退
; delay_ms(xuanya_delayms);
.dbline 236
; turn_right();//左转
in R24,0x13
andi R24,8
sts _mic_in,R24
.dbline 237
; delay_ms(xuanya_delayms/2);
tst R24
brne L44
.dbline 237
.dbline 237
rjmp L43
L44:
.dbline 238
L42:
.dbline 234
rjmp L41
L43:
.dbline -2
.dbline 239
; }
; if(pc == 0x20)
L40:
.dbline 0 ; func end
ret
.dbend
.dbfunc e remote_auto_time _remote_auto_time fV
.even
_remote_auto_time::
.dbline -1
.dbline 254
; {//后退//左转
; backward();//后退
; delay_ms(xuanya_delayms);
; turn_right();//左转
; delay_ms(xuanya_delayms/2);
; }
; if(pc == 0xc0)
; {//后退//左转
; backward();//后退
; delay_ms(xuanya_delayms);
; turn_right();//左转
; delay_ms(xuanya_delayms/2);
; }
; if(pc == 0x60)
; {//后退//左转
.dbline 255
; backward();//后退
in R24,0x16
andi R24,15
sts _remote_in,R24
.dbline 256
; delay_ms(xuanya_delayms);
mov R16,R24
clr R17
cpi R16,0
cpc R16,R17
brne X4
rjmp L48
X4:
X2:
cpi R16,1
ldi R30,0
cpc R17,R30
brne X5
rjmp L59
X5:
cpi R16,2
ldi R30,0
cpc R17,R30
breq L53
cpi R16,4
ldi R30,0
cpc R17,R30
breq L50
cpi R16,8
ldi R30,0
cpc R17,R30
breq L56
rjmp L47
X3:
.dbline 257
; turn_right();//左转
L50:
.dbline 259
; delay_ms(xuanya_delayms/2);
; }
lds R24,_delay_time2
lds R25,_delay_time2+1
sbiw R24,50
sts _delay_time2+1,R25
sts _delay_time2,R24
.dbline 260
; if(pc == 0xE0)
cpi R24,50
ldi R30,0
cpc R25,R30
breq X6
rjmp L48
X6:
.dbline 261
; {
.dbline 261
ldi R24,100
ldi R25,0
sts _delay_time2+1,R25
sts _delay_time2,R24
.dbline 261
.dbline 262
; //刹车 //led灯为流水灯
rjmp L48
L53:
.dbline 264
; stop();
; PORTA = 0x3C;
lds R24,_delay_time1
lds R25,_delay_time1+1
adiw R24,50
sts _delay_time1+1,R25
sts _delay_time1,R24
.dbline 265
; delay_ms(xuanya_delayms);
cpi R24,2
ldi R30,8
cpc R25,R30
brne L48
.dbline 266
; PORTA = 0xC3;
.dbline 266
ldi R24,2000
ldi R25,7
sts _delay_time1+1,R25
sts _delay_time1,R24
.dbline 266
.dbline 267
; delay_ms(xuanya_delayms);
rjmp L48
L56:
.dbline 269
; }
; else
lds R24,_delay_time1
lds R25,_delay_time1+1
sbiw R24,50
sts _delay_time1+1,R25
sts _delay_time1,R24
.dbline 270
; {
cpi R24,50
ldi R30,0
cpc R25,R30
brne L48
.dbline 271
; forward();//前行
.dbline 271
ldi R24,100
ldi R25,0
sts _delay_time1+1,R25
sts _delay_time1,R24
.dbline 271
.dbline 272
; }
rjmp L48
L59:
.dbline 274
; }
; }
lds R24,_delay_time2
lds R25,_delay_time2+1
adiw R24,50
sts _delay_time2+1,R25
sts _delay_time2,R24
.dbline 275
;
cpi R24,2
ldi R30,8
cpc R25,R30
brne L48
.dbline 276
; void remote_car()
.dbline 276
ldi R24,2000
ldi R25,7
sts _delay_time2+1,R25
sts _delay_time2,R24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -