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

📄 auto_car8.lst

📁 单片机开发资料光盘-双龙-686M.zip
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    000D E5CF      LDI	R28,0x5F
    000E E0D2      LDI	R29,2
    000F BFCD      OUT	P3D,R28
    0010 BFDE      OUT	P3E,R29
    0011 51C0      SUBI	R28,0x10
    0012 40D0      SBCI	R29,0
    0013 EA0A      LDI	R16,0xAA
    0014 8308      STD	R16,0+Y
    0015 2400      CLR	R0
    0016 E6E0      LDI	R30,0x60
    0017 E0F0      LDI	R31,0
    0018 E010      LDI	R17,0
    0019 36E5      CPI	R30,0x65
    001A 07F1      CPC	R31,R17
    001B F011      BEQ	0x001E
    001C 9201      ST	R0,Z+
    001D CFFB      RJMP	0x0019
    001E 8300      STD	R16,0+Z
    001F E1EA      LDI	R30,0x1A
    0020 E0F0      LDI	R31,0
    0021 E6A0      LDI	R26,0x60
    0022 E0B0      LDI	R27,0
    0023 E010      LDI	R17,0
    0024 31EA      CPI	R30,0x1A
    0025 07F1      CPC	R31,R17
    0026 F021      BEQ	0x002B
    0027 95C8      LPM
    0028 9631      ADIW	R30,1
    0029 920D      ST	R0,X+
    002A CFF9      RJMP	0x0024
    002B D147      RCALL	_main
_exit:
    002C 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) 
(0075) #define touch_time 250
(0076) 
(0077) unsigned char work_status;
(0078)  
(0079) void port_init(void)
(0080) {//PA,PB,PC,PD 初始化
(0081)  DDRA  = 0xFF;PORTA = 0xFF;  //PA口输出,接8路LED指示灯
_port_init:
    002D EF8F      LDI	R24,0xFF
    002E BB8A      OUT	P1A,R24
    002F BB8B      OUT	P1B,R24
(0082)  DDRB  = 0x80;PORTB = 0xFF;  //PB7输出口,PB6~PB4输入(轻触开关)PB4~PB0输入(遥控器)
    0030 E880      LDI	R24,0x80
    0031 BB87      OUT	P17,R24
    0032 EF8F      LDI	R24,0xFF
    0033 BB88      OUT	P18,R24
(0083)  DDRC  = 0x01;PORTC = 0xFF;  //PC0蜂鸣器输出,PC7~PC1检测信号输入端
    0034 E081      LDI	R24,1
    0035 BB84      OUT	P14,R24
    0036 EF8F      LDI	R24,0xFF
    0037 BB85      OUT	P15,R24
(0084)  DDRD  = 0xF0;PORTD = 0xFF;  //PD7~PD4输出驱动电机,PD3~PD0输入
    0038 EF80      LDI	R24,0xF0
    0039 BB81      OUT	P11,R24
    003A EF8F      LDI	R24,0xFF
    003B BB82      OUT	P12,R24
(0085) }
    003C 9508      RET
(0086)  
(0087) void delay_us(int time)
(0088) {//微秒级延时程序     
(0089)  do
(0090)  {
(0091)   time--;
_delay_us:
  time                 --> R16
    003D 5001      SUBI	R16,1
    003E 4010      SBCI	R17,0
(0092)  }	
(0093)   while (time>1);
    003F E081      LDI	R24,1
    0040 E090      LDI	R25,0
    0041 1780      CP	R24,R16
    0042 0791      CPC	R25,R17
    0043 F3CC      BLT	0x003D
(0094) }	  
    0044 9508      RET
_delay_ms:
  time                 --> R20
    0045 D130      RCALL	push_gset1
    0046 2F40      MOV	R20,R16
    0047 2F51      MOV	R21,R17
(0095) 
(0096) void delay_ms(unsigned int time)
(0097) {//毫秒级延时程序
    0048 C005      RJMP	0x004E
(0098)  while(time!=0)
(0099)  {		
(0100)   delay_us(1000);
    0049 EE08      LDI	R16,0xE8
    004A E013      LDI	R17,3
    004B DFF1      RCALL	_delay_us
(0101)   time--;
    004C 5041      SUBI	R20,1
    004D 4050      SBCI	R21,0
    004E 3040      CPI	R20,0
    004F 0745      CPC	R20,R21
    0050 F7C1      BNE	0x0049
(0102)  }
(0103) }		
    0051 D127      RCALL	pop_gset1
    0052 9508      RET
(0104) 
(0105) void turn_right()//右转
(0106)     {
(0107) 		 PORTD = 0x60;   //右转//0110 0000   
_turn_right:
    0053 E680      LDI	R24,0x60
    0054 BB82      OUT	P12,R24
(0108) 		 PORTA = 0xCC;     //1100,1100 指示灯
    0055 EC8C      LDI	R24,0xCC
    0056 BB8B      OUT	P1B,R24
(0109)     }
    0057 9508      RET
(0110) 
(0111) void turn_left()//左转
(0112)     {
(0113)          PORTD = 0x90;   //左转//1001 0000   
_turn_left:
    0058 E980      LDI	R24,0x90
    0059 BB82      OUT	P12,R24
(0114) 		 PORTA = 0x33;     //0011,0011 指示灯
    005A E383      LDI	R24,0x33
    005B BB8B      OUT	P1B,R24
(0115)     }
    005C 9508      RET
(0116) void turn_right_s()      //慢速右转
(0117)     {
(0118)          PORTD = 0x20;   //慢速右转//0010 0000
_turn_right_s:
    005D E280      LDI	R24,0x20
    005E BB82      OUT	P12,R24
(0119) 		 PORTA = 0xCF;   //1100,1111
    005F EC8F      LDI	R24,0xCF
    0060 BB8B      OUT	P1B,R24
(0120)     }
    0061 9508      RET
(0121) 
(0122) void turn_left_s()       //慢速左转
(0123)     {
(0124)          PORTD = 0x80;   //慢速左转//1000 0000
_turn_left_s:
    0062 E880      LDI	R24,0x80
    0063 BB82      OUT	P12,R24
(0125) 		 PORTA = 0xF3;     //1111,0011
    0064 EF83      LDI	R24,0xF3
    0065 BB8B      OUT	P1B,R24
(0126)     }
    0066 9508      RET
(0127) 
(0128) void backward()//后退
(0129)     {
(0130) 		 PORTD = 0x50;   //后退//0101 0000   
_backward:
    0067 E580      LDI	R24,0x50
    0068 BB82      OUT	P12,R24
(0131) 		 PORTA = 0x3C;     //0011,1100 指示灯
    0069 E38C      LDI	R24,0x3C
    006A BB8B      OUT	P1B,R24
(0132)     }
    006B 9508      RET
(0133) 
(0134) void forward()//前行
(0135)     {
(0136) 		 PORTD = 0xA0;   //前行//1010 0000   
_forward:
    006C EA80      LDI	R24,0xA0
    006D BB82      OUT	P12,R24
(0137) 		 PORTA = 0xC3;     //1100,0011
    006E EC83      LDI	R24,0xC3
    006F BB8B      OUT	P1B,R24
(0138)     }
    0070 9508      RET
(0139) 	
(0140) void stop()//停止运动
(0141)     {
(0142) 		 PORTD = 0xff;   //停止   
_stop:
    0071 EF8F      LDI	R24,0xFF
    0072 BB82      OUT	P12,R24
(0143) 		 PORTA = 0xff;     //
    0073 BB8B      OUT	P1B,R24
(0144) 	}
    0074 9508      RET
_sw_touch:
  remote_in            --> R22
  sw_in                --> R20
    0075 D117      RCALL	push_gset2
(0145) 
(0146) //左边       X PC4 X       右边
(0147) //        X X X X X X X
(0148) //       8 7 6 5 4 3 2 1
(0149) //     PB4  X X X X X  PB6 
(0150) //         | X  X  X | 
(0151) //         | X  X  X | 
(0152) //         | X  X  X |   
(0153) //     |$||- X  X  X -||$|
(0154) //     |$|| XXXXXXXXX ||$|
(0155) //    #|$||XXXXXXXXXXX||$|#
(0156) //     |$||XXX     XXX||$|
(0157) //     |$||___ PB5 ___||$|
(0158) 
(0159) void sw_touch()
(0160) {
(0161)  unsigned char sw_in,remote_in;
(0162)  
(0163)  sw_in = PINC & 0x10;
    0076 B343      IN	R20,P13
    0077 7140      ANDI	R20,0x10
(0164)  if(sw_in == 0x00)
    0078 F4C9      BNE	0x0092
(0165)    {//后退,左转                   首部开关接触
(0166)        backward();          //后退
    0079 DFED      RCALL	_backward
(0167)        delay_ms(touch_time);
    007A EF0A      LDI	R16,0xFA
    007B E010      LDI	R17,0
    007C DFC8      RCALL	_delay_ms
(0168) 	   
(0169) 	   if(work_status == 0x70)
    007D 91800064  LDS	R24,_work_status
    007F 3780      CPI	R24,0x70
    0080 F469      BNE	0x008E
(0170) 	     {//追光机器人,首部开关接触,停止运动,PA 口led 流动闪烁
(0171) 		  stop();
    0081 DFEF      RCALL	_stop
    0082 C00A      RJMP	0x008D
(0172) 		  while(1)
(0173) 		    {
(0174) 			 PORTA = 0x55;
    0083 E585      LDI	R24,0x55
    0084 BB8B      OUT	P1B,R24
(0175) 		     delay_ms(250);
    0085 EF0A      LDI	R16,0xFA
    0086 E010      LDI	R17,0
    0087 DFBD      RCALL	_delay_ms
(0176) 		     PORTA = 0xAA;
    0088 EA8A      LDI	R24,0xAA
    0089 BB8B      OUT	P1B,R24
(0177) 		     delay_ms(250);
    008A EF0A      LDI	R16,0xFA
    008B E010      LDI	R17,0
    008C DFB8      RCALL	_delay_ms
    008D CFF5      RJMP	0x0083
(0178) 			}
(0179) 		 }
(0180) 	   
(0181)        turn_left();         //左转
    008E DFC9      RCALL	_turn_left
(0182)        delay_ms(touch_time);
    008F EF0A      LDI	R16,0xFA
    0090 E010      LDI	R17,0
    0091 DFB3      RCALL	_delay_ms
(0183)    }
(0184)  
(0185)  sw_in = PINB & 0x70;
    0092 B346      IN	R20,P16
    0093 7740      ANDI	R20,0x70
(0186)  if(sw_in == 0x50)// 0b 0101,0000  尾部开关接触 
    0094 3540      CPI	R20,0x50
    0095 F441      BNE	0x009E
(0187)    {//前行,左转
(0188) 	   forward();           //前行
    0096 DFD5      RCALL	_forward
(0189)        delay_ms(touch_time);
    0097 EF0A      LDI	R16,0xFA
    0098 E010      LDI	R17,0
    0099 DFAB      RCALL	_delay_ms
(0190)        
(0191) 	   turn_left();         //左转
    009A DFBD      RCALL	_turn_left
(0192)        delay_ms(touch_time);
    009B EF0A      LDI	R16,0xFA
    009C E010      LDI	R17,0
    009D DFA7      RCALL	_delay_ms

⌨️ 快捷键说明

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