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