📄 led_car.lst
字号:
__start:
__text_start:
0049 E5CF LDI R28,0x5F
004A E0D2 LDI R29,2
004B BFCD OUT 0x3D,R28
004C BFDE OUT 0x3E,R29
004D 51C0 SUBI R28,0x10
004E 40D0 SBCI R29,0
004F EA0A LDI R16,0xAA
0050 8308 STD Y+0,R16
0051 2400 CLR R0
0052 EDE8 LDI R30,0xD8
0053 E0F0 LDI R31,0
0054 E010 LDI R17,0
0055 3EE2 CPI R30,0xE2
0056 07F1 CPC R31,R17
0057 F011 BEQ 0x005A
0058 9201 ST R0,Z+
0059 CFFB RJMP 0x0055
005A 8300 STD Z+0,R16
005B E1EA LDI R30,0x1A
005C E0F0 LDI R31,0
005D E6A0 LDI R26,0x60
005E E0B0 LDI R27,0
005F E010 LDI R17,0
0060 39E2 CPI R30,0x92
0061 07F1 CPC R31,R17
0062 F021 BEQ 0x0067
0063 95C8 LPM
0064 9631 ADIW R30,1
0065 920D ST R0,X+
0066 CFF9 RJMP 0x0060
0067 D33E RCALL _main
_exit:
0068 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:
0069 EF8F LDI R24,0xFF
006A BB8A OUT 0x1A,R24
006B BB8B OUT 0x1B,R24
(0085) DDRB = 0x80;PORTB = 0xFF; //PB7输出口,PB6~PB4输入(轻触开关)PB4~PB0输入(遥控器)
006C E880 LDI R24,0x80
006D BB87 OUT 0x17,R24
006E EF8F LDI R24,0xFF
006F BB88 OUT 0x18,R24
(0086) DDRC = 0x01;PORTC = 0xFF; //PC0蜂鸣器输出,PC7~PC1检测信号输入端
0070 E081 LDI R24,1
0071 BB84 OUT 0x14,R24
0072 EF8F LDI R24,0xFF
0073 BB85 OUT 0x15,R24
(0087) DDRD = 0xF0;PORTD = 0xFF; //PD7~PD4输出驱动电机,PD3~PD0输入
0074 EF80 LDI R24,0xF0
0075 BB81 OUT 0x11,R24
0076 EF8F LDI R24,0xFF
0077 BB82 OUT 0x12,R24
(0088) }
0078 9508 RET
(0089)
(0090) void delay_us(int time)
(0091) {//微秒级延时程序
(0092) do
(0093) {
(0094) time--;
_delay_us:
time --> R16
0079 5001 SUBI R16,1
007A 4010 SBCI R17,0
(0095) }
(0096) while (time>1);
007B E081 LDI R24,1
007C E090 LDI R25,0
007D 1780 CP R24,R16
007E 0791 CPC R25,R17
007F F3CC BLT 0x0079
(0097) }
0080 9508 RET
_delay_ms:
time --> R20
0081 D325 RCALL push_gset1
0082 2F40 MOV R20,R16
0083 2F51 MOV R21,R17
(0098)
(0099) void delay_ms(unsigned int time)
(0100) {//毫秒级延时程序
0084 C005 RJMP 0x008A
(0101) while(time!=0)
(0102) {
(0103) delay_us(1000);
0085 EE08 LDI R16,0xE8
0086 E013 LDI R17,3
0087 DFF1 RCALL _delay_us
(0104) time--;
0088 5041 SUBI R20,1
0089 4050 SBCI R21,0
008A 3040 CPI R20,0
008B 0745 CPC R20,R21
008C F7C1 BNE 0x0085
(0105) }
(0106) }
008D D31C RCALL pop_gset1
008E 9508 RET
(0107)
(0108) void turn_right()//右转
(0109) {
(0110) PORTD = 0x60; //右转//0110 0000
_turn_right:
008F E680 LDI R24,0x60
0090 BB82 OUT 0x12,R24
(0111) PORTA = 0xCC; //1100,1100 指示灯
0091 EC8C LDI R24,0xCC
0092 BB8B OUT 0x1B,R24
(0112) }
0093 9508 RET
(0113)
(0114) void turn_left()//左转
(0115) {
(0116) PORTD = 0x90; //左转//1001 0000
_turn_left:
0094 E980 LDI R24,0x90
0095 BB82 OUT 0x12,R24
(0117) PORTA = 0x33; //0011,0011 指示灯
0096 E383 LDI R24,0x33
0097 BB8B OUT 0x1B,R24
(0118) }
0098 9508 RET
(0119) void turn_right_s() //慢速右转
(0120) {
(0121) PORTD = 0x20; //慢速右转//0010 0000
_turn_right_s:
0099 E280 LDI R24,0x20
009A BB82 OUT 0x12,R24
(0122) PORTA = 0xCF; //1100,1111
009B EC8F LDI R24,0xCF
009C BB8B OUT 0x1B,R24
(0123) }
009D 9508 RET
(0124)
(0125) void turn_left_s() //慢速左转
(0126) {
(0127) PORTD = 0x80; //慢速左转//1000 0000
_turn_left_s:
009E E880 LDI R24,0x80
009F BB82 OUT 0x12,R24
(0128) PORTA = 0xF3; //1111,0011
00A0 EF83 LDI R24,0xF3
00A1 BB8B OUT 0x1B,R24
(0129) }
00A2 9508 RET
(0130)
(0131) void backward()//后退
(0132) {
(0133) PORTD = 0x50; //后退//0101 0000
_backward:
00A3 E580 LDI R24,0x50
00A4 BB82 OUT 0x12,R24
(0134) PORTA = 0x3C; //0011,1100 指示灯
00A5 E38C LDI R24,0x3C
00A6 BB8B OUT 0x1B,R24
(0135) }
00A7 9508 RET
(0136)
(0137) void forward()//前行
(0138) {
(0139) PORTD = 0xA0; //前行//1010 0000
_forward:
00A8 EA80 LDI R24,0xA0
00A9 BB82 OUT 0x12,R24
(0140) PORTA = 0xC3; //1100,0011
00AA EC83 LDI R24,0xC3
00AB BB8B OUT 0x1B,R24
(0141) }
00AC 9508 RET
(0142)
(0143) void stop()//停止运动
(0144) {
(0145) PORTD = 0xff; //停止
_stop:
00AD EF8F LDI R24,0xFF
00AE BB82 OUT 0x12,R24
(0146) PORTA = 0xff; //
00AF BB8B OUT 0x1B,R24
(0147) }
00B0 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:
00B1 B383 IN R24,0x13
00B2 7180 ANDI R24,0x10
00B3 938000E0 STS _sw_in,R24
(0165) if(sw_in == 0x00)
00B5 2388 TST R24
00B6 F4C9 BNE 0x00D0
(0166) {//后退,左转 首部开关接触
(0167) backward(); //后退
00B7 DFEB RCALL _backward
(0168) delay_ms(touch_time);
00B8 EF0A LDI R16,0xFA
00B9 E010 LDI R17,0
00BA DFC6 RCALL _delay_ms
(0169)
(0170) if(work_status == 0x70)
00BB 918000E1 LDS R24,_work_status
00BD 3780 CPI R24,0x70
00BE F469 BNE 0x00CC
(0171) {//追光机器人,首部开关接触,停止运动,PA 口led 流动闪烁
(0172) stop();
00BF DFED RCALL _stop
00C0 C00A RJMP 0x00CB
(0173) while(1)
(0174) {
(0175) PORTA = 0x55;
00C1 E585 LDI R24,0x55
00C2 BB8B OUT 0x1B,R24
(0176) delay_ms(250);
00C3 EF0A LDI R16,0xFA
00C4 E010 LDI R17,0
00C5 DFBB RCALL _delay_ms
(0177) PORTA = 0xAA;
00C6 EA8A LDI R24,0xAA
00C7 BB8B OUT 0x1B,R24
(0178) delay_ms(250);
00C8 EF0A LDI R16,0xFA
00C9 E010 LDI R17,0
00CA DFB6 RCALL _delay_ms
00CB CFF5 RJMP 0x00C1
(0179) }
(0180) }
(0181)
(0182) turn_left(); //左转
00CC DFC7 RCALL _turn_left
(0183) delay_ms(touch_time);
00CD EF0A LDI R16,0xFA
00CE E010 LDI R17,0
00CF DFB1 RCALL _delay_ms
(0184) }
(0185)
(0186) sw_in = PINB & 0x70;
00D0 B386 IN R24,0x16
00D1 7780 ANDI R24,0x70
00D2 938000E0 STS _sw_in,R24
(0187) if(sw_in == 0x50)// 0b 0101,0000 尾部开关接触
00D4 3580 CPI R24,0x50
00D5 F441 BNE 0x00DE
(0188) {//前行,左转
(0189) forward(); //前行
00D6 DFD1 RCALL _forward
(0190) delay_ms(touch_time);
00D7 EF0A LDI R16,0xFA
00D8 E010 LDI R17,0
00D9 DFA7 RCALL _delay_ms
(0191)
(0192) turn_left(); //左转
00DA DFB9 RCALL _turn_left
(0193) delay_ms(touch_time);
00DB EF0A LDI R16,0xFA
00DC E010 LDI R17,0
00DD DFA3 RCALL _delay_ms
(0194) }
(0195) if(sw_in == 0x30)// 0b 0011,0000 右侧开关接触
00DE 918000E0 LDS R24,_sw_in
00E0 3380 CPI R24,0x30
00E1 F441 BNE 0x00EA
(0196) {//后退,左转
(0197) backward(); //后退
00E2 DFC0 RCALL _backward
(0198) delay_ms(touch_time);
00E3 EF0A LDI R16,0xFA
00E4 E010 LDI R17,0
00E5 DF9B RCALL _delay_ms
(0199)
(0200) turn_left(); //左转
00E6 DFAD RCALL _turn_left
(0201) delay_ms(touch_time);
00E7 EF0A LDI R16,0xFA
00E8 E010 LDI R17,0
00E9 DF97 RCALL _delay_ms
(0202) }
(0203) if(sw_in == 0x60)// 0b 0110,0000 左侧开关接触
00EA 918000E0 LDS R24,_sw_in
00EC 3680 CPI R24,0x60
00ED F441 BNE 0x00F6
(0204) {//后退,左转
(0205) backward(); //后退
00EE DFB4 RCALL _backward
(0206) delay_ms(touch_time);
00EF EF0A LDI R16,0xFA
00F0 E010 LDI R17,0
00F1 DF8F RCALL _delay_ms
(0207)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -