📄 text1.lst
字号:
__text_start:
__start:
00A1 E5CF LDI R28,0x5F
00A2 E0D4 LDI R29,4
00A3 BFCD OUT 0x3D,R28
00A4 BFDE OUT 0x3E,R29
00A5 51C0 SUBI R28,0x10
00A6 40D0 SBCI R29,0
00A7 EA0A LDI R16,0xAA
00A8 8308 STD Y+0,R16
00A9 2400 CLR R0
00AA E6E2 LDI R30,0x62
00AB E0F0 LDI R31,0
00AC E010 LDI R17,0
00AD 36E8 CPI R30,0x68
00AE 07F1 CPC R31,R17
00AF F011 BEQ 0x00B2
00B0 9201 ST R0,Z+
00B1 CFFB RJMP 0x00AD
00B2 8300 STD Z+0,R16
00B3 E4E0 LDI R30,0x40
00B4 E0F1 LDI R31,1
00B5 E6A0 LDI R26,0x60
00B6 E0B0 LDI R27,0
00B7 E011 LDI R17,1
00B8 34E2 CPI R30,0x42
00B9 07F1 CPC R31,R17
00BA F021 BEQ 0x00BF
00BB 95C8 LPM
00BC 9631 ADIW R30,1
00BD 920D ST R0,X+
00BE CFF9 RJMP 0x00B8
00BF 940E031F CALL _main
_exit:
00C1 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:
00C2 EF8F LDI R24,0xFF
00C3 BB8A OUT 0x1A,R24
00C4 BB8B OUT 0x1B,R24
(0083) //PA口输出,接8路LED指示灯
(0084) DDRB = 0x00;PORTB = 0xFF;
00C5 2422 CLR R2
00C6 BA27 OUT 0x17,R2
00C7 BB88 OUT 0x18,R24
(0085) //PB2声控开关信号输入口,PB0、PB1、PB3输入(左、尾、右轻触开关)PB7~PB4输入(遥控器)
(0086) DDRC = 0x01;PORTC = 0xFF;
00C8 E081 LDI R24,1
00C9 BB84 OUT 0x14,R24
00CA EF8F LDI R24,0xFF
00CB BB85 OUT 0x15,R24
(0087) //PC0蜂鸣器输出,PC7~PC5 CNY70探测信号输入端,PC4首部轻触开关,PC1、PC2光敏感光信号输入
(0088) DDRD = 0xF0;PORTD = 0xFF;
00CC EF80 LDI R24,0xF0
00CD BB81 OUT 0x11,R24
00CE EF8F LDI R24,0xFF
00CF BB82 OUT 0x12,R24
00D0 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
00D1 5001 SUBI R16,1
00D2 4010 SBCI R17,0
(0097) }
(0098) while (time>1);
00D3 E081 LDI R24,1
00D4 E090 LDI R25,0
00D5 1780 CP R24,R16
00D6 0791 CPC R25,R17
00D7 F3CC BLT 0x00D1
00D8 9508 RET
_delay_ms:
time --> R20
00D9 940E03E2 CALL push_gset1
00DB 01A8 MOVW R20,R16
(0099) }
(0100)
(0101) void delay_ms(unsigned int time)
(0102) {//毫秒级延时程序
00DC C005 RJMP 0x00E2
(0103) while(time!=0)
(0104) {
(0105) delay_us(1000);
00DD EE08 LDI R16,0xE8
00DE E013 LDI R17,3
00DF DFF1 RCALL _delay_us
(0106) time--;
00E0 5041 SUBI R20,1
00E1 4050 SBCI R21,0
00E2 3040 CPI R20,0
00E3 0745 CPC R20,R21
00E4 F7C1 BNE 0x00DD
00E5 940E03E5 CALL pop_gset1
00E7 9508 RET
(0107) }
(0108) }
(0109)
(0110) void turn_right()//右转
(0111) {
(0112) PORTD = 0x90; //右转//0110 0000
_turn_right:
00E8 E980 LDI R24,0x90
00E9 BB82 OUT 0x12,R24
(0113) PORTA = 0xCC; //1100,1100 指示灯
00EA EC8C LDI R24,0xCC
00EB BB8B OUT 0x1B,R24
00EC 9508 RET
(0114) }
(0115)
(0116) void turn_left()//左转
(0117) {
(0118) PORTD = 0x60; //左转//1001 0000
_turn_left:
00ED E680 LDI R24,0x60
00EE BB82 OUT 0x12,R24
(0119) PORTA = 0x33; //0011,0011 指示灯
00EF E383 LDI R24,0x33
00F0 BB8B OUT 0x1B,R24
00F1 9508 RET
(0120) }
(0121) void turn_right_s() //慢速右转
(0122) {
(0123) PORTD = 0x80; //慢速右转//0010 0000
_turn_right_s:
00F2 E880 LDI R24,0x80
00F3 BB82 OUT 0x12,R24
(0124) PORTA = 0xCF; //1100,1111
00F4 EC8F LDI R24,0xCF
00F5 BB8B OUT 0x1B,R24
00F6 9508 RET
(0125) }
(0126)
(0127) void turn_left_s() //慢速左转
(0128) {
(0129) PORTD = 0x20; //慢速左转//1000 0000
_turn_left_s:
00F7 E280 LDI R24,0x20
00F8 BB82 OUT 0x12,R24
(0130) PORTA = 0xF3; //1111,0011
00F9 EF83 LDI R24,0xF3
00FA BB8B OUT 0x1B,R24
00FB 9508 RET
(0131) }
(0132)
(0133) void backward()//后退
(0134) {
(0135) PORTD = 0x50; //后退//0101 0000
_backward:
00FC E580 LDI R24,0x50
00FD BB82 OUT 0x12,R24
(0136) PORTA = 0x3C; //0011,1100 指示灯
00FE E38C LDI R24,0x3C
00FF BB8B OUT 0x1B,R24
0100 9508 RET
(0137) }
(0138)
(0139) void forward()//前行
(0140) {
(0141) PORTD = 0xA0; //前行//1010 0000
_forward:
0101 EA80 LDI R24,0xA0
0102 BB82 OUT 0x12,R24
(0142) PORTA = 0xC3; //1100,0011
0103 EC83 LDI R24,0xC3
0104 BB8B OUT 0x1B,R24
0105 9508 RET
(0143) }
(0144)
(0145) void stop()//停止运动
(0146) {
(0147) PORTD = 0xff; //停止
_stop:
0106 EF8F LDI R24,0xFF
0107 BB82 OUT 0x12,R24
(0148) PORTA = 0xff; //
0108 BB8B OUT 0x1B,R24
0109 9508 RET
_sw_touch:
sw_in --> R20
remote_in --> R22
010A 940E03E0 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;
010C B343 IN R20,0x13
010D 7140 ANDI R20,0x10
(0168) if(sw_in == 0x00)
010E F4C9 BNE 0x0128
(0169) {//后退,左转 首部开关接触
(0170) backward(); //后退
010F DFEC RCALL _backward
(0171) delay_ms(touch_time);
0110 EF0A LDI R16,0xFA
0111 E010 LDI R17,0
0112 DFC6 RCALL _delay_ms
(0172)
(0173) if(work_status == 0x70)
0113 91800067 LDS R24,work_status
0115 3780 CPI R24,0x70
0116 F469 BNE 0x0124
(0174) {//追光机器人,首部开关接触,停止运动,PA 口led 流动闪烁
(0175) stop();
0117 DFEE RCALL _stop
0118 C00A RJMP 0x0123
(0176) while(1)
(0177) {
(0178) PORTA = 0x55;
0119 E585 LDI R24,0x55
011A BB8B OUT 0x1B,R24
(0179) delay_ms(250);
011B EF0A LDI R16,0xFA
011C E010 LDI R17,0
011D DFBB RCALL _delay_ms
(0180) PORTA = 0xAA;
011E EA8A LDI R24,0xAA
011F BB8B OUT 0x1B,R24
(0181) delay_ms(250);
0120 EF0A LDI R16,0xFA
0121 E010 LDI R17,0
0122 DFB6 RCALL _delay_ms
0123 CFF5 RJMP 0x0119
(0182) }
(0183) }
(0184)
(0185) turn_left(); //左转
0124 DFC8 RCALL _turn_left
(0186) delay_ms(touch_time);
0125 EF0A LDI R16,0xFA
0126 E010 LDI R17,0
0127 DFB1 RCALL _delay_ms
(0187) }
(0188)
(0189) sw_in = PINB & 0x0b;//0b0000,1011 pb3,pb1,pb0
0128 B346 IN R20,0x16
0129 704B ANDI R20,0xB
(0190) if(sw_in == 0x09)// 0b 0000,1001 尾部开关接触
012A 3049 CPI R20,0x9
012B F441 BNE 0x0134
(0191) {//前行,左转
(0192) forward(); //前行
012C DFD4 RCALL _forward
(0193) delay_ms(touch_time);
012D EF0A LDI R16,0xFA
012E E010 LDI R17,0
012F DFA9 RCALL _delay_ms
(0194)
(0195) turn_left(); //左转
0130 DFBC RCALL _turn_left
(0196) delay_ms(touch_time);
0131 EF0A LDI R16,0xFA
0132 E010 LDI R17,0
0133 DFA5 RCALL _delay_ms
(0197) }
(0198) if(sw_in == 0x0a)// 0b 0000,1010 右侧开关接触
0134 304A CPI R20,0xA
0135 F441 BNE 0x013E
(0199) {//后退,左转
(0200) backward(); //后退
0136 DFC5 RCALL _backward
(0201) delay_ms(touch_time);
0137 EF0A LDI R16,0xFA
0138 E010 LDI R17,0
0139 DF9F RCALL _delay_ms
(0202)
(0203) turn_left(); //左转
013A DFB2 RCALL _turn_left
(0204) delay_ms(touch_time);
013B EF0A LDI R16,0xFA
013C E010 LDI R17,0
013D DF9B RCALL _delay_ms
(0205) }
(0206) if(sw_in == 0x03)// 0b 0000,0011 左侧开关接触
013E 3043 CPI R20,3
013F F441 BNE 0x0148
(0207) {//后退,左转
(0208) backward(); //后退
0140 DFBB RCALL _backward
(0209) delay_ms(touch_time);
0141 EF0A LDI R16,0xFA
0142 E010 LDI R17,0
0143 DF95 RCALL _delay_ms
(0210)
(0211) turn_left(); //左转
0144 DFA8 RCALL _turn_left
(0212) delay_ms(touch_time);
0145 EF0A LDI R16,0xFA
0146 E010 LDI R17,0
0147 DF91 RCALL _delay_ms
(0213) }
(0214) if(sw_in == 0x02)// 0b 0000,0010 两侧开关同时接触,停止运动
0148 3042 CPI R20,2
0149 F4F9 BNE 0x0169
(0215) {
(0216) stop(); //停止运动,熄灭指示灯
014A DFBB RCALL _stop
(0217) delay_ms(touch_time*4);
014B EE08 LDI R16,0xE8
014C E013 LDI R17,3
014D DF8B RCALL _delay_ms
014E C019 RJMP 0x0168
(0218) while(1)
(0219) {
(0220) sw_in = PINC & 0x10;
014F B343 IN R20,0x13
0150 7140 ANDI R20,0x10
(0221) if(sw_in == 0x00)
0151 F409 BNE 0x0153
(0222) {break;}//首部开关接触继续启动运动
0152 C016 RJMP 0x0169
(0223) PORTA = 0x55;//停止不运动时pa口指示灯流动闪烁
0153 E585 LDI R24,0x55
0154 BB8B OUT 0x1B,R24
(0224) delay_ms(250);
0155 EF0A LDI R16,0xFA
0156 E010 LDI R17,0
0157 DF81 RCALL _delay_ms
(0225) PORTA = 0xAA;
0158 EA8A LDI R24,0xAA
0159 BB8B OUT 0x1B,R24
(0226) delay_ms(250);
015A EF0A LDI R16,0xFA
015B E010 LDI R17,0
015C DF7C RCALL _delay_ms
(0227) remote_in = PINB & 0xf0;//遥控器控制继续运动
015D B366 IN R22,0x16
015E 7F60 ANDI R22,0xF0
(0228) if(remote_in == 0x10 || remote_in == 0x20 || remote_in == 0x40 || remote_in == 0x80)
015F 3160 CPI R22,0x10
0160 F031 BEQ 0x0167
0161 3260 CPI R22,0x20
0162 F021 BEQ 0x0167
0163 3460 CPI R22,0x40
0164 F011 BEQ 0x0167
0165 3860 CPI R22,0x80
0166 F409 BNE 0x0168
(0229) {break;}
0167 C001 RJMP 0x0169
0168 CFE6 RJMP 0x014F
(0230) }
(0231) }
0169 940E03D4 CALL pop_gset2
016B 9508 RET
(0232) }
(0233)
(0234) void mic_startup()
(0235) {//声控启动程序运行
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -