⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xuanya_car.lst

📁 单片机开发资料光盘-双龙-686M.zip
💻 LST
📖 第 1 页 / 共 3 页
字号:
__start:
__text_start:
    0065 E5CF      LDI	R28,0x5F
    0066 E0D2      LDI	R29,2
    0067 BFCD      OUT	P3D,R28
    0068 BFDE      OUT	P3E,R29
    0069 51C0      SUBI	R28,0x10
    006A 40D0      SBCI	R29,0
    006B EA0A      LDI	R16,0xAA
    006C 8308      STD	R16,0+Y
    006D 2400      CLR	R0
    006E E6E4      LDI	R30,0x64
    006F E0F0      LDI	R31,0
    0070 E010      LDI	R17,0
    0071 38E0      CPI	R30,0x80
    0072 07F1      CPC	R31,R17
    0073 F011      BEQ	0x0076
    0074 9201      ST	R0,Z+
    0075 CFFB      RJMP	0x0071
    0076 8300      STD	R16,0+Z
    0077 ECE6      LDI	R30,0xC6
    0078 E0F0      LDI	R31,0
    0079 E6A0      LDI	R26,0x60
    007A E0B0      LDI	R27,0
    007B E010      LDI	R17,0
    007C 3CEA      CPI	R30,0xCA
    007D 07F1      CPC	R31,R17
    007E F021      BEQ	0x0083
    007F 95C8      LPM
    0080 9631      ADIW	R30,1
    0081 920D      ST	R0,X+
    0082 CFF9      RJMP	0x007C
    0083 D2B5      RCALL	_main
_exit:
    0084 CFFF      RJMP	_exit
FILE: e:\ICC\include\sl3010.c
(0001) //sl3010.c    sl3010机器人常用函数库
(0002) //#include <io8515v.h>
(0003) 
(0004) // 更新日期: 2003.03.18
(0005) 
(0006) /*
(0007) void port_init();         //PA,PB,PC,PD 初始化
(0008) void delay_us(int time);  //微妙级延时
(0009) void delay_ms(unsigned int time);//毫秒级延时
(0010) void sw_touch();          //检测轻触开关
(0011) void mic_startup();       //等待声控启动
(0012) void remote_auto_time();  //遥控器控制直行和转弯时间
(0013) void turn_right();        //右转
(0014) void turn_left();         //左转
(0015) void turn_right_s();      //慢速右转
(0016) void turn_left_s();       //慢速左转
(0017) void backward();          //后退
(0018) void forward();           //前行
(0019) void stop();              //停止运动
(0020) */
(0021) /*
(0022) sl-3010 运行不同的程序其对应的工作状态由 work_status 变量指示
(0023) 对应数据表如下:
(0024)   程序名            程序功能简介        work_status 值
(0025) cny_car 程序    白底黑线,探黑线行走        0x10
(0026) xuanya_car      走悬崖,避障碍              0x20
(0027) music_car       音乐车                      0x30
(0028) led_car         霓虹灯                      0x40
(0029) auto_car1       自走车                      0x51
(0030) auto_car8       走<8>字                     0x50
(0031) remote_car      智能遥控机器人              0x60
(0032) trace_light     追光行进机器人              0x70
(0033) remote_light    遥控和追光                  0x67
(0034) ……  
(0035) */
(0036) //  电机驱动信号                       led灯指示电机状态 
(0037) //PORTD = 0xA0;//前行    //1010 0000//PORTA = 0xC3;//1100,0011
(0038) //PORTD = 0x90;//快速左转//1001 0000//PORTA = 0x33;//0011,0011
(0039) //PORTD = 0x80;//慢速左转//1000 0000//PORTA = 0xF3;//1111,0011
(0040) //PORTD = 0x60;//快速右转//0110 0000//PORTA = 0xCC;//1100,1100
(0041) //PORTD = 0x20;//慢速右转//0010 0000//PORTA = 0xCF;//1100,1111
(0042) //PORTD = 0x50;//后退    //0101 0000//PORTA = 0x3C;//0011,1100
(0043) 
(0044) //#define A 0x04      //0b0000,0100
(0045) //#define B 0x02      //0b0000,0010
(0046) //#define C 0x08      //0b0000,1000
(0047) //#define D 0x01      //0b0000,0001
(0048) 
(0049) 
(0050) /*		 音阶常数=65536-8000000/8/2/f	  */
(0051) #define DO	64580	//523
(0052) #define RE	64684	//587
(0053) #define	MI	64777	//659
(0054) #define FA	64820	//698
(0055) #define	SO	64898	//784
(0056) #define LA	64968	//880
(0057) #define	TI	65030	//988                	                        	
(0058) #define DO_H	65058	//1046
(0059) #define RE_H	65110	//1174
(0060) #define MI_H	65157	//1318
(0061) #define FA_H	65178	//1397
(0062) #define SO_H	65217	//1568
(0063) #define LA_H	65252	//1760
(0064) #define TI_H	65283	//1976
(0065) #define DO_HH	65297	//2093
(0066) /*		 		 位操作宏  				*/
(0067) #define set_bit(x,y)	(x|=(1<<y))
(0068) #define clr_bit(x,y)	(x&=~(1<<y))
(0069) #define get_bit(x,y)	(x&(1<<y))
(0070) 
(0071) #define fosc 8000000
(0072) #define baud 19200
(0073) #define device 0x38
(0074) #define touch_time 250
(0075) 
(0076) unsigned char work_status;
(0077) unsigned char sw_in,remote_in;
(0078) unsigned char mic_in;
(0079) unsigned int delay_time1,delay_time2;
(0080) unsigned char remote_in;
(0081)  
(0082) void port_init(void)
(0083) {//PA,PB,PC,PD 初始化
(0084)  DDRA  = 0xFF;PORTA = 0xFF;  //PA口输出,接8路LED指示灯
_port_init:
    0085 EF8F      LDI	R24,0xFF
    0086 BB8A      OUT	P1A,R24
    0087 BB8B      OUT	P1B,R24
(0085)  DDRB  = 0x80;PORTB = 0xFF;  //PB7输出口,PB6~PB4输入(轻触开关)PB4~PB0输入(遥控器)
    0088 E880      LDI	R24,0x80
    0089 BB87      OUT	P17,R24
    008A EF8F      LDI	R24,0xFF
    008B BB88      OUT	P18,R24
(0086)  DDRC  = 0x01;PORTC = 0xFF;  //PC0蜂鸣器输出,PC7~PC1检测信号输入端
    008C E081      LDI	R24,1
    008D BB84      OUT	P14,R24
    008E EF8F      LDI	R24,0xFF
    008F BB85      OUT	P15,R24
(0087)  DDRD  = 0xF0;PORTD = 0xFF;  //PD7~PD4输出驱动电机,PD3~PD0输入
    0090 EF80      LDI	R24,0xF0
    0091 BB81      OUT	P11,R24
    0092 EF8F      LDI	R24,0xFF
    0093 BB82      OUT	P12,R24
(0088) }
    0094 9508      RET
(0089)  
(0090) void delay_us(int time)
(0091) {//微秒级延时程序     
(0092)  do
(0093)  {
(0094)   time--;
_delay_us:
  time                 --> R16
    0095 5001      SUBI	R16,1
    0096 4010      SBCI	R17,0
(0095)  }	
(0096)   while (time>1);
    0097 E081      LDI	R24,1
    0098 E090      LDI	R25,0
    0099 1780      CP	R24,R16
    009A 0791      CPC	R25,R17
    009B F3CC      BLT	0x0095
(0097) }	  
    009C 9508      RET
_delay_ms:
  time                 --> R20
    009D D29C      RCALL	push_gset1
    009E 2F40      MOV	R20,R16
    009F 2F51      MOV	R21,R17
(0098) 
(0099) void delay_ms(unsigned int time)
(0100) {//毫秒级延时程序
    00A0 C005      RJMP	0x00A6
(0101)  while(time!=0)
(0102)  {		
(0103)   delay_us(1000);
    00A1 EE08      LDI	R16,0xE8
    00A2 E013      LDI	R17,3
    00A3 DFF1      RCALL	_delay_us
(0104)   time--;
    00A4 5041      SUBI	R20,1
    00A5 4050      SBCI	R21,0
    00A6 3040      CPI	R20,0
    00A7 0745      CPC	R20,R21
    00A8 F7C1      BNE	0x00A1
(0105)  }
(0106) }		
    00A9 D293      RCALL	pop_gset1
    00AA 9508      RET
(0107) 
(0108) void turn_right()//右转
(0109)     {
(0110) 		 PORTD = 0x60;   //右转//0110 0000   
_turn_right:
    00AB E680      LDI	R24,0x60
    00AC BB82      OUT	P12,R24
(0111) 		 PORTA = 0xCC;     //1100,1100 指示灯
    00AD EC8C      LDI	R24,0xCC
    00AE BB8B      OUT	P1B,R24
(0112)     }
    00AF 9508      RET
(0113) 
(0114) void turn_left()//左转
(0115)     {
(0116)          PORTD = 0x90;   //左转//1001 0000   
_turn_left:
    00B0 E980      LDI	R24,0x90
    00B1 BB82      OUT	P12,R24
(0117) 		 PORTA = 0x33;     //0011,0011 指示灯
    00B2 E383      LDI	R24,0x33
    00B3 BB8B      OUT	P1B,R24
(0118)     }
    00B4 9508      RET
(0119) void turn_right_s()      //慢速右转
(0120)     {
(0121)          PORTD = 0x20;   //慢速右转//0010 0000
_turn_right_s:
    00B5 E280      LDI	R24,0x20
    00B6 BB82      OUT	P12,R24
(0122) 		 PORTA = 0xCF;   //1100,1111
    00B7 EC8F      LDI	R24,0xCF
    00B8 BB8B      OUT	P1B,R24
(0123)     }
    00B9 9508      RET
(0124) 
(0125) void turn_left_s()       //慢速左转
(0126)     {
(0127)          PORTD = 0x80;   //慢速左转//1000 0000
_turn_left_s:
    00BA E880      LDI	R24,0x80
    00BB BB82      OUT	P12,R24
(0128) 		 PORTA = 0xF3;     //1111,0011
    00BC EF83      LDI	R24,0xF3
    00BD BB8B      OUT	P1B,R24
(0129)     }
    00BE 9508      RET
(0130) 
(0131) void backward()//后退
(0132)     {
(0133) 		 PORTD = 0x50;   //后退//0101 0000   
_backward:
    00BF E580      LDI	R24,0x50
    00C0 BB82      OUT	P12,R24
(0134) 		 PORTA = 0x3C;     //0011,1100 指示灯
    00C1 E38C      LDI	R24,0x3C
    00C2 BB8B      OUT	P1B,R24
(0135)     }
    00C3 9508      RET
(0136) 
(0137) void forward()//前行
(0138)     {
(0139) 		 PORTD = 0xA0;   //前行//1010 0000   
_forward:
    00C4 EA80      LDI	R24,0xA0
    00C5 BB82      OUT	P12,R24
(0140) 		 PORTA = 0xC3;     //1100,0011
    00C6 EC83      LDI	R24,0xC3
    00C7 BB8B      OUT	P1B,R24
(0141)     }
    00C8 9508      RET
(0142) 	
(0143) void stop()//停止运动
(0144)     {
(0145) 		 PORTD = 0xff;   //停止   
_stop:
    00C9 EF8F      LDI	R24,0xFF
    00CA BB82      OUT	P12,R24
(0146) 		 PORTA = 0xff;     //
    00CB BB8B      OUT	P1B,R24
(0147) 	}
    00CC 9508      RET
(0148) 
(0149) //左边       X PC4 X       右边
(0150) //        X X X X X X X
(0151) //       8 7 6 5 4 3 2 1
(0152) //     PB4  X X X X X  PB6 
(0153) //         | X  X  X | 
(0154) //         | X  X  X | 
(0155) //         | X  X  X |   
(0156) //     |$||- X  X  X -||$|
(0157) //     |$|| XXXXXXXXX ||$|
(0158) //    #|$||XXXXXXXXXXX||$|#
(0159) //     |$||XXX     XXX||$|
(0160) //     |$||___ PB5 ___||$|
(0161) 
(0162) void sw_touch()
(0163) {
(0164)  sw_in = PINC & 0x10;
_sw_touch:
    00CD B383      IN	R24,P13
    00CE 7180      ANDI	R24,0x10
    00CF 9380007E  STS	_sw_in,R24
(0165)  if(sw_in == 0x00)
    00D1 2388      TST	R24
    00D2 F4C9      BNE	0x00EC
(0166)    {//后退,左转                   首部开关接触
(0167)        backward();          //后退
    00D3 DFEB      RCALL	_backward
(0168)        delay_ms(touch_time);
    00D4 EF0A      LDI	R16,0xFA
    00D5 E010      LDI	R17,0
    00D6 DFC6      RCALL	_delay_ms
(0169) 	   
(0170) 	   if(work_status == 0x70)
    00D7 9180007F  LDS	R24,_work_status
    00D9 3780      CPI	R24,0x70
    00DA F469      BNE	0x00E8
(0171) 	     {//追光机器人,首部开关接触,停止运动,PA 口led 流动闪烁
(0172) 		  stop();
    00DB DFED      RCALL	_stop
    00DC C00A      RJMP	0x00E7
(0173) 		  while(1)
(0174) 		    {
(0175) 			 PORTA = 0x55;
    00DD E585      LDI	R24,0x55
    00DE BB8B      OUT	P1B,R24
(0176) 		     delay_ms(250);
    00DF EF0A      LDI	R16,0xFA
    00E0 E010      LDI	R17,0
    00E1 DFBB      RCALL	_delay_ms
(0177) 		     PORTA = 0xAA;
    00E2 EA8A      LDI	R24,0xAA
    00E3 BB8B      OUT	P1B,R24
(0178) 		     delay_ms(250);
    00E4 EF0A      LDI	R16,0xFA
    00E5 E010      LDI	R17,0
    00E6 DFB6      RCALL	_delay_ms
    00E7 CFF5      RJMP	0x00DD
(0179) 			}
(0180) 		 }
(0181) 	   
(0182)        turn_left();         //左转
    00E8 DFC7      RCALL	_turn_left
(0183)        delay_ms(touch_time);
    00E9 EF0A      LDI	R16,0xFA
    00EA E010      LDI	R17,0
    00EB DFB1      RCALL	_delay_ms
(0184)    }
(0185)  
(0186)  sw_in = PINB & 0x70;
    00EC B386      IN	R24,P16
    00ED 7780      ANDI	R24,0x70
    00EE 9380007E  STS	_sw_in,R24
(0187)  if(sw_in == 0x50)// 0b 0101,0000  尾部开关接触 
    00F0 3580      CPI	R24,0x50
    00F1 F441      BNE	0x00FA
(0188)    {//前行,左转
(0189) 	   forward();           //前行
    00F2 DFD1      RCALL	_forward
(0190)        delay_ms(touch_time);
    00F3 EF0A      LDI	R16,0xFA
    00F4 E010      LDI	R17,0
    00F5 DFA7      RCALL	_delay_ms
(0191)        
(0192) 	   turn_left();         //左转
    00F6 DFB9      RCALL	_turn_left
(0193)        delay_ms(touch_time);
    00F7 EF0A      LDI	R16,0xFA
    00F8 E010      LDI	R17,0
    00F9 DFA3      RCALL	_delay_ms
(0194)    }
(0195)  if(sw_in == 0x30)// 0b 0011,0000  右侧开关接触
    00FA 9180007E  LDS	R24,_sw_in
    00FC 3380      CPI	R24,0x30
    00FD F441      BNE	0x0106
(0196)    {//后退,左转
(0197)        backward();          //后退
    00FE DFC0      RCALL	_backward
(0198)        delay_ms(touch_time);
    00FF EF0A      LDI	R16,0xFA
    0100 E010      LDI	R17,0
    0101 DF9B      RCALL	_delay_ms
(0199)        
(0200) 	   turn_left();         //左转
    0102 DFAD      RCALL	_turn_left
(0201)        delay_ms(touch_time);
    0103 EF0A      LDI	R16,0xFA
    0104 E010      LDI	R17,0
    0105 DF97      RCALL	_delay_ms
(0202)    }  
(0203)  if(sw_in == 0x60)// 0b 0110,0000  左侧开关接触
    0106 9180007E  LDS	R24,_sw_in
    0108 3680      CPI	R24,0x60
    0109 F441      BNE	0x0112
(0204)    {//后退,左转
(0205)        backward();          //后退
    010A DFB4      RCALL	_backward
(0206)        delay_ms(touch_time);
    010B EF0A      LDI	R16,0xFA
    010C E010      LDI	R17,0
    010D DF8F      RCALL	_delay_ms
(0207)        
(0208) 	   turn_left();         //左转
    010E DFA1      RCALL	_turn_left
(0209)        delay_ms(touch_time);
    010F EF0A      LDI	R16,0xFA
    0110 E010      LDI	R17,0
    0111 DF8B      RCALL	_delay_ms
(0210)    }
(0211)  if(sw_in == 0x20)// 0b 0010,0000  两侧开关同时接触,停止运动
    0112 9180007E  LDS	R24,_sw_in
    0114 3280      CPI	R24,0x20
    0115 F4F1      BNE	0x0134
(0212)    {
(0213) 	stop();       //停止运动,熄灭指示灯
    0116 DFB2      RCALL	_stop
(0214)     delay_ms(touch_time*4);
    0117 EE08      LDI	R16,0xE8
    0118 E013      LDI	R17,3
    0119 DF83      RCALL	_delay_ms
    011A C018      RJMP	0x0133
(0215) 	while(1)
(0216) 	     {
(0217) 		  sw_in = PINC & 0x10;
    011B B383      IN	R24,P13
    011C 7180      ANDI	R24,0x10
    011D 9380007E  STS	_sw_in,R24
(0218) 		  if(sw_in == 0x00)
    011F 2388      TST	R24
    0120 F409      BNE	0x0122
(0219) 		    {break;}
    0121 C012      RJMP	0x0134
(0220) 		  PORTA = 0x55;
    0122 E585      LDI	R24,0x55
    0123 BB8B      OUT	P1B,R24
(0221) 		  delay_ms(250);
    0124 EF0A      LDI	R16,0xFA
    0125 E010      LDI	R17,0
    0126 DF76      RCALL	_delay_ms

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -