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

📄 sl3010_3.lst

📁 单片机开发资料光盘-双龙-686M.zip
💻 LST
📖 第 1 页 / 共 4 页
字号:
__text_start:
__start:
    0059 E5CF      LDI	R28,0x5F
    005A E0D2      LDI	R29,2
    005B BFCD      OUT	0x3D,R28
    005C BFDE      OUT	0x3E,R29
    005D 51C0      SUBI	R28,0x10
    005E 40D0      SBCI	R29,0
    005F EA0A      LDI	R16,0xAA
    0060 8308      STD	Y+0,R16
    0061 2400      CLR	R0
    0062 E6E4      LDI	R30,0x64
    0063 E0F0      LDI	R31,0
    0064 E010      LDI	R17,0
    0065 37ED      CPI	R30,0x7D
    0066 07F1      CPC	R31,R17
    0067 F011      BEQ	0x006A
    0068 9201      ST	R0,Z+
    0069 CFFB      RJMP	0x0065
    006A 8300      STD	Z+0,R16
    006B EAEE      LDI	R30,0xAE
    006C E0F0      LDI	R31,0
    006D E6A0      LDI	R26,0x60
    006E E0B0      LDI	R27,0
    006F E010      LDI	R17,0
    0070 3BE2      CPI	R30,0xB2
    0071 07F1      CPC	R31,R17
    0072 F021      BEQ	0x0077
    0073 95C8      LPM
    0074 9631      ADIW	R30,1
    0075 920D      ST	R0,X+
    0076 CFF9      RJMP	0x0070
    0077 D312      RCALL	_main
_exit:
    0078 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:
    0079 EF8F      LDI	R24,0xFF
    007A BB8A      OUT	0x1A,R24
    007B BB8B      OUT	0x1B,R24
(0085)  DDRB  = 0x80;PORTB = 0xFF;  //PB7输出口,PB6~PB4输入(轻触开关)PB4~PB0输入(遥控器)
    007C E880      LDI	R24,0x80
    007D BB87      OUT	0x17,R24
    007E EF8F      LDI	R24,0xFF
    007F BB88      OUT	0x18,R24
(0086)  DDRC  = 0x01;PORTC = 0xFF;  //PC0蜂鸣器输出,PC7~PC1检测信号输入端
    0080 E081      LDI	R24,1
    0081 BB84      OUT	0x14,R24
    0082 EF8F      LDI	R24,0xFF
    0083 BB85      OUT	0x15,R24
(0087)  DDRD  = 0xF0;PORTD = 0xFF;  //PD7~PD4输出驱动电机,PD3~PD0输入
    0084 EF80      LDI	R24,0xF0
    0085 BB81      OUT	0x11,R24
    0086 EF8F      LDI	R24,0xFF
    0087 BB82      OUT	0x12,R24
(0088) }
    0088 9508      RET
(0089)  
(0090) void delay_us(int time)
(0091) {//微秒级延时程序     
(0092)  do
(0093)  {
(0094)   time--;
_delay_us:
  time                 --> R16
    0089 5001      SUBI	R16,1
    008A 4010      SBCI	R17,0
(0095)  }	
(0096)   while (time>1);
    008B E081      LDI	R24,1
    008C E090      LDI	R25,0
    008D 1780      CP	R24,R16
    008E 0791      CPC	R25,R17
    008F F3CC      BLT	0x0089
(0097) }	  
    0090 9508      RET
_delay_ms:
  time                 --> R20
    0091 D3BA      RCALL	push_gset1
    0092 2F40      MOV	R20,R16
    0093 2F51      MOV	R21,R17
(0098) 
(0099) void delay_ms(unsigned int time)
(0100) {//毫秒级延时程序
    0094 C005      RJMP	0x009A
(0101)  while(time!=0)
(0102)  {		
(0103)   delay_us(1000);
    0095 EE08      LDI	R16,0xE8
    0096 E013      LDI	R17,3
    0097 DFF1      RCALL	_delay_us
(0104)   time--;
    0098 5041      SUBI	R20,1
    0099 4050      SBCI	R21,0
    009A 3040      CPI	R20,0
    009B 0745      CPC	R20,R21
    009C F7C1      BNE	0x0095
(0105)  }
(0106) }		
    009D D3B1      RCALL	pop_gset1
    009E 9508      RET
(0107) 
(0108) void turn_right()//右转
(0109)     {
(0110) 		 PORTD = 0x60;   //右转//0110 0000   
_turn_right:
    009F E680      LDI	R24,0x60
    00A0 BB82      OUT	0x12,R24
(0111) 		 PORTA = 0xCC;     //1100,1100 指示灯
    00A1 EC8C      LDI	R24,0xCC
    00A2 BB8B      OUT	0x1B,R24
(0112)     }
    00A3 9508      RET
(0113) 
(0114) void turn_left()//左转
(0115)     {
(0116)          PORTD = 0x90;   //左转//1001 0000   
_turn_left:
    00A4 E980      LDI	R24,0x90
    00A5 BB82      OUT	0x12,R24
(0117) 		 PORTA = 0x33;     //0011,0011 指示灯
    00A6 E383      LDI	R24,0x33
    00A7 BB8B      OUT	0x1B,R24
(0118)     }
    00A8 9508      RET
(0119) void turn_right_s()      //慢速右转
(0120)     {
(0121)          PORTD = 0x20;   //慢速右转//0010 0000
_turn_right_s:
    00A9 E280      LDI	R24,0x20
    00AA BB82      OUT	0x12,R24
(0122) 		 PORTA = 0xCF;   //1100,1111
    00AB EC8F      LDI	R24,0xCF
    00AC BB8B      OUT	0x1B,R24
(0123)     }
    00AD 9508      RET
(0124) 
(0125) void turn_left_s()       //慢速左转
(0126)     {
(0127)          PORTD = 0x80;   //慢速左转//1000 0000
_turn_left_s:
    00AE E880      LDI	R24,0x80
    00AF BB82      OUT	0x12,R24
(0128) 		 PORTA = 0xF3;     //1111,0011
    00B0 EF83      LDI	R24,0xF3
    00B1 BB8B      OUT	0x1B,R24
(0129)     }
    00B2 9508      RET
(0130) 
(0131) void backward()//后退
(0132)     {
(0133) 		 PORTD = 0x50;   //后退//0101 0000   
_backward:
    00B3 E580      LDI	R24,0x50
    00B4 BB82      OUT	0x12,R24
(0134) 		 PORTA = 0x3C;     //0011,1100 指示灯
    00B5 E38C      LDI	R24,0x3C
    00B6 BB8B      OUT	0x1B,R24
(0135)     }
    00B7 9508      RET
(0136) 
(0137) void forward()//前行
(0138)     {
(0139) 		 PORTD = 0xA0;   //前行//1010 0000   
_forward:
    00B8 EA80      LDI	R24,0xA0
    00B9 BB82      OUT	0x12,R24
(0140) 		 PORTA = 0xC3;     //1100,0011
    00BA EC83      LDI	R24,0xC3
    00BB BB8B      OUT	0x1B,R24
(0141)     }
    00BC 9508      RET
(0142) 	
(0143) void stop()//停止运动
(0144)     {
(0145) 		 PORTD = 0xff;   //停止   
_stop:
    00BD EF8F      LDI	R24,0xFF
    00BE BB82      OUT	0x12,R24
(0146) 		 PORTA = 0xff;     //
    00BF BB8B      OUT	0x1B,R24
(0147) 	}
    00C0 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:
    00C1 B383      IN	R24,0x13
    00C2 7180      ANDI	R24,0x10
    00C3 9380007B  STS	_sw_in,R24
(0165)  if(sw_in == 0x00)
    00C5 2388      TST	R24
    00C6 F4C9      BNE	0x00E0
(0166)    {//后退,左转                   首部开关接触
(0167)        backward();          //后退
    00C7 DFEB      RCALL	_backward
(0168)        delay_ms(touch_time);
    00C8 EF0A      LDI	R16,0xFA
    00C9 E010      LDI	R17,0
    00CA DFC6      RCALL	_delay_ms
(0169) 	   
(0170) 	   if(work_status == 0x70)
    00CB 9180007C  LDS	R24,_work_status
    00CD 3780      CPI	R24,0x70
    00CE F469      BNE	0x00DC
(0171) 	     {//追光机器人,首部开关接触,停止运动,PA 口led 流动闪烁
(0172) 		  stop();
    00CF DFED      RCALL	_stop
    00D0 C00A      RJMP	0x00DB
(0173) 		  while(1)
(0174) 		    {
(0175) 			 PORTA = 0x55;
    00D1 E585      LDI	R24,0x55
    00D2 BB8B      OUT	0x1B,R24
(0176) 		     delay_ms(250);
    00D3 EF0A      LDI	R16,0xFA
    00D4 E010      LDI	R17,0
    00D5 DFBB      RCALL	_delay_ms
(0177) 		     PORTA = 0xAA;
    00D6 EA8A      LDI	R24,0xAA
    00D7 BB8B      OUT	0x1B,R24
(0178) 		     delay_ms(250);
    00D8 EF0A      LDI	R16,0xFA
    00D9 E010      LDI	R17,0
    00DA DFB6      RCALL	_delay_ms
    00DB CFF5      RJMP	0x00D1
(0179) 			}
(0180) 		 }
(0181) 	   
(0182)        turn_left();         //左转
    00DC DFC7      RCALL	_turn_left
(0183)        delay_ms(touch_time);
    00DD EF0A      LDI	R16,0xFA
    00DE E010      LDI	R17,0
    00DF DFB1      RCALL	_delay_ms
(0184)    }
(0185)  
(0186)  sw_in = PINB & 0x70;
    00E0 B386      IN	R24,0x16
    00E1 7780      ANDI	R24,0x70
    00E2 9380007B  STS	_sw_in,R24
(0187)  if(sw_in == 0x50)// 0b 0101,0000  尾部开关接触 
    00E4 3580      CPI	R24,0x50
    00E5 F441      BNE	0x00EE
(0188)    {//前行,左转
(0189) 	   forward();           //前行
    00E6 DFD1      RCALL	_forward
(0190)        delay_ms(touch_time);
    00E7 EF0A      LDI	R16,0xFA
    00E8 E010      LDI	R17,0
    00E9 DFA7      RCALL	_delay_ms
(0191)        
(0192) 	   turn_left();         //左转
    00EA DFB9      RCALL	_turn_left
(0193)        delay_ms(touch_time);
    00EB EF0A      LDI	R16,0xFA
    00EC E010      LDI	R17,0
    00ED DFA3      RCALL	_delay_ms
(0194)    }
(0195)  if(sw_in == 0x30)// 0b 0011,0000  右侧开关接触
    00EE 9180007B  LDS	R24,_sw_in
    00F0 3380      CPI	R24,0x30
    00F1 F441      BNE	0x00FA
(0196)    {//后退,左转
(0197)        backward();          //后退
    00F2 DFC0      RCALL	_backward
(0198)        delay_ms(touch_time);
    00F3 EF0A      LDI	R16,0xFA
    00F4 E010      LDI	R17,0
    00F5 DF9B      RCALL	_delay_ms
(0199)        
(0200) 	   turn_left();         //左转
    00F6 DFAD      RCALL	_turn_left
(0201)        delay_ms(touch_time);
    00F7 EF0A      LDI	R16,0xFA
    00F8 E010      LDI	R17,0
    00F9 DF97      RCALL	_delay_ms
(0202)    }  
(0203)  if(sw_in == 0x60)// 0b 0110,0000  左侧开关接触
    00FA 9180007B  LDS	R24,_sw_in
    00FC 3680      CPI	R24,0x60
    00FD F441      BNE	0x0106
(0204)    {//后退,左转
(0205)        backward();          //后退
    00FE DFB4      RCALL	_backward
(0206)        delay_ms(touch_time);
    00FF EF0A      LDI	R16,0xFA
    0100 E010      LDI	R17,0
    0101 DF8F      RCALL	_delay_ms
(0207)        
(0208) 	   turn_left();         //左转
    0102 DFA1      RCALL	_turn_left
(0209)        delay_ms(touch_time);
    0103 EF0A      LDI	R16,0xFA
    0104 E010      LDI	R17,0
    0105 DF8B      RCALL	_delay_ms
(0210)    }
(0211)  if(sw_in == 0x20)// 0b 0010,0000  两侧开关同时接触,停止运动
    0106 9180007B  LDS	R24,_sw_in
    0108 3280      CPI	R24,0x20
    0109 F4F1      BNE	0x0128
(0212)    {
(0213) 	stop();       //停止运动,熄灭指示灯
    010A DFB2      RCALL	_stop
(0214)     delay_ms(touch_time*4);
    010B EE08      LDI	R16,0xE8
    010C E013      LDI	R17,3
    010D DF83      RCALL	_delay_ms
    010E C018      RJMP	0x0127
(0215) 	while(1)
(0216) 	     {
(0217) 		  sw_in = PINC & 0x10;
    010F B383      IN	R24,0x13
    0110 7180      ANDI	R24,0x10
    0111 9380007B  STS	_sw_in,R24
(0218) 		  if(sw_in == 0x00)
    0113 2388      TST	R24
    0114 F409      BNE	0x0116
(0219) 		    {break;}
    0115 C012      RJMP	0x0128
(0220) 		  PORTA = 0x55;
    0116 E585      LDI	R24,0x55
    0117 BB8B      OUT	0x1B,R24
(0221) 		  delay_ms(250);
    0118 EF0A      LDI	R16,0xFA
    0119 E010      LDI	R17,0
    011A DF76      RCALL	_delay_ms
(0222) 		  PORTA = 0xAA;
    011B EA8A      LDI	R24,0xAA
    011C BB8B      OUT	0x1B,R24
(0223) 		  delay_ms(250);
    011D EF0A      LDI	R16,0xFA
    011E E010      LDI	R17,0
    011F DF71      RCALL	_delay_ms
(0224) 		  remote_in = PINB & 0x0f;
    0120 B386      IN	R24,0x16
    0121 708F      ANDI	R24,0xF
    0122 9380007A  STS	_remote_in,R24
(0225) 		  if(remote_in != 0x00)
    0124 2388      TST	R24
    0125 F009      BEQ	0x0127
(0226) 		    {break;}
    0126 C001      RJMP	0x0128
    0127 CFE7      RJMP	0x010F
(0227) 		 }
(0228)    }   
(0229) }
    0128 9508      RET
(0230) 
(0231) void mic_startup()
(0232) {//声控启动程序运行
_mic_startup:
    0129 C007      RJMP	0x0131
(0233) 
(0234)  while(1)//等待pc3(声控键)按键按下	
(0235)  {	  //无键按下等待
(0236)   mic_in = PINC & 0x08;     //pc2=0
    012A B383      IN	R24,0x13
    012B 7088      ANDI	R24,0x8
    012C 93800079  STS	_mic_in,R24
(0237)   if(mic_in == 0){break;}
    012E 2388      TST	R24
    012F F409      BNE	0x0131
    0130 C001      RJMP	0x0132
    0131 CFF8      RJMP	0x012A
(0238)  }//有键按下运行下面的程序
(0239) }

⌨️ 快捷键说明

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