📄 text1.lst
字号:
__start:
__text_start:
0033 E5CF LDI R28,0x5F
0034 E0D4 LDI R29,4
0035 BFCD OUT 0x3D,R28
0036 BFDE OUT 0x3E,R29
0037 51C0 SUBI R28,0x10
0038 40D0 SBCI R29,0
0039 EA0A LDI R16,0xAA
003A 8308 STD Y+0,R16
003B 2400 CLR R0
003C E6E2 LDI R30,0x62
003D E0F0 LDI R31,0
003E E010 LDI R17,0
003F 36EB CPI R30,0x6B
0040 07F1 CPC R31,R17
0041 F011 BEQ 0x0044
0042 9201 ST R0,Z+
0043 CFFB RJMP 0x003F
0044 8300 STD Z+0,R16
0045 E6E4 LDI R30,0x64
0046 E0F0 LDI R31,0
0047 E6A0 LDI R26,0x60
0048 E0B0 LDI R27,0
0049 E010 LDI R17,0
004A 36E6 CPI R30,0x66
004B 07F1 CPC R31,R17
004C F021 BEQ 0x0051
004D 95C8 LPM
004E 9631 ADIW R30,1
004F 920D ST R0,X+
0050 CFF9 RJMP 0x004A
0051 940E01B9 CALL _main
_exit:
0053 CFFF RJMP _exit
FILE: D:\icc\include\diy0206.c
(0001) //diy0206.c sldiy02-06机器人常用函数库
(0002) //#include <io8515v.h>
(0003) //#include <io8535v.h>
(0004)
(0005) // 更新日期: 2003.03.27
(0006)
(0007) /*
(0008) void port_init(); //PA,PB,PC,PD 初始化
(0009) void delay_us(int time); //微妙级延时
(0010) void delay_ms(unsigned int time);//毫秒级延时
(0011) void sw_touch(); //检测轻触开关
(0012) void mic_startup(); //等待声控启动
(0013) void remote_auto_time(); //遥控器控制直行和转弯时间
(0014) void turn_right(); //右转
(0015) void turn_left(); //左转
(0016) void turn_right_s(); //慢速右转
(0017) void turn_left_s(); //慢速左转
(0018) void backward(); //后退
(0019) void forward(); //前行
(0020) void stop(); //停止运动
(0021) */
(0022) /*
(0023) sl-3010 运行不同的程序其对应的工作状态由 work_status 变量指示
(0024) 对应数据表如下:
(0025) 程序名 程序功能简介 work_status 值
(0026) cny_car 程序 白底黑线,探黑线行走 0x10
(0027) xuanya_car 走悬崖,避障碍 0x20
(0028) music_car 音乐车 0x30
(0029) led_car 霓虹灯 0x40
(0030) auto_car1 自走车 0x51
(0031) auto_car8 走<8>字 0x50
(0032) remote_car 智能遥控机器人 0x60
(0033) trace_light 追光行进机器人 0x70
(0034) remote_light 遥控和追光 0x67
(0035) ……
(0036) */
(0037) // 电机驱动信号 led灯指示电机状态
(0038) //PORTD = 0xA0;//前行 //1010 0000//PORTA = 0xC3;//1100,0011
(0039) //PORTD = 0x60;//快速左转//0110 0000//PORTA = 0x33;//0011,0011
(0040) //PORTD = 0x20;//慢速左转//0010 0000//PORTA = 0xF3;//1111,0011
(0041) //PORTD = 0x90;//快速右转//1001 0000//PORTA = 0xCC;//1100,1100
(0042) //PORTD = 0x80;//慢速右转//1000 0000//PORTA = 0xCF;//1100,1111
(0043) //PORTD = 0x50;//后退 //0101 0000//PORTA = 0x3C;//0011,1100
(0044)
(0045) //#define A 0x20 //0b0010,0000
(0046) //#define B 0x40 //0b0100,0000
(0047) //#define C 0x10 //0b0001,0000
(0048) //#define D 0x80 //0b1000,0000
(0049)
(0050)
(0051) /* 音阶常数=65536-8000000/8/2/f */
(0052) #define DO 64580 //523
(0053) #define RE 64684 //587
(0054) #define MI 64777 //659
(0055) #define FA 64820 //698
(0056) #define SO 64898 //784
(0057) #define LA 64968 //880
(0058) #define TI 65030 //988
(0059) #define DO_H 65058 //1046
(0060) #define RE_H 65110 //1174
(0061) #define MI_H 65157 //1318
(0062) #define FA_H 65178 //1397
(0063) #define SO_H 65217 //1568
(0064) #define LA_H 65252 //1760
(0065) #define TI_H 65283 //1976
(0066) #define DO_HH 65297 //2093
(0067) /* 位操作宏 */
(0068) #define set_bit(x,y) (x|=(1<<y))
(0069) #define clr_bit(x,y) (x&=~(1<<y))
(0070) #define get_bit(x,y) (x&(1<<y))
(0071)
(0072) #define fosc 8000000
(0073) #define baud 19200
(0074) #define device 0x38
(0075)
(0076) #define touch_time 250
(0077)
(0078) unsigned char work_status;
(0079)
(0080) void port_init(void)
(0081) {//PA,PB,PC,PD 初始化
(0082) DDRA = 0xFF;PORTA = 0xFF;
_port_init:
0054 EF8F LDI R24,0xFF
0055 BB8A OUT 0x1A,R24
0056 BB8B OUT 0x1B,R24
(0083) //PA口输出,接8路LED指示灯
(0084) DDRB = 0x00;PORTB = 0xFF;
0057 2422 CLR R2
0058 BA27 OUT 0x17,R2
0059 BB88 OUT 0x18,R24
(0085) //PB2声控开关信号输入口,PB0、PB1、PB3输入(左、尾、右轻触开关)PB7~PB4输入(遥控器)
(0086) DDRC = 0x01;PORTC = 0xFF;
005A E081 LDI R24,1
005B BB84 OUT 0x14,R24
005C EF8F LDI R24,0xFF
005D BB85 OUT 0x15,R24
(0087) //PC0蜂鸣器输出,PC7~PC5 CNY70探测信号输入端,PC4首部轻触开关,PC1、PC2光敏感光信号输入
(0088) DDRD = 0xF0;PORTD = 0xFF;
005E EF80 LDI R24,0xF0
005F BB81 OUT 0x11,R24
0060 EF8F LDI R24,0xFF
0061 BB82 OUT 0x12,R24
0062 9508 RET
(0089) //PD7~PD4输出驱动电机,PD3~PD0输入
(0090) }
(0091)
(0092) void delay_us(int time)
(0093) {//微秒级延时程序
(0094) do
(0095) {
(0096) time--;
_delay_us:
time --> R16
0063 5001 SUBI R16,1
0064 4010 SBCI R17,0
(0097) }
(0098) while (time>1);
0065 E081 LDI R24,1
0066 E090 LDI R25,0
0067 1780 CP R24,R16
0068 0791 CPC R25,R17
0069 F3CC BLT 0x0063
006A 9508 RET
_delay_ms:
time --> R20
006B 940E021D CALL push_gset1
006D 01A8 MOVW R20,R16
(0099) }
(0100)
(0101) void delay_ms(unsigned int time)
(0102) {//毫秒级延时程序
006E C005 RJMP 0x0074
(0103) while(time!=0)
(0104) {
(0105) delay_us(1000);
006F EE08 LDI R16,0xE8
0070 E013 LDI R17,3
0071 DFF1 RCALL _delay_us
(0106) time--;
0072 5041 SUBI R20,1
0073 4050 SBCI R21,0
0074 3040 CPI R20,0
0075 0745 CPC R20,R21
0076 F7C1 BNE 0x006F
0077 940E0220 CALL pop_gset1
0079 9508 RET
(0107) }
(0108) }
(0109)
(0110) void turn_right()//右转
(0111) {
(0112) PORTD = 0x90; //右转//0110 0000
_turn_right:
007A E980 LDI R24,0x90
007B BB82 OUT 0x12,R24
(0113) PORTA = 0xCC; //1100,1100 指示灯
007C EC8C LDI R24,0xCC
007D BB8B OUT 0x1B,R24
007E 9508 RET
(0114) }
(0115)
(0116) void turn_left()//左转
(0117) {
(0118) PORTD = 0x60; //左转//1001 0000
_turn_left:
007F E680 LDI R24,0x60
0080 BB82 OUT 0x12,R24
(0119) PORTA = 0x33; //0011,0011 指示灯
0081 E383 LDI R24,0x33
0082 BB8B OUT 0x1B,R24
0083 9508 RET
(0120) }
(0121) void turn_right_s() //慢速右转
(0122) {
(0123) PORTD = 0x80; //慢速右转//0010 0000
_turn_right_s:
0084 E880 LDI R24,0x80
0085 BB82 OUT 0x12,R24
(0124) PORTA = 0xCF; //1100,1111
0086 EC8F LDI R24,0xCF
0087 BB8B OUT 0x1B,R24
0088 9508 RET
(0125) }
(0126)
(0127) void turn_left_s() //慢速左转
(0128) {
(0129) PORTD = 0x20; //慢速左转//1000 0000
_turn_left_s:
0089 E280 LDI R24,0x20
008A BB82 OUT 0x12,R24
(0130) PORTA = 0xF3; //1111,0011
008B EF83 LDI R24,0xF3
008C BB8B OUT 0x1B,R24
008D 9508 RET
(0131) }
(0132)
(0133) void backward()//后退
(0134) {
(0135) PORTD = 0x50; //后退//0101 0000
_backward:
008E E580 LDI R24,0x50
008F BB82 OUT 0x12,R24
(0136) PORTA = 0x3C; //0011,1100 指示灯
0090 E38C LDI R24,0x3C
0091 BB8B OUT 0x1B,R24
0092 9508 RET
(0137) }
(0138)
(0139) void forward()//前行
(0140) {
(0141) PORTD = 0xA0; //前行//1010 0000
_forward:
0093 EA80 LDI R24,0xA0
0094 BB82 OUT 0x12,R24
(0142) PORTA = 0xC3; //1100,0011
0095 EC83 LDI R24,0xC3
0096 BB8B OUT 0x1B,R24
0097 9508 RET
(0143) }
(0144)
(0145) void stop()//停止运动
(0146) {
(0147) PORTD = 0xff; //停止
_stop:
0098 EF8F LDI R24,0xFF
0099 BB82 OUT 0x12,R24
(0148) PORTA = 0xff; //
009A BB8B OUT 0x1B,R24
009B 9508 RET
_sw_touch:
sw_in --> R20
remote_in --> R22
009C 940E021B CALL push_gset2
(0149) }
(0150)
(0151) //左边 X PC4 X 右边
(0152) // X X X X X X X
(0153) // 8 7 6 5 4 3 2 1
(0154) // PB0 X X X X X PB3
(0155) // | X X X |
(0156) // | X X X |
(0157) // | X X X |
(0158) // |$||- X X X -||$|
(0159) // |$|| XXXXXXXXX ||$|
(0160) // #|$||XXXXXXXXXXX||$|#
(0161) // |$||XXX XXX||$|
(0162) // |$||___ PB1 ___||$|
(0163)
(0164) void sw_touch()
(0165) {
(0166) unsigned char sw_in,remote_in;
(0167) sw_in = PINC & 0x10;
009E B343 IN R20,0x13
009F 7140 ANDI R20,0x10
(0168) if(sw_in == 0x00)
00A0 F4C9 BNE 0x00BA
(0169) {//后退,左转 首部开关接触
(0170) backward(); //后退
00A1 DFEC RCALL _backward
(0171) delay_ms(touch_time);
00A2 EF0A LDI R16,0xFA
00A3 E010 LDI R17,0
00A4 DFC6 RCALL _delay_ms
(0172)
(0173) if(work_status == 0x70)
00A5 9180006A LDS R24,work_status
00A7 3780 CPI R24,0x70
00A8 F469 BNE 0x00B6
(0174) {//追光机器人,首部开关接触,停止运动,PA 口led 流动闪烁
(0175) stop();
00A9 DFEE RCALL _stop
00AA C00A RJMP 0x00B5
(0176) while(1)
(0177) {
(0178) PORTA = 0x55;
00AB E585 LDI R24,0x55
00AC BB8B OUT 0x1B,R24
(0179) delay_ms(250);
00AD EF0A LDI R16,0xFA
00AE E010 LDI R17,0
00AF DFBB RCALL _delay_ms
(0180) PORTA = 0xAA;
00B0 EA8A LDI R24,0xAA
00B1 BB8B OUT 0x1B,R24
(0181) delay_ms(250);
00B2 EF0A LDI R16,0xFA
00B3 E010 LDI R17,0
00B4 DFB6 RCALL _delay_ms
00B5 CFF5 RJMP 0x00AB
(0182) }
(0183) }
(0184)
(0185) turn_left(); //左转
00B6 DFC8 RCALL _turn_left
(0186) delay_ms(touch_time);
00B7 EF0A LDI R16,0xFA
00B8 E010 LDI R17,0
00B9 DFB1 RCALL _delay_ms
(0187) }
(0188)
(0189) sw_in = PINB & 0x0b;//0b0000,1011 pb3,pb1,pb0
00BA B346 IN R20,0x16
00BB 704B ANDI R20,0xB
(0190) if(sw_in == 0x09)// 0b 0000,1001 尾部开关接触
00BC 3049 CPI R20,0x9
00BD F441 BNE 0x00C6
(0191) {//前行,左转
(0192) forward(); //前行
00BE DFD4 RCALL _forward
(0193) delay_ms(touch_time);
00BF EF0A LDI R16,0xFA
00C0 E010 LDI R17,0
00C1 DFA9 RCALL _delay_ms
(0194)
(0195) turn_left(); //左转
00C2 DFBC RCALL _turn_left
(0196) delay_ms(touch_time);
00C3 EF0A LDI R16,0xFA
00C4 E010 LDI R17,0
00C5 DFA5 RCALL _delay_ms
(0197) }
(0198) if(sw_in == 0x0a)// 0b 0000,1010 右侧开关接触
00C6 304A CPI R20,0xA
00C7 F441 BNE 0x00D0
(0199) {//后退,左转
(0200) backward(); //后退
00C8 DFC5 RCALL _backward
(0201) delay_ms(touch_time);
00C9 EF0A LDI R16,0xFA
00CA E010 LDI R17,0
00CB DF9F RCALL _delay_ms
(0202)
(0203) turn_left(); //左转
00CC DFB2 RCALL _turn_left
(0204) delay_ms(touch_time);
00CD EF0A LDI R16,0xFA
00CE E010 LDI R17,0
00CF DF9B RCALL _delay_ms
(0205) }
(0206) if(sw_in == 0x03)// 0b 0000,0011 左侧开关接触
00D0 3043 CPI R20,3
00D1 F441 BNE 0x00DA
(0207) {//后退,左转
(0208) backward(); //后退
00D2 DFBB RCALL _backward
(0209) delay_ms(touch_time);
00D3 EF0A LDI R16,0xFA
00D4 E010 LDI R17,0
00D5 DF95 RCALL _delay_ms
(0210)
(0211) turn_left(); //左转
00D6 DFA8 RCALL _turn_left
(0212) delay_ms(touch_time);
00D7 EF0A LDI R16,0xFA
00D8 E010 LDI R17,0
00D9 DF91 RCALL _delay_ms
(0213) }
(0214) if(sw_in == 0x02)// 0b 0000,0010 两侧开关同时接触,停止运动
00DA 3042 CPI R20,2
00DB F4F9 BNE 0x00FB
(0215) {
(0216) stop(); //停止运动,熄灭指示灯
00DC DFBB RCALL _stop
(0217) delay_ms(touch_time*4);
00DD EE08 LDI R16,0xE8
00DE E013 LDI R17,3
00DF DF8B RCALL _delay_ms
00E0 C019 RJMP 0x00FA
(0218) while(1)
(0219) {
(0220) sw_in = PINC & 0x10;
00E1 B343 IN R20,0x13
00E2 7140 ANDI R20,0x10
(0221) if(sw_in == 0x00)
00E3 F409 BNE 0x00E5
(0222) {break;}//首部开关接触继续启动运动
00E4 C016 RJMP 0x00FB
(0223) PORTA = 0x55;//停止不运动时pa口指示灯流动闪烁
00E5 E585 LDI R24,0x55
00E6 BB8B OUT 0x1B,R24
(0224) delay_ms(250);
00E7 EF0A LDI R16,0xFA
00E8 E010 LDI R17,0
00E9 DF81 RCALL _delay_ms
(0225) PORTA = 0xAA;
00EA EA8A LDI R24,0xAA
00EB BB8B OUT 0x1B,R24
(0226) delay_ms(250);
00EC EF0A LDI R16,0xFA
00ED E010 LDI R17,0
00EE DF7C RCALL _delay_ms
(0227) remote_in = PINB & 0xf0;//遥控器控制继续运动
00EF B366 IN R22,0x16
00F0 7F60 ANDI R22,0xF0
(0228) if(remote_in == 0x10 || remote_in == 0x20 || remote_in == 0x40 || remote_in == 0x80)
00F1 3160 CPI R22,0x10
00F2 F031 BEQ 0x00F9
00F3 3260 CPI R22,0x20
00F4 F021 BEQ 0x00F9
00F5 3460 CPI R22,0x40
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -