📄 sl3010_3.lst
字号:
0132 9508 RET
(0240)
(0241) // #
(0242) // #
(0243) // #
(0244) // #
(0245) // # // delay_time1 转弯时间
(0246) // # # # # # // delay_time2 直行时间
(0247) // # X # //<A> 0x04 delay_time2-50
(0248) // # B C # //<B> 0x02 delay_time1+50
(0249) // # D A # //<C> 0x08 delay_time1-50
(0250) // # # //<D> 0x01 delay_time2+50
(0251) // # # # # // max: 2000 min: 200
(0252)
(0253) void remote_auto_time()
(0254) {
(0255) remote_in = PINB & 0x0F;
_remote_auto_time:
0133 B386 IN R24,0x16
0134 708F ANDI R24,0xF
0135 9380007A STS _remote_in,R24
(0256) switch (remote_in)
0137 2F08 MOV R16,R24
0138 2711 CLR R17
0139 3000 CPI R16,0
013A 0701 CPC R16,R17
013B F409 BNE 0x013D
013C C062 RJMP 0x019F
013D 3001 CPI R16,1
013E E0E0 LDI R30,0
013F 071E CPC R17,R30
0140 F409 BNE 0x0142
0141 C04A RJMP 0x018C
0142 3002 CPI R16,2
0143 E0E0 LDI R30,0
0144 071E CPC R17,R30
0145 F0F1 BEQ 0x0164
0146 3004 CPI R16,4
0147 E0E0 LDI R30,0
0148 071E CPC R17,R30
0149 F029 BEQ 0x014F
014A 3008 CPI R16,0x8
014B E0E0 LDI R30,0
014C 071E CPC R17,R30
014D F151 BEQ 0x0178
014E C050 RJMP 0x019F
(0257) {//检测遥控器是否有键按下
(0258) case 0x04: // < A >
(0259) delay_time2 = delay_time2 - 50;
014F 91800075 LDS R24,_delay_time2
0151 91900076 LDS R25,_delay_time2+1
0153 97C2 SBIW R24,0x32
0154 93900076 STS _delay_time2+1,R25
0156 93800075 STS _delay_time2,R24
(0260) if(delay_time2 == 50)
0158 3382 CPI R24,0x32
0159 E0E0 LDI R30,0
015A 079E CPC R25,R30
015B F009 BEQ 0x015D
015C C042 RJMP 0x019F
(0261) {delay_time2 = 100;}
015D E684 LDI R24,0x64
015E E090 LDI R25,0
015F 93900076 STS _delay_time2+1,R25
0161 93800075 STS _delay_time2,R24
(0262) break;
0163 C03B RJMP 0x019F
(0263) case 0x02: // < B >
(0264) delay_time1 = delay_time1 + 50;
0164 91800077 LDS R24,_delay_time1
0166 91900078 LDS R25,_delay_time1+1
0168 96C2 ADIW R24,0x32
0169 93900078 STS _delay_time1+1,R25
016B 93800077 STS _delay_time1,R24
(0265) if(delay_time1 == 2050)
016D 3082 CPI R24,2
016E E0E8 LDI R30,0x8
016F 079E CPC R25,R30
0170 F571 BNE 0x019F
(0266) {delay_time1 = 2000;}
0171 ED80 LDI R24,0xD0
0172 E097 LDI R25,7
0173 93900078 STS _delay_time1+1,R25
0175 93800077 STS _delay_time1,R24
(0267) break;
0177 C027 RJMP 0x019F
(0268) case 0x08: // < C >
(0269) delay_time1 = delay_time1 - 50;
0178 91800077 LDS R24,_delay_time1
017A 91900078 LDS R25,_delay_time1+1
017C 97C2 SBIW R24,0x32
017D 93900078 STS _delay_time1+1,R25
017F 93800077 STS _delay_time1,R24
(0270) if(delay_time1 == 50)
0181 3382 CPI R24,0x32
0182 E0E0 LDI R30,0
0183 079E CPC R25,R30
0184 F4D1 BNE 0x019F
(0271) {delay_time1 = 100;}
0185 E684 LDI R24,0x64
0186 E090 LDI R25,0
0187 93900078 STS _delay_time1+1,R25
0189 93800077 STS _delay_time1,R24
(0272) break;
018B C013 RJMP 0x019F
(0273) case 0x01: // < D >
(0274) delay_time2 = delay_time2 + 50;
018C 91800075 LDS R24,_delay_time2
018E 91900076 LDS R25,_delay_time2+1
0190 96C2 ADIW R24,0x32
0191 93900076 STS _delay_time2+1,R25
0193 93800075 STS _delay_time2,R24
(0275) if(delay_time2 == 2050)
0195 3082 CPI R24,2
0196 E0E8 LDI R30,0x8
0197 079E CPC R25,R30
0198 F431 BNE 0x019F
(0276) {delay_time2 = 2000;}
0199 ED80 LDI R24,0xD0
019A E097 LDI R25,7
019B 93900076 STS _delay_time2+1,R25
019D 93800075 STS _delay_time2,R24
(0277) break;
(0278) case 0x00: // 无按键
(0279) break;
(0280) }
(0281) }
019F 9508 RET
FILE: E:\icc\iccavr\sl3010\sl3010_3\sl3010_3.c
(0001) /*******************************************/
(0002) /* 广州天河双龙电子公司 */
(0003) /* http://www.sl.com.cn */
(0004) /* 020-85510191,87578852,87578872 */
(0005) /* nikko@sl.com.cn */
(0006) /*******************************************/
(0007)
(0008) //遥控器没有按键或者 pd3,pd2,pd1,pd0 短路块全部不接上,全为高电平
(0009) //机器人运行霓虹灯程序。
(0010)
(0011) //将 pd0 接低电平,pd3,pd2,pd1 保持高电平,只连接pd0的短路块
(0012) // 或按下遥控器<A>(保持 0.5s) 进入遥控机器人运行环境
(0013)
(0014) //将 pd1 接低电平,pd3,pd2,pd0 保持高电平,只连接pd1的短路块
(0015) // 或按下遥控器<B>(保持 0.5s) 寻迹机器人,探测白底黑线,沿黑线行进
(0016)
(0017) //将 pd2 接低电平,pd3,pd1,pd0 保持高电平,只连接pd2的短路块
(0018) // 或按下遥控器<C>(保持 0.5s) 机器人避障碍、避悬崖行进
(0019)
(0020) //将 pd3 接低电平,pd2,pd1,pd0 保持高电平,只连接pd3的短路块
(0021) // 或按下遥控器<D>(保持 0.5s) 机器人按程序设定路线行走,走四方形,同时演奏音乐
(0022)
(0023) //程序等待声控起动运行。
(0024)
(0025) //将 sl3010.c 文件拷贝到 icc avr 安装目录的<include>文件夹
(0026) //sl3010.c 是sl3010机器人板的子函数库
(0027) //程序中调用此文件后 #include <sl3010.c>
(0028) //可直接调用里面的函数和变量
(0029)
(0030) #include <io8515v.h>
(0031) #include <macros.h>
(0032) #include <sl3010.c>
(0033) #include <eeprom.h>
(0034)
(0035) #define xuanya_delayms 300
(0036) #define cny_delayms 50
(0037) #define light_delay 100
(0038)
(0039) /* 音乐数据 */
(0040) /* 四分之一拍为0x10, 二分之一拍为0x20, 一拍为0x40*/
(0041) /* 低1-1 2-2 3-3 4-4 5-5 6-6 7-7 */
(0042) /* 中1-8 2-9 3-A 4-B 5-C 6-D 7-E */
(0043) /* 高1-F*/
(0044) #pragma data:eeprom
(0045) unsigned char sound[]={
(0046) //走进新时代
(0047) 0x68,0x26,0x25,0x23,0x22,0x13,0x12,0x41,0x41,0x41,0x23,0x25,
(0048) 0x28,0x48,0x28,0x29,0x2a,0x29,0x26,0x45,0x45,0x45,0x45,0x68,
(0049) 0x29,0x29,0x28,0x26,0x25,0x46,0x46,0x46,0x25,0x26,0x29,0x43,
(0050) 0x25,0x22,0x23,0x22,0x21,0x42,0x42,0x42,0x42,0x63,0x25,0x26,
(0051) 0x25,0x26,0x25,0x23,0x22,0x13,0x12,0x41,0x23,0x25,0x28,0x28,
(0052) 0x28,0x28,0x29,0x2a,0x2a,0x29,0x46,0x46,0x46,0x46,0x46,0x29,
(0053) 0x2a,0x28,0x28,0x26,0x25,0x26,0x26,0x25,0x43,0x43,0x22,0x42,
(0054) 0x26,0x25,0x23,0x22,0x13,0x12,0x41,0x41,0x41,0x41,
(0055)
(0056) 0x00,0x00
(0057) };
(0058) #pragma data:data
(0059) /* 音阶表 */
(0060) const unsigned int TONETABLE[15]={DO,RE,MI,FA,SO,LA,TI,DO_H,
(0061) RE_H,MI_H,FA_H,SO_H,LA_H,TI_H,DO_HH};
(0062) /* 音阶重装常数 */
(0063) unsigned int toneconst;
(0064) unsigned int sound_add=0;
(0065) unsigned int delay_time1,delay_time2,led_delayms=600;
(0066) unsigned char temp,temp1;
(0067) unsigned char pa,pb,pc,pd,remote_in,timers,cny_in,cny_times,rst_time,cds,pd_select,remote_select;
(0068) unsigned char gzsl,t0_times;
(0069) const unsigned char led_data[]=
(0070) {//设置LED广告灯数据表
(0071) 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,
(0072) 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,
(0073) 0x00,0x18,0x3c,0x7e,0xff,0x7e,0x3c,0x18,
(0074) 0x00,0x18,0x3c,0x7e,0xff,0x7e,0x3c,0x18,
(0075) 0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x8f,0xc7,0xe3,0xf1,
(0076) 0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x8f,0xc7,0xe3,0xf1,
(0077) 0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,
(0078) 0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,
(0079) 0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,
(0080) 0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,
(0081) 0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,
(0082)
(0083) 0x0a,0x0a
(0084) };
(0085)
(0086) //TIMER0 initialisation - prescale:1024
(0087) // desired value: 25mSec
(0088) // actual value: 24.960mSec (0.2%)
(0089) void timer0_init(void)
(0090) {
(0091) TCCR0 = 0x00; //stop timer
_timer0_init:
01A0 2422 CLR R2
01A1 BE23 OUT 0x33,R2
(0092) TCNT0 = 0x3D; //set count value
01A2 E38D LDI R24,0x3D
01A3 BF82 OUT 0x32,R24
(0093) TCCR0 = 0x05; //start timer
01A4 E085 LDI R24,5
01A5 BF83 OUT 0x33,R24
(0094) }
01A6 9508 RET
_timer0_ovf_isr:
01A7 D2C9 RCALL push_lset
(0095)
(0096) #pragma interrupt_handler timer0_ovf_isr:8
(0097) void timer0_ovf_isr(void)
(0098) {
(0099) TCNT0 = 0x3D; //reload counter value
01A8 E38D LDI R24,0x3D
01A9 BF82 OUT 0x32,R24
(0100) t0_times++;
01AA 91800064 LDS R24,_t0_times
01AC 5F8F SUBI R24,0xFF
01AD 93800064 STS _t0_times,R24
(0101) if(gzsl == 0x88)
01AF 91800065 LDS R24,_gzsl
01B1 3888 CPI R24,0x88
01B2 F461 BNE 0x01BF
(0102) {
(0103) if(t0_times == 10)
01B3 91800064 LDS R24,_t0_times
01B5 308A CPI R24,0xA
01B6 F441 BNE 0x01BF
(0104) {
(0105) timers++;
01B7 9180006C LDS R24,_timers
01B9 5F8F SUBI R24,0xFF
01BA 9380006C STS _timers,R24
(0106) t0_times = 0;
01BC 2422 CLR R2
01BD 92200064 STS _t0_times,R2
(0107) }
(0108) }
(0109) if(gzsl == 0x11)
01BF 91800065 LDS R24,_gzsl
01C1 3181 CPI R24,0x11
01C2 F489 BNE 0x01D4
(0110) {
(0111) if(t0_times == delay_time1) //delay_time1*25ms
01C3 90200077 LDS R2,_delay_time1
01C5 90300078 LDS R3,_delay_time1+1
01C7 90400064 LDS R4,_t0_times
01C9 2455 CLR R5
01CA 1442 CP R4,R2
01CB 0453 CPC R5,R3
01CC F439 BNE 0x01D4
(0112) {
(0113) t0_times = 0;
01CD 2422 CLR R2
01CE 92200064 STS _t0_times,R2
(0114) gzsl = 0x22;
01D0 E282 LDI R24,0x22
01D1 93800065 STS _gzsl,R24
(0115) forward();
01D3 DEE4 RCALL _forward
(0116) }
(0117) }
(0118) if(gzsl == 0x22)
01D4 91800065 LDS R24,_gzsl
01D6 3282 CPI R24,0x22
01D7 F489 BNE 0x01E9
(0119) {
(0120) if(t0_times == delay_time2) //delay_time2*25ms
01D8 90200075 LDS R2,_delay_time2
01DA 90300076 LDS R3,_delay_time2+1
01DC 90400064 LDS R4,_t0_times
01DE 2455 CLR R5
01DF 1442 CP R4,R2
01E0 0453 CPC R5,R3
01E1 F439 BNE 0x01E9
(0121) {
(0122) t0_times = 0;
01E2 2422 CLR R2
01E3 92200064 STS _t0_times,R2
(0123) gzsl = 0x11;
01E5 E181 LDI R24,0x11
01E6 93800065 STS _gzsl,R24
(0124) turn_right();
01E8 DEB6 RCALL _turn_right
(0125) }
(0126) }
(0127) }
01E9 D29E RCALL pop_lset
01EA 9518 RETI
(0128)
(0129) void stop_timer0()
(0130) {
(0131) CLI();
_stop_timer0:
01EB 94F8 BCLR 7
(0132) TCCR0 = 0x00;//停止timer0
01EC 2422 CLR R2
01ED BE23 OUT 0x33,R2
(0133) MCUCR = 0x00;
01EE BE25 OUT 0x35,R2
(0134) GIMSK = 0x00;
01EF BE2B OUT 0x3B,R2
(0135) TIMSK = 0x00;
01F0 BE29 OUT 0x39,R2
(0136) SEI();
01F1 9478 BSET 7
(0137) }
01F2 9508 RET
_timer1_ovf_isr:
01F3 922A ST R2,-Y
01F4 923A ST R3,-Y
01F5 938A ST R24,-Y
01F6 B62F IN R2,0x3F
01F7 922A ST R2,-Y
(0138)
(0139) /*******************************************/
(0140) /* 电子音乐演示程序 */
(0141) /*******************************************/
(0142) //使用说明:音乐输出端口:PORTC.0,音乐数据存放
(0143) //于AT90S8515 的EEPROM存贮器中。
(0144) // 可以用并口下载软件写入新的音乐文件
(0145) //PA口为音乐灯,当不同的音乐节奏,点亮不同的灯。
(0146)
(0147) #pragma interrupt_handler timer1_ovf_isr:iv_TIMER1_OVF
(0148) void timer1_ovf_isr(void)
(0149) {
(0150) TCNT1=toneconst;
01F8 90200073 LDS R2,_toneconst
01FA 90300074 LDS R3,_toneconst+1
01FC BC3D OUT 0x2D,R3
01FD BC2C OUT 0x2C,R2
(0151) PORTC^=1;
01FE E081 LDI R24,1
01FF B225 IN R2,0x15
0200 2628 EOR R2,R24
0201 BA25 OUT 0x15,R2
(0152) }
0202 9029 LD R2,Y+
0203 BE2F OUT 0x3F,R2
0204 9189 LD R24,Y+
0205 9039 LD R3,Y+
0206 9029 LD R2,Y+
0207 9518 RETI
(0153)
(0154) void music_car(void)
(0155) {
(0156) TCCR1A = 0x00;
_music_car:
0208 2422 CLR R2
0209 BC2F OUT 0x2F,R2
(0157) TCCR1B =(1<<CS11);//8分频
020A E082 LDI R24,2
020B BD8E OUT 0x2E,R24
(0158) temp1=EEPROMread((int)&sound[sound_add]);
020C E081 LDI R24,1
020D E090 LDI R25,0
020E 91000060 LDS R16,0x60
0210 91100061 LDS R17,0x61
0212 0F08 ADD R16,R24
0213 1F19 ADC R17,R25
0214 D29E RCALL _EEPROMread
0215 93000071 STS _temp1,R16
0217 C04B RJMP 0x0263
(0159) while(temp1!=0)
(0160) {
(0161) temp=temp1;
0218 90200071 LDS R2,_temp1
021A 92200072 STS _temp,R2
(0162) temp&=0x0f;
021C 2D82 MOV R24,R2
021D 708F ANDI R24,0xF
021E 93800072 STS _temp,R24
(0163) /*
(0164) //PA口为音乐灯
(0165) if(temp==1 || temp==2 || temp==3 || temp==4){PORTA = 0xfe;}
(0166) if(temp==5 || temp==6){PORTA = 0xfc;}
(0167) if(temp==7 || temp==8 ){PORTA = 0xf8;}
(0168) if(temp==9){PORTA = 0xf0;}
(0169) if(temp==10){PORTA = 0xe0;}
(0170) if(temp==11){PORTA = 0xc0;}
(0171) if(temp==12){PORTA = 0x80;}
(0172) if(temp==13 || temp==14 || temp==15){PORTA = 0x00;}
(0173) */
(0174) if(temp!=0)
0220 2E28 MOV R2,R24
0221 2388 TST R24
0222 F0B9 BEQ 0x023A
(0175) {
(0176) TIMSK|=(1<<TOIE1);//根据SOUNDTABLE中数据的低四位选择音调频率
0223 B789 IN R24,0x39
0224 6880 ORI R24,0x80
0225 BF89 OUT 0x39,R24
(0177) temp--;
0226 2D82 MOV R24,R2
0227 5081 SUBI R24,1
0228 93800072 STS _temp,R24
(0178) toneconst=TONETABLE[temp];
022A E18A LDI R24,0x1A
022B E090 LDI R25,0
022C 91000072 LDS R16,_temp
022E 2711 CLR R17
022F 0F00 LSL R16
0230 1F11 ROL R17
0231 0F08 ADD R16,R24
0232 1F19 ADC R17,R25
0233 D22F RCALL lpm16
0234 93100074 STS _toneconst+1,R17
0236 93000073 STS _toneconst,R16
(0179) TCNT1=toneconst;
0238 BD1D OUT 0x2D,R17
0239 BD0C OUT 0x2C,R16
(0180) }
(0181) temp=temp1;
023A 90200071 LDS R2,_temp1
023C 92200072 STS _temp,R2
(0182) temp>>=4;
023E 2D82 MOV R24,R2
023F 9582 SWAP R24
0240 708F ANDI R24,0xF
0241 93800072 STS _temp,R24
(0183) temp&=0x0f;
0243 708F ANDI R24,0xF
0244 93800072 STS _temp,R24
(0184) delay_ms(temp*129);//根据SOUNDTABLE中数据的高四位*5后,为音调持续时间
0246 2F28 MOV R18,R24
0247 2733 CLR R19
0248 E801 LDI R16,0x81
0249 E010 LDI R17,0
024A D254 RCALL mpy16s
024B DE45 RCALL _delay_ms
(0185) TIMSK&=~(1<<TOIE1);
024C B789 IN R24,0x39
024D 778F ANDI R24,0x7F
024E BF89 OUT 0x39,R24
(0186) sound_add++;
024F 91800060 LDS R24,0x60
0251 91900061 LDS R25,0x61
0253 9601 ADIW R24,1
0254 93900061 STS 0x61,R25
0256 93800060 STS 0x60,R24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -