📄 music_car.lst
字号:
__text_start:
__start:
0168 E5CF LDI R28,0x5F
0169 E0D2 LDI R29,2
016A BFCD OUT 0x3D,R28
016B BFDE OUT 0x3E,R29
016C 51C0 SUBI R28,0x10
016D 40D0 SBCI R29,0
016E EA0A LDI R16,0xAA
016F 8308 STD Y+0,R16
0170 2400 CLR R0
0171 E6E4 LDI R30,0x64
0172 E0F0 LDI R31,0
0173 E010 LDI R17,0
0174 38E0 CPI R30,0x80
0175 07F1 CPC R31,R17
0176 F011 BEQ 0x0179
0177 9201 ST R0,Z+
0178 CFFB RJMP 0x0174
0179 8300 STD Z+0,R16
017A ECEC LDI R30,0xCC
017B E0F2 LDI R31,2
017C E6A0 LDI R26,0x60
017D E0B0 LDI R27,0
017E E012 LDI R17,2
017F 3DE0 CPI R30,0xD0
0180 07F1 CPC R31,R17
0181 F021 BEQ 0x0186
0182 95C8 LPM
0183 9631 ADIW R30,1
0184 920D ST R0,X+
0185 CFF9 RJMP 0x017F
0186 D2FF RCALL _main
_exit:
0187 CFFF RJMP _exit
FILE: e:\ICC\include\sl3010.c
(0001) //sl3010.c sl3010机器人常用函数库
(0002) //#include <io8515v.h>
(0003)
(0004) // 更新日期: 2003.03.18
(0005)
(0006) /*
(0007) void port_init(); //PA,PB,PC,PD 初始化
(0008) void delay_us(int time); //微妙级延时
(0009) void delay_ms(unsigned int time);//毫秒级延时
(0010) void sw_touch(); //检测轻触开关
(0011) void mic_startup(); //等待声控启动
(0012) void remote_auto_time(); //遥控器控制直行和转弯时间
(0013) void turn_right(); //右转
(0014) void turn_left(); //左转
(0015) void turn_right_s(); //慢速右转
(0016) void turn_left_s(); //慢速左转
(0017) void backward(); //后退
(0018) void forward(); //前行
(0019) void stop(); //停止运动
(0020) */
(0021) /*
(0022) sl-3010 运行不同的程序其对应的工作状态由 work_status 变量指示
(0023) 对应数据表如下:
(0024) 程序名 程序功能简介 work_status 值
(0025) cny_car 程序 白底黑线,探黑线行走 0x10
(0026) xuanya_car 走悬崖,避障碍 0x20
(0027) music_car 音乐车 0x30
(0028) led_car 霓虹灯 0x40
(0029) auto_car1 自走车 0x51
(0030) auto_car8 走<8>字 0x50
(0031) remote_car 智能遥控机器人 0x60
(0032) trace_light 追光行进机器人 0x70
(0033) remote_light 遥控和追光 0x67
(0034) ……
(0035) */
(0036) // 电机驱动信号 led灯指示电机状态
(0037) //PORTD = 0xA0;//前行 //1010 0000//PORTA = 0xC3;//1100,0011
(0038) //PORTD = 0x90;//快速左转//1001 0000//PORTA = 0x33;//0011,0011
(0039) //PORTD = 0x80;//慢速左转//1000 0000//PORTA = 0xF3;//1111,0011
(0040) //PORTD = 0x60;//快速右转//0110 0000//PORTA = 0xCC;//1100,1100
(0041) //PORTD = 0x20;//慢速右转//0010 0000//PORTA = 0xCF;//1100,1111
(0042) //PORTD = 0x50;//后退 //0101 0000//PORTA = 0x3C;//0011,1100
(0043)
(0044) //#define A 0x04 //0b0000,0100
(0045) //#define B 0x02 //0b0000,0010
(0046) //#define C 0x08 //0b0000,1000
(0047) //#define D 0x01 //0b0000,0001
(0048)
(0049)
(0050) /* 音阶常数=65536-8000000/8/2/f */
(0051) #define DO 64580 //523
(0052) #define RE 64684 //587
(0053) #define MI 64777 //659
(0054) #define FA 64820 //698
(0055) #define SO 64898 //784
(0056) #define LA 64968 //880
(0057) #define TI 65030 //988
(0058) #define DO_H 65058 //1046
(0059) #define RE_H 65110 //1174
(0060) #define MI_H 65157 //1318
(0061) #define FA_H 65178 //1397
(0062) #define SO_H 65217 //1568
(0063) #define LA_H 65252 //1760
(0064) #define TI_H 65283 //1976
(0065) #define DO_HH 65297 //2093
(0066) /* 位操作宏 */
(0067) #define set_bit(x,y) (x|=(1<<y))
(0068) #define clr_bit(x,y) (x&=~(1<<y))
(0069) #define get_bit(x,y) (x&(1<<y))
(0070)
(0071) #define fosc 8000000
(0072) #define baud 19200
(0073) #define device 0x38
(0074) #define touch_time 250
(0075)
(0076) unsigned char work_status;
(0077) unsigned char sw_in,remote_in;
(0078) unsigned char mic_in;
(0079) unsigned int delay_time1,delay_time2;
(0080) unsigned char remote_in;
(0081)
(0082) void port_init(void)
(0083) {//PA,PB,PC,PD 初始化
(0084) DDRA = 0xFF;PORTA = 0xFF; //PA口输出,接8路LED指示灯
_port_init:
0188 EF8F LDI R24,0xFF
0189 BB8A OUT 0x1A,R24
018A BB8B OUT 0x1B,R24
(0085) DDRB = 0x80;PORTB = 0xFF; //PB7输出口,PB6~PB4输入(轻触开关)PB4~PB0输入(遥控器)
018B E880 LDI R24,0x80
018C BB87 OUT 0x17,R24
018D EF8F LDI R24,0xFF
018E BB88 OUT 0x18,R24
(0086) DDRC = 0x01;PORTC = 0xFF; //PC0蜂鸣器输出,PC7~PC1检测信号输入端
018F E081 LDI R24,1
0190 BB84 OUT 0x14,R24
0191 EF8F LDI R24,0xFF
0192 BB85 OUT 0x15,R24
(0087) DDRD = 0xF0;PORTD = 0xFF; //PD7~PD4输出驱动电机,PD3~PD0输入
0193 EF80 LDI R24,0xF0
0194 BB81 OUT 0x11,R24
0195 EF8F LDI R24,0xFF
0196 BB82 OUT 0x12,R24
(0088) }
0197 9508 RET
(0089)
(0090) void delay_us(int time)
(0091) {//微秒级延时程序
(0092) do
(0093) {
(0094) time--;
_delay_us:
time --> R16
0198 5001 SUBI R16,1
0199 4010 SBCI R17,0
(0095) }
(0096) while (time>1);
019A E081 LDI R24,1
019B E090 LDI R25,0
019C 1780 CP R24,R16
019D 0791 CPC R25,R17
019E F3CC BLT 0x0198
(0097) }
019F 9508 RET
_delay_ms:
time --> R20
01A0 D2E6 RCALL push_gset1
01A1 2F40 MOV R20,R16
01A2 2F51 MOV R21,R17
(0098)
(0099) void delay_ms(unsigned int time)
(0100) {//毫秒级延时程序
01A3 C005 RJMP 0x01A9
(0101) while(time!=0)
(0102) {
(0103) delay_us(1000);
01A4 EE08 LDI R16,0xE8
01A5 E013 LDI R17,3
01A6 DFF1 RCALL _delay_us
(0104) time--;
01A7 5041 SUBI R20,1
01A8 4050 SBCI R21,0
01A9 3040 CPI R20,0
01AA 0745 CPC R20,R21
01AB F7C1 BNE 0x01A4
(0105) }
(0106) }
01AC D2DD RCALL pop_gset1
01AD 9508 RET
(0107)
(0108) void turn_right()//右转
(0109) {
(0110) PORTD = 0x60; //右转//0110 0000
_turn_right:
01AE E680 LDI R24,0x60
01AF BB82 OUT 0x12,R24
(0111) PORTA = 0xCC; //1100,1100 指示灯
01B0 EC8C LDI R24,0xCC
01B1 BB8B OUT 0x1B,R24
(0112) }
01B2 9508 RET
(0113)
(0114) void turn_left()//左转
(0115) {
(0116) PORTD = 0x90; //左转//1001 0000
_turn_left:
01B3 E980 LDI R24,0x90
01B4 BB82 OUT 0x12,R24
(0117) PORTA = 0x33; //0011,0011 指示灯
01B5 E383 LDI R24,0x33
01B6 BB8B OUT 0x1B,R24
(0118) }
01B7 9508 RET
(0119) void turn_right_s() //慢速右转
(0120) {
(0121) PORTD = 0x20; //慢速右转//0010 0000
_turn_right_s:
01B8 E280 LDI R24,0x20
01B9 BB82 OUT 0x12,R24
(0122) PORTA = 0xCF; //1100,1111
01BA EC8F LDI R24,0xCF
01BB BB8B OUT 0x1B,R24
(0123) }
01BC 9508 RET
(0124)
(0125) void turn_left_s() //慢速左转
(0126) {
(0127) PORTD = 0x80; //慢速左转//1000 0000
_turn_left_s:
01BD E880 LDI R24,0x80
01BE BB82 OUT 0x12,R24
(0128) PORTA = 0xF3; //1111,0011
01BF EF83 LDI R24,0xF3
01C0 BB8B OUT 0x1B,R24
(0129) }
01C1 9508 RET
(0130)
(0131) void backward()//后退
(0132) {
(0133) PORTD = 0x50; //后退//0101 0000
_backward:
01C2 E580 LDI R24,0x50
01C3 BB82 OUT 0x12,R24
(0134) PORTA = 0x3C; //0011,1100 指示灯
01C4 E38C LDI R24,0x3C
01C5 BB8B OUT 0x1B,R24
(0135) }
01C6 9508 RET
(0136)
(0137) void forward()//前行
(0138) {
(0139) PORTD = 0xA0; //前行//1010 0000
_forward:
01C7 EA80 LDI R24,0xA0
01C8 BB82 OUT 0x12,R24
(0140) PORTA = 0xC3; //1100,0011
01C9 EC83 LDI R24,0xC3
01CA BB8B OUT 0x1B,R24
(0141) }
01CB 9508 RET
(0142)
(0143) void stop()//停止运动
(0144) {
(0145) PORTD = 0xff; //停止
_stop:
01CC EF8F LDI R24,0xFF
01CD BB82 OUT 0x12,R24
(0146) PORTA = 0xff; //
01CE BB8B OUT 0x1B,R24
(0147) }
01CF 9508 RET
(0148)
(0149) //左边 X PC4 X 右边
(0150) // X X X X X X X
(0151) // 8 7 6 5 4 3 2 1
(0152) // PB4 X X X X X PB6
(0153) // | X X X |
(0154) // | X X X |
(0155) // | X X X |
(0156) // |$||- X X X -||$|
(0157) // |$|| XXXXXXXXX ||$|
(0158) // #|$||XXXXXXXXXXX||$|#
(0159) // |$||XXX XXX||$|
(0160) // |$||___ PB5 ___||$|
(0161)
(0162) void sw_touch()
(0163) {
(0164) sw_in = PINC & 0x10;
_sw_touch:
01D0 B383 IN R24,0x13
01D1 7180 ANDI R24,0x10
01D2 9380007E STS _sw_in,R24
(0165) if(sw_in == 0x00)
01D4 2388 TST R24
01D5 F4C9 BNE 0x01EF
(0166) {//后退,左转 首部开关接触
(0167) backward(); //后退
01D6 DFEB RCALL _backward
(0168) delay_ms(touch_time);
01D7 EF0A LDI R16,0xFA
01D8 E010 LDI R17,0
01D9 DFC6 RCALL _delay_ms
(0169)
(0170) if(work_status == 0x70)
01DA 9180007F LDS R24,_work_status
01DC 3780 CPI R24,0x70
01DD F469 BNE 0x01EB
(0171) {//追光机器人,首部开关接触,停止运动,PA 口led 流动闪烁
(0172) stop();
01DE DFED RCALL _stop
01DF C00A RJMP 0x01EA
(0173) while(1)
(0174) {
(0175) PORTA = 0x55;
01E0 E585 LDI R24,0x55
01E1 BB8B OUT 0x1B,R24
(0176) delay_ms(250);
01E2 EF0A LDI R16,0xFA
01E3 E010 LDI R17,0
01E4 DFBB RCALL _delay_ms
(0177) PORTA = 0xAA;
01E5 EA8A LDI R24,0xAA
01E6 BB8B OUT 0x1B,R24
(0178) delay_ms(250);
01E7 EF0A LDI R16,0xFA
01E8 E010 LDI R17,0
01E9 DFB6 RCALL _delay_ms
01EA CFF5 RJMP 0x01E0
(0179) }
(0180) }
(0181)
(0182) turn_left(); //左转
01EB DFC7 RCALL _turn_left
(0183) delay_ms(touch_time);
01EC EF0A LDI R16,0xFA
01ED E010 LDI R17,0
01EE DFB1 RCALL _delay_ms
(0184) }
(0185)
(0186) sw_in = PINB & 0x70;
01EF B386 IN R24,0x16
01F0 7780 ANDI R24,0x70
01F1 9380007E STS _sw_in,R24
(0187) if(sw_in == 0x50)// 0b 0101,0000 尾部开关接触
01F3 3580 CPI R24,0x50
01F4 F441 BNE 0x01FD
(0188) {//前行,左转
(0189) forward(); //前行
01F5 DFD1 RCALL _forward
(0190) delay_ms(touch_time);
01F6 EF0A LDI R16,0xFA
01F7 E010 LDI R17,0
01F8 DFA7 RCALL _delay_ms
(0191)
(0192) turn_left(); //左转
01F9 DFB9 RCALL _turn_left
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -