📄 remote_light.lst
字号:
(0187)
(0188) sw_in = PINB & 0x70;
009A B346 IN R20,P16
009B 7740 ANDI R20,0x70
(0189) if(sw_in == 0x50)// 0b 0101,0000 尾部开关接触
009C 3540 CPI R20,0x50
009D F441 BNE 0x00A6
(0190) {//前行,左转
(0191) forward(); //前行
009E DFCD RCALL _forward
(0192) delay_ms(touch_time);
009F EF0A LDI R16,0xFA
00A0 E010 LDI R17,0
00A1 DFA3 RCALL _delay_ms
(0193)
(0194) turn_left(); //左转
00A2 DFB5 RCALL _turn_left
(0195) delay_ms(touch_time);
00A3 EF0A LDI R16,0xFA
00A4 E010 LDI R17,0
00A5 DF9F RCALL _delay_ms
(0196) }
(0197) if(sw_in == 0x30)// 0b 0011,0000 右侧开关接触
00A6 3340 CPI R20,0x30
00A7 F441 BNE 0x00B0
(0198) {//后退,左转
(0199) backward(); //后退
00A8 DFBE RCALL _backward
(0200) delay_ms(touch_time);
00A9 EF0A LDI R16,0xFA
00AA E010 LDI R17,0
00AB DF99 RCALL _delay_ms
(0201)
(0202) turn_left(); //左转
00AC DFAB RCALL _turn_left
(0203) delay_ms(touch_time);
00AD EF0A LDI R16,0xFA
00AE E010 LDI R17,0
00AF DF95 RCALL _delay_ms
(0204) }
(0205) if(sw_in == 0x60)// 0b 0110,0000 左侧开关接触
00B0 3640 CPI R20,0x60
00B1 F441 BNE 0x00BA
(0206) {//后退,左转
(0207) backward(); //后退
00B2 DFB4 RCALL _backward
(0208) delay_ms(touch_time);
00B3 EF0A LDI R16,0xFA
00B4 E010 LDI R17,0
00B5 DF8F RCALL _delay_ms
(0209)
(0210) turn_left(); //左转
00B6 DFA1 RCALL _turn_left
(0211) delay_ms(touch_time);
00B7 EF0A LDI R16,0xFA
00B8 E010 LDI R17,0
00B9 DF8B RCALL _delay_ms
(0212) }
(0213) if(sw_in == 0x20)// 0b 0010,0000 两侧开关同时接触,停止运动
00BA 3240 CPI R20,0x20
00BB F4C1 BNE 0x00D4
(0214) {
(0215) stop(); //停止运动,熄灭指示灯
00BC DFB4 RCALL _stop
(0216) delay_ms(touch_time*4);
00BD EE08 LDI R16,0xE8
00BE E013 LDI R17,3
00BF DF85 RCALL _delay_ms
00C0 C012 RJMP 0x00D3
(0217) while(1)
(0218) {
(0219) sw_in = PINC & 0x10;
00C1 B343 IN R20,P13
00C2 7140 ANDI R20,0x10
(0220) if(sw_in == 0x00)
00C3 F409 BNE 0x00C5
(0221) {break;}
00C4 C00F RJMP 0x00D4
(0222) PORTA = 0x55;
00C5 E585 LDI R24,0x55
00C6 BB8B OUT P1B,R24
(0223) delay_ms(250);
00C7 EF0A LDI R16,0xFA
00C8 E010 LDI R17,0
00C9 DF7B RCALL _delay_ms
(0224) PORTA = 0xAA;
00CA EA8A LDI R24,0xAA
00CB BB8B OUT P1B,R24
(0225) delay_ms(250);
00CC EF0A LDI R16,0xFA
00CD E010 LDI R17,0
00CE DF76 RCALL _delay_ms
(0226) remote_in = PINB & 0x0f;
00CF B366 IN R22,P16
00D0 706F ANDI R22,0xF
(0227) if(remote_in != 0x00)
00D1 F009 BEQ 0x00D3
(0228) {break;}
00D2 C001 RJMP 0x00D4
00D3 CFED RJMP 0x00C1
(0229) }
(0230) }
(0231) }
00D4 D14A RCALL pop_gset2
00D5 9508 RET
_mic_startup:
mic_in --> R20
00D6 D128 RCALL push_gset1
(0232)
(0233) void mic_startup()
(0234) {//声控启动程序运行
(0235) unsigned char mic_in;
(0236) DDRC = 0x01;PORTC = 0xFF;
00D7 E081 LDI R24,1
00D8 BB84 OUT P14,R24
00D9 EF8F LDI R24,0xFF
00DA BB85 OUT P15,R24
(0237) delay_us(1);
00DB E001 LDI R16,1
00DC E010 LDI R17,0
00DD DF5F RCALL _delay_us
00DE C004 RJMP 0x00E3
(0238) while(1)//等待pc3(声控键)按键按下
(0239) { //无键按下等待
(0240) mic_in = PINC & 0x08; //pc2=0
00DF B343 IN R20,P13
00E0 7048 ANDI R20,0x8
(0241) if(mic_in == 0){break;}
00E1 F409 BNE 0x00E3
00E2 C001 RJMP 0x00E4
00E3 CFFB RJMP 0x00DF
(0242) }//有键按下运行下面的程序
(0243) }
00E4 D11D RCALL pop_gset1
00E5 9508 RET
(0244)
(0245) // #
(0246) // #
(0247) // #
(0248) // #
(0249) // # // delay_time1 转弯时间
(0250) // # # # # # // delay_time2 直行时间
(0251) // # X # //<A> 0x04 delay_time2-50
(0252) // # B C # //<B> 0x02 delay_time1+50
(0253) // # D A # //<C> 0x08 delay_time1-50
(0254) // # # //<D> 0x01 delay_time2+50
(0255) // # # # # // max: 2000 min: 200
(0256)
(0257) unsigned int delay_time1,delay_time2;
(0258)
(0259) void remote_auto_time()
(0260) {
(0261) unsigned char remote_in;
(0262) remote_in = PINB & 0x0F;
_remote_auto_time:
remote_in --> R16
00E6 B306 IN R16,P16
00E7 700F ANDI R16,0xF
(0263) switch (remote_in)
00E8 2711 CLR R17
00E9 3000 CPI R16,0
00EA 0701 CPC R16,R17
00EB F409 BNE 0x00ED
00EC C062 RJMP 0x014F
00ED 3001 CPI R16,1
00EE E0E0 LDI R30,0
00EF 071E CPC R17,R30
00F0 F409 BNE 0x00F2
00F1 C04A RJMP 0x013C
00F2 3002 CPI R16,2
00F3 E0E0 LDI R30,0
00F4 071E CPC R17,R30
00F5 F0F1 BEQ 0x0114
00F6 3004 CPI R16,4
00F7 E0E0 LDI R30,0
00F8 071E CPC R17,R30
00F9 F029 BEQ 0x00FF
00FA 3008 CPI R16,0x8
00FB E0E0 LDI R30,0
00FC 071E CPC R17,R30
00FD F151 BEQ 0x0128
00FE C050 RJMP 0x014F
(0264) {//检测遥控器是否有键按下
(0265) case 0x04: // < A >
(0266) delay_time2 = delay_time2 - 50;
00FF 91800061 LDS R24,_delay_time2
0101 91900062 LDS R25,_delay_time2+1
0103 97C2 SBIW R24,0x32
0104 93900062 STS _delay_time2+1,R25
0106 93800061 STS _delay_time2,R24
(0267) if(delay_time2 == 50)
0108 3382 CPI R24,0x32
0109 E0E0 LDI R30,0
010A 079E CPC R25,R30
010B F009 BEQ 0x010D
010C C042 RJMP 0x014F
(0268) {delay_time2 = 100;}
010D E684 LDI R24,0x64
010E E090 LDI R25,0
010F 93900062 STS _delay_time2+1,R25
0111 93800061 STS _delay_time2,R24
(0269) break;
0113 C03B RJMP 0x014F
(0270) case 0x02: // < B >
(0271) delay_time1 = delay_time1 + 50;
0114 91800063 LDS R24,_delay_time1
0116 91900064 LDS R25,_delay_time1+1
0118 96C2 ADIW R24,0x32
0119 93900064 STS _delay_time1+1,R25
011B 93800063 STS _delay_time1,R24
(0272) if(delay_time1 == 2050)
011D 3082 CPI R24,2
011E E0E8 LDI R30,0x8
011F 079E CPC R25,R30
0120 F571 BNE 0x014F
(0273) {delay_time1 = 2000;}
0121 ED80 LDI R24,0xD0
0122 E097 LDI R25,7
0123 93900064 STS _delay_time1+1,R25
0125 93800063 STS _delay_time1,R24
(0274) break;
0127 C027 RJMP 0x014F
(0275) case 0x08: // < C >
(0276) delay_time1 = delay_time1 - 50;
0128 91800063 LDS R24,_delay_time1
012A 91900064 LDS R25,_delay_time1+1
012C 97C2 SBIW R24,0x32
012D 93900064 STS _delay_time1+1,R25
012F 93800063 STS _delay_time1,R24
(0277) if(delay_time1 == 50)
0131 3382 CPI R24,0x32
0132 E0E0 LDI R30,0
0133 079E CPC R25,R30
0134 F4D1 BNE 0x014F
(0278) {delay_time1 = 100;}
0135 E684 LDI R24,0x64
0136 E090 LDI R25,0
0137 93900064 STS _delay_time1+1,R25
0139 93800063 STS _delay_time1,R24
(0279) break;
013B C013 RJMP 0x014F
(0280) case 0x01: // < D >
(0281) delay_time2 = delay_time2 + 50;
013C 91800061 LDS R24,_delay_time2
013E 91900062 LDS R25,_delay_time2+1
0140 96C2 ADIW R24,0x32
0141 93900062 STS _delay_time2+1,R25
0143 93800061 STS _delay_time2,R24
(0282) if(delay_time2 == 2050)
0145 3082 CPI R24,2
0146 E0E8 LDI R30,0x8
0147 079E CPC R25,R30
0148 F431 BNE 0x014F
(0283) {delay_time2 = 2000;}
0149 ED80 LDI R24,0xD0
014A E097 LDI R25,7
014B 93900062 STS _delay_time2+1,R25
014D 93800061 STS _delay_time2,R24
(0284) break;
(0285) case 0x00: // 无按键
(0286) break;
(0287) }
(0288) }
014F 9508 RET
_remote_car:
remote_in --> R10
timers --> R22
led --> R20
0150 D0CB RCALL push_gset4
FILE: E:\icc\iccavr\sl3010\remote_light\remote_light.c
(0001) //追光机器人 和 遥控机器人程序
(0002)
(0003) //将 pd0 接低电平,pd3,pd2,pd1 保持高电平
(0004) // 或按下遥控器<A>(保持 0.5s) 进入遥控机器人运行环境
(0005)
(0006) //将 pd1 接低电平,pd3,pd2,pd0 保持高电平
(0007) // 或按下遥控器<B>(保持 0.5s) 进入追光机器人运行环境
(0008)
(0009) //将 sl3010.c 文件拷贝到 icc avr 安装目录的<include>文件夹
(0010) //sl3010.c 是sl3010机器人的子函数库
(0011) //程序中调用此文件后 #include <sl3010.c>
(0012) //可直接调用里面的函数和变量
(0013) /*
(0014) void port_init(); //PA,PB,PC,PD 初始化
(0015) void delay_us(int time); //微妙级延时
(0016) void delay_ms(unsigned int time);//毫秒级延时
(0017) void sw_touch(); //检测轻触开关
(0018) void mic_startup(); //等待声控启动
(0019) void remote_auto_time(); //遥控器控制直行和转弯时间
(0020) void turn_right(); //右转
(0021) void turn_left(); //左转
(0022) void turn_right_s(); //慢速右转
(0023) void turn_left_s(); //慢速左转
(0024) void backward(); //后退
(0025) void forward(); //前行
(0026) void stop(); //停止运动
(0027) */
(0028)
(0029) //更新日期 2003.03.17
(0030)
(0031) #include <io8515v.h>
(0032) #include <macros.h>
(0033) #include <sl3010.c> //调用sl3010小车的子函数库
(0034)
(0035) #define light_delay 100
(0036)
(0037) unsigned char cds;
(0038)
(0039) void remote_car()
(0040) {//遥控车程序
(0041) unsigned char remote_in,led,timers;
(0042)
(0043) led = 0x00;
0151 2744 CLR R20
(0044) for(timers=0;timers<7;timers++)
0152 2766 CLR R22
0153 C006 RJMP 0x015A
(0045) {//8 LED 整体亮灭闪烁
(0046) PORTA = led;
0154 BB4B OUT P1B,R20
(0047) delay_ms(500);
0155 EF04 LDI R16,0xF4
0156 E011 LDI R17,1
0157 DEED RCALL _delay_ms
(0048) led = ~led;
0158 9540 COM R20
0159 9563 INC R22
015A 3067 CPI R22,7
015B F3C0 BCS 0x0154
(0049) }
(0050)
(0051) work_status = 0x60;//置对应的工作状态标志
015C E680 LDI R24,0x60
015D 93800065 STS _work_status,R24
(0052)
(0053) mic_startup();//等待声控启动函数
015F DF76 RCALL _mic_startup
0160 C029 RJMP 0x018A
(0054)
(0055) while(1)
(0056) {
(0057)
(0058) sw_touch();//检测轻触开关
0161 DF13 RCALL _sw_touch
(0059)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -