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

📄 text1.lst

📁 AVR单片机应用开发指南及实例,包含许多实例,挺不错
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    0033 E5CF      LDI	R28,0x5F
    0034 E0D4      LDI	R29,4
    0035 BFCD      OUT	0x3D,R28
    0036 BFDE      OUT	0x3E,R29
    0037 51C0      SUBI	R28,0x10
    0038 40D0      SBCI	R29,0
    0039 EA0A      LDI	R16,0xAA
    003A 8308      STD	Y+0,R16
    003B 2400      CLR	R0
    003C E6E2      LDI	R30,0x62
    003D E0F0      LDI	R31,0
    003E E010      LDI	R17,0
    003F 36EB      CPI	R30,0x6B
    0040 07F1      CPC	R31,R17
    0041 F011      BEQ	0x0044
    0042 9201      ST	R0,Z+
    0043 CFFB      RJMP	0x003F
    0044 8300      STD	Z+0,R16
    0045 E6E4      LDI	R30,0x64
    0046 E0F0      LDI	R31,0
    0047 E6A0      LDI	R26,0x60
    0048 E0B0      LDI	R27,0
    0049 E010      LDI	R17,0
    004A 36E6      CPI	R30,0x66
    004B 07F1      CPC	R31,R17
    004C F021      BEQ	0x0051
    004D 95C8      LPM
    004E 9631      ADIW	R30,1
    004F 920D      ST	R0,X+
    0050 CFF9      RJMP	0x004A
    0051 940E01B9  CALL	_main
_exit:
    0053 CFFF      RJMP	_exit
FILE: D:\icc\include\diy0206.c
(0001) //diy0206.c    sldiy02-06机器人常用函数库
(0002) //#include <io8515v.h>
(0003) //#include <io8535v.h>
(0004) 
(0005) // 更新日期: 2003.03.27				 
(0006) 
(0007) /*
(0008) void port_init();         //PA,PB,PC,PD 初始化
(0009) void delay_us(int time);  //微妙级延时
(0010) void delay_ms(unsigned int time);//毫秒级延时
(0011) void sw_touch();          //检测轻触开关
(0012) void mic_startup();       //等待声控启动
(0013) void remote_auto_time();  //遥控器控制直行和转弯时间
(0014) void turn_right();        //右转
(0015) void turn_left();         //左转
(0016) void turn_right_s();      //慢速右转
(0017) void turn_left_s();       //慢速左转
(0018) void backward();          //后退
(0019) void forward();           //前行
(0020) void stop();              //停止运动
(0021) */
(0022) /*
(0023) sl-3010 运行不同的程序其对应的工作状态由 work_status 变量指示
(0024) 对应数据表如下:
(0025)   程序名            程序功能简介        work_status 值
(0026) cny_car 程序    白底黑线,探黑线行走        0x10
(0027) xuanya_car      走悬崖,避障碍              0x20
(0028) music_car       音乐车                      0x30
(0029) led_car         霓虹灯                      0x40
(0030) auto_car1       自走车                      0x51
(0031) auto_car8       走<8>字                     0x50
(0032) remote_car      智能遥控机器人              0x60
(0033) trace_light     追光行进机器人              0x70
(0034) remote_light    遥控和追光                  0x67
(0035) ……  
(0036) */
(0037) //  电机驱动信号                       led灯指示电机状态 
(0038) //PORTD = 0xA0;//前行    //1010 0000//PORTA = 0xC3;//1100,0011
(0039) //PORTD = 0x60;//快速左转//0110 0000//PORTA = 0x33;//0011,0011
(0040) //PORTD = 0x20;//慢速左转//0010 0000//PORTA = 0xF3;//1111,0011
(0041) //PORTD = 0x90;//快速右转//1001 0000//PORTA = 0xCC;//1100,1100
(0042) //PORTD = 0x80;//慢速右转//1000 0000//PORTA = 0xCF;//1100,1111
(0043) //PORTD = 0x50;//后退    //0101 0000//PORTA = 0x3C;//0011,1100
(0044) 
(0045) //#define A 0x20      //0b0010,0000
(0046) //#define B 0x40      //0b0100,0000
(0047) //#define C 0x10      //0b0001,0000
(0048) //#define D 0x80      //0b1000,0000
(0049) 
(0050) 
(0051) /*		 音阶常数=65536-8000000/8/2/f	  */
(0052) #define DO	64580	//523
(0053) #define RE	64684	//587
(0054) #define	MI	64777	//659
(0055) #define FA	64820	//698
(0056) #define	SO	64898	//784
(0057) #define LA	64968	//880
(0058) #define	TI	65030	//988                	                        	
(0059) #define DO_H	65058	//1046
(0060) #define RE_H	65110	//1174
(0061) #define MI_H	65157	//1318
(0062) #define FA_H	65178	//1397
(0063) #define SO_H	65217	//1568
(0064) #define LA_H	65252	//1760
(0065) #define TI_H	65283	//1976
(0066) #define DO_HH	65297	//2093
(0067) /*		 		 位操作宏  				*/
(0068) #define set_bit(x,y)	(x|=(1<<y))
(0069) #define clr_bit(x,y)	(x&=~(1<<y))
(0070) #define get_bit(x,y)	(x&(1<<y))
(0071) 
(0072) #define fosc 8000000
(0073) #define baud 19200
(0074) #define device 0x38
(0075) 
(0076) #define touch_time 250
(0077) 
(0078) unsigned char work_status;
(0079)  
(0080) void port_init(void)
(0081) {//PA,PB,PC,PD 初始化
(0082)  DDRA  = 0xFF;PORTA = 0xFF;  
_port_init:
    0054 EF8F      LDI	R24,0xFF
    0055 BB8A      OUT	0x1A,R24
    0056 BB8B      OUT	0x1B,R24
(0083)      //PA口输出,接8路LED指示灯
(0084)  DDRB  = 0x00;PORTB = 0xFF;  
    0057 2422      CLR	R2
    0058 BA27      OUT	0x17,R2
    0059 BB88      OUT	0x18,R24
(0085)      //PB2声控开关信号输入口,PB0、PB1、PB3输入(左、尾、右轻触开关)PB7~PB4输入(遥控器)
(0086)  DDRC  = 0x01;PORTC = 0xFF;  
    005A E081      LDI	R24,1
    005B BB84      OUT	0x14,R24
    005C EF8F      LDI	R24,0xFF
    005D BB85      OUT	0x15,R24
(0087)      //PC0蜂鸣器输出,PC7~PC5 CNY70探测信号输入端,PC4首部轻触开关,PC1、PC2光敏感光信号输入
(0088)  DDRD  = 0xF0;PORTD = 0xFF;  
    005E EF80      LDI	R24,0xF0
    005F BB81      OUT	0x11,R24
    0060 EF8F      LDI	R24,0xFF
    0061 BB82      OUT	0x12,R24
    0062 9508      RET
(0089)      //PD7~PD4输出驱动电机,PD3~PD0输入
(0090) }
(0091)  
(0092) void delay_us(int time)
(0093) {//微秒级延时程序     
(0094)  do
(0095)  {
(0096)   time--;
_delay_us:
  time                 --> R16
    0063 5001      SUBI	R16,1
    0064 4010      SBCI	R17,0
(0097)  }	
(0098)   while (time>1);
    0065 E081      LDI	R24,1
    0066 E090      LDI	R25,0
    0067 1780      CP	R24,R16
    0068 0791      CPC	R25,R17
    0069 F3CC      BLT	0x0063
    006A 9508      RET
_delay_ms:
  time                 --> R20
    006B 940E021D  CALL	push_gset1
    006D 01A8      MOVW	R20,R16
(0099) }	  
(0100) 
(0101) void delay_ms(unsigned int time)
(0102) {//毫秒级延时程序
    006E C005      RJMP	0x0074
(0103)  while(time!=0)
(0104)  {		
(0105)   delay_us(1000);
    006F EE08      LDI	R16,0xE8
    0070 E013      LDI	R17,3
    0071 DFF1      RCALL	_delay_us
(0106)   time--;
    0072 5041      SUBI	R20,1
    0073 4050      SBCI	R21,0
    0074 3040      CPI	R20,0
    0075 0745      CPC	R20,R21
    0076 F7C1      BNE	0x006F
    0077 940E0220  CALL	pop_gset1
    0079 9508      RET
(0107)  }
(0108) }		
(0109) 
(0110) void turn_right()//右转
(0111)     {
(0112) 		 PORTD = 0x90;   //右转//0110 0000   
_turn_right:
    007A E980      LDI	R24,0x90
    007B BB82      OUT	0x12,R24
(0113) 		 PORTA = 0xCC;     //1100,1100 指示灯
    007C EC8C      LDI	R24,0xCC
    007D BB8B      OUT	0x1B,R24
    007E 9508      RET
(0114)     }
(0115) 
(0116) void turn_left()//左转
(0117)     {
(0118)          PORTD = 0x60;   //左转//1001 0000   
_turn_left:
    007F E680      LDI	R24,0x60
    0080 BB82      OUT	0x12,R24
(0119) 		 PORTA = 0x33;     //0011,0011 指示灯
    0081 E383      LDI	R24,0x33
    0082 BB8B      OUT	0x1B,R24
    0083 9508      RET
(0120)     }
(0121) void turn_right_s()      //慢速右转
(0122)     {
(0123)          PORTD = 0x80;   //慢速右转//0010 0000
_turn_right_s:
    0084 E880      LDI	R24,0x80
    0085 BB82      OUT	0x12,R24
(0124) 		 PORTA = 0xCF;   //1100,1111
    0086 EC8F      LDI	R24,0xCF
    0087 BB8B      OUT	0x1B,R24
    0088 9508      RET
(0125)     }
(0126) 
(0127) void turn_left_s()       //慢速左转
(0128)     {
(0129)          PORTD = 0x20;   //慢速左转//1000 0000
_turn_left_s:
    0089 E280      LDI	R24,0x20
    008A BB82      OUT	0x12,R24
(0130) 		 PORTA = 0xF3;     //1111,0011
    008B EF83      LDI	R24,0xF3
    008C BB8B      OUT	0x1B,R24
    008D 9508      RET
(0131)     }
(0132) 
(0133) void backward()//后退
(0134)     {
(0135) 		 PORTD = 0x50;   //后退//0101 0000   
_backward:
    008E E580      LDI	R24,0x50
    008F BB82      OUT	0x12,R24
(0136) 		 PORTA = 0x3C;     //0011,1100 指示灯
    0090 E38C      LDI	R24,0x3C
    0091 BB8B      OUT	0x1B,R24
    0092 9508      RET
(0137)     }
(0138) 
(0139) void forward()//前行
(0140)     {
(0141) 		 PORTD = 0xA0;   //前行//1010 0000   
_forward:
    0093 EA80      LDI	R24,0xA0
    0094 BB82      OUT	0x12,R24
(0142) 		 PORTA = 0xC3;     //1100,0011
    0095 EC83      LDI	R24,0xC3
    0096 BB8B      OUT	0x1B,R24
    0097 9508      RET
(0143)     }
(0144) 	
(0145) void stop()//停止运动
(0146)     {
(0147) 		 PORTD = 0xff;   //停止   
_stop:
    0098 EF8F      LDI	R24,0xFF
    0099 BB82      OUT	0x12,R24
(0148) 		 PORTA = 0xff;     //
    009A BB8B      OUT	0x1B,R24
    009B 9508      RET
_sw_touch:
  sw_in                --> R20
  remote_in            --> R22
    009C 940E021B  CALL	push_gset2
(0149) 	}
(0150) 
(0151) //左边       X PC4 X       右边
(0152) //        X X X X X X X
(0153) //       8 7 6 5 4 3 2 1
(0154) //     PB0  X X X X X  PB3 
(0155) //         | X  X  X | 
(0156) //         | X  X  X | 
(0157) //         | X  X  X |   
(0158) //     |$||- X  X  X -||$|
(0159) //     |$|| XXXXXXXXX ||$|
(0160) //    #|$||XXXXXXXXXXX||$|#
(0161) //     |$||XXX     XXX||$|
(0162) //     |$||___ PB1 ___||$|
(0163) 
(0164) void sw_touch()
(0165) {
(0166)  unsigned char sw_in,remote_in;
(0167)  sw_in = PINC & 0x10;
    009E B343      IN	R20,0x13
    009F 7140      ANDI	R20,0x10
(0168)  if(sw_in == 0x00)
    00A0 F4C9      BNE	0x00BA
(0169)    {//后退,左转                   首部开关接触
(0170)        backward();          //后退
    00A1 DFEC      RCALL	_backward
(0171)        delay_ms(touch_time);
    00A2 EF0A      LDI	R16,0xFA
    00A3 E010      LDI	R17,0
    00A4 DFC6      RCALL	_delay_ms
(0172) 	   
(0173) 	   if(work_status == 0x70)
    00A5 9180006A  LDS	R24,work_status
    00A7 3780      CPI	R24,0x70
    00A8 F469      BNE	0x00B6
(0174) 	     {//追光机器人,首部开关接触,停止运动,PA 口led 流动闪烁
(0175) 		  stop();
    00A9 DFEE      RCALL	_stop
    00AA C00A      RJMP	0x00B5
(0176) 		  while(1)
(0177) 		    {
(0178) 			 PORTA = 0x55;
    00AB E585      LDI	R24,0x55
    00AC BB8B      OUT	0x1B,R24
(0179) 		     delay_ms(250);
    00AD EF0A      LDI	R16,0xFA
    00AE E010      LDI	R17,0
    00AF DFBB      RCALL	_delay_ms
(0180) 		     PORTA = 0xAA;
    00B0 EA8A      LDI	R24,0xAA
    00B1 BB8B      OUT	0x1B,R24
(0181) 		     delay_ms(250);
    00B2 EF0A      LDI	R16,0xFA
    00B3 E010      LDI	R17,0
    00B4 DFB6      RCALL	_delay_ms
    00B5 CFF5      RJMP	0x00AB
(0182) 			}
(0183) 		 }
(0184) 	   
(0185)        turn_left();         //左转
    00B6 DFC8      RCALL	_turn_left
(0186)        delay_ms(touch_time);
    00B7 EF0A      LDI	R16,0xFA
    00B8 E010      LDI	R17,0
    00B9 DFB1      RCALL	_delay_ms
(0187)    }
(0188)  
(0189)  sw_in = PINB & 0x0b;//0b0000,1011  pb3,pb1,pb0
    00BA B346      IN	R20,0x16
    00BB 704B      ANDI	R20,0xB
(0190)  if(sw_in == 0x09)// 0b 0000,1001  尾部开关接触 
    00BC 3049      CPI	R20,0x9
    00BD F441      BNE	0x00C6
(0191)    {//前行,左转
(0192) 	   forward();           //前行
    00BE DFD4      RCALL	_forward
(0193)        delay_ms(touch_time);
    00BF EF0A      LDI	R16,0xFA
    00C0 E010      LDI	R17,0
    00C1 DFA9      RCALL	_delay_ms
(0194)        
(0195) 	   turn_left();         //左转
    00C2 DFBC      RCALL	_turn_left
(0196)        delay_ms(touch_time);
    00C3 EF0A      LDI	R16,0xFA
    00C4 E010      LDI	R17,0
    00C5 DFA5      RCALL	_delay_ms
(0197)    }
(0198)  if(sw_in == 0x0a)// 0b 0000,1010  右侧开关接触
    00C6 304A      CPI	R20,0xA
    00C7 F441      BNE	0x00D0
(0199)    {//后退,左转
(0200)        backward();          //后退
    00C8 DFC5      RCALL	_backward
(0201)        delay_ms(touch_time);
    00C9 EF0A      LDI	R16,0xFA
    00CA E010      LDI	R17,0
    00CB DF9F      RCALL	_delay_ms
(0202)        
(0203) 	   turn_left();         //左转
    00CC DFB2      RCALL	_turn_left
(0204)        delay_ms(touch_time);
    00CD EF0A      LDI	R16,0xFA
    00CE E010      LDI	R17,0
    00CF DF9B      RCALL	_delay_ms
(0205)    }  
(0206)  if(sw_in == 0x03)// 0b 0000,0011  左侧开关接触
    00D0 3043      CPI	R20,3
    00D1 F441      BNE	0x00DA
(0207)    {//后退,左转
(0208)        backward();          //后退
    00D2 DFBB      RCALL	_backward
(0209)        delay_ms(touch_time);
    00D3 EF0A      LDI	R16,0xFA
    00D4 E010      LDI	R17,0
    00D5 DF95      RCALL	_delay_ms
(0210)        
(0211) 	   turn_left();         //左转
    00D6 DFA8      RCALL	_turn_left
(0212)        delay_ms(touch_time);
    00D7 EF0A      LDI	R16,0xFA
    00D8 E010      LDI	R17,0
    00D9 DF91      RCALL	_delay_ms
(0213)    }
(0214)  if(sw_in == 0x02)// 0b 0000,0010  两侧开关同时接触,停止运动
    00DA 3042      CPI	R20,2
    00DB F4F9      BNE	0x00FB
(0215)    {
(0216) 	stop();       //停止运动,熄灭指示灯
    00DC DFBB      RCALL	_stop
(0217)     delay_ms(touch_time*4);
    00DD EE08      LDI	R16,0xE8
    00DE E013      LDI	R17,3
    00DF DF8B      RCALL	_delay_ms
    00E0 C019      RJMP	0x00FA
(0218) 	while(1)
(0219) 	     {
(0220) 		  sw_in = PINC & 0x10;
    00E1 B343      IN	R20,0x13
    00E2 7140      ANDI	R20,0x10
(0221) 		  if(sw_in == 0x00)
    00E3 F409      BNE	0x00E5
(0222) 		    {break;}//首部开关接触继续启动运动
    00E4 C016      RJMP	0x00FB
(0223) 		  PORTA = 0x55;//停止不运动时pa口指示灯流动闪烁
    00E5 E585      LDI	R24,0x55
    00E6 BB8B      OUT	0x1B,R24
(0224) 		  delay_ms(250);
    00E7 EF0A      LDI	R16,0xFA
    00E8 E010      LDI	R17,0
    00E9 DF81      RCALL	_delay_ms
(0225) 		  PORTA = 0xAA;
    00EA EA8A      LDI	R24,0xAA
    00EB BB8B      OUT	0x1B,R24
(0226) 		  delay_ms(250);
    00EC EF0A      LDI	R16,0xFA
    00ED E010      LDI	R17,0
    00EE DF7C      RCALL	_delay_ms
(0227) 		  remote_in = PINB & 0xf0;//遥控器控制继续运动
    00EF B366      IN	R22,0x16
    00F0 7F60      ANDI	R22,0xF0
(0228) 		  if(remote_in == 0x10 || remote_in == 0x20 || remote_in == 0x40 || remote_in == 0x80)
    00F1 3160      CPI	R22,0x10
    00F2 F031      BEQ	0x00F9
    00F3 3260      CPI	R22,0x20
    00F4 F021      BEQ	0x00F9
    00F5 3460      CPI	R22,0x40

⌨️ 快捷键说明

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