📄 sl3010_1.lst
字号:
__start:
__text_start:
0058 E5CF LDI R28,0x5F
0059 E0D2 LDI R29,2
005A BFCD OUT 0x3D,R28
005B BFDE OUT 0x3E,R29
005C 51C0 SUBI R28,0x10
005D 40D0 SBCI R29,0
005E EA0A LDI R16,0xAA
005F 8308 STD Y+0,R16
0060 2400 CLR R0
0061 EDE8 LDI R30,0xD8
0062 E0F0 LDI R31,0
0063 E010 LDI R17,0
0064 3EE7 CPI R30,0xE7
0065 07F1 CPC R31,R17
0066 F011 BEQ 0x0069
0067 9201 ST R0,Z+
0068 CFFB RJMP 0x0064
0069 8300 STD Z+0,R16
006A E3E8 LDI R30,0x38
006B E0F0 LDI R31,0
006C E6A0 LDI R26,0x60
006D E0B0 LDI R27,0
006E E010 LDI R17,0
006F 3BE0 CPI R30,0xB0
0070 07F1 CPC R31,R17
0071 F021 BEQ 0x0076
0072 95C8 LPM
0073 9631 ADIW R30,1
0074 920D ST R0,X+
0075 CFF9 RJMP 0x006F
0076 D471 RCALL _main
_exit:
0077 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:
0078 EF8F LDI R24,0xFF
0079 BB8A OUT 0x1A,R24
007A BB8B OUT 0x1B,R24
(0085) DDRB = 0x80;PORTB = 0xFF; //PB7输出口,PB6~PB4输入(轻触开关)PB4~PB0输入(遥控器)
007B E880 LDI R24,0x80
007C BB87 OUT 0x17,R24
007D EF8F LDI R24,0xFF
007E BB88 OUT 0x18,R24
(0086) DDRC = 0x01;PORTC = 0xFF; //PC0蜂鸣器输出,PC7~PC1检测信号输入端
007F E081 LDI R24,1
0080 BB84 OUT 0x14,R24
0081 EF8F LDI R24,0xFF
0082 BB85 OUT 0x15,R24
(0087) DDRD = 0xF0;PORTD = 0xFF; //PD7~PD4输出驱动电机,PD3~PD0输入
0083 EF80 LDI R24,0xF0
0084 BB81 OUT 0x11,R24
0085 EF8F LDI R24,0xFF
0086 BB82 OUT 0x12,R24
(0088) }
0087 9508 RET
(0089)
(0090) void delay_us(int time)
(0091) {//微秒级延时程序
(0092) do
(0093) {
(0094) time--;
_delay_us:
time --> R16
0088 5001 SUBI R16,1
0089 4010 SBCI R17,0
(0095) }
(0096) while (time>1);
008A E081 LDI R24,1
008B E090 LDI R25,0
008C 1780 CP R24,R16
008D 0791 CPC R25,R17
008E F3CC BLT 0x0088
(0097) }
008F 9508 RET
_delay_ms:
time --> R20
0090 D4C8 RCALL push_gset1
0091 2F40 MOV R20,R16
0092 2F51 MOV R21,R17
(0098)
(0099) void delay_ms(unsigned int time)
(0100) {//毫秒级延时程序
0093 C005 RJMP 0x0099
(0101) while(time!=0)
(0102) {
(0103) delay_us(1000);
0094 EE08 LDI R16,0xE8
0095 E013 LDI R17,3
0096 DFF1 RCALL _delay_us
(0104) time--;
0097 5041 SUBI R20,1
0098 4050 SBCI R21,0
0099 3040 CPI R20,0
009A 0745 CPC R20,R21
009B F7C1 BNE 0x0094
(0105) }
(0106) }
009C D4BF RCALL pop_gset1
009D 9508 RET
(0107)
(0108) void turn_right()//右转
(0109) {
(0110) PORTD = 0x60; //右转//0110 0000
_turn_right:
009E E680 LDI R24,0x60
009F BB82 OUT 0x12,R24
(0111) PORTA = 0xCC; //1100,1100 指示灯
00A0 EC8C LDI R24,0xCC
00A1 BB8B OUT 0x1B,R24
(0112) }
00A2 9508 RET
(0113)
(0114) void turn_left()//左转
(0115) {
(0116) PORTD = 0x90; //左转//1001 0000
_turn_left:
00A3 E980 LDI R24,0x90
00A4 BB82 OUT 0x12,R24
(0117) PORTA = 0x33; //0011,0011 指示灯
00A5 E383 LDI R24,0x33
00A6 BB8B OUT 0x1B,R24
(0118) }
00A7 9508 RET
(0119) void turn_right_s() //慢速右转
(0120) {
(0121) PORTD = 0x20; //慢速右转//0010 0000
_turn_right_s:
00A8 E280 LDI R24,0x20
00A9 BB82 OUT 0x12,R24
(0122) PORTA = 0xCF; //1100,1111
00AA EC8F LDI R24,0xCF
00AB BB8B OUT 0x1B,R24
(0123) }
00AC 9508 RET
(0124)
(0125) void turn_left_s() //慢速左转
(0126) {
(0127) PORTD = 0x80; //慢速左转//1000 0000
_turn_left_s:
00AD E880 LDI R24,0x80
00AE BB82 OUT 0x12,R24
(0128) PORTA = 0xF3; //1111,0011
00AF EF83 LDI R24,0xF3
00B0 BB8B OUT 0x1B,R24
(0129) }
00B1 9508 RET
(0130)
(0131) void backward()//后退
(0132) {
(0133) PORTD = 0x50; //后退//0101 0000
_backward:
00B2 E580 LDI R24,0x50
00B3 BB82 OUT 0x12,R24
(0134) PORTA = 0x3C; //0011,1100 指示灯
00B4 E38C LDI R24,0x3C
00B5 BB8B OUT 0x1B,R24
(0135) }
00B6 9508 RET
(0136)
(0137) void forward()//前行
(0138) {
(0139) PORTD = 0xA0; //前行//1010 0000
_forward:
00B7 EA80 LDI R24,0xA0
00B8 BB82 OUT 0x12,R24
(0140) PORTA = 0xC3; //1100,0011
00B9 EC83 LDI R24,0xC3
00BA BB8B OUT 0x1B,R24
(0141) }
00BB 9508 RET
(0142)
(0143) void stop()//停止运动
(0144) {
(0145) PORTD = 0xff; //停止
_stop:
00BC EF8F LDI R24,0xFF
00BD BB82 OUT 0x12,R24
(0146) PORTA = 0xff; //
00BE BB8B OUT 0x1B,R24
(0147) }
00BF 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:
00C0 B383 IN R24,0x13
00C1 7180 ANDI R24,0x10
00C2 938000E5 STS _sw_in,R24
(0165) if(sw_in == 0x00)
00C4 2388 TST R24
00C5 F4C9 BNE 0x00DF
(0166) {//后退,左转 首部开关接触
(0167) backward(); //后退
00C6 DFEB RCALL _backward
(0168) delay_ms(touch_time);
00C7 EF0A LDI R16,0xFA
00C8 E010 LDI R17,0
00C9 DFC6 RCALL _delay_ms
(0169)
(0170) if(work_status == 0x70)
00CA 918000E6 LDS R24,_work_status
00CC 3780 CPI R24,0x70
00CD F469 BNE 0x00DB
(0171) {//追光机器人,首部开关接触,停止运动,PA 口led 流动闪烁
(0172) stop();
00CE DFED RCALL _stop
00CF C00A RJMP 0x00DA
(0173) while(1)
(0174) {
(0175) PORTA = 0x55;
00D0 E585 LDI R24,0x55
00D1 BB8B OUT 0x1B,R24
(0176) delay_ms(250);
00D2 EF0A LDI R16,0xFA
00D3 E010 LDI R17,0
00D4 DFBB RCALL _delay_ms
(0177) PORTA = 0xAA;
00D5 EA8A LDI R24,0xAA
00D6 BB8B OUT 0x1B,R24
(0178) delay_ms(250);
00D7 EF0A LDI R16,0xFA
00D8 E010 LDI R17,0
00D9 DFB6 RCALL _delay_ms
00DA CFF5 RJMP 0x00D0
(0179) }
(0180) }
(0181)
(0182) turn_left(); //左转
00DB DFC7 RCALL _turn_left
(0183) delay_ms(touch_time);
00DC EF0A LDI R16,0xFA
00DD E010 LDI R17,0
00DE DFB1 RCALL _delay_ms
(0184) }
(0185)
(0186) sw_in = PINB & 0x70;
00DF B386 IN R24,0x16
00E0 7780 ANDI R24,0x70
00E1 938000E5 STS _sw_in,R24
(0187) if(sw_in == 0x50)// 0b 0101,0000 尾部开关接触
00E3 3580 CPI R24,0x50
00E4 F441 BNE 0x00ED
(0188) {//前行,左转
(0189) forward(); //前行
00E5 DFD1 RCALL _forward
(0190) delay_ms(touch_time);
00E6 EF0A LDI R16,0xFA
00E7 E010 LDI R17,0
00E8 DFA7 RCALL _delay_ms
(0191)
(0192) turn_left(); //左转
00E9 DFB9 RCALL _turn_left
(0193) delay_ms(touch_time);
00EA EF0A LDI R16,0xFA
00EB E010 LDI R17,0
00EC DFA3 RCALL _delay_ms
(0194) }
(0195) if(sw_in == 0x30)// 0b 0011,0000 右侧开关接触
00ED 918000E5 LDS R24,_sw_in
00EF 3380 CPI R24,0x30
00F0 F441 BNE 0x00F9
(0196) {//后退,左转
(0197) backward(); //后退
00F1 DFC0 RCALL _backward
(0198) delay_ms(touch_time);
00F2 EF0A LDI R16,0xFA
00F3 E010 LDI R17,0
00F4 DF9B RCALL _delay_ms
(0199)
(0200) turn_left(); //左转
00F5 DFAD RCALL _turn_left
(0201) delay_ms(touch_time);
00F6 EF0A LDI R16,0xFA
00F7 E010 LDI R17,0
00F8 DF97 RCALL _delay_ms
(0202) }
(0203) if(sw_in == 0x60)// 0b 0110,0000 左侧开关接触
00F9 918000E5 LDS R24,_sw_in
00FB 3680 CPI R24,0x60
00FC F441 BNE 0x0105
(0204) {//后退,左转
(0205) backward(); //后退
00FD DFB4 RCALL _backward
(0206) delay_ms(touch_time);
00FE EF0A LDI R16,0xFA
00FF E010 LDI R17,0
0100 DF8F RCALL _delay_ms
(0207)
(0208) turn_left(); //左转
0101 DFA1 RCALL _turn_left
(0209) delay_ms(touch_time);
0102 EF0A LDI R16,0xFA
0103 E010 LDI R17,0
0104 DF8B RCALL _delay_ms
(0210) }
(0211) if(sw_in == 0x20)// 0b 0010,0000 两侧开关同时接触,停止运动
0105 918000E5 LDS R24,_sw_in
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -