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 + -
显示快捷键?