📄 text1.lst
字号:
__start:
__text_start:
002A E5CF LDI R28,0x5F
002B E0D4 LDI R29,4
002C BFCD OUT 0x3D,R28
002D BFDE OUT 0x3E,R29
002E 51C0 SUBI R28,0x10
002F 40D0 SBCI R29,0
0030 EA0A LDI R16,0xAA
0031 8308 STD Y+0,R16
0032 2400 CLR R0
0033 E6E0 LDI R30,0x60
0034 E0F0 LDI R31,0
0035 E010 LDI R17,0
0036 36E6 CPI R30,0x66
0037 07F1 CPC R31,R17
0038 F011 BEQ 0x003B
0039 9201 ST R0,Z+
003A CFFB RJMP 0x0036
003B 8300 STD Z+0,R16
003C E5E4 LDI R30,0x54
003D E0F0 LDI R31,0
003E E6A0 LDI R26,0x60
003F E0B0 LDI R27,0
0040 E010 LDI R17,0
0041 35E4 CPI R30,0x54
0042 07F1 CPC R31,R17
0043 F021 BEQ 0x0048
0044 95C8 LPM
0045 9631 ADIW R30,1
0046 920D ST R0,X+
0047 CFF9 RJMP 0x0041
0048 940E01C7 CALL _main
_exit:
004A 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:
004B EF8F LDI R24,0xFF
004C BB8A OUT 0x1A,R24
004D BB8B OUT 0x1B,R24
(0083) //PA口输出,接8路LED指示灯
(0084) DDRB = 0x00;PORTB = 0xFF;
004E 2422 CLR R2
004F BA27 OUT 0x17,R2
0050 BB88 OUT 0x18,R24
(0085) //PB2声控开关信号输入口,PB0、PB1、PB3输入(左、尾、右轻触开关)PB7~PB4输入(遥控器)
(0086) DDRC = 0x01;PORTC = 0xFF;
0051 E081 LDI R24,1
0052 BB84 OUT 0x14,R24
0053 EF8F LDI R24,0xFF
0054 BB85 OUT 0x15,R24
(0087) //PC0蜂鸣器输出,PC7~PC5 CNY70探测信号输入端,PC4首部轻触开关,PC1、PC2光敏感光信号输入
(0088) DDRD = 0xF0;PORTD = 0xFF;
0055 EF80 LDI R24,0xF0
0056 BB81 OUT 0x11,R24
0057 EF8F LDI R24,0xFF
0058 BB82 OUT 0x12,R24
0059 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
005A 5001 SUBI R16,1
005B 4010 SBCI R17,0
(0097) }
(0098) while (time>1);
005C E081 LDI R24,1
005D E090 LDI R25,0
005E 1780 CP R24,R16
005F 0791 CPC R25,R17
0060 F3CC BLT 0x005A
0061 9508 RET
_delay_ms:
time --> R20
0062 940E01D4 CALL push_gset1
0064 01A8 MOVW R20,R16
(0099) }
(0100)
(0101) void delay_ms(unsigned int time)
(0102) {//毫秒级延时程序
0065 C005 RJMP 0x006B
(0103) while(time!=0)
(0104) {
(0105) delay_us(1000);
0066 EE08 LDI R16,0xE8
0067 E013 LDI R17,3
0068 DFF1 RCALL _delay_us
(0106) time--;
0069 5041 SUBI R20,1
006A 4050 SBCI R21,0
006B 3040 CPI R20,0
006C 0745 CPC R20,R21
006D F7C1 BNE 0x0066
006E 940E01D7 CALL pop_gset1
0070 9508 RET
(0107) }
(0108) }
(0109)
(0110) void turn_right()//右转
(0111) {
(0112) PORTD = 0x90; //右转//0110 0000
_turn_right:
0071 E980 LDI R24,0x90
0072 BB82 OUT 0x12,R24
(0113) PORTA = 0xCC; //1100,1100 指示灯
0073 EC8C LDI R24,0xCC
0074 BB8B OUT 0x1B,R24
0075 9508 RET
(0114) }
(0115)
(0116) void turn_left()//左转
(0117) {
(0118) PORTD = 0x60; //左转//1001 0000
_turn_left:
0076 E680 LDI R24,0x60
0077 BB82 OUT 0x12,R24
(0119) PORTA = 0x33; //0011,0011 指示灯
0078 E383 LDI R24,0x33
0079 BB8B OUT 0x1B,R24
007A 9508 RET
(0120) }
(0121) void turn_right_s() //慢速右转
(0122) {
(0123) PORTD = 0x80; //慢速右转//0010 0000
_turn_right_s:
007B E880 LDI R24,0x80
007C BB82 OUT 0x12,R24
(0124) PORTA = 0xCF; //1100,1111
007D EC8F LDI R24,0xCF
007E BB8B OUT 0x1B,R24
007F 9508 RET
(0125) }
(0126)
(0127) void turn_left_s() //慢速左转
(0128) {
(0129) PORTD = 0x20; //慢速左转//1000 0000
_turn_left_s:
0080 E280 LDI R24,0x20
0081 BB82 OUT 0x12,R24
(0130) PORTA = 0xF3; //1111,0011
0082 EF83 LDI R24,0xF3
0083 BB8B OUT 0x1B,R24
0084 9508 RET
(0131) }
(0132)
(0133) void backward()//后退
(0134) {
(0135) PORTD = 0x50; //后退//0101 0000
_backward:
0085 E580 LDI R24,0x50
0086 BB82 OUT 0x12,R24
(0136) PORTA = 0x3C; //0011,1100 指示灯
0087 E38C LDI R24,0x3C
0088 BB8B OUT 0x1B,R24
0089 9508 RET
(0137) }
(0138)
(0139) void forward()//前行
(0140) {
(0141) PORTD = 0xA0; //前行//1010 0000
_forward:
008A EA80 LDI R24,0xA0
008B BB82 OUT 0x12,R24
(0142) PORTA = 0xC3; //1100,0011
008C EC83 LDI R24,0xC3
008D BB8B OUT 0x1B,R24
008E 9508 RET
(0143) }
(0144)
(0145) void stop()//停止运动
(0146) {
(0147) PORTD = 0xff; //停止
_stop:
008F EF8F LDI R24,0xFF
0090 BB82 OUT 0x12,R24
(0148) PORTA = 0xff; //
0091 BB8B OUT 0x1B,R24
0092 9508 RET
_sw_touch:
sw_in --> R20
remote_in --> R22
0093 940E01D2 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;
0095 B343 IN R20,0x13
0096 7140 ANDI R20,0x10
(0168) if(sw_in == 0x00)
0097 F4C9 BNE 0x00B1
(0169) {//后退,左转 首部开关接触
(0170) backward(); //后退
0098 DFEC RCALL _backward
(0171) delay_ms(touch_time);
0099 EF0A LDI R16,0xFA
009A E010 LDI R17,0
009B DFC6 RCALL _delay_ms
(0172)
(0173) if(work_status == 0x70)
009C 91800065 LDS R24,work_status
009E 3780 CPI R24,0x70
009F F469 BNE 0x00AD
(0174) {//追光机器人,首部开关接触,停止运动,PA 口led 流动闪烁
(0175) stop();
00A0 DFEE RCALL _stop
00A1 C00A RJMP 0x00AC
(0176) while(1)
(0177) {
(0178) PORTA = 0x55;
00A2 E585 LDI R24,0x55
00A3 BB8B OUT 0x1B,R24
(0179) delay_ms(250);
00A4 EF0A LDI R16,0xFA
00A5 E010 LDI R17,0
00A6 DFBB RCALL _delay_ms
(0180) PORTA = 0xAA;
00A7 EA8A LDI R24,0xAA
00A8 BB8B OUT 0x1B,R24
(0181) delay_ms(250);
00A9 EF0A LDI R16,0xFA
00AA E010 LDI R17,0
00AB DFB6 RCALL _delay_ms
00AC CFF5 RJMP 0x00A2
(0182) }
(0183) }
(0184)
(0185) turn_left(); //左转
00AD DFC8 RCALL _turn_left
(0186) delay_ms(touch_time);
00AE EF0A LDI R16,0xFA
00AF E010 LDI R17,0
00B0 DFB1 RCALL _delay_ms
(0187) }
(0188)
(0189) sw_in = PINB & 0x0b;//0b0000,1011 pb3,pb1,pb0
00B1 B346 IN R20,0x16
00B2 704B ANDI R20,0xB
(0190) if(sw_in == 0x09)// 0b 0000,1001 尾部开关接触
00B3 3049 CPI R20,0x9
00B4 F441 BNE 0x00BD
(0191) {//前行,左转
(0192) forward(); //前行
00B5 DFD4 RCALL _forward
(0193) delay_ms(touch_time);
00B6 EF0A LDI R16,0xFA
00B7 E010 LDI R17,0
00B8 DFA9 RCALL _delay_ms
(0194)
(0195) turn_left(); //左转
00B9 DFBC RCALL _turn_left
(0196) delay_ms(touch_time);
00BA EF0A LDI R16,0xFA
00BB E010 LDI R17,0
00BC DFA5 RCALL _delay_ms
(0197) }
(0198) if(sw_in == 0x0a)// 0b 0000,1010 右侧开关接触
00BD 304A CPI R20,0xA
00BE F441 BNE 0x00C7
(0199) {//后退,左转
(0200) backward(); //后退
00BF DFC5 RCALL _backward
(0201) delay_ms(touch_time);
00C0 EF0A LDI R16,0xFA
00C1 E010 LDI R17,0
00C2 DF9F RCALL _delay_ms
(0202)
(0203) turn_left(); //左转
00C3 DFB2 RCALL _turn_left
(0204) delay_ms(touch_time);
00C4 EF0A LDI R16,0xFA
00C5 E010 LDI R17,0
00C6 DF9B RCALL _delay_ms
(0205) }
(0206) if(sw_in == 0x03)// 0b 0000,0011 左侧开关接触
00C7 3043 CPI R20,3
00C8 F441 BNE 0x00D1
(0207) {//后退,左转
(0208) backward(); //后退
00C9 DFBB RCALL _backward
(0209) delay_ms(touch_time);
00CA EF0A LDI R16,0xFA
00CB E010 LDI R17,0
00CC DF95 RCALL _delay_ms
(0210)
(0211) turn_left(); //左转
00CD DFA8 RCALL _turn_left
(0212) delay_ms(touch_time);
00CE EF0A LDI R16,0xFA
00CF E010 LDI R17,0
00D0 DF91 RCALL _delay_ms
(0213) }
(0214) if(sw_in == 0x02)// 0b 0000,0010 两侧开关同时接触,停止运动
00D1 3042 CPI R20,2
00D2 F4F9 BNE 0x00F2
(0215) {
(0216) stop(); //停止运动,熄灭指示灯
00D3 DFBB RCALL _stop
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -