xuanya_car.lst
来自「单片机开发资料光盘-双龙-686M.zip」· LST 代码 · 共 1,275 行 · 第 1/3 页
LST
1,275 行
(0222) PORTA = 0xAA;
0127 EA8A LDI R24,0xAA
0128 BB8B OUT P1B,R24
(0223) delay_ms(250);
0129 EF0A LDI R16,0xFA
012A E010 LDI R17,0
012B DF71 RCALL _delay_ms
(0224) remote_in = PINB & 0x0f;
012C B386 IN R24,P16
012D 708F ANDI R24,0xF
012E 9380007D STS _remote_in,R24
(0225) if(remote_in != 0x00)
0130 2388 TST R24
0131 F009 BEQ 0x0133
(0226) {break;}
0132 C001 RJMP 0x0134
0133 CFE7 RJMP 0x011B
(0227) }
(0228) }
(0229) }
0134 9508 RET
(0230)
(0231) void mic_startup()
(0232) {//声控启动程序运行
_mic_startup:
0135 C007 RJMP 0x013D
(0233)
(0234) while(1)//等待pc3(声控键)按键按下
(0235) { //无键按下等待
(0236) mic_in = PINC & 0x08; //pc2=0
0136 B383 IN R24,P13
0137 7088 ANDI R24,0x8
0138 9380007C STS _mic_in,R24
(0237) if(mic_in == 0){break;}
013A 2388 TST R24
013B F409 BNE 0x013D
013C C001 RJMP 0x013E
013D CFF8 RJMP 0x0136
(0238) }//有键按下运行下面的程序
(0239) }
013E 9508 RET
(0240)
(0241) // #
(0242) // #
(0243) // #
(0244) // #
(0245) // # // delay_time1 转弯时间
(0246) // # # # # # // delay_time2 直行时间
(0247) // # X # //<A> 0x04 delay_time2-50
(0248) // # B C # //<B> 0x02 delay_time1+50
(0249) // # D A # //<C> 0x08 delay_time1-50
(0250) // # # //<D> 0x01 delay_time2+50
(0251) // # # # # // max: 2000 min: 200
(0252)
(0253) void remote_auto_time()
(0254) {
(0255) remote_in = PINB & 0x0F;
_remote_auto_time:
013F B386 IN R24,P16
0140 708F ANDI R24,0xF
0141 9380007D STS _remote_in,R24
(0256) switch (remote_in)
0143 2F08 MOV R16,R24
0144 2711 CLR R17
0145 3000 CPI R16,0
0146 0701 CPC R16,R17
0147 F409 BNE 0x0149
0148 C062 RJMP 0x01AB
0149 3001 CPI R16,1
014A E0E0 LDI R30,0
014B 071E CPC R17,R30
014C F409 BNE 0x014E
014D C04A RJMP 0x0198
014E 3002 CPI R16,2
014F E0E0 LDI R30,0
0150 071E CPC R17,R30
0151 F0F1 BEQ 0x0170
0152 3004 CPI R16,4
0153 E0E0 LDI R30,0
0154 071E CPC R17,R30
0155 F029 BEQ 0x015B
0156 3008 CPI R16,0x8
0157 E0E0 LDI R30,0
0158 071E CPC R17,R30
0159 F151 BEQ 0x0184
015A C050 RJMP 0x01AB
(0257) {//检测遥控器是否有键按下
(0258) case 0x04: // < A >
(0259) delay_time2 = delay_time2 - 50;
015B 91800078 LDS R24,_delay_time2
015D 91900079 LDS R25,_delay_time2+1
015F 97C2 SBIW R24,0x32
0160 93900079 STS _delay_time2+1,R25
0162 93800078 STS _delay_time2,R24
(0260) if(delay_time2 == 50)
0164 3382 CPI R24,0x32
0165 E0E0 LDI R30,0
0166 079E CPC R25,R30
0167 F009 BEQ 0x0169
0168 C042 RJMP 0x01AB
(0261) {delay_time2 = 100;}
0169 E684 LDI R24,0x64
016A E090 LDI R25,0
016B 93900079 STS _delay_time2+1,R25
016D 93800078 STS _delay_time2,R24
(0262) break;
016F C03B RJMP 0x01AB
(0263) case 0x02: // < B >
(0264) delay_time1 = delay_time1 + 50;
0170 9180007A LDS R24,_delay_time1
0172 9190007B LDS R25,_delay_time1+1
0174 96C2 ADIW R24,0x32
0175 9390007B STS _delay_time1+1,R25
0177 9380007A STS _delay_time1,R24
(0265) if(delay_time1 == 2050)
0179 3082 CPI R24,2
017A E0E8 LDI R30,0x8
017B 079E CPC R25,R30
017C F571 BNE 0x01AB
(0266) {delay_time1 = 2000;}
017D ED80 LDI R24,0xD0
017E E097 LDI R25,7
017F 9390007B STS _delay_time1+1,R25
0181 9380007A STS _delay_time1,R24
(0267) break;
0183 C027 RJMP 0x01AB
(0268) case 0x08: // < C >
(0269) delay_time1 = delay_time1 - 50;
0184 9180007A LDS R24,_delay_time1
0186 9190007B LDS R25,_delay_time1+1
0188 97C2 SBIW R24,0x32
0189 9390007B STS _delay_time1+1,R25
018B 9380007A STS _delay_time1,R24
(0270) if(delay_time1 == 50)
018D 3382 CPI R24,0x32
018E E0E0 LDI R30,0
018F 079E CPC R25,R30
0190 F4D1 BNE 0x01AB
(0271) {delay_time1 = 100;}
0191 E684 LDI R24,0x64
0192 E090 LDI R25,0
0193 9390007B STS _delay_time1+1,R25
0195 9380007A STS _delay_time1,R24
(0272) break;
0197 C013 RJMP 0x01AB
(0273) case 0x01: // < D >
(0274) delay_time2 = delay_time2 + 50;
0198 91800078 LDS R24,_delay_time2
019A 91900079 LDS R25,_delay_time2+1
019C 96C2 ADIW R24,0x32
019D 93900079 STS _delay_time2+1,R25
019F 93800078 STS _delay_time2,R24
(0275) if(delay_time2 == 2050)
01A1 3082 CPI R24,2
01A2 E0E8 LDI R30,0x8
01A3 079E CPC R25,R30
01A4 F431 BNE 0x01AB
(0276) {delay_time2 = 2000;}
01A5 ED80 LDI R24,0xD0
01A6 E097 LDI R25,7
01A7 93900079 STS _delay_time2+1,R25
01A9 93800078 STS _delay_time2,R24
(0277) break;
(0278) case 0x00: // 无按键
(0279) break;
(0280) }
(0281) }
01AB 9508 RET
FILE: E:\icc\iccavr\sl3010\xuanya_car\xuanya_car.c
(0001) // PORTD = 0xA0; //前行//1010 0000 PORTA=0xC3; 1100,0011
(0002) // PORTD = 0x90; //左转//1001 0000 PORTA=0x33; 0011,0011
(0003) // PORTD = 0x80; //左转//1000 0000 PORTA=0xF3; 1111,0011
(0004) // PORTD = 0x60; //右转//0110 0000 PORTA=0xCC; 1100,1100
(0005) // PORTD = 0x20; //右转//0010 0000 PORTA=0xCF; 1100,1111
(0006) // PORTD = 0x50; //后退//0101 0000 PORTA=0x3C; 0011,1100
(0007)
(0008) //PC3声控启动
(0009) // 用PD7~PD4来作为电机驱动端
(0010)
(0011) #include <io8515v.h>
(0012) #include <macros.h>
(0013) #include <eeprom.h>
(0014) #include <sl3010.c>
(0015)
(0016) #define xuanya_delayms 300
(0017)
(0018) //声控起动避悬崖,壁障碍运行程序,未起动时,PA口的8 LED 呈广告灯效果(霓虹灯)
(0019) //声控起动后,机器人开始动作
(0020) //探测到边缘,后退、转弯,并以伴有音乐提示。
(0021)
(0022) #pragma data:eeprom
(0023) unsigned char sound[]={ //乐曲数据表
(0024) //铃儿响叮当
(0025) 0x2a,0x2a,0x4a,0x2a,0x2a,0x4a,0x2a,0x2c,0x28,0x29,
(0026) 0x4a,0x4a,0x2b,0x2b,0x2b,0x2b,0x2b,0x2a,0x2a,0x2a,
(0027) 0x2a,0x29,0x29,0x28,0x49,0x4c,0x2a,0x2a,0x4a,0x2a,
(0028) 0x2a,0x4a,0x2a,0x2c,0x28,0x29,0x4a,0x4a,0x2b,0x2b,
(0029) 0x2b,0x2b,0x2b,0x2a,0x2a,0x2a,0x2c,0x2c,0x2b,0x29,
(0030) 0x48,0x48,
(0031)
(0032) 0x00,0x00
(0033) };
(0034) #pragma data:data
(0035)
(0036) /* 音阶表 */
(0037) const unsigned int TONETABLE[15]={DO,RE,MI,FA,SO,LA,TI,DO_H,
(0038) RE_H,MI_H,FA_H,SO_H,LA_H,TI_H,DO_HH};
(0039) /* 音阶重装常数 */
(0040) unsigned int toneconst;
(0041) unsigned int sound_add=0;
(0042) unsigned int rst_time,delay_time1,delay_time2,led_delayms=600;
(0043) unsigned char temp,temp1;
(0044) unsigned char pa,pb,pc,pd,remote_in,cny_in,cny_times,cds,pd_select,remote_select;
(0045) unsigned char gzsl,t0_times,timers;
(0046) unsigned char sound_1,sound_2;
(0047)
(0048) const unsigned char led_data[]=
(0049) {//设置LED广告灯数据表
(0050) 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,
(0051) 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,
(0052) 0x00,0x18,0x3c,0x7e,0xff,0x7e,0x3c,0x18,
(0053) 0x00,0x18,0x3c,0x7e,0xff,0x7e,0x3c,0x18,
(0054) 0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x8f,0xc7,0xe3,0xf1,
(0055) 0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x8f,0xc7,0xe3,0xf1,
(0056) 0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,
(0057) 0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,
(0058) 0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,
(0059) 0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,
(0060) 0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,
(0061)
(0062) 0x0a,0x0a
(0063) };
(0064)
(0065) const unsigned char sound_back[]={0x2a,0x2c,0x4d,0x4d,0x4d,0x2a,0x2c,0x49,0x49,0x49,0x2a,0x2c,0x2d,0x4f,
(0066) 0x2d,0x4c,0x1d,0x18,0x2a,0x49,0x49,0x49,0x00,0x00};
(0067)
(0068) //Watchdog initialisation
(0069) // prescale: 1024K cycles
(0070) void watchdog_init(void)
(0071) {
(0072) WDR(); //this prevents a timout on enabling
_watchdog_init:
01AC 95A8 WDR
(0073) WDTCR = 0x0E; //WATCHDOG ENABLED - dont forget WDR
01AD E08E LDI R24,0xE
01AE BD81 OUT P21,R24
(0074) }
01AF 9508 RET
(0075)
(0076) //TIMER0 initialisation - prescale:1024
(0077) // desired value: 25mSec
(0078) // actual value: 24.960mSec (0.2%)
(0079) void timer0_init(void)
(0080) {
(0081) TCCR0 = 0x00; //stop timer
_timer0_init:
01B0 2422 CLR R2
01B1 BE23 OUT P33,R2
(0082) TCNT0 = 0x3D; //set count value
01B2 E38D LDI R24,0x3D
01B3 BF82 OUT P32,R24
(0083) TCCR0 = 0x05; //start timer
01B4 E085 LDI R24,5
01B5 BF83 OUT P33,R24
(0084) }
01B6 9508 RET
_timer0_ovf_isr:
01B7 D1A7 RCALL push_lset
01B8 D181 RCALL push_gset1
(0085)
(0086) #pragma interrupt_handler timer0_ovf_isr:iv_TIMER0_OVF
(0087) void timer0_ovf_isr(void)
(0088) {
(0089) TCNT0 = 0x3D; //reload counter value
01B9 E38D LDI R24,0x3D
01BA BF82 OUT P32,R24
(0090) t0_times++;
01BB 91800067 LDS R24,_t0_times
01BD 5F8F SUBI R24,0xFF
01BE 93800067 STS _t0_times,R24
(0091) remote_in = PINB & 0x0F;
01C0 B386 IN R24,P16
01C1 708F ANDI R24,0xF
01C2 9380007D STS _remote_in,R24
(0092) switch (remote_in)
01C4 2F48 MOV R20,R24
01C5 2755 CLR R21
01C6 3040 CPI R20,0
01C7 0745 CPC R20,R21
01C8 F089 BEQ 0x01DA
01C9 3041 CPI R20,1
01CA E0E0 LDI R30,0
01CB 075E CPC R21,R30
01CC F161 BEQ 0x01F9
01CD 3042 CPI R20,2
01CE E0E0 LDI R30,0
01CF 075E CPC R21,R30
01D0 F0B9 BEQ 0x01E8
01D1 3044 CPI R20,4
01D2 E0E0 LDI R30,0
01D3 075E CPC R21,R30
01D4 F061 BEQ 0x01E1
01D5 3048 CPI R20,0x8
01D6 E0E0 LDI R30,0
01D7 075E CPC R21,R30
01D8 F0B1 BEQ 0x01EF
01D9 C025 RJMP 0x01FF
(0093) {//检测遥控器是否有键按下
(0094) case 0x00: // none
(0095) rst_time=0;
01DA 2422 CLR R2
01DB 2433 CLR R3
01DC 92300075 STS _rst_time+1,R3
01DE 92200074 STS _rst_time,R2
(0096) break;
01E0 C01E RJMP 0x01FF
(0097) case 0x04: // < A >
(0098) rst_time=0;
01E1 2422 CLR R2
01E2 2433 CLR R3
01E3 92300075 STS _rst_time+1,R3
01E5 92200074 STS _rst_time,R2
(0099) break;
01E7 C017 RJMP 0x01FF
(0100) case 0x02: // < B >
(0101) rst_time=0;
01E8 2422 CLR R2
01E9 2433 CLR R3
01EA 92300075 STS _rst_time+1,R3
01EC 92200074 STS _rst_time,R2
(0102) break;
01EE C010 RJMP 0x01FF
(0103) case 0x08: // < C >
(0104) rst_time++;
01EF 91800074 LDS R24,_rst_time
01F1 91900075 LDS R25,_rst_time+1
01F3 9601 ADIW R24,1
01F4 93900075 STS _rst_time+1,R25
01F6 93800074 STS _rst_time,R24
(0105) break;
01F8 C006 RJMP 0x01FF
(0106) case 0x01: // < D >
(0107) rst_time=0;
01F9 2422 CLR R2
01FA 2433 CLR R3
01FB 92300075 STS _rst_time+1,R3
01FD 92200074 STS _rst_time,R2
(0108) break;
(0109) }
(0110) if(rst_time > 400) // 400*25ms=10s,+1s 看门狗复位
01FF E980 LDI R24,0x90
0200 E091 LDI R25,1
0201 90200074 LDS R2,_rst_time
0203 90300075 LDS R3,_rst_time+1
0205 1582 CP R24,R2
0206 0593 CPC R25,R3
0207 F420 BCC 0x020C
(0111) {
(0112) PORTA = 0xff;
0208 EF8F LDI R24,0xFF
0209 BB8B OUT P1B,R24
(0113) watchdog_init();
020A DFA1 RCALL _watchdog_init
(0114) while(1);
020B CFFF RJMP 0x020B
(0115) }
(0116)
(0117) if(gzsl == 0x88)
020C 91800068 LDS R24,_gzsl
020E 3888 CPI R24,0x88
020F F509 BNE 0x0231
(0118) {
(0119) if(t0_times == 10)
0210 91800067 LDS R24,_t0_times
0212 308A CPI R24,0xA
0213 F4E9 BNE 0x0231
(0120) {
(0121) timers++;
0214 91800066 LDS R24,_timers
0216 5F8F SUBI R24,0xFF
0217 93800066 STS _timers,R24
(0122) t0_times = 0;
0219 2422 CLR R2
021A 92200067 STS _t0_times,R2
(0123) pa = led_data[timers];
021C E388 LDI R24,0x38
021D E090 LDI R25,0
021E 90200066 LDS R2,_timers
0220 2433 CLR R3
0221 0E28 ADD R2,R24
0222 1E39 ADC R3,R25
0223 2DE2 MOV R30,R2
0224 2DF3 MOV R31,R3
0225 95C8 LPM
0226 92000071 STS _pa,R0
(0124) if(pa==0x0a){timers=0;}
0228 2D80 MOV R24,R0
0229 308A CPI R24,0xA
022A F419 BNE 0x022E
022B 2422 CLR R2
022C 92200066 STS _timers,R2
(0125) PORTA = pa;
022E 90200071 LDS R2,_pa
0230 BA2B OUT P1B,R2
(0126) }
(0127) }
(0128) if(gzsl == 0x44)
0231 91800068 LDS R24,_gzsl
0233 3484 CPI R24,0x44
0234 F009 BEQ 0x0236
0235 C06A RJMP 0x02A0
(0129) {
(0130) sw_touch();
0236 DE96 RCALL _sw_touch
(0131) pc = PINC & 0xE0;
0237 B383 IN R24,P13
0238 7E80 ANDI R24,0xE0
0239 9380006F STS _pc,R24
(0132) if(pc == 0xE0)
023B 3E80 CPI R24,0xE0
023C F491 BNE 0x024F
(0133) {
(0134) stop();
023D DE8B RCALL _stop
(0135) t0_times = 0;timers = 0x22;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?