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

📄 text1.lst

📁 AVR单片机应用开发指南及实例,包含许多实例,挺不错
💻 LST
📖 第 1 页 / 共 3 页
字号:
__text_start:
__start:
    00A1 E5CF      LDI	R28,0x5F
    00A2 E0D4      LDI	R29,4
    00A3 BFCD      OUT	0x3D,R28
    00A4 BFDE      OUT	0x3E,R29
    00A5 51C0      SUBI	R28,0x10
    00A6 40D0      SBCI	R29,0
    00A7 EA0A      LDI	R16,0xAA
    00A8 8308      STD	Y+0,R16
    00A9 2400      CLR	R0
    00AA E6E2      LDI	R30,0x62
    00AB E0F0      LDI	R31,0
    00AC E010      LDI	R17,0
    00AD 36E8      CPI	R30,0x68
    00AE 07F1      CPC	R31,R17
    00AF F011      BEQ	0x00B2
    00B0 9201      ST	R0,Z+
    00B1 CFFB      RJMP	0x00AD
    00B2 8300      STD	Z+0,R16
    00B3 E4E0      LDI	R30,0x40
    00B4 E0F1      LDI	R31,1
    00B5 E6A0      LDI	R26,0x60
    00B6 E0B0      LDI	R27,0
    00B7 E011      LDI	R17,1
    00B8 34E2      CPI	R30,0x42
    00B9 07F1      CPC	R31,R17
    00BA F021      BEQ	0x00BF
    00BB 95C8      LPM
    00BC 9631      ADIW	R30,1
    00BD 920D      ST	R0,X+
    00BE CFF9      RJMP	0x00B8
    00BF 940E031F  CALL	_main
_exit:
    00C1 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:
    00C2 EF8F      LDI	R24,0xFF
    00C3 BB8A      OUT	0x1A,R24
    00C4 BB8B      OUT	0x1B,R24
(0083)      //PA口输出,接8路LED指示灯
(0084)  DDRB  = 0x00;PORTB = 0xFF;  
    00C5 2422      CLR	R2
    00C6 BA27      OUT	0x17,R2
    00C7 BB88      OUT	0x18,R24
(0085)      //PB2声控开关信号输入口,PB0、PB1、PB3输入(左、尾、右轻触开关)PB7~PB4输入(遥控器)
(0086)  DDRC  = 0x01;PORTC = 0xFF;  
    00C8 E081      LDI	R24,1
    00C9 BB84      OUT	0x14,R24
    00CA EF8F      LDI	R24,0xFF
    00CB BB85      OUT	0x15,R24
(0087)      //PC0蜂鸣器输出,PC7~PC5 CNY70探测信号输入端,PC4首部轻触开关,PC1、PC2光敏感光信号输入
(0088)  DDRD  = 0xF0;PORTD = 0xFF;  
    00CC EF80      LDI	R24,0xF0
    00CD BB81      OUT	0x11,R24
    00CE EF8F      LDI	R24,0xFF
    00CF BB82      OUT	0x12,R24
    00D0 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
    00D1 5001      SUBI	R16,1
    00D2 4010      SBCI	R17,0
(0097)  }	
(0098)   while (time>1);
    00D3 E081      LDI	R24,1
    00D4 E090      LDI	R25,0
    00D5 1780      CP	R24,R16
    00D6 0791      CPC	R25,R17
    00D7 F3CC      BLT	0x00D1
    00D8 9508      RET
_delay_ms:
  time                 --> R20
    00D9 940E03E2  CALL	push_gset1
    00DB 01A8      MOVW	R20,R16
(0099) }	  
(0100) 
(0101) void delay_ms(unsigned int time)
(0102) {//毫秒级延时程序
    00DC C005      RJMP	0x00E2
(0103)  while(time!=0)
(0104)  {		
(0105)   delay_us(1000);
    00DD EE08      LDI	R16,0xE8
    00DE E013      LDI	R17,3
    00DF DFF1      RCALL	_delay_us
(0106)   time--;
    00E0 5041      SUBI	R20,1
    00E1 4050      SBCI	R21,0
    00E2 3040      CPI	R20,0
    00E3 0745      CPC	R20,R21
    00E4 F7C1      BNE	0x00DD
    00E5 940E03E5  CALL	pop_gset1
    00E7 9508      RET
(0107)  }
(0108) }		
(0109) 
(0110) void turn_right()//右转
(0111)     {
(0112) 		 PORTD = 0x90;   //右转//0110 0000   
_turn_right:
    00E8 E980      LDI	R24,0x90
    00E9 BB82      OUT	0x12,R24
(0113) 		 PORTA = 0xCC;     //1100,1100 指示灯
    00EA EC8C      LDI	R24,0xCC
    00EB BB8B      OUT	0x1B,R24
    00EC 9508      RET
(0114)     }
(0115) 
(0116) void turn_left()//左转
(0117)     {
(0118)          PORTD = 0x60;   //左转//1001 0000   
_turn_left:
    00ED E680      LDI	R24,0x60
    00EE BB82      OUT	0x12,R24
(0119) 		 PORTA = 0x33;     //0011,0011 指示灯
    00EF E383      LDI	R24,0x33
    00F0 BB8B      OUT	0x1B,R24
    00F1 9508      RET
(0120)     }
(0121) void turn_right_s()      //慢速右转
(0122)     {
(0123)          PORTD = 0x80;   //慢速右转//0010 0000
_turn_right_s:
    00F2 E880      LDI	R24,0x80
    00F3 BB82      OUT	0x12,R24
(0124) 		 PORTA = 0xCF;   //1100,1111
    00F4 EC8F      LDI	R24,0xCF
    00F5 BB8B      OUT	0x1B,R24
    00F6 9508      RET
(0125)     }
(0126) 
(0127) void turn_left_s()       //慢速左转
(0128)     {
(0129)          PORTD = 0x20;   //慢速左转//1000 0000
_turn_left_s:
    00F7 E280      LDI	R24,0x20
    00F8 BB82      OUT	0x12,R24
(0130) 		 PORTA = 0xF3;     //1111,0011
    00F9 EF83      LDI	R24,0xF3
    00FA BB8B      OUT	0x1B,R24
    00FB 9508      RET
(0131)     }
(0132) 
(0133) void backward()//后退
(0134)     {
(0135) 		 PORTD = 0x50;   //后退//0101 0000   
_backward:
    00FC E580      LDI	R24,0x50
    00FD BB82      OUT	0x12,R24
(0136) 		 PORTA = 0x3C;     //0011,1100 指示灯
    00FE E38C      LDI	R24,0x3C
    00FF BB8B      OUT	0x1B,R24
    0100 9508      RET
(0137)     }
(0138) 
(0139) void forward()//前行
(0140)     {
(0141) 		 PORTD = 0xA0;   //前行//1010 0000   
_forward:
    0101 EA80      LDI	R24,0xA0
    0102 BB82      OUT	0x12,R24
(0142) 		 PORTA = 0xC3;     //1100,0011
    0103 EC83      LDI	R24,0xC3
    0104 BB8B      OUT	0x1B,R24
    0105 9508      RET
(0143)     }
(0144) 	
(0145) void stop()//停止运动
(0146)     {
(0147) 		 PORTD = 0xff;   //停止   
_stop:
    0106 EF8F      LDI	R24,0xFF
    0107 BB82      OUT	0x12,R24
(0148) 		 PORTA = 0xff;     //
    0108 BB8B      OUT	0x1B,R24
    0109 9508      RET
_sw_touch:
  sw_in                --> R20
  remote_in            --> R22
    010A 940E03E0  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;
    010C B343      IN	R20,0x13
    010D 7140      ANDI	R20,0x10
(0168)  if(sw_in == 0x00)
    010E F4C9      BNE	0x0128
(0169)    {//后退,左转                   首部开关接触
(0170)        backward();          //后退
    010F DFEC      RCALL	_backward
(0171)        delay_ms(touch_time);
    0110 EF0A      LDI	R16,0xFA
    0111 E010      LDI	R17,0
    0112 DFC6      RCALL	_delay_ms
(0172) 	   
(0173) 	   if(work_status == 0x70)
    0113 91800067  LDS	R24,work_status
    0115 3780      CPI	R24,0x70
    0116 F469      BNE	0x0124
(0174) 	     {//追光机器人,首部开关接触,停止运动,PA 口led 流动闪烁
(0175) 		  stop();
    0117 DFEE      RCALL	_stop
    0118 C00A      RJMP	0x0123
(0176) 		  while(1)
(0177) 		    {
(0178) 			 PORTA = 0x55;
    0119 E585      LDI	R24,0x55
    011A BB8B      OUT	0x1B,R24
(0179) 		     delay_ms(250);
    011B EF0A      LDI	R16,0xFA
    011C E010      LDI	R17,0
    011D DFBB      RCALL	_delay_ms
(0180) 		     PORTA = 0xAA;
    011E EA8A      LDI	R24,0xAA
    011F BB8B      OUT	0x1B,R24
(0181) 		     delay_ms(250);
    0120 EF0A      LDI	R16,0xFA
    0121 E010      LDI	R17,0
    0122 DFB6      RCALL	_delay_ms
    0123 CFF5      RJMP	0x0119
(0182) 			}
(0183) 		 }
(0184) 	   
(0185)        turn_left();         //左转
    0124 DFC8      RCALL	_turn_left
(0186)        delay_ms(touch_time);
    0125 EF0A      LDI	R16,0xFA
    0126 E010      LDI	R17,0
    0127 DFB1      RCALL	_delay_ms
(0187)    }
(0188)  
(0189)  sw_in = PINB & 0x0b;//0b0000,1011  pb3,pb1,pb0
    0128 B346      IN	R20,0x16
    0129 704B      ANDI	R20,0xB
(0190)  if(sw_in == 0x09)// 0b 0000,1001  尾部开关接触 
    012A 3049      CPI	R20,0x9
    012B F441      BNE	0x0134
(0191)    {//前行,左转
(0192) 	   forward();           //前行
    012C DFD4      RCALL	_forward
(0193)        delay_ms(touch_time);
    012D EF0A      LDI	R16,0xFA
    012E E010      LDI	R17,0
    012F DFA9      RCALL	_delay_ms
(0194)        
(0195) 	   turn_left();         //左转
    0130 DFBC      RCALL	_turn_left
(0196)        delay_ms(touch_time);
    0131 EF0A      LDI	R16,0xFA
    0132 E010      LDI	R17,0
    0133 DFA5      RCALL	_delay_ms
(0197)    }
(0198)  if(sw_in == 0x0a)// 0b 0000,1010  右侧开关接触
    0134 304A      CPI	R20,0xA
    0135 F441      BNE	0x013E
(0199)    {//后退,左转
(0200)        backward();          //后退
    0136 DFC5      RCALL	_backward
(0201)        delay_ms(touch_time);
    0137 EF0A      LDI	R16,0xFA
    0138 E010      LDI	R17,0
    0139 DF9F      RCALL	_delay_ms
(0202)        
(0203) 	   turn_left();         //左转
    013A DFB2      RCALL	_turn_left
(0204)        delay_ms(touch_time);
    013B EF0A      LDI	R16,0xFA
    013C E010      LDI	R17,0
    013D DF9B      RCALL	_delay_ms
(0205)    }  
(0206)  if(sw_in == 0x03)// 0b 0000,0011  左侧开关接触
    013E 3043      CPI	R20,3
    013F F441      BNE	0x0148
(0207)    {//后退,左转
(0208)        backward();          //后退
    0140 DFBB      RCALL	_backward
(0209)        delay_ms(touch_time);
    0141 EF0A      LDI	R16,0xFA
    0142 E010      LDI	R17,0
    0143 DF95      RCALL	_delay_ms
(0210)        
(0211) 	   turn_left();         //左转
    0144 DFA8      RCALL	_turn_left
(0212)        delay_ms(touch_time);
    0145 EF0A      LDI	R16,0xFA
    0146 E010      LDI	R17,0
    0147 DF91      RCALL	_delay_ms
(0213)    }
(0214)  if(sw_in == 0x02)// 0b 0000,0010  两侧开关同时接触,停止运动
    0148 3042      CPI	R20,2
    0149 F4F9      BNE	0x0169
(0215)    {
(0216) 	stop();       //停止运动,熄灭指示灯
    014A DFBB      RCALL	_stop
(0217)     delay_ms(touch_time*4);
    014B EE08      LDI	R16,0xE8
    014C E013      LDI	R17,3
    014D DF8B      RCALL	_delay_ms
    014E C019      RJMP	0x0168
(0218) 	while(1)
(0219) 	     {
(0220) 		  sw_in = PINC & 0x10;
    014F B343      IN	R20,0x13
    0150 7140      ANDI	R20,0x10
(0221) 		  if(sw_in == 0x00)
    0151 F409      BNE	0x0153
(0222) 		    {break;}//首部开关接触继续启动运动
    0152 C016      RJMP	0x0169
(0223) 		  PORTA = 0x55;//停止不运动时pa口指示灯流动闪烁
    0153 E585      LDI	R24,0x55
    0154 BB8B      OUT	0x1B,R24
(0224) 		  delay_ms(250);
    0155 EF0A      LDI	R16,0xFA
    0156 E010      LDI	R17,0
    0157 DF81      RCALL	_delay_ms
(0225) 		  PORTA = 0xAA;
    0158 EA8A      LDI	R24,0xAA
    0159 BB8B      OUT	0x1B,R24
(0226) 		  delay_ms(250);
    015A EF0A      LDI	R16,0xFA
    015B E010      LDI	R17,0
    015C DF7C      RCALL	_delay_ms
(0227) 		  remote_in = PINB & 0xf0;//遥控器控制继续运动
    015D B366      IN	R22,0x16
    015E 7F60      ANDI	R22,0xF0
(0228) 		  if(remote_in == 0x10 || remote_in == 0x20 || remote_in == 0x40 || remote_in == 0x80)
    015F 3160      CPI	R22,0x10
    0160 F031      BEQ	0x0167
    0161 3260      CPI	R22,0x20
    0162 F021      BEQ	0x0167
    0163 3460      CPI	R22,0x40
    0164 F011      BEQ	0x0167
    0165 3860      CPI	R22,0x80
    0166 F409      BNE	0x0168
(0229) 		    {break;}
    0167 C001      RJMP	0x0169
    0168 CFE6      RJMP	0x014F
(0230) 		 }
(0231)    }   
    0169 940E03D4  CALL	pop_gset2
    016B 9508      RET
(0232) }
(0233) 
(0234) void mic_startup()
(0235) {//声控启动程序运行

⌨️ 快捷键说明

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