📄 test_remote.lst
字号:
__start:
__text_start:
000D E5CF LDI R28,0x5F
000E E0D2 LDI R29,2
000F BFCD OUT P3D,R28
0010 BFDE OUT P3E,R29
0011 51C0 SUBI R28,0x10
0012 40D0 SBCI R29,0
0013 EA0A LDI R16,0xAA
0014 8308 STD R16,0+Y
0015 2400 CLR R0
0016 E6E0 LDI R30,0x60
0017 E0F0 LDI R31,0
0018 E010 LDI R17,0
0019 36E9 CPI R30,0x69
001A 07F1 CPC R31,R17
001B F011 BEQ 0x001E
001C 9201 ST R0,Z+
001D CFFB RJMP 0x0019
001E 8300 STD R16,0+Z
001F E1EA LDI R30,0x1A
0020 E0F0 LDI R31,0
0021 E6A0 LDI R26,0x60
0022 E0B0 LDI R27,0
0023 E010 LDI R17,0
0024 31EA CPI R30,0x1A
0025 07F1 CPC R31,R17
0026 F021 BEQ 0x002B
0027 95C8 LPM
0028 9631 ADIW R30,1
0029 920D ST R0,X+
002A CFF9 RJMP 0x0024
002B D130 RCALL _main
_exit:
002C 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:
002D EF8F LDI R24,0xFF
002E BB8A OUT P1A,R24
002F BB8B OUT P1B,R24
(0085) DDRB = 0x80;PORTB = 0xFF; //PB7输出口,PB6~PB4输入(轻触开关)PB4~PB0输入(遥控器)
0030 E880 LDI R24,0x80
0031 BB87 OUT P17,R24
0032 EF8F LDI R24,0xFF
0033 BB88 OUT P18,R24
(0086) DDRC = 0x01;PORTC = 0xFF; //PC0蜂鸣器输出,PC7~PC1检测信号输入端
0034 E081 LDI R24,1
0035 BB84 OUT P14,R24
0036 EF8F LDI R24,0xFF
0037 BB85 OUT P15,R24
(0087) DDRD = 0xF0;PORTD = 0xFF; //PD7~PD4输出驱动电机,PD3~PD0输入
0038 EF80 LDI R24,0xF0
0039 BB81 OUT P11,R24
003A EF8F LDI R24,0xFF
003B BB82 OUT P12,R24
(0088) }
003C 9508 RET
(0089)
(0090) void delay_us(int time)
(0091) {//微秒级延时程序
(0092) do
(0093) {
(0094) time--;
_delay_us:
time --> R16
003D 5001 SUBI R16,1
003E 4010 SBCI R17,0
(0095) }
(0096) while (time>1);
003F E081 LDI R24,1
0040 E090 LDI R25,0
0041 1780 CP R24,R16
0042 0791 CPC R25,R17
0043 F3CC BLT 0x003D
(0097) }
0044 9508 RET
_delay_ms:
time --> R20
0045 D121 RCALL push_gset1
0046 2F40 MOV R20,R16
0047 2F51 MOV R21,R17
(0098)
(0099) void delay_ms(unsigned int time)
(0100) {//毫秒级延时程序
0048 C005 RJMP 0x004E
(0101) while(time!=0)
(0102) {
(0103) delay_us(1000);
0049 EE08 LDI R16,0xE8
004A E013 LDI R17,3
004B DFF1 RCALL _delay_us
(0104) time--;
004C 5041 SUBI R20,1
004D 4050 SBCI R21,0
004E 3040 CPI R20,0
004F 0745 CPC R20,R21
0050 F7C1 BNE 0x0049
(0105) }
(0106) }
0051 D118 RCALL pop_gset1
0052 9508 RET
(0107)
(0108) void turn_right()//右转
(0109) {
(0110) PORTD = 0x60; //右转//0110 0000
_turn_right:
0053 E680 LDI R24,0x60
0054 BB82 OUT P12,R24
(0111) PORTA = 0xCC; //1100,1100 指示灯
0055 EC8C LDI R24,0xCC
0056 BB8B OUT P1B,R24
(0112) }
0057 9508 RET
(0113)
(0114) void turn_left()//左转
(0115) {
(0116) PORTD = 0x90; //左转//1001 0000
_turn_left:
0058 E980 LDI R24,0x90
0059 BB82 OUT P12,R24
(0117) PORTA = 0x33; //0011,0011 指示灯
005A E383 LDI R24,0x33
005B BB8B OUT P1B,R24
(0118) }
005C 9508 RET
(0119) void turn_right_s() //慢速右转
(0120) {
(0121) PORTD = 0x20; //慢速右转//0010 0000
_turn_right_s:
005D E280 LDI R24,0x20
005E BB82 OUT P12,R24
(0122) PORTA = 0xCF; //1100,1111
005F EC8F LDI R24,0xCF
0060 BB8B OUT P1B,R24
(0123) }
0061 9508 RET
(0124)
(0125) void turn_left_s() //慢速左转
(0126) {
(0127) PORTD = 0x80; //慢速左转//1000 0000
_turn_left_s:
0062 E880 LDI R24,0x80
0063 BB82 OUT P12,R24
(0128) PORTA = 0xF3; //1111,0011
0064 EF83 LDI R24,0xF3
0065 BB8B OUT P1B,R24
(0129) }
0066 9508 RET
(0130)
(0131) void backward()//后退
(0132) {
(0133) PORTD = 0x50; //后退//0101 0000
_backward:
0067 E580 LDI R24,0x50
0068 BB82 OUT P12,R24
(0134) PORTA = 0x3C; //0011,1100 指示灯
0069 E38C LDI R24,0x3C
006A BB8B OUT P1B,R24
(0135) }
006B 9508 RET
(0136)
(0137) void forward()//前行
(0138) {
(0139) PORTD = 0xA0; //前行//1010 0000
_forward:
006C EA80 LDI R24,0xA0
006D BB82 OUT P12,R24
(0140) PORTA = 0xC3; //1100,0011
006E EC83 LDI R24,0xC3
006F BB8B OUT P1B,R24
(0141) }
0070 9508 RET
(0142)
(0143) void stop()//停止运动
(0144) {
(0145) PORTD = 0xff; //停止
_stop:
0071 EF8F LDI R24,0xFF
0072 BB82 OUT P12,R24
(0146) PORTA = 0xff; //
0073 BB8B OUT P1B,R24
(0147) }
0074 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:
0075 B383 IN R24,P13
0076 7180 ANDI R24,0x10
0077 93800067 STS _sw_in,R24
(0165) if(sw_in == 0x00)
0079 2388 TST R24
007A F4C9 BNE 0x0094
(0166) {//后退,左转 首部开关接触
(0167) backward(); //后退
007B DFEB RCALL _backward
(0168) delay_ms(touch_time);
007C EF0A LDI R16,0xFA
007D E010 LDI R17,0
007E DFC6 RCALL _delay_ms
(0169)
(0170) if(work_status == 0x70)
007F 91800068 LDS R24,_work_status
0081 3780 CPI R24,0x70
0082 F469 BNE 0x0090
(0171) {//追光机器人,首部开关接触,停止运动,PA 口led 流动闪烁
(0172) stop();
0083 DFED RCALL _stop
0084 C00A RJMP 0x008F
(0173) while(1)
(0174) {
(0175) PORTA = 0x55;
0085 E585 LDI R24,0x55
0086 BB8B OUT P1B,R24
(0176) delay_ms(250);
0087 EF0A LDI R16,0xFA
0088 E010 LDI R17,0
0089 DFBB RCALL _delay_ms
(0177) PORTA = 0xAA;
008A EA8A LDI R24,0xAA
008B BB8B OUT P1B,R24
(0178) delay_ms(250);
008C EF0A LDI R16,0xFA
008D E010 LDI R17,0
008E DFB6 RCALL _delay_ms
008F CFF5 RJMP 0x0085
(0179) }
(0180) }
(0181)
(0182) turn_left(); //左转
0090 DFC7 RCALL _turn_left
(0183) delay_ms(touch_time);
0091 EF0A LDI R16,0xFA
0092 E010 LDI R17,0
0093 DFB1 RCALL _delay_ms
(0184) }
(0185)
(0186) sw_in = PINB & 0x70;
0094 B386 IN R24,P16
0095 7780 ANDI R24,0x70
0096 93800067 STS _sw_in,R24
(0187) if(sw_in == 0x50)// 0b 0101,0000 尾部开关接触
0098 3580 CPI R24,0x50
0099 F441 BNE 0x00A2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -