📄 auto_car2.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 36E5 CPI R30,0x65
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 D184 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)
(0075) #define touch_time 250
(0076)
(0077) unsigned char work_status;
(0078)
(0079) void port_init(void)
(0080) {//PA,PB,PC,PD 初始化
(0081) DDRA = 0xFF;PORTA = 0xFF; //PA口输出,接8路LED指示灯
_port_init:
002D EF8F LDI R24,0xFF
002E BB8A OUT P1A,R24
002F BB8B OUT P1B,R24
(0082) 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
(0083) 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
(0084) 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
(0085) }
003C 9508 RET
(0086)
(0087) void delay_us(int time)
(0088) {//微秒级延时程序
(0089) do
(0090) {
(0091) time--;
_delay_us:
time --> R16
003D 5001 SUBI R16,1
003E 4010 SBCI R17,0
(0092) }
(0093) 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
(0094) }
0044 9508 RET
_delay_ms:
time --> R20
0045 D16D RCALL push_gset1
0046 2F40 MOV R20,R16
0047 2F51 MOV R21,R17
(0095)
(0096) void delay_ms(unsigned int time)
(0097) {//毫秒级延时程序
0048 C005 RJMP 0x004E
(0098) while(time!=0)
(0099) {
(0100) delay_us(1000);
0049 EE08 LDI R16,0xE8
004A E013 LDI R17,3
004B DFF1 RCALL _delay_us
(0101) 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
(0102) }
(0103) }
0051 D164 RCALL pop_gset1
0052 9508 RET
(0104)
(0105) void turn_right()//右转
(0106) {
(0107) PORTD = 0x60; //右转//0110 0000
_turn_right:
0053 E680 LDI R24,0x60
0054 BB82 OUT P12,R24
(0108) PORTA = 0xCC; //1100,1100 指示灯
0055 EC8C LDI R24,0xCC
0056 BB8B OUT P1B,R24
(0109) }
0057 9508 RET
(0110)
(0111) void turn_left()//左转
(0112) {
(0113) PORTD = 0x90; //左转//1001 0000
_turn_left:
0058 E980 LDI R24,0x90
0059 BB82 OUT P12,R24
(0114) PORTA = 0x33; //0011,0011 指示灯
005A E383 LDI R24,0x33
005B BB8B OUT P1B,R24
(0115) }
005C 9508 RET
(0116) void turn_right_s() //慢速右转
(0117) {
(0118) PORTD = 0x20; //慢速右转//0010 0000
_turn_right_s:
005D E280 LDI R24,0x20
005E BB82 OUT P12,R24
(0119) PORTA = 0xCF; //1100,1111
005F EC8F LDI R24,0xCF
0060 BB8B OUT P1B,R24
(0120) }
0061 9508 RET
(0121)
(0122) void turn_left_s() //慢速左转
(0123) {
(0124) PORTD = 0x80; //慢速左转//1000 0000
_turn_left_s:
0062 E880 LDI R24,0x80
0063 BB82 OUT P12,R24
(0125) PORTA = 0xF3; //1111,0011
0064 EF83 LDI R24,0xF3
0065 BB8B OUT P1B,R24
(0126) }
0066 9508 RET
(0127)
(0128) void backward()//后退
(0129) {
(0130) PORTD = 0x50; //后退//0101 0000
_backward:
0067 E580 LDI R24,0x50
0068 BB82 OUT P12,R24
(0131) PORTA = 0x3C; //0011,1100 指示灯
0069 E38C LDI R24,0x3C
006A BB8B OUT P1B,R24
(0132) }
006B 9508 RET
(0133)
(0134) void forward()//前行
(0135) {
(0136) PORTD = 0xA0; //前行//1010 0000
_forward:
006C EA80 LDI R24,0xA0
006D BB82 OUT P12,R24
(0137) PORTA = 0xC3; //1100,0011
006E EC83 LDI R24,0xC3
006F BB8B OUT P1B,R24
(0138) }
0070 9508 RET
(0139)
(0140) void stop()//停止运动
(0141) {
(0142) PORTD = 0xff; //停止
_stop:
0071 EF8F LDI R24,0xFF
0072 BB82 OUT P12,R24
(0143) PORTA = 0xff; //
0073 BB8B OUT P1B,R24
(0144) }
0074 9508 RET
_sw_touch:
remote_in --> R22
sw_in --> R20
0075 D154 RCALL push_gset2
(0145)
(0146) //左边 X PC4 X 右边
(0147) // X X X X X X X
(0148) // 8 7 6 5 4 3 2 1
(0149) // PB4 X X X X X PB6
(0150) // | X X X |
(0151) // | X X X |
(0152) // | X X X |
(0153) // |$||- X X X -||$|
(0154) // |$|| XXXXXXXXX ||$|
(0155) // #|$||XXXXXXXXXXX||$|#
(0156) // |$||XXX XXX||$|
(0157) // |$||___ PB5 ___||$|
(0158)
(0159) void sw_touch()
(0160) {
(0161) unsigned char sw_in,remote_in;
(0162)
(0163) sw_in = PINC & 0x10;
0076 B343 IN R20,P13
0077 7140 ANDI R20,0x10
(0164) if(sw_in == 0x00)
0078 F4C9 BNE 0x0092
(0165) {//后退,左转 首部开关接触
(0166) backward(); //后退
0079 DFED RCALL _backward
(0167) delay_ms(touch_time);
007A EF0A LDI R16,0xFA
007B E010 LDI R17,0
007C DFC8 RCALL _delay_ms
(0168)
(0169) if(work_status == 0x70)
007D 91800064 LDS R24,_work_status
007F 3780 CPI R24,0x70
0080 F469 BNE 0x008E
(0170) {//追光机器人,首部开关接触,停止运动,PA 口led 流动闪烁
(0171) stop();
0081 DFEF RCALL _stop
0082 C00A RJMP 0x008D
(0172) while(1)
(0173) {
(0174) PORTA = 0x55;
0083 E585 LDI R24,0x55
0084 BB8B OUT P1B,R24
(0175) delay_ms(250);
0085 EF0A LDI R16,0xFA
0086 E010 LDI R17,0
0087 DFBD RCALL _delay_ms
(0176) PORTA = 0xAA;
0088 EA8A LDI R24,0xAA
0089 BB8B OUT P1B,R24
(0177) delay_ms(250);
008A EF0A LDI R16,0xFA
008B E010 LDI R17,0
008C DFB8 RCALL _delay_ms
008D CFF5 RJMP 0x0083
(0178) }
(0179) }
(0180)
(0181) turn_left(); //左转
008E DFC9 RCALL _turn_left
(0182) delay_ms(touch_time);
008F EF0A LDI R16,0xFA
0090 E010 LDI R17,0
0091 DFB3 RCALL _delay_ms
(0183) }
(0184)
(0185) sw_in = PINB & 0x70;
0092 B346 IN R20,P16
0093 7740 ANDI R20,0x70
(0186) if(sw_in == 0x50)// 0b 0101,0000 尾部开关接触
0094 3540 CPI R20,0x50
0095 F441 BNE 0x009E
(0187) {//前行,左转
(0188) forward(); //前行
0096 DFD5 RCALL _forward
(0189) delay_ms(touch_time);
0097 EF0A LDI R16,0xFA
0098 E010 LDI R17,0
0099 DFAB RCALL _delay_ms
(0190)
(0191) turn_left(); //左转
009A DFBD RCALL _turn_left
(0192) delay_ms(touch_time);
009B EF0A LDI R16,0xFA
009C E010 LDI R17,0
009D DFA7 RCALL _delay_ms
(0193) }
(0194) if(sw_in == 0x30)// 0b 0011,0000 右侧开关接触
009E 3340 CPI R20,0x30
009F F441 BNE 0x00A8
(0195) {//后退,左转
(0196) backward(); //后退
00A0 DFC6 RCALL _backward
(0197) delay_ms(touch_time);
00A1 EF0A LDI R16,0xFA
00A2 E010 LDI R17,0
00A3 DFA1 RCALL _delay_ms
(0198)
(0199) turn_left(); //左转
00A4 DFB3 RCALL _turn_left
(0200) delay_ms(touch_time);
00A5 EF0A LDI R16,0xFA
00A6 E010 LDI R17,0
00A7 DF9D RCALL _delay_ms
(0201) }
(0202) if(sw_in == 0x60)// 0b 0110,0000 左侧开关接触
00A8 3640 CPI R20,0x60
00A9 F441 BNE 0x00B2
(0203) {//后退,左转
(0204) backward(); //后退
00AA DFBC RCALL _backward
(0205) delay_ms(touch_time);
00AB EF0A LDI R16,0xFA
00AC E010 LDI R17,0
00AD DF97 RCALL _delay_ms
(0206)
(0207) turn_left(); //左转
00AE DFA9 RCALL _turn_left
(0208) delay_ms(touch_time);
00AF EF0A LDI R16,0xFA
00B0 E010 LDI R17,0
00B1 DF93 RCALL _delay_ms
(0209) }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -