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