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